@elementor/editor-default-styles 4.4.0-1140 → 4.4.0-1141

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -8,4 +8,28 @@ declare function DefaultStylesTabEmbedded({ onRequestClose, onExposeCloseAttempt
8
8
 
9
9
  declare function init(): void;
10
10
 
11
- export { DefaultStylesTabEmbedded, init };
11
+ type AllowedHtmlTag = string;
12
+
13
+ type EventMap = {
14
+ panelOpened: object;
15
+ tagSaved: {
16
+ tag: AllowedHtmlTag;
17
+ action: 'set' | 'unset';
18
+ sections_modified: string[];
19
+ };
20
+ saveFailed: {
21
+ tags_changed_count: number;
22
+ };
23
+ changesDiscarded: {
24
+ tags_discarded: AllowedHtmlTag[];
25
+ tags_discarded_count: number;
26
+ };
27
+ };
28
+ type DefaultStylesTrackingEvent = {
29
+ [K in keyof EventMap]: {
30
+ event: K;
31
+ } & EventMap[K];
32
+ }[keyof EventMap];
33
+ declare const trackDefaultStyles: (payload: DefaultStylesTrackingEvent) => void;
34
+
35
+ export { DefaultStylesTabEmbedded, init, trackDefaultStyles };
package/dist/index.d.ts CHANGED
@@ -8,4 +8,28 @@ declare function DefaultStylesTabEmbedded({ onRequestClose, onExposeCloseAttempt
8
8
 
9
9
  declare function init(): void;
10
10
 
11
- export { DefaultStylesTabEmbedded, init };
11
+ type AllowedHtmlTag = string;
12
+
13
+ type EventMap = {
14
+ panelOpened: object;
15
+ tagSaved: {
16
+ tag: AllowedHtmlTag;
17
+ action: 'set' | 'unset';
18
+ sections_modified: string[];
19
+ };
20
+ saveFailed: {
21
+ tags_changed_count: number;
22
+ };
23
+ changesDiscarded: {
24
+ tags_discarded: AllowedHtmlTag[];
25
+ tags_discarded_count: number;
26
+ };
27
+ };
28
+ type DefaultStylesTrackingEvent = {
29
+ [K in keyof EventMap]: {
30
+ event: K;
31
+ } & EventMap[K];
32
+ }[keyof EventMap];
33
+ declare const trackDefaultStyles: (payload: DefaultStylesTrackingEvent) => void;
34
+
35
+ export { DefaultStylesTabEmbedded, init, trackDefaultStyles };
package/dist/index.js CHANGED
@@ -31,7 +31,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  DefaultStylesTabEmbedded: () => DefaultStylesTabEmbedded,
34
- init: () => init
34
+ init: () => init,
35
+ trackDefaultStyles: () => trackDefaultStyles
35
36
  });
36
37
  module.exports = __toCommonJS(index_exports);
37
38
 
@@ -39,7 +40,7 @@ module.exports = __toCommonJS(index_exports);
39
40
  var React3 = __toESM(require("react"));
40
41
  var import_react2 = require("react");
41
42
  var import_editor_controls = require("@elementor/editor-controls");
42
- var import_editor_editing_panel2 = require("@elementor/editor-editing-panel");
43
+ var import_editor_editing_panel3 = require("@elementor/editor-editing-panel");
43
44
  var import_editor_responsive = require("@elementor/editor-responsive");
44
45
  var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
45
46
  var import_editor_ui = require("@elementor/editor-ui");
@@ -256,7 +257,7 @@ var subscribeWithStates = (cb) => {
256
257
 
257
258
  // src/save-default-styles.ts
258
259
  var import_store4 = require("@elementor/store");
259
- var import_utils = require("@elementor/utils");
260
+ var import_utils2 = require("@elementor/utils");
260
261
 
261
262
  // src/api.ts
262
263
  var import_http_client = require("@elementor/http-client");
@@ -271,6 +272,87 @@ var apiClient = {
271
272
  delete: (tag) => (0, import_http_client.httpService)().delete(`${BASE_URL}${RESOURCE_URL}/${tag}`)
272
273
  };
273
274
 
275
+ // src/modified-sections.ts
276
+ var import_editor_editing_panel = require("@elementor/editor-editing-panel");
277
+ var import_utils = require("@elementor/utils");
278
+ var CUSTOM_CSS_SECTION = "custom_css";
279
+ function getModifiedSections(initialStyle, currentStyle) {
280
+ const sectionByProp = new Map(
281
+ import_editor_editing_panel.STYLE_SECTIONS.flatMap(({ name, fields }) => fields.map((field) => [field, name.toLowerCase()]))
282
+ );
283
+ const modified = /* @__PURE__ */ new Set();
284
+ const variantsOf = (style) => new Map((style?.variants ?? []).map((variant) => [JSON.stringify(variant.meta), variant]));
285
+ const initialVariants = variantsOf(initialStyle);
286
+ const currentVariants = variantsOf(currentStyle);
287
+ (/* @__PURE__ */ new Set([...initialVariants.keys(), ...currentVariants.keys()])).forEach((meta) => {
288
+ const initial = initialVariants.get(meta);
289
+ const current = currentVariants.get(meta);
290
+ (/* @__PURE__ */ new Set([...Object.keys(initial?.props ?? {}), ...Object.keys(current?.props ?? {})])).forEach(
291
+ (prop) => {
292
+ if (isChanged(initial?.props[prop], current?.props[prop]) && sectionByProp.has(prop)) {
293
+ modified.add(sectionByProp.get(prop));
294
+ }
295
+ }
296
+ );
297
+ if (isChanged(initial?.custom_css, current?.custom_css)) {
298
+ modified.add(CUSTOM_CSS_SECTION);
299
+ }
300
+ });
301
+ return [...modified];
302
+ }
303
+ function isChanged(initial, current) {
304
+ return (0, import_utils.hash)({ value: initial ?? null }) !== (0, import_utils.hash)({ value: current ?? null });
305
+ }
306
+
307
+ // src/utils/tracking.ts
308
+ var import_events = require("@elementor/events");
309
+ var EVENT_PROPERTIES = {
310
+ panelOpened: {
311
+ target_type: "tab",
312
+ target_name: "defaults_tab",
313
+ target_location: "design_system_panel",
314
+ interaction_result: "panel_opened"
315
+ },
316
+ tagSaved: {
317
+ target_type: "button",
318
+ target_name: "save_changes",
319
+ target_location: "design_system_panel",
320
+ interaction_result: "tag_saved",
321
+ executed_by: "user"
322
+ },
323
+ saveFailed: {
324
+ target_type: "button",
325
+ target_name: "save_changes",
326
+ target_location: "design_system_panel",
327
+ interaction_result: "save_failed",
328
+ executed_by: "user"
329
+ },
330
+ changesDiscarded: {
331
+ target_type: "button",
332
+ target_name: "discard_changes",
333
+ target_location: "dialog",
334
+ interaction_result: "changes_discarded"
335
+ }
336
+ };
337
+ var trackDefaultStyles = (payload) => {
338
+ const { dispatchEvent, config } = (0, import_events.getMixpanel)();
339
+ const name = config?.names?.default_styles?.[payload.event];
340
+ if (!name) {
341
+ return;
342
+ }
343
+ const { event, ...eventData } = payload;
344
+ try {
345
+ dispatchEvent?.(name, {
346
+ window_name: config?.appTypes?.editor,
347
+ app_type: config?.appTypes?.editor,
348
+ interaction_type: "click",
349
+ ...EVENT_PROPERTIES[event],
350
+ ...eventData
351
+ });
352
+ } catch {
353
+ }
354
+ };
355
+
274
356
  // src/save-default-styles.ts
275
357
  function getChangedTags(state) {
276
358
  const current = selectData(state);
@@ -279,7 +361,7 @@ function getChangedTags(state) {
279
361
  Object.keys(current).forEach((tag) => {
280
362
  const currentStyle = current[tag];
281
363
  const initialStyle = initial[tag];
282
- if (!initialStyle || (0, import_utils.hash)(currentStyle) !== (0, import_utils.hash)(initialStyle)) {
364
+ if (!initialStyle || (0, import_utils2.hash)(currentStyle) !== (0, import_utils2.hash)(initialStyle)) {
283
365
  changed.push(tag);
284
366
  }
285
367
  });
@@ -296,6 +378,7 @@ async function saveDefaultStyles() {
296
378
  return;
297
379
  }
298
380
  const data = selectData(state);
381
+ const initialData = selectInitialData(state);
299
382
  const changedTags = getChangedTags(state);
300
383
  await Promise.all(
301
384
  changedTags.map(async (tag) => {
@@ -306,7 +389,19 @@ async function saveDefaultStyles() {
306
389
  }
307
390
  await apiClient.put(tag, style.variants);
308
391
  })
309
- );
392
+ ).catch((error) => {
393
+ trackDefaultStyles({ event: "saveFailed", tags_changed_count: changedTags.length });
394
+ throw error;
395
+ });
396
+ changedTags.forEach((tag) => {
397
+ const isUnset = !data[tag]?.variants.length;
398
+ trackDefaultStyles({
399
+ event: "tagSaved",
400
+ tag,
401
+ action: isUnset ? "unset" : "set",
402
+ sections_modified: isUnset ? [] : getModifiedSections(initialData[tag], data[tag])
403
+ });
404
+ });
310
405
  (0, import_store4.__dispatch)(slice.actions.commit());
311
406
  }
312
407
 
@@ -319,7 +414,7 @@ var import_i18n2 = require("@wordpress/i18n");
319
414
 
320
415
  // src/components/tag-state-menu.tsx
321
416
  var React = __toESM(require("react"));
322
- var import_editor_editing_panel = require("@elementor/editor-editing-panel");
417
+ var import_editor_editing_panel2 = require("@elementor/editor-editing-panel");
323
418
  var import_ui = require("@elementor/ui");
324
419
  function TagStateMenu({ popupState, anchorEl, activeState, onSelectState }) {
325
420
  return /* @__PURE__ */ React.createElement(
@@ -333,9 +428,9 @@ function TagStateMenu({ popupState, anchorEl, activeState, onSelectState }) {
333
428
  disableAutoFocusItem: true
334
429
  },
335
430
  /* @__PURE__ */ React.createElement(
336
- import_editor_editing_panel.PseudoStateMenuItems,
431
+ import_editor_editing_panel2.PseudoStateMenuItems,
337
432
  {
338
- states: import_editor_editing_panel.DEFAULT_PSEUDO_STATES,
433
+ states: import_editor_editing_panel2.DEFAULT_PSEUDO_STATES,
339
434
  activeState,
340
435
  onSelectState,
341
436
  onClose: popupState.close
@@ -487,6 +582,12 @@ function DefaultStylesTabEmbedded({ onRequestClose, onExposeCloseAttempt }) {
487
582
  setActiveStyleState(null);
488
583
  };
489
584
  const resetAndClosePanel = () => {
585
+ const tagsDiscarded = getChangedTags((0, import_store6.__getState)());
586
+ trackDefaultStyles({
587
+ event: "changesDiscarded",
588
+ tags_discarded: tagsDiscarded,
589
+ tags_discarded_count: tagsDiscarded.length
590
+ });
490
591
  (0, import_store6.__dispatch)(slice.actions.reset());
491
592
  closeSaveChangesDialog();
492
593
  void onRequestClose();
@@ -512,7 +613,7 @@ function DefaultStylesTabEmbedded({ onRequestClose, onExposeCloseAttempt }) {
512
613
  }
513
614
  },
514
615
  /* @__PURE__ */ React3.createElement(import_ui3.Box, { sx: { flex: 1, minHeight: 0, overflow: "auto" } }, /* @__PURE__ */ React3.createElement(import_ui3.Stack, { sx: { px: 2, pt: 1, gap: 1 } }, /* @__PURE__ */ React3.createElement(import_ui3.FormControl, { fullWidth: true, size: "small" }, /* @__PURE__ */ React3.createElement(import_ui3.FormLabel, { htmlFor: TAG_SELECTOR_ID, size: "small", sx: { mb: 1 } }, (0, import_i18n3.__)("Tag", "elementor")), /* @__PURE__ */ React3.createElement(
515
- import_editor_editing_panel2.CreatableAutocomplete,
616
+ import_editor_editing_panel3.CreatableAutocomplete,
516
617
  {
517
618
  id: TAG_SELECTOR_ID,
518
619
  size: "tiny",
@@ -532,14 +633,14 @@ function DefaultStylesTabEmbedded({ onRequestClose, onExposeCloseAttempt }) {
532
633
  ))
533
634
  }
534
635
  ))), /* @__PURE__ */ React3.createElement(
535
- import_editor_editing_panel2.ElementProvider,
636
+ import_editor_editing_panel3.ElementProvider,
536
637
  {
537
638
  element: shimElement,
538
639
  elementType: shimElementType,
539
640
  settings: {}
540
641
  },
541
- /* @__PURE__ */ React3.createElement(import_editor_editing_panel2.ClassesPropProvider, { prop: SHIM_CLASSES_PROP }, /* @__PURE__ */ React3.createElement(
542
- import_editor_editing_panel2.StyleProvider,
642
+ /* @__PURE__ */ React3.createElement(import_editor_editing_panel3.ClassesPropProvider, { prop: SHIM_CLASSES_PROP }, /* @__PURE__ */ React3.createElement(
643
+ import_editor_editing_panel3.StyleProvider,
543
644
  {
544
645
  meta: {
545
646
  breakpoint,
@@ -550,7 +651,7 @@ function DefaultStylesTabEmbedded({ onRequestClose, onExposeCloseAttempt }) {
550
651
  },
551
652
  setMetaState: setActiveStyleState
552
653
  },
553
- /* @__PURE__ */ React3.createElement(import_session.SessionStorageProvider, { prefix: selectedTag }, /* @__PURE__ */ React3.createElement(import_editor_editing_panel2.StyleInheritanceProvider, null, /* @__PURE__ */ React3.createElement(import_editor_editing_panel2.SectionsList, null, /* @__PURE__ */ React3.createElement(import_editor_editing_panel2.StyleSections, null), /* @__PURE__ */ React3.createElement(import_editor_editing_panel2.StyleTabSlot, null)), /* @__PURE__ */ React3.createElement(
654
+ /* @__PURE__ */ React3.createElement(import_session.SessionStorageProvider, { prefix: selectedTag }, /* @__PURE__ */ React3.createElement(import_editor_editing_panel3.StyleInheritanceProvider, null, /* @__PURE__ */ React3.createElement(import_editor_editing_panel3.SectionsList, null, /* @__PURE__ */ React3.createElement(import_editor_editing_panel3.StyleSections, null), /* @__PURE__ */ React3.createElement(import_editor_editing_panel3.StyleTabSlot, null)), /* @__PURE__ */ React3.createElement(
554
655
  import_ui3.Box,
555
656
  {
556
657
  sx: {
@@ -610,7 +711,7 @@ function usePreventUnload(isDirty) {
610
711
 
611
712
  // src/init.ts
612
713
  var import_editor = require("@elementor/editor");
613
- var import_editor_editing_panel3 = require("@elementor/editor-editing-panel");
714
+ var import_editor_editing_panel4 = require("@elementor/editor-editing-panel");
614
715
  var import_editor_styles_repository3 = require("@elementor/editor-styles-repository");
615
716
  var import_store12 = require("@elementor/store");
616
717
 
@@ -675,7 +776,7 @@ function PopulateStore() {
675
776
  // src/init.ts
676
777
  function init() {
677
778
  (0, import_store12.__registerSlice)(slice);
678
- (0, import_editor_editing_panel3.registerElementPanelDefaults)("default-style", {
779
+ (0, import_editor_editing_panel4.registerElementPanelDefaults)("default-style", {
679
780
  defaultTab: "style",
680
781
  defaultSectionsExpanded: {
681
782
  style: []
@@ -694,6 +795,7 @@ function init() {
694
795
  // Annotate the CommonJS export names for ESM import in node:
695
796
  0 && (module.exports = {
696
797
  DefaultStylesTabEmbedded,
697
- init
798
+ init,
799
+ trackDefaultStyles
698
800
  });
699
801
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/default-styles-tab-embedded.tsx","../src/allowed-tags.ts","../src/default-styles-provider.ts","../src/capabilities.ts","../src/store.ts","../src/save-default-styles.ts","../src/api.ts","../src/components/tag-chip.tsx","../src/components/tag-state-menu.tsx","../src/init.ts","../src/components/global-styles-import-listener.tsx","../src/load-default-styles.ts","../src/components/populate-store.tsx"],"sourcesContent":["export { DefaultStylesTabEmbedded } from './components/default-styles-tab-embedded';\nexport { init } from './init';\n","import * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n\tControlActionsProvider,\n\tControlReplacementsProvider,\n\tgetControlReplacements,\n} from '@elementor/editor-controls';\nimport {\n\tClassesPropProvider,\n\tCreatableAutocomplete,\n\tElementProvider,\n\ttype Option,\n\tSectionsList,\n\tStyleInheritanceProvider,\n\tStyleProvider,\n\tStyleSections,\n\tStyleTabSlot,\n} from '@elementor/editor-editing-panel';\nimport { type Element, type ElementType } from '@elementor/editor-elements';\nimport { useActiveBreakpoint } from '@elementor/editor-responsive';\nimport { type StyleDefinitionID, type StyleDefinitionState } from '@elementor/editor-styles';\nimport { useUserStylesCapability } from '@elementor/editor-styles-repository';\nimport { SaveChangesDialog, ThemeProvider, useDialog } from '@elementor/editor-ui';\nimport { controlActionsMenu } from '@elementor/menus';\nimport { useMutation } from '@elementor/query';\nimport { getSessionStorageItem, SessionStorageProvider, setSessionStorageItem } from '@elementor/session';\nimport { __dispatch as dispatch, __useSelector as useSelector } from '@elementor/store';\nimport {\n\ttype AutocompleteChangeReason,\n\tBox,\n\tButton,\n\tErrorBoundary,\n\tFormControl,\n\tFormLabel,\n\tStack,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport {\n\ttype AllowedHtmlTag,\n\tgetAllowedDefaultStyleTags,\n\tgetDefaultActiveTag,\n\tisAllowedDefaultStyleTag,\n} from '../allowed-tags';\nimport { DEFAULT_STYLES_PROVIDER_KEY } from '../default-styles-provider';\nimport { saveDefaultStyles } from '../save-default-styles';\nimport { selectIsDirty, slice } from '../store';\nimport { TagChip } from './tag-chip';\n\nconst { useMenuItems } = controlActionsMenu;\n\nconst SHIM_ELEMENT_ID = 'default-styles-editor-shim';\nconst SHIM_CLASSES_PROP = '__default_styles_classes__';\nconst TAG_SELECTOR_ID = 'default-styles-tag-selector';\nconst LAST_ACTIVE_TAG_SESSION_PREFIX = 'default-styles';\nconst LAST_ACTIVE_TAG_SESSION_KEY = 'last-active-tag';\nconst LAST_ACTIVE_TAG_STORAGE_KEY = `${ LAST_ACTIVE_TAG_SESSION_PREFIX }/${ LAST_ACTIVE_TAG_SESSION_KEY }`;\n\nfunction readStoredActiveTag( allowedTags: AllowedHtmlTag[] ): AllowedHtmlTag {\n\tconst storedTag = getSessionStorageItem< AllowedHtmlTag >( LAST_ACTIVE_TAG_STORAGE_KEY );\n\n\tif ( storedTag && isAllowedDefaultStyleTag( storedTag, allowedTags ) ) {\n\t\treturn storedTag;\n\t}\n\n\treturn getDefaultActiveTag( allowedTags );\n}\n\nfunction toTagChip( tag: AllowedHtmlTag ): Option {\n\treturn { label: tag, value: tag, fixed: true };\n}\n\nconst shimElement: Element = {\n\tid: SHIM_ELEMENT_ID,\n\ttype: 'default-style',\n};\n\nconst shimElementType: ElementType = {\n\tkey: 'default-style',\n\tcontrols: [],\n\tpropsSchema: {},\n\ttitle: __( 'Default Style', 'elementor' ),\n};\n\nexport type DefaultStylesTabEmbeddedProps = {\n\tonRequestClose: () => void | Promise< void >;\n\tonExposeCloseAttempt?: ( attemptClose: ( () => void ) | null ) => void;\n};\n\nexport function DefaultStylesTabEmbedded( { onRequestClose, onExposeCloseAttempt }: DefaultStylesTabEmbeddedProps ) {\n\tconst allowedTags = useMemo( () => getAllowedDefaultStyleTags(), [] );\n\tconst tagOptions = useMemo< Option[] >(\n\t\t() => allowedTags.map( ( tag ) => ( { label: tag, value: tag } ) ),\n\t\t[ allowedTags ]\n\t);\n\tconst [ selectedTag, setSelectedTagState ] = useState< AllowedHtmlTag >( () => readStoredActiveTag( allowedTags ) );\n\tconst [ activeStyleState, setActiveStyleState ] = useState< StyleDefinitionState | null >( null );\n\tconst breakpoint = useActiveBreakpoint();\n\tconst menuItems = useMenuItems().default;\n\tconst controlReplacements = getControlReplacements();\n\tconst isDirty = useSelector( selectIsDirty );\n\tconst { mutateAsync: save, isPending: isSaving } = useSave();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\tconst { userCan } = useUserStylesCapability();\n\tconst canEdit = userCan( DEFAULT_STYLES_PROVIDER_KEY ).updateProps;\n\n\tconst setSelectedTag = ( tag: AllowedHtmlTag ) => {\n\t\tsetSelectedTagState( tag );\n\t\tsetSessionStorageItem( LAST_ACTIVE_TAG_STORAGE_KEY, tag );\n\t};\n\n\tconst handleClosePanel = useCallback( () => {\n\t\tif ( canEdit && isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\tvoid onRequestClose();\n\t}, [ canEdit, isDirty, onRequestClose, openSaveChangesDialog ] );\n\n\tuseEffect( () => {\n\t\tif ( ! onExposeCloseAttempt ) {\n\t\t\treturn;\n\t\t}\n\n\t\tonExposeCloseAttempt( () => handleClosePanel() );\n\n\t\treturn () => onExposeCloseAttempt( null );\n\t}, [ onExposeCloseAttempt, handleClosePanel ] );\n\n\tusePreventUnload( canEdit && isDirty );\n\n\tconst handleTagSelect = ( _selected: Option[], reason: AutocompleteChangeReason, option: Option ) => {\n\t\tif ( reason !== 'selectOption' || ! option.value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedTag( option.value as AllowedHtmlTag );\n\t\tsetActiveStyleState( null );\n\t};\n\n\tconst resetAndClosePanel = () => {\n\t\tdispatch( slice.actions.reset() );\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\tconst handleSaveAndContinue = async () => {\n\t\ttry {\n\t\t\tawait save();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\treturn (\n\t\t<ErrorBoundary fallback={ null }>\n\t\t\t<ThemeProvider>\n\t\t\t\t<ControlActionsProvider items={ menuItems }>\n\t\t\t\t\t<ControlReplacementsProvider replacements={ controlReplacements }>\n\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\t\tminHeight: 0,\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Box sx={ { flex: 1, minHeight: 0, overflow: 'auto' } }>\n\t\t\t\t\t\t\t\t<Stack sx={ { px: 2, pt: 1, gap: 1 } }>\n\t\t\t\t\t\t\t\t\t<FormControl fullWidth size=\"small\">\n\t\t\t\t\t\t\t\t\t\t<FormLabel htmlFor={ TAG_SELECTOR_ID } size=\"small\" sx={ { mb: 1 } }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Tag', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<CreatableAutocomplete< Option >\n\t\t\t\t\t\t\t\t\t\t\tid={ TAG_SELECTOR_ID }\n\t\t\t\t\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'Type tag name', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t\toptions={ tagOptions }\n\t\t\t\t\t\t\t\t\t\t\tselected={ [ toTagChip( selectedTag ) ] }\n\t\t\t\t\t\t\t\t\t\t\tonSelect={ handleTagSelect }\n\t\t\t\t\t\t\t\t\t\t\trenderTags={ ( values, getTagProps ) =>\n\t\t\t\t\t\t\t\t\t\t\t\tvalues.map( ( value, index ) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TagChip\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={ value.value ?? value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={ value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchipProps={ getTagProps( { index } ) }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tactiveState={ activeStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelectState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) )\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t<ElementProvider\n\t\t\t\t\t\t\t\t\telement={ shimElement }\n\t\t\t\t\t\t\t\t\telementType={ shimElementType }\n\t\t\t\t\t\t\t\t\tsettings={ {} }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ClassesPropProvider prop={ SHIM_CLASSES_PROP }>\n\t\t\t\t\t\t\t\t\t\t<StyleProvider\n\t\t\t\t\t\t\t\t\t\t\tmeta={ {\n\t\t\t\t\t\t\t\t\t\t\t\tbreakpoint,\n\t\t\t\t\t\t\t\t\t\t\t\tstate: activeStyleState,\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tid={ selectedTag as StyleDefinitionID }\n\t\t\t\t\t\t\t\t\t\t\tsetId={ () => {} }\n\t\t\t\t\t\t\t\t\t\t\tsetMetaState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<SessionStorageProvider prefix={ selectedTag }>\n\t\t\t\t\t\t\t\t\t\t\t\t<StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleSections />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleTabSlot />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: '150px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t</SessionStorageProvider>\n\t\t\t\t\t\t\t\t\t\t</StyleProvider>\n\t\t\t\t\t\t\t\t\t</ClassesPropProvider>\n\t\t\t\t\t\t\t\t</ElementProvider>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t{ canEdit ? (\n\t\t\t\t\t\t\t\t<Box sx={ { flexShrink: 0, px: 2, py: 1.5 } }>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\t\t\t\tonClick={ () => void save() }\n\t\t\t\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\t\t\t\tloading={ isSaving }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</ControlReplacementsProvider>\n\t\t\t\t</ControlActionsProvider>\n\n\t\t\t\t{ canEdit && isSaveChangesDialogOpen && (\n\t\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t\t<SaveChangesDialog.Title onClose={ closeSaveChangesDialog }>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.Title>\n\t\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t\t{ __( 'You have unsaved changes in Default Styles.', 'elementor' ) }\n\t\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\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\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\t\tdiscard: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Discard', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: resetAndClosePanel,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: handleSaveAndContinue,\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</SaveChangesDialog>\n\t\t\t\t) }\n\t\t\t</ThemeProvider>\n\t\t</ErrorBoundary>\n\t);\n}\n\nfunction useSave() {\n\treturn useMutation( {\n\t\tmutationFn: () => saveDefaultStyles(),\n\t} );\n}\n\nfunction usePreventUnload( isDirty: boolean ) {\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","type ExtendedWindow = Window & {\n\telementor: {\n\t\tconfig: {\n\t\t\tatomic?: {\n\t\t\t\tdefault_styles?: {\n\t\t\t\t\tallowed_tags?: string[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst getElementorConfig = () => ( window as unknown as ExtendedWindow ).elementor?.config ?? {};\n\nexport const getAllowedDefaultStyleTags = (): string[] => {\n\tconst tags = getElementorConfig().atomic?.default_styles?.allowed_tags;\n\n\tif ( ! tags?.length ) {\n\t\treturn [];\n\t}\n\n\treturn tags;\n};\n\nexport type AllowedHtmlTag = string;\n\nexport const getDefaultActiveTag = ( tags: string[] ): AllowedHtmlTag => {\n\tif ( tags.includes( 'h1' ) ) {\n\t\treturn 'h1';\n\t}\n\n\treturn tags[ 0 ] ?? '';\n};\n\nexport const isAllowedDefaultStyleTag = ( tag: string, tags = getAllowedDefaultStyleTags() ): tag is AllowedHtmlTag =>\n\ttags.includes( tag );\n","import { type StyleDefinition, type StyleDefinitionID } 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 { getAllowedDefaultStyleTags } from './allowed-tags';\nimport { getCapabilities } from './capabilities';\nimport { selectData, slice } from './store';\n\nexport const DEFAULT_STYLES_PROVIDER_KEY = 'default-styles';\nexport const DEFAULT_STYLES_CSS_NAME_PREFIX = 'e-default-';\n\nconst resolveCssName = ( id: StyleDefinitionID ) => `${ DEFAULT_STYLES_CSS_NAME_PREFIX }${ id }`;\n\nconst placeholderDefinition = ( id: StyleDefinitionID ): StyleDefinition => ( {\n\tid,\n\tlabel: id,\n\ttype: 'class',\n\tvariants: [],\n} );\n\nconst asClassDefinition = ( style: StyleDefinition ): StyleDefinition => ( {\n\t...style,\n\ttype: 'class',\n} );\n\nexport const defaultStylesStylesProvider = createStylesProvider( {\n\tkey: DEFAULT_STYLES_PROVIDER_KEY,\n\tpriority: 15,\n\tlabels: {\n\t\tsingular: __( 'tag', 'elementor' ),\n\t\tplural: __( 'tags', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithStates( cb ),\n\tcapabilities: getCapabilities(),\n\tactions: {\n\t\tall: () =>\n\t\t\tgetAllowedDefaultStyleTags().map( ( tag ) => {\n\t\t\t\tconst style = selectData( getState() )[ tag ];\n\n\t\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( tag );\n\t\t\t} ),\n\t\tget: ( id ) => {\n\t\t\tconst style = selectData( getState() )[ id ];\n\n\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( id );\n\t\t},\n\t\tresolveCssName,\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.deleteTag( 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\tmode: args.mode,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tupdateCustomCss: ( 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\tcustom_css: args.custom_css,\n\t\t\t\t\tprops: {},\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n\nconst subscribeWithStates = (\n\tcb: ( previous: Record< string, StyleDefinition >, current: Record< string, StyleDefinition > ) => void\n) => {\n\tlet previousState = selectData( getState() );\n\n\treturn subscribeWithSelector(\n\t\t( state ) => selectData( state ),\n\t\t( currentState ) => {\n\t\t\tcb( previousState, currentState );\n\t\t\tpreviousState = currentState;\n\t\t}\n\t);\n};\n","import { type UserCapabilities } from '@elementor/editor-styles-repository';\n\nexport const UPDATE_DEFAULT_STYLES_CAPABILITY_KEY = 'manage_options';\n\nexport const getCapabilities = (): UserCapabilities => {\n\treturn {\n\t\tupdate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tcreate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tdelete: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tupdateProps: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t};\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\ttype CustomCss,\n\tgetNonEmptyVariants,\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\ntype DefaultStylesState = {\n\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\tinitialData: Record< StyleDefinitionID, StyleDefinition >;\n\tisDirty: boolean;\n};\n\nconst initialState: DefaultStylesState = {\n\tdata: {},\n\tinitialData: {},\n\tisDirty: false,\n};\n\nexport type StateWithDefaultStyles = SliceState< typeof slice >;\n\nconst SLICE_NAME = 'defaultStyles';\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: { data },\n\t\t\t}: PayloadAction< {\n\t\t\t\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\t\t\t} >\n\t\t) {\n\t\t\tconst normalizedData = Array.isArray( data ) ? {} : data;\n\n\t\t\tstate.initialData = structuredClone( normalizedData );\n\t\t\tstate.data = structuredClone( normalizedData );\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tstate.data[ payload.style.id ] = {\n\t\t\t\t...state.data[ payload.style.id ],\n\t\t\t\t...payload.style,\n\t\t\t} as StyleDefinition;\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< {\n\t\t\t\tid: StyleDefinitionID;\n\t\t\t\tmeta: StyleDefinitionVariant[ 'meta' ];\n\t\t\t\tprops: Props;\n\t\t\t\tcustom_css?: CustomCss | null;\n\t\t\t\tmode?: 'merge' | 'replace';\n\t\t\t} >\n\t\t) {\n\t\t\tconst style = state.data[ payload.id ] ?? {\n\t\t\t\tid: payload.id,\n\t\t\t\tlabel: payload.id,\n\t\t\t\ttype: 'class' as const,\n\t\t\t\tvariants: [],\n\t\t\t};\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tlet customCss = ( 'custom_css' in payload ? payload.custom_css : variant?.custom_css ) ?? null;\n\t\t\tcustomCss = customCss?.raw ? customCss : null;\n\n\t\t\tconst payloadProps = JSON.parse( JSON.stringify( payload.props ) ) as Props;\n\t\t\tconst mode = payload.mode ?? 'merge';\n\n\t\t\tif ( variant ) {\n\t\t\t\tconst variantProps = extractVariantProps( mode, variant );\n\t\t\t\tvariant.props = mergeProps( variantProps, payloadProps );\n\t\t\t\tvariant.custom_css = customCss;\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( {\n\t\t\t\t\tmeta: payload.meta,\n\t\t\t\t\tprops: mergeProps( {}, payloadProps ),\n\t\t\t\t\tcustom_css: customCss,\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tstyle.variants = getNonEmptyVariants( style );\n\n\t\t\tstate.data[ payload.id ] = style;\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state ) {\n\t\t\tstate.data = state.initialData;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tcommit( state ) {\n\t\t\tstate.initialData = state.data;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tdeleteTag( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete state.data[ payload ];\n\t\t\tstate.isDirty = true;\n\t\t},\n\t},\n} );\n\nfunction extractVariantProps( mode: string, variant: StyleDefinitionVariant ) {\n\tif ( 'replace' === mode ) {\n\t\treturn {};\n\t}\n\treturn JSON.parse( JSON.stringify( variant.props ) ) as Props;\n}\n\nexport const selectData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.data,\n\t( data ) => data\n);\n\nexport const selectIsDirty = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.isDirty,\n\t( isDirty ) => isDirty\n);\n\nexport const selectInitialData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.initialData,\n\t( initialData ) => initialData\n);\n\nexport const selectTagStyle = createSelector(\n\t[ selectData, ( _state: StateWithDefaultStyles, id: StyleDefinitionID ) => id ],\n\t( data, id ) => data[ id ]\n);\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\nimport { hash } from '@elementor/utils';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\nimport { apiClient } from './api';\nimport { selectData, selectInitialData, selectIsDirty, slice, type StateWithDefaultStyles } from './store';\n\nfunction getChangedTags( state: StateWithDefaultStyles ): AllowedHtmlTag[] {\n\tconst current = selectData( state );\n\tconst initial = selectInitialData( state );\n\n\tconst changed: AllowedHtmlTag[] = [];\n\n\tObject.keys( current ).forEach( ( tag ) => {\n\t\tconst currentStyle = current[ tag ];\n\t\tconst initialStyle = initial[ tag ];\n\n\t\tif ( ! initialStyle || hash( currentStyle ) !== hash( initialStyle ) ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\tObject.keys( initial ).forEach( ( tag ) => {\n\t\tif ( ! current[ tag ] ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\treturn changed;\n}\n\nexport async function saveDefaultStyles() {\n\tconst state = getState() as StateWithDefaultStyles;\n\n\tif ( ! selectIsDirty( state ) ) {\n\t\treturn;\n\t}\n\n\tconst data = selectData( state );\n\tconst changedTags = getChangedTags( state );\n\n\tawait Promise.all(\n\t\tchangedTags.map( async ( tag ) => {\n\t\t\tconst style = data[ tag ];\n\n\t\t\tif ( ! style || style.variants.length === 0 ) {\n\t\t\t\tawait apiClient.delete( tag );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait apiClient.put( tag, style.variants );\n\t\t} )\n\t);\n\n\tdispatch( slice.actions.commit() );\n}\n","import { type StyleDefinition, type StyleDefinitionID } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\n\nconst RESOURCE_URL = '/default-styles';\nconst BASE_URL = 'elementor/v1';\n\nexport type DefaultStylesMap = Record< StyleDefinitionID, StyleDefinition >;\n\ntype DefaultStylesHttpResponse = HttpResponse< DefaultStylesMap >;\n\nexport const apiClient = {\n\tall: () => httpService().get< DefaultStylesHttpResponse >( `${ BASE_URL }${ RESOURCE_URL }` ),\n\n\tput: ( tag: AllowedHtmlTag, variants: StyleDefinition[ 'variants' ] ) =>\n\t\thttpService().put( `${ BASE_URL }${ RESOURCE_URL }/${ tag }`, {\n\t\t\ttype: 'class',\n\t\t\tvariants,\n\t\t} ),\n\n\tdelete: ( tag: AllowedHtmlTag ) => httpService().delete( `${ BASE_URL }${ RESOURCE_URL }/${ tag }` ),\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport {\n\ttype AutocompleteRenderGetTagProps,\n\tbindTrigger,\n\tChip,\n\tStack,\n\ttype Theme,\n\tTypography,\n\tUnstableChipGroup,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { TagStateMenu } from './tag-state-menu';\n\nconst CHIP_SIZE = 'tiny';\n\ntype TagChipProps = {\n\tlabel: string;\n\tchipProps: ReturnType< AutocompleteRenderGetTagProps >;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagChip( { label, chipProps, activeState, onSelectState }: TagChipProps ) {\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tpopupId: 'tag-state-menu',\n\t} );\n\tconst [ chipRef, setChipRef ] = useState< HTMLElement | null >( null );\n\n\tconst { onDelete: _onDelete, ...chipGroupProps } = chipProps;\n\tconst isShowingState = Boolean( activeState );\n\n\treturn (\n\t\t<>\n\t\t\t<UnstableChipGroup\n\t\t\t\tref={ setChipRef }\n\t\t\t\t{ ...chipGroupProps }\n\t\t\t\taria-label={ `Edit ${ label }` }\n\t\t\t\trole=\"group\"\n\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t'&.MuiChipGroup-root.MuiAutocomplete-tag': {\n\t\t\t\t\t\tmargin: theme.spacing( 0.125 ),\n\t\t\t\t\t},\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t<Chip\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={ label }\n\t\t\t\t\tvariant={ isShowingState ? 'standard' : 'filled' }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tif ( isShowingState ) {\n\t\t\t\t\t\t\tonSelectState( null );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t\t<Chip\n\t\t\t\t\ticon={ isShowingState ? undefined : <DotsVerticalIcon fontSize=\"tiny\" /> }\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={\n\t\t\t\t\t\tisShowingState ? (\n\t\t\t\t\t\t\t<Stack direction=\"row\" gap={ 0.5 } alignItems=\"center\">\n\t\t\t\t\t\t\t\t<Typography variant=\"inherit\">{ activeState }</Typography>\n\t\t\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\t{ ...bindTrigger( popupState ) }\n\t\t\t\t\taria-label={ __( 'Open tag state menu', 'elementor' ) }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t...( ! isShowingState ? { paddingLeft: 0 } : {} ),\n\t\t\t\t\t\t'.MuiChip-label': isShowingState ? { paddingRight: 0 } : { padding: 0 },\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t</UnstableChipGroup>\n\t\t\t<TagStateMenu\n\t\t\t\tpopupState={ popupState }\n\t\t\t\tanchorEl={ chipRef }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { DEFAULT_PSEUDO_STATES, PseudoStateMenuItems } from '@elementor/editor-editing-panel';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { bindMenu, Menu, type PopupState } from '@elementor/ui';\n\ntype TagStateMenuProps = {\n\tpopupState: PopupState;\n\tanchorEl: HTMLElement | null;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagStateMenu( { popupState, anchorEl, activeState, onSelectState }: TagStateMenuProps ) {\n\treturn (\n\t\t<Menu\n\t\t\tMenuListProps={ { dense: true, sx: { minWidth: '160px' } } }\n\t\t\t{ ...bindMenu( popupState ) }\n\t\t\tanchorEl={ anchorEl }\n\t\t\tanchorOrigin={ { vertical: 'bottom', horizontal: 'left' } }\n\t\t\ttransformOrigin={ { horizontal: 'left', vertical: -4 } }\n\t\t\tdisableAutoFocusItem\n\t\t>\n\t\t\t<PseudoStateMenuItems\n\t\t\t\tstates={ DEFAULT_PSEUDO_STATES }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t\tonClose={ popupState.close }\n\t\t\t/>\n\t\t</Menu>\n\t);\n}\n","import { injectIntoLogic } from '@elementor/editor';\nimport { registerElementPanelDefaults } from '@elementor/editor-editing-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { GlobalStylesImportListener } from './components/global-styles-import-listener';\nimport { PopulateStore } from './components/populate-store';\nimport { defaultStylesStylesProvider } from './default-styles-provider';\nimport { slice } from './store';\n\nexport function init() {\n\tregisterSlice( slice );\n\n\tregisterElementPanelDefaults( 'default-style', {\n\t\tdefaultTab: 'style',\n\t\tdefaultSectionsExpanded: {\n\t\t\tstyle: [],\n\t\t},\n\t} );\n\n\tstylesRepository.register( defaultStylesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-import-listener',\n\t\tcomponent: GlobalStylesImportListener,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n}\n","import { useEffect } from 'react';\nimport { GLOBAL_STYLES_IMPORTED_EVENT } from '@elementor/editor-canvas';\n\nimport { loadDefaultStyles } from '../load-default-styles';\n\nexport function GlobalStylesImportListener() {\n\tuseEffect( () => {\n\t\tconst handleGlobalStylesImported = () => {\n\t\t\tvoid loadDefaultStyles();\n\t\t};\n\n\t\twindow.addEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\t\t};\n\t}, [] );\n\n\treturn null;\n}\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from './api';\nimport { slice } from './store';\n\nexport async function loadDefaultStyles() {\n\ttry {\n\t\tconst response = await apiClient.all();\n\n\t\tconst items = response.data.data;\n\n\t\tdispatch(\n\t\t\tslice.actions.load( {\n\t\t\t\tdata: items,\n\t\t\t} )\n\t\t);\n\t} catch {}\n}\n","import { useEffect } from 'react';\nimport { __privateListenTo as listenTo, registerDataHook, routeCloseEvent } from '@elementor/editor-v1-adapters';\nimport { __getState as getState } from '@elementor/store';\n\nimport { loadDefaultStyles } from '../load-default-styles';\nimport { selectIsDirty } from '../store';\n\nconst V2_PANEL_ROUTE = 'panel/v2';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tvoid loadDefaultStyles();\n\n\t\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait loadDefaultStyles();\n\t\t} );\n\n\t\tconst unsubscribe = listenTo( routeCloseEvent( V2_PANEL_ROUTE ), () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid loadDefaultStyles();\n\t\t} );\n\n\t\treturn unsubscribe;\n\t}, [] );\n\n\treturn null;\n}\n"],"mappings":"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","names":["React","import_react","import_editor_editing_panel","import_editor_styles_repository","import_store","import_ui","import_i18n","import_store","createSlice","createSelector","getState","dispatch","subscribeWithSelector","import_store","getState","dispatch","React","import_ui","import_i18n","useSelector","dispatch","import_editor_editing_panel","import_editor_styles_repository","import_store","import_react","import_store","dispatch","import_react","import_store","getState","listenTo","registerSlice"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/default-styles-tab-embedded.tsx","../src/allowed-tags.ts","../src/default-styles-provider.ts","../src/capabilities.ts","../src/store.ts","../src/save-default-styles.ts","../src/api.ts","../src/modified-sections.ts","../src/utils/tracking.ts","../src/components/tag-chip.tsx","../src/components/tag-state-menu.tsx","../src/init.ts","../src/components/global-styles-import-listener.tsx","../src/load-default-styles.ts","../src/components/populate-store.tsx"],"sourcesContent":["export { DefaultStylesTabEmbedded } from './components/default-styles-tab-embedded';\nexport { init } from './init';\nexport { trackDefaultStyles } from './utils/tracking';\n","import * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n\tControlActionsProvider,\n\tControlReplacementsProvider,\n\tgetControlReplacements,\n} from '@elementor/editor-controls';\nimport {\n\tClassesPropProvider,\n\tCreatableAutocomplete,\n\tElementProvider,\n\ttype Option,\n\tSectionsList,\n\tStyleInheritanceProvider,\n\tStyleProvider,\n\tStyleSections,\n\tStyleTabSlot,\n} from '@elementor/editor-editing-panel';\nimport { type Element, type ElementType } from '@elementor/editor-elements';\nimport { useActiveBreakpoint } from '@elementor/editor-responsive';\nimport { type StyleDefinitionID, type StyleDefinitionState } from '@elementor/editor-styles';\nimport { useUserStylesCapability } from '@elementor/editor-styles-repository';\nimport { SaveChangesDialog, ThemeProvider, useDialog } from '@elementor/editor-ui';\nimport { controlActionsMenu } from '@elementor/menus';\nimport { useMutation } from '@elementor/query';\nimport { getSessionStorageItem, SessionStorageProvider, setSessionStorageItem } from '@elementor/session';\nimport { __dispatch as dispatch, __getState as getState, __useSelector as useSelector } from '@elementor/store';\nimport {\n\ttype AutocompleteChangeReason,\n\tBox,\n\tButton,\n\tErrorBoundary,\n\tFormControl,\n\tFormLabel,\n\tStack,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport {\n\ttype AllowedHtmlTag,\n\tgetAllowedDefaultStyleTags,\n\tgetDefaultActiveTag,\n\tisAllowedDefaultStyleTag,\n} from '../allowed-tags';\nimport { DEFAULT_STYLES_PROVIDER_KEY } from '../default-styles-provider';\nimport { getChangedTags, saveDefaultStyles } from '../save-default-styles';\nimport { selectIsDirty, slice, type StateWithDefaultStyles } from '../store';\nimport { trackDefaultStyles } from '../utils/tracking';\nimport { TagChip } from './tag-chip';\n\nconst { useMenuItems } = controlActionsMenu;\n\nconst SHIM_ELEMENT_ID = 'default-styles-editor-shim';\nconst SHIM_CLASSES_PROP = '__default_styles_classes__';\nconst TAG_SELECTOR_ID = 'default-styles-tag-selector';\nconst LAST_ACTIVE_TAG_SESSION_PREFIX = 'default-styles';\nconst LAST_ACTIVE_TAG_SESSION_KEY = 'last-active-tag';\nconst LAST_ACTIVE_TAG_STORAGE_KEY = `${ LAST_ACTIVE_TAG_SESSION_PREFIX }/${ LAST_ACTIVE_TAG_SESSION_KEY }`;\n\nfunction readStoredActiveTag( allowedTags: AllowedHtmlTag[] ): AllowedHtmlTag {\n\tconst storedTag = getSessionStorageItem< AllowedHtmlTag >( LAST_ACTIVE_TAG_STORAGE_KEY );\n\n\tif ( storedTag && isAllowedDefaultStyleTag( storedTag, allowedTags ) ) {\n\t\treturn storedTag;\n\t}\n\n\treturn getDefaultActiveTag( allowedTags );\n}\n\nfunction toTagChip( tag: AllowedHtmlTag ): Option {\n\treturn { label: tag, value: tag, fixed: true };\n}\n\nconst shimElement: Element = {\n\tid: SHIM_ELEMENT_ID,\n\ttype: 'default-style',\n};\n\nconst shimElementType: ElementType = {\n\tkey: 'default-style',\n\tcontrols: [],\n\tpropsSchema: {},\n\ttitle: __( 'Default Style', 'elementor' ),\n};\n\nexport type DefaultStylesTabEmbeddedProps = {\n\tonRequestClose: () => void | Promise< void >;\n\tonExposeCloseAttempt?: ( attemptClose: ( () => void ) | null ) => void;\n};\n\nexport function DefaultStylesTabEmbedded( { onRequestClose, onExposeCloseAttempt }: DefaultStylesTabEmbeddedProps ) {\n\tconst allowedTags = useMemo( () => getAllowedDefaultStyleTags(), [] );\n\tconst tagOptions = useMemo< Option[] >(\n\t\t() => allowedTags.map( ( tag ) => ( { label: tag, value: tag } ) ),\n\t\t[ allowedTags ]\n\t);\n\tconst [ selectedTag, setSelectedTagState ] = useState< AllowedHtmlTag >( () => readStoredActiveTag( allowedTags ) );\n\tconst [ activeStyleState, setActiveStyleState ] = useState< StyleDefinitionState | null >( null );\n\tconst breakpoint = useActiveBreakpoint();\n\tconst menuItems = useMenuItems().default;\n\tconst controlReplacements = getControlReplacements();\n\tconst isDirty = useSelector( selectIsDirty );\n\tconst { mutateAsync: save, isPending: isSaving } = useSave();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\tconst { userCan } = useUserStylesCapability();\n\tconst canEdit = userCan( DEFAULT_STYLES_PROVIDER_KEY ).updateProps;\n\n\tconst setSelectedTag = ( tag: AllowedHtmlTag ) => {\n\t\tsetSelectedTagState( tag );\n\t\tsetSessionStorageItem( LAST_ACTIVE_TAG_STORAGE_KEY, tag );\n\t};\n\n\tconst handleClosePanel = useCallback( () => {\n\t\tif ( canEdit && isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\tvoid onRequestClose();\n\t}, [ canEdit, isDirty, onRequestClose, openSaveChangesDialog ] );\n\n\tuseEffect( () => {\n\t\tif ( ! onExposeCloseAttempt ) {\n\t\t\treturn;\n\t\t}\n\n\t\tonExposeCloseAttempt( () => handleClosePanel() );\n\n\t\treturn () => onExposeCloseAttempt( null );\n\t}, [ onExposeCloseAttempt, handleClosePanel ] );\n\n\tusePreventUnload( canEdit && isDirty );\n\n\tconst handleTagSelect = ( _selected: Option[], reason: AutocompleteChangeReason, option: Option ) => {\n\t\tif ( reason !== 'selectOption' || ! option.value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedTag( option.value as AllowedHtmlTag );\n\t\tsetActiveStyleState( null );\n\t};\n\n\tconst resetAndClosePanel = () => {\n\t\tconst tagsDiscarded = getChangedTags( getState() as StateWithDefaultStyles );\n\n\t\ttrackDefaultStyles( {\n\t\t\tevent: 'changesDiscarded',\n\t\t\ttags_discarded: tagsDiscarded,\n\t\t\ttags_discarded_count: tagsDiscarded.length,\n\t\t} );\n\t\tdispatch( slice.actions.reset() );\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\tconst handleSaveAndContinue = async () => {\n\t\ttry {\n\t\t\tawait save();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\treturn (\n\t\t<ErrorBoundary fallback={ null }>\n\t\t\t<ThemeProvider>\n\t\t\t\t<ControlActionsProvider items={ menuItems }>\n\t\t\t\t\t<ControlReplacementsProvider replacements={ controlReplacements }>\n\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\t\tminHeight: 0,\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Box sx={ { flex: 1, minHeight: 0, overflow: 'auto' } }>\n\t\t\t\t\t\t\t\t<Stack sx={ { px: 2, pt: 1, gap: 1 } }>\n\t\t\t\t\t\t\t\t\t<FormControl fullWidth size=\"small\">\n\t\t\t\t\t\t\t\t\t\t<FormLabel htmlFor={ TAG_SELECTOR_ID } size=\"small\" sx={ { mb: 1 } }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Tag', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<CreatableAutocomplete< Option >\n\t\t\t\t\t\t\t\t\t\t\tid={ TAG_SELECTOR_ID }\n\t\t\t\t\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'Type tag name', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t\toptions={ tagOptions }\n\t\t\t\t\t\t\t\t\t\t\tselected={ [ toTagChip( selectedTag ) ] }\n\t\t\t\t\t\t\t\t\t\t\tonSelect={ handleTagSelect }\n\t\t\t\t\t\t\t\t\t\t\trenderTags={ ( values, getTagProps ) =>\n\t\t\t\t\t\t\t\t\t\t\t\tvalues.map( ( value, index ) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TagChip\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={ value.value ?? value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={ value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchipProps={ getTagProps( { index } ) }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tactiveState={ activeStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelectState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) )\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t<ElementProvider\n\t\t\t\t\t\t\t\t\telement={ shimElement }\n\t\t\t\t\t\t\t\t\telementType={ shimElementType }\n\t\t\t\t\t\t\t\t\tsettings={ {} }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ClassesPropProvider prop={ SHIM_CLASSES_PROP }>\n\t\t\t\t\t\t\t\t\t\t<StyleProvider\n\t\t\t\t\t\t\t\t\t\t\tmeta={ {\n\t\t\t\t\t\t\t\t\t\t\t\tbreakpoint,\n\t\t\t\t\t\t\t\t\t\t\t\tstate: activeStyleState,\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tid={ selectedTag as StyleDefinitionID }\n\t\t\t\t\t\t\t\t\t\t\tsetId={ () => {} }\n\t\t\t\t\t\t\t\t\t\t\tsetMetaState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<SessionStorageProvider prefix={ selectedTag }>\n\t\t\t\t\t\t\t\t\t\t\t\t<StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleSections />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleTabSlot />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: '150px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t</SessionStorageProvider>\n\t\t\t\t\t\t\t\t\t\t</StyleProvider>\n\t\t\t\t\t\t\t\t\t</ClassesPropProvider>\n\t\t\t\t\t\t\t\t</ElementProvider>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t{ canEdit ? (\n\t\t\t\t\t\t\t\t<Box sx={ { flexShrink: 0, px: 2, py: 1.5 } }>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\t\t\t\tonClick={ () => void save() }\n\t\t\t\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\t\t\t\tloading={ isSaving }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</ControlReplacementsProvider>\n\t\t\t\t</ControlActionsProvider>\n\n\t\t\t\t{ canEdit && isSaveChangesDialogOpen && (\n\t\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t\t<SaveChangesDialog.Title onClose={ closeSaveChangesDialog }>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.Title>\n\t\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t\t{ __( 'You have unsaved changes in Default Styles.', 'elementor' ) }\n\t\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\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\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\t\tdiscard: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Discard', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: resetAndClosePanel,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: handleSaveAndContinue,\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</SaveChangesDialog>\n\t\t\t\t) }\n\t\t\t</ThemeProvider>\n\t\t</ErrorBoundary>\n\t);\n}\n\nfunction useSave() {\n\treturn useMutation( {\n\t\tmutationFn: () => saveDefaultStyles(),\n\t} );\n}\n\nfunction usePreventUnload( isDirty: boolean ) {\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","type ExtendedWindow = Window & {\n\telementor: {\n\t\tconfig: {\n\t\t\tatomic?: {\n\t\t\t\tdefault_styles?: {\n\t\t\t\t\tallowed_tags?: string[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst getElementorConfig = () => ( window as unknown as ExtendedWindow ).elementor?.config ?? {};\n\nexport const getAllowedDefaultStyleTags = (): string[] => {\n\tconst tags = getElementorConfig().atomic?.default_styles?.allowed_tags;\n\n\tif ( ! tags?.length ) {\n\t\treturn [];\n\t}\n\n\treturn tags;\n};\n\nexport type AllowedHtmlTag = string;\n\nexport const getDefaultActiveTag = ( tags: string[] ): AllowedHtmlTag => {\n\tif ( tags.includes( 'h1' ) ) {\n\t\treturn 'h1';\n\t}\n\n\treturn tags[ 0 ] ?? '';\n};\n\nexport const isAllowedDefaultStyleTag = ( tag: string, tags = getAllowedDefaultStyleTags() ): tag is AllowedHtmlTag =>\n\ttags.includes( tag );\n","import { type StyleDefinition, type StyleDefinitionID } 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 { getAllowedDefaultStyleTags } from './allowed-tags';\nimport { getCapabilities } from './capabilities';\nimport { selectData, slice } from './store';\n\nexport const DEFAULT_STYLES_PROVIDER_KEY = 'default-styles';\nexport const DEFAULT_STYLES_CSS_NAME_PREFIX = 'e-default-';\n\nconst resolveCssName = ( id: StyleDefinitionID ) => `${ DEFAULT_STYLES_CSS_NAME_PREFIX }${ id }`;\n\nconst placeholderDefinition = ( id: StyleDefinitionID ): StyleDefinition => ( {\n\tid,\n\tlabel: id,\n\ttype: 'class',\n\tvariants: [],\n} );\n\nconst asClassDefinition = ( style: StyleDefinition ): StyleDefinition => ( {\n\t...style,\n\ttype: 'class',\n} );\n\nexport const defaultStylesStylesProvider = createStylesProvider( {\n\tkey: DEFAULT_STYLES_PROVIDER_KEY,\n\tpriority: 15,\n\tlabels: {\n\t\tsingular: __( 'tag', 'elementor' ),\n\t\tplural: __( 'tags', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithStates( cb ),\n\tcapabilities: getCapabilities(),\n\tactions: {\n\t\tall: () =>\n\t\t\tgetAllowedDefaultStyleTags().map( ( tag ) => {\n\t\t\t\tconst style = selectData( getState() )[ tag ];\n\n\t\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( tag );\n\t\t\t} ),\n\t\tget: ( id ) => {\n\t\t\tconst style = selectData( getState() )[ id ];\n\n\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( id );\n\t\t},\n\t\tresolveCssName,\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.deleteTag( 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\tmode: args.mode,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tupdateCustomCss: ( 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\tcustom_css: args.custom_css,\n\t\t\t\t\tprops: {},\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n\nconst subscribeWithStates = (\n\tcb: ( previous: Record< string, StyleDefinition >, current: Record< string, StyleDefinition > ) => void\n) => {\n\tlet previousState = selectData( getState() );\n\n\treturn subscribeWithSelector(\n\t\t( state ) => selectData( state ),\n\t\t( currentState ) => {\n\t\t\tcb( previousState, currentState );\n\t\t\tpreviousState = currentState;\n\t\t}\n\t);\n};\n","import { type UserCapabilities } from '@elementor/editor-styles-repository';\n\nexport const UPDATE_DEFAULT_STYLES_CAPABILITY_KEY = 'manage_options';\n\nexport const getCapabilities = (): UserCapabilities => {\n\treturn {\n\t\tupdate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tcreate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tdelete: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tupdateProps: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t};\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\ttype CustomCss,\n\tgetNonEmptyVariants,\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\ntype DefaultStylesState = {\n\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\tinitialData: Record< StyleDefinitionID, StyleDefinition >;\n\tisDirty: boolean;\n};\n\nconst initialState: DefaultStylesState = {\n\tdata: {},\n\tinitialData: {},\n\tisDirty: false,\n};\n\nexport type StateWithDefaultStyles = SliceState< typeof slice >;\n\nconst SLICE_NAME = 'defaultStyles';\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: { data },\n\t\t\t}: PayloadAction< {\n\t\t\t\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\t\t\t} >\n\t\t) {\n\t\t\tconst normalizedData = Array.isArray( data ) ? {} : data;\n\n\t\t\tstate.initialData = structuredClone( normalizedData );\n\t\t\tstate.data = structuredClone( normalizedData );\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tstate.data[ payload.style.id ] = {\n\t\t\t\t...state.data[ payload.style.id ],\n\t\t\t\t...payload.style,\n\t\t\t} as StyleDefinition;\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< {\n\t\t\t\tid: StyleDefinitionID;\n\t\t\t\tmeta: StyleDefinitionVariant[ 'meta' ];\n\t\t\t\tprops: Props;\n\t\t\t\tcustom_css?: CustomCss | null;\n\t\t\t\tmode?: 'merge' | 'replace';\n\t\t\t} >\n\t\t) {\n\t\t\tconst style = state.data[ payload.id ] ?? {\n\t\t\t\tid: payload.id,\n\t\t\t\tlabel: payload.id,\n\t\t\t\ttype: 'class' as const,\n\t\t\t\tvariants: [],\n\t\t\t};\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tlet customCss = ( 'custom_css' in payload ? payload.custom_css : variant?.custom_css ) ?? null;\n\t\t\tcustomCss = customCss?.raw ? customCss : null;\n\n\t\t\tconst payloadProps = JSON.parse( JSON.stringify( payload.props ) ) as Props;\n\t\t\tconst mode = payload.mode ?? 'merge';\n\n\t\t\tif ( variant ) {\n\t\t\t\tconst variantProps = extractVariantProps( mode, variant );\n\t\t\t\tvariant.props = mergeProps( variantProps, payloadProps );\n\t\t\t\tvariant.custom_css = customCss;\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( {\n\t\t\t\t\tmeta: payload.meta,\n\t\t\t\t\tprops: mergeProps( {}, payloadProps ),\n\t\t\t\t\tcustom_css: customCss,\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tstyle.variants = getNonEmptyVariants( style );\n\n\t\t\tstate.data[ payload.id ] = style;\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state ) {\n\t\t\tstate.data = state.initialData;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tcommit( state ) {\n\t\t\tstate.initialData = state.data;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tdeleteTag( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete state.data[ payload ];\n\t\t\tstate.isDirty = true;\n\t\t},\n\t},\n} );\n\nfunction extractVariantProps( mode: string, variant: StyleDefinitionVariant ) {\n\tif ( 'replace' === mode ) {\n\t\treturn {};\n\t}\n\treturn JSON.parse( JSON.stringify( variant.props ) ) as Props;\n}\n\nexport const selectData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.data,\n\t( data ) => data\n);\n\nexport const selectIsDirty = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.isDirty,\n\t( isDirty ) => isDirty\n);\n\nexport const selectInitialData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.initialData,\n\t( initialData ) => initialData\n);\n\nexport const selectTagStyle = createSelector(\n\t[ selectData, ( _state: StateWithDefaultStyles, id: StyleDefinitionID ) => id ],\n\t( data, id ) => data[ id ]\n);\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\nimport { hash } from '@elementor/utils';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\nimport { apiClient } from './api';\nimport { getModifiedSections } from './modified-sections';\nimport { selectData, selectInitialData, selectIsDirty, slice, type StateWithDefaultStyles } from './store';\nimport { trackDefaultStyles } from './utils/tracking';\n\nexport function getChangedTags( state: StateWithDefaultStyles ): AllowedHtmlTag[] {\n\tconst current = selectData( state );\n\tconst initial = selectInitialData( state );\n\n\tconst changed: AllowedHtmlTag[] = [];\n\n\tObject.keys( current ).forEach( ( tag ) => {\n\t\tconst currentStyle = current[ tag ];\n\t\tconst initialStyle = initial[ tag ];\n\n\t\tif ( ! initialStyle || hash( currentStyle ) !== hash( initialStyle ) ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\tObject.keys( initial ).forEach( ( tag ) => {\n\t\tif ( ! current[ tag ] ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\treturn changed;\n}\n\nexport async function saveDefaultStyles() {\n\tconst state = getState() as StateWithDefaultStyles;\n\n\tif ( ! selectIsDirty( state ) ) {\n\t\treturn;\n\t}\n\n\tconst data = selectData( state );\n\tconst initialData = selectInitialData( state );\n\tconst changedTags = getChangedTags( state );\n\n\tawait Promise.all(\n\t\tchangedTags.map( async ( tag ) => {\n\t\t\tconst style = data[ tag ];\n\n\t\t\tif ( ! style || style.variants.length === 0 ) {\n\t\t\t\tawait apiClient.delete( tag );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait apiClient.put( tag, style.variants );\n\t\t} )\n\t).catch( ( error ) => {\n\t\ttrackDefaultStyles( { event: 'saveFailed', tags_changed_count: changedTags.length } );\n\n\t\tthrow error;\n\t} );\n\n\tchangedTags.forEach( ( tag ) => {\n\t\tconst isUnset = ! data[ tag ]?.variants.length;\n\n\t\ttrackDefaultStyles( {\n\t\t\tevent: 'tagSaved',\n\t\t\ttag,\n\t\t\taction: isUnset ? 'unset' : 'set',\n\t\t\tsections_modified: isUnset ? [] : getModifiedSections( initialData[ tag ], data[ tag ] ),\n\t\t} );\n\t} );\n\n\tdispatch( slice.actions.commit() );\n}\n","import { type StyleDefinition, type StyleDefinitionID } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\n\nconst RESOURCE_URL = '/default-styles';\nconst BASE_URL = 'elementor/v1';\n\nexport type DefaultStylesMap = Record< StyleDefinitionID, StyleDefinition >;\n\ntype DefaultStylesHttpResponse = HttpResponse< DefaultStylesMap >;\n\nexport const apiClient = {\n\tall: () => httpService().get< DefaultStylesHttpResponse >( `${ BASE_URL }${ RESOURCE_URL }` ),\n\n\tput: ( tag: AllowedHtmlTag, variants: StyleDefinition[ 'variants' ] ) =>\n\t\thttpService().put( `${ BASE_URL }${ RESOURCE_URL }/${ tag }`, {\n\t\t\ttype: 'class',\n\t\t\tvariants,\n\t\t} ),\n\n\tdelete: ( tag: AllowedHtmlTag ) => httpService().delete( `${ BASE_URL }${ RESOURCE_URL }/${ tag }` ),\n};\n","import { STYLE_SECTIONS } from '@elementor/editor-editing-panel';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { hash } from '@elementor/utils';\n\nconst CUSTOM_CSS_SECTION = 'custom_css';\n\nexport function getModifiedSections( initialStyle?: StyleDefinition, currentStyle?: StyleDefinition ): string[] {\n\tconst sectionByProp = new Map(\n\t\tSTYLE_SECTIONS.flatMap( ( { name, fields } ) => fields.map( ( field ) => [ field, name.toLowerCase() ] ) )\n\t);\n\tconst modified = new Set< string >();\n\tconst variantsOf = ( style?: StyleDefinition ) =>\n\t\tnew Map( ( style?.variants ?? [] ).map( ( variant ) => [ JSON.stringify( variant.meta ), variant ] ) );\n\tconst initialVariants = variantsOf( initialStyle );\n\tconst currentVariants = variantsOf( currentStyle );\n\n\tnew Set( [ ...initialVariants.keys(), ...currentVariants.keys() ] ).forEach( ( meta ) => {\n\t\tconst initial = initialVariants.get( meta );\n\t\tconst current = currentVariants.get( meta );\n\n\t\tnew Set( [ ...Object.keys( initial?.props ?? {} ), ...Object.keys( current?.props ?? {} ) ] ).forEach(\n\t\t\t( prop ) => {\n\t\t\t\tif ( isChanged( initial?.props[ prop ], current?.props[ prop ] ) && sectionByProp.has( prop ) ) {\n\t\t\t\t\tmodified.add( sectionByProp.get( prop ) as string );\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tif ( isChanged( initial?.custom_css, current?.custom_css ) ) {\n\t\t\tmodified.add( CUSTOM_CSS_SECTION );\n\t\t}\n\t} );\n\n\treturn [ ...modified ];\n}\n\nfunction isChanged( initial: unknown, current: unknown ) {\n\treturn hash( { value: initial ?? null } ) !== hash( { value: current ?? null } );\n}\n","import { getMixpanel } from '@elementor/events';\n\nimport { type AllowedHtmlTag } from '../allowed-tags';\n\ntype EventMap = {\n\tpanelOpened: object;\n\ttagSaved: { tag: AllowedHtmlTag; action: 'set' | 'unset'; sections_modified: string[] };\n\tsaveFailed: { tags_changed_count: number };\n\tchangesDiscarded: { tags_discarded: AllowedHtmlTag[]; tags_discarded_count: number };\n};\n\nexport type DefaultStylesTrackingEvent = {\n\t[ K in keyof EventMap ]: { event: K } & EventMap[ K ];\n}[ keyof EventMap ];\n\nconst EVENT_PROPERTIES: Record< keyof EventMap, Record< string, string > > = {\n\tpanelOpened: {\n\t\ttarget_type: 'tab',\n\t\ttarget_name: 'defaults_tab',\n\t\ttarget_location: 'design_system_panel',\n\t\tinteraction_result: 'panel_opened',\n\t},\n\ttagSaved: {\n\t\ttarget_type: 'button',\n\t\ttarget_name: 'save_changes',\n\t\ttarget_location: 'design_system_panel',\n\t\tinteraction_result: 'tag_saved',\n\t\texecuted_by: 'user',\n\t},\n\tsaveFailed: {\n\t\ttarget_type: 'button',\n\t\ttarget_name: 'save_changes',\n\t\ttarget_location: 'design_system_panel',\n\t\tinteraction_result: 'save_failed',\n\t\texecuted_by: 'user',\n\t},\n\tchangesDiscarded: {\n\t\ttarget_type: 'button',\n\t\ttarget_name: 'discard_changes',\n\t\ttarget_location: 'dialog',\n\t\tinteraction_result: 'changes_discarded',\n\t},\n};\n\nexport const trackDefaultStyles = ( payload: DefaultStylesTrackingEvent ) => {\n\tconst { dispatchEvent, config } = getMixpanel();\n\tconst name = config?.names?.default_styles?.[ payload.event ];\n\n\tif ( ! name ) {\n\t\treturn;\n\t}\n\n\tconst { event, ...eventData } = payload;\n\n\ttry {\n\t\tdispatchEvent?.( name, {\n\t\t\twindow_name: config?.appTypes?.editor,\n\t\t\tapp_type: config?.appTypes?.editor,\n\t\t\tinteraction_type: 'click',\n\t\t\t...EVENT_PROPERTIES[ event ],\n\t\t\t...eventData,\n\t\t} );\n\t} catch {\n\t\t// Silently ignore tracking errors so they don't break the user flow.\n\t}\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport {\n\ttype AutocompleteRenderGetTagProps,\n\tbindTrigger,\n\tChip,\n\tStack,\n\ttype Theme,\n\tTypography,\n\tUnstableChipGroup,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { TagStateMenu } from './tag-state-menu';\n\nconst CHIP_SIZE = 'tiny';\n\ntype TagChipProps = {\n\tlabel: string;\n\tchipProps: ReturnType< AutocompleteRenderGetTagProps >;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagChip( { label, chipProps, activeState, onSelectState }: TagChipProps ) {\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tpopupId: 'tag-state-menu',\n\t} );\n\tconst [ chipRef, setChipRef ] = useState< HTMLElement | null >( null );\n\n\tconst { onDelete: _onDelete, ...chipGroupProps } = chipProps;\n\tconst isShowingState = Boolean( activeState );\n\n\treturn (\n\t\t<>\n\t\t\t<UnstableChipGroup\n\t\t\t\tref={ setChipRef }\n\t\t\t\t{ ...chipGroupProps }\n\t\t\t\taria-label={ `Edit ${ label }` }\n\t\t\t\trole=\"group\"\n\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t'&.MuiChipGroup-root.MuiAutocomplete-tag': {\n\t\t\t\t\t\tmargin: theme.spacing( 0.125 ),\n\t\t\t\t\t},\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t<Chip\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={ label }\n\t\t\t\t\tvariant={ isShowingState ? 'standard' : 'filled' }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tif ( isShowingState ) {\n\t\t\t\t\t\t\tonSelectState( null );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t\t<Chip\n\t\t\t\t\ticon={ isShowingState ? undefined : <DotsVerticalIcon fontSize=\"tiny\" /> }\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={\n\t\t\t\t\t\tisShowingState ? (\n\t\t\t\t\t\t\t<Stack direction=\"row\" gap={ 0.5 } alignItems=\"center\">\n\t\t\t\t\t\t\t\t<Typography variant=\"inherit\">{ activeState }</Typography>\n\t\t\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\t{ ...bindTrigger( popupState ) }\n\t\t\t\t\taria-label={ __( 'Open tag state menu', 'elementor' ) }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t...( ! isShowingState ? { paddingLeft: 0 } : {} ),\n\t\t\t\t\t\t'.MuiChip-label': isShowingState ? { paddingRight: 0 } : { padding: 0 },\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t</UnstableChipGroup>\n\t\t\t<TagStateMenu\n\t\t\t\tpopupState={ popupState }\n\t\t\t\tanchorEl={ chipRef }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { DEFAULT_PSEUDO_STATES, PseudoStateMenuItems } from '@elementor/editor-editing-panel';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { bindMenu, Menu, type PopupState } from '@elementor/ui';\n\ntype TagStateMenuProps = {\n\tpopupState: PopupState;\n\tanchorEl: HTMLElement | null;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagStateMenu( { popupState, anchorEl, activeState, onSelectState }: TagStateMenuProps ) {\n\treturn (\n\t\t<Menu\n\t\t\tMenuListProps={ { dense: true, sx: { minWidth: '160px' } } }\n\t\t\t{ ...bindMenu( popupState ) }\n\t\t\tanchorEl={ anchorEl }\n\t\t\tanchorOrigin={ { vertical: 'bottom', horizontal: 'left' } }\n\t\t\ttransformOrigin={ { horizontal: 'left', vertical: -4 } }\n\t\t\tdisableAutoFocusItem\n\t\t>\n\t\t\t<PseudoStateMenuItems\n\t\t\t\tstates={ DEFAULT_PSEUDO_STATES }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t\tonClose={ popupState.close }\n\t\t\t/>\n\t\t</Menu>\n\t);\n}\n","import { injectIntoLogic } from '@elementor/editor';\nimport { registerElementPanelDefaults } from '@elementor/editor-editing-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { GlobalStylesImportListener } from './components/global-styles-import-listener';\nimport { PopulateStore } from './components/populate-store';\nimport { defaultStylesStylesProvider } from './default-styles-provider';\nimport { slice } from './store';\n\nexport function init() {\n\tregisterSlice( slice );\n\n\tregisterElementPanelDefaults( 'default-style', {\n\t\tdefaultTab: 'style',\n\t\tdefaultSectionsExpanded: {\n\t\t\tstyle: [],\n\t\t},\n\t} );\n\n\tstylesRepository.register( defaultStylesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-import-listener',\n\t\tcomponent: GlobalStylesImportListener,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n}\n","import { useEffect } from 'react';\nimport { GLOBAL_STYLES_IMPORTED_EVENT } from '@elementor/editor-canvas';\n\nimport { loadDefaultStyles } from '../load-default-styles';\n\nexport function GlobalStylesImportListener() {\n\tuseEffect( () => {\n\t\tconst handleGlobalStylesImported = () => {\n\t\t\tvoid loadDefaultStyles();\n\t\t};\n\n\t\twindow.addEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\t\t};\n\t}, [] );\n\n\treturn null;\n}\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from './api';\nimport { slice } from './store';\n\nexport async function loadDefaultStyles() {\n\ttry {\n\t\tconst response = await apiClient.all();\n\n\t\tconst items = response.data.data;\n\n\t\tdispatch(\n\t\t\tslice.actions.load( {\n\t\t\t\tdata: items,\n\t\t\t} )\n\t\t);\n\t} catch {}\n}\n","import { useEffect } from 'react';\nimport { __privateListenTo as listenTo, registerDataHook, routeCloseEvent } from '@elementor/editor-v1-adapters';\nimport { __getState as getState } from '@elementor/store';\n\nimport { loadDefaultStyles } from '../load-default-styles';\nimport { selectIsDirty } from '../store';\n\nconst V2_PANEL_ROUTE = 'panel/v2';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tvoid loadDefaultStyles();\n\n\t\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait loadDefaultStyles();\n\t\t} );\n\n\t\tconst unsubscribe = listenTo( routeCloseEvent( V2_PANEL_ROUTE ), () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid loadDefaultStyles();\n\t\t} );\n\n\t\treturn unsubscribe;\n\t}, [] );\n\n\treturn null;\n}\n"],"mappings":"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","names":["React","import_react","import_editor_editing_panel","import_editor_styles_repository","import_store","import_ui","import_i18n","import_store","createSlice","createSelector","getState","dispatch","subscribeWithSelector","import_store","import_utils","getState","dispatch","React","import_ui","import_i18n","import_editor_editing_panel","useSelector","getState","dispatch","import_editor_editing_panel","import_editor_styles_repository","import_store","import_react","import_store","dispatch","import_react","import_store","getState","listenTo","registerSlice"]}
package/dist/index.mjs CHANGED
@@ -22,7 +22,7 @@ import { SaveChangesDialog, ThemeProvider, useDialog } from "@elementor/editor-u
22
22
  import { controlActionsMenu } from "@elementor/menus";
23
23
  import { useMutation } from "@elementor/query";
24
24
  import { getSessionStorageItem, SessionStorageProvider, setSessionStorageItem } from "@elementor/session";
25
- import { __dispatch as dispatch3, __useSelector as useSelector } from "@elementor/store";
25
+ import { __dispatch as dispatch3, __getState as getState3, __useSelector as useSelector } from "@elementor/store";
26
26
  import {
27
27
  Box,
28
28
  Button,
@@ -249,7 +249,7 @@ var subscribeWithStates = (cb) => {
249
249
 
250
250
  // src/save-default-styles.ts
251
251
  import { __dispatch as dispatch2, __getState as getState2 } from "@elementor/store";
252
- import { hash } from "@elementor/utils";
252
+ import { hash as hash2 } from "@elementor/utils";
253
253
 
254
254
  // src/api.ts
255
255
  import { httpService } from "@elementor/http-client";
@@ -264,6 +264,87 @@ var apiClient = {
264
264
  delete: (tag) => httpService().delete(`${BASE_URL}${RESOURCE_URL}/${tag}`)
265
265
  };
266
266
 
267
+ // src/modified-sections.ts
268
+ import { STYLE_SECTIONS } from "@elementor/editor-editing-panel";
269
+ import { hash } from "@elementor/utils";
270
+ var CUSTOM_CSS_SECTION = "custom_css";
271
+ function getModifiedSections(initialStyle, currentStyle) {
272
+ const sectionByProp = new Map(
273
+ STYLE_SECTIONS.flatMap(({ name, fields }) => fields.map((field) => [field, name.toLowerCase()]))
274
+ );
275
+ const modified = /* @__PURE__ */ new Set();
276
+ const variantsOf = (style) => new Map((style?.variants ?? []).map((variant) => [JSON.stringify(variant.meta), variant]));
277
+ const initialVariants = variantsOf(initialStyle);
278
+ const currentVariants = variantsOf(currentStyle);
279
+ (/* @__PURE__ */ new Set([...initialVariants.keys(), ...currentVariants.keys()])).forEach((meta) => {
280
+ const initial = initialVariants.get(meta);
281
+ const current = currentVariants.get(meta);
282
+ (/* @__PURE__ */ new Set([...Object.keys(initial?.props ?? {}), ...Object.keys(current?.props ?? {})])).forEach(
283
+ (prop) => {
284
+ if (isChanged(initial?.props[prop], current?.props[prop]) && sectionByProp.has(prop)) {
285
+ modified.add(sectionByProp.get(prop));
286
+ }
287
+ }
288
+ );
289
+ if (isChanged(initial?.custom_css, current?.custom_css)) {
290
+ modified.add(CUSTOM_CSS_SECTION);
291
+ }
292
+ });
293
+ return [...modified];
294
+ }
295
+ function isChanged(initial, current) {
296
+ return hash({ value: initial ?? null }) !== hash({ value: current ?? null });
297
+ }
298
+
299
+ // src/utils/tracking.ts
300
+ import { getMixpanel } from "@elementor/events";
301
+ var EVENT_PROPERTIES = {
302
+ panelOpened: {
303
+ target_type: "tab",
304
+ target_name: "defaults_tab",
305
+ target_location: "design_system_panel",
306
+ interaction_result: "panel_opened"
307
+ },
308
+ tagSaved: {
309
+ target_type: "button",
310
+ target_name: "save_changes",
311
+ target_location: "design_system_panel",
312
+ interaction_result: "tag_saved",
313
+ executed_by: "user"
314
+ },
315
+ saveFailed: {
316
+ target_type: "button",
317
+ target_name: "save_changes",
318
+ target_location: "design_system_panel",
319
+ interaction_result: "save_failed",
320
+ executed_by: "user"
321
+ },
322
+ changesDiscarded: {
323
+ target_type: "button",
324
+ target_name: "discard_changes",
325
+ target_location: "dialog",
326
+ interaction_result: "changes_discarded"
327
+ }
328
+ };
329
+ var trackDefaultStyles = (payload) => {
330
+ const { dispatchEvent, config } = getMixpanel();
331
+ const name = config?.names?.default_styles?.[payload.event];
332
+ if (!name) {
333
+ return;
334
+ }
335
+ const { event, ...eventData } = payload;
336
+ try {
337
+ dispatchEvent?.(name, {
338
+ window_name: config?.appTypes?.editor,
339
+ app_type: config?.appTypes?.editor,
340
+ interaction_type: "click",
341
+ ...EVENT_PROPERTIES[event],
342
+ ...eventData
343
+ });
344
+ } catch {
345
+ }
346
+ };
347
+
267
348
  // src/save-default-styles.ts
268
349
  function getChangedTags(state) {
269
350
  const current = selectData(state);
@@ -272,7 +353,7 @@ function getChangedTags(state) {
272
353
  Object.keys(current).forEach((tag) => {
273
354
  const currentStyle = current[tag];
274
355
  const initialStyle = initial[tag];
275
- if (!initialStyle || hash(currentStyle) !== hash(initialStyle)) {
356
+ if (!initialStyle || hash2(currentStyle) !== hash2(initialStyle)) {
276
357
  changed.push(tag);
277
358
  }
278
359
  });
@@ -289,6 +370,7 @@ async function saveDefaultStyles() {
289
370
  return;
290
371
  }
291
372
  const data = selectData(state);
373
+ const initialData = selectInitialData(state);
292
374
  const changedTags = getChangedTags(state);
293
375
  await Promise.all(
294
376
  changedTags.map(async (tag) => {
@@ -299,7 +381,19 @@ async function saveDefaultStyles() {
299
381
  }
300
382
  await apiClient.put(tag, style.variants);
301
383
  })
302
- );
384
+ ).catch((error) => {
385
+ trackDefaultStyles({ event: "saveFailed", tags_changed_count: changedTags.length });
386
+ throw error;
387
+ });
388
+ changedTags.forEach((tag) => {
389
+ const isUnset = !data[tag]?.variants.length;
390
+ trackDefaultStyles({
391
+ event: "tagSaved",
392
+ tag,
393
+ action: isUnset ? "unset" : "set",
394
+ sections_modified: isUnset ? [] : getModifiedSections(initialData[tag], data[tag])
395
+ });
396
+ });
303
397
  dispatch2(slice.actions.commit());
304
398
  }
305
399
 
@@ -487,6 +581,12 @@ function DefaultStylesTabEmbedded({ onRequestClose, onExposeCloseAttempt }) {
487
581
  setActiveStyleState(null);
488
582
  };
489
583
  const resetAndClosePanel = () => {
584
+ const tagsDiscarded = getChangedTags(getState3());
585
+ trackDefaultStyles({
586
+ event: "changesDiscarded",
587
+ tags_discarded: tagsDiscarded,
588
+ tags_discarded_count: tagsDiscarded.length
589
+ });
490
590
  dispatch3(slice.actions.reset());
491
591
  closeSaveChangesDialog();
492
592
  void onRequestClose();
@@ -650,19 +750,19 @@ function GlobalStylesImportListener() {
650
750
  // src/components/populate-store.tsx
651
751
  import { useEffect as useEffect3 } from "react";
652
752
  import { __privateListenTo as listenTo, registerDataHook, routeCloseEvent } from "@elementor/editor-v1-adapters";
653
- import { __getState as getState3 } from "@elementor/store";
753
+ import { __getState as getState4 } from "@elementor/store";
654
754
  var V2_PANEL_ROUTE = "panel/v2";
655
755
  function PopulateStore() {
656
756
  useEffect3(() => {
657
757
  void loadDefaultStyles();
658
758
  registerDataHook("after", "editor/documents/attach-preview", async () => {
659
- if (selectIsDirty(getState3())) {
759
+ if (selectIsDirty(getState4())) {
660
760
  return;
661
761
  }
662
762
  await loadDefaultStyles();
663
763
  });
664
764
  const unsubscribe = listenTo(routeCloseEvent(V2_PANEL_ROUTE), () => {
665
- if (selectIsDirty(getState3())) {
765
+ if (selectIsDirty(getState4())) {
666
766
  return;
667
767
  }
668
768
  void loadDefaultStyles();
@@ -693,6 +793,7 @@ function init() {
693
793
  }
694
794
  export {
695
795
  DefaultStylesTabEmbedded,
696
- init
796
+ init,
797
+ trackDefaultStyles
697
798
  };
698
799
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/default-styles-tab-embedded.tsx","../src/allowed-tags.ts","../src/default-styles-provider.ts","../src/capabilities.ts","../src/store.ts","../src/save-default-styles.ts","../src/api.ts","../src/components/tag-chip.tsx","../src/components/tag-state-menu.tsx","../src/init.ts","../src/components/global-styles-import-listener.tsx","../src/load-default-styles.ts","../src/components/populate-store.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n\tControlActionsProvider,\n\tControlReplacementsProvider,\n\tgetControlReplacements,\n} from '@elementor/editor-controls';\nimport {\n\tClassesPropProvider,\n\tCreatableAutocomplete,\n\tElementProvider,\n\ttype Option,\n\tSectionsList,\n\tStyleInheritanceProvider,\n\tStyleProvider,\n\tStyleSections,\n\tStyleTabSlot,\n} from '@elementor/editor-editing-panel';\nimport { type Element, type ElementType } from '@elementor/editor-elements';\nimport { useActiveBreakpoint } from '@elementor/editor-responsive';\nimport { type StyleDefinitionID, type StyleDefinitionState } from '@elementor/editor-styles';\nimport { useUserStylesCapability } from '@elementor/editor-styles-repository';\nimport { SaveChangesDialog, ThemeProvider, useDialog } from '@elementor/editor-ui';\nimport { controlActionsMenu } from '@elementor/menus';\nimport { useMutation } from '@elementor/query';\nimport { getSessionStorageItem, SessionStorageProvider, setSessionStorageItem } from '@elementor/session';\nimport { __dispatch as dispatch, __useSelector as useSelector } from '@elementor/store';\nimport {\n\ttype AutocompleteChangeReason,\n\tBox,\n\tButton,\n\tErrorBoundary,\n\tFormControl,\n\tFormLabel,\n\tStack,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport {\n\ttype AllowedHtmlTag,\n\tgetAllowedDefaultStyleTags,\n\tgetDefaultActiveTag,\n\tisAllowedDefaultStyleTag,\n} from '../allowed-tags';\nimport { DEFAULT_STYLES_PROVIDER_KEY } from '../default-styles-provider';\nimport { saveDefaultStyles } from '../save-default-styles';\nimport { selectIsDirty, slice } from '../store';\nimport { TagChip } from './tag-chip';\n\nconst { useMenuItems } = controlActionsMenu;\n\nconst SHIM_ELEMENT_ID = 'default-styles-editor-shim';\nconst SHIM_CLASSES_PROP = '__default_styles_classes__';\nconst TAG_SELECTOR_ID = 'default-styles-tag-selector';\nconst LAST_ACTIVE_TAG_SESSION_PREFIX = 'default-styles';\nconst LAST_ACTIVE_TAG_SESSION_KEY = 'last-active-tag';\nconst LAST_ACTIVE_TAG_STORAGE_KEY = `${ LAST_ACTIVE_TAG_SESSION_PREFIX }/${ LAST_ACTIVE_TAG_SESSION_KEY }`;\n\nfunction readStoredActiveTag( allowedTags: AllowedHtmlTag[] ): AllowedHtmlTag {\n\tconst storedTag = getSessionStorageItem< AllowedHtmlTag >( LAST_ACTIVE_TAG_STORAGE_KEY );\n\n\tif ( storedTag && isAllowedDefaultStyleTag( storedTag, allowedTags ) ) {\n\t\treturn storedTag;\n\t}\n\n\treturn getDefaultActiveTag( allowedTags );\n}\n\nfunction toTagChip( tag: AllowedHtmlTag ): Option {\n\treturn { label: tag, value: tag, fixed: true };\n}\n\nconst shimElement: Element = {\n\tid: SHIM_ELEMENT_ID,\n\ttype: 'default-style',\n};\n\nconst shimElementType: ElementType = {\n\tkey: 'default-style',\n\tcontrols: [],\n\tpropsSchema: {},\n\ttitle: __( 'Default Style', 'elementor' ),\n};\n\nexport type DefaultStylesTabEmbeddedProps = {\n\tonRequestClose: () => void | Promise< void >;\n\tonExposeCloseAttempt?: ( attemptClose: ( () => void ) | null ) => void;\n};\n\nexport function DefaultStylesTabEmbedded( { onRequestClose, onExposeCloseAttempt }: DefaultStylesTabEmbeddedProps ) {\n\tconst allowedTags = useMemo( () => getAllowedDefaultStyleTags(), [] );\n\tconst tagOptions = useMemo< Option[] >(\n\t\t() => allowedTags.map( ( tag ) => ( { label: tag, value: tag } ) ),\n\t\t[ allowedTags ]\n\t);\n\tconst [ selectedTag, setSelectedTagState ] = useState< AllowedHtmlTag >( () => readStoredActiveTag( allowedTags ) );\n\tconst [ activeStyleState, setActiveStyleState ] = useState< StyleDefinitionState | null >( null );\n\tconst breakpoint = useActiveBreakpoint();\n\tconst menuItems = useMenuItems().default;\n\tconst controlReplacements = getControlReplacements();\n\tconst isDirty = useSelector( selectIsDirty );\n\tconst { mutateAsync: save, isPending: isSaving } = useSave();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\tconst { userCan } = useUserStylesCapability();\n\tconst canEdit = userCan( DEFAULT_STYLES_PROVIDER_KEY ).updateProps;\n\n\tconst setSelectedTag = ( tag: AllowedHtmlTag ) => {\n\t\tsetSelectedTagState( tag );\n\t\tsetSessionStorageItem( LAST_ACTIVE_TAG_STORAGE_KEY, tag );\n\t};\n\n\tconst handleClosePanel = useCallback( () => {\n\t\tif ( canEdit && isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\tvoid onRequestClose();\n\t}, [ canEdit, isDirty, onRequestClose, openSaveChangesDialog ] );\n\n\tuseEffect( () => {\n\t\tif ( ! onExposeCloseAttempt ) {\n\t\t\treturn;\n\t\t}\n\n\t\tonExposeCloseAttempt( () => handleClosePanel() );\n\n\t\treturn () => onExposeCloseAttempt( null );\n\t}, [ onExposeCloseAttempt, handleClosePanel ] );\n\n\tusePreventUnload( canEdit && isDirty );\n\n\tconst handleTagSelect = ( _selected: Option[], reason: AutocompleteChangeReason, option: Option ) => {\n\t\tif ( reason !== 'selectOption' || ! option.value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedTag( option.value as AllowedHtmlTag );\n\t\tsetActiveStyleState( null );\n\t};\n\n\tconst resetAndClosePanel = () => {\n\t\tdispatch( slice.actions.reset() );\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\tconst handleSaveAndContinue = async () => {\n\t\ttry {\n\t\t\tawait save();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\treturn (\n\t\t<ErrorBoundary fallback={ null }>\n\t\t\t<ThemeProvider>\n\t\t\t\t<ControlActionsProvider items={ menuItems }>\n\t\t\t\t\t<ControlReplacementsProvider replacements={ controlReplacements }>\n\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\t\tminHeight: 0,\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Box sx={ { flex: 1, minHeight: 0, overflow: 'auto' } }>\n\t\t\t\t\t\t\t\t<Stack sx={ { px: 2, pt: 1, gap: 1 } }>\n\t\t\t\t\t\t\t\t\t<FormControl fullWidth size=\"small\">\n\t\t\t\t\t\t\t\t\t\t<FormLabel htmlFor={ TAG_SELECTOR_ID } size=\"small\" sx={ { mb: 1 } }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Tag', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<CreatableAutocomplete< Option >\n\t\t\t\t\t\t\t\t\t\t\tid={ TAG_SELECTOR_ID }\n\t\t\t\t\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'Type tag name', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t\toptions={ tagOptions }\n\t\t\t\t\t\t\t\t\t\t\tselected={ [ toTagChip( selectedTag ) ] }\n\t\t\t\t\t\t\t\t\t\t\tonSelect={ handleTagSelect }\n\t\t\t\t\t\t\t\t\t\t\trenderTags={ ( values, getTagProps ) =>\n\t\t\t\t\t\t\t\t\t\t\t\tvalues.map( ( value, index ) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TagChip\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={ value.value ?? value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={ value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchipProps={ getTagProps( { index } ) }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tactiveState={ activeStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelectState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) )\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t<ElementProvider\n\t\t\t\t\t\t\t\t\telement={ shimElement }\n\t\t\t\t\t\t\t\t\telementType={ shimElementType }\n\t\t\t\t\t\t\t\t\tsettings={ {} }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ClassesPropProvider prop={ SHIM_CLASSES_PROP }>\n\t\t\t\t\t\t\t\t\t\t<StyleProvider\n\t\t\t\t\t\t\t\t\t\t\tmeta={ {\n\t\t\t\t\t\t\t\t\t\t\t\tbreakpoint,\n\t\t\t\t\t\t\t\t\t\t\t\tstate: activeStyleState,\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tid={ selectedTag as StyleDefinitionID }\n\t\t\t\t\t\t\t\t\t\t\tsetId={ () => {} }\n\t\t\t\t\t\t\t\t\t\t\tsetMetaState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<SessionStorageProvider prefix={ selectedTag }>\n\t\t\t\t\t\t\t\t\t\t\t\t<StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleSections />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleTabSlot />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: '150px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t</SessionStorageProvider>\n\t\t\t\t\t\t\t\t\t\t</StyleProvider>\n\t\t\t\t\t\t\t\t\t</ClassesPropProvider>\n\t\t\t\t\t\t\t\t</ElementProvider>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t{ canEdit ? (\n\t\t\t\t\t\t\t\t<Box sx={ { flexShrink: 0, px: 2, py: 1.5 } }>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\t\t\t\tonClick={ () => void save() }\n\t\t\t\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\t\t\t\tloading={ isSaving }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</ControlReplacementsProvider>\n\t\t\t\t</ControlActionsProvider>\n\n\t\t\t\t{ canEdit && isSaveChangesDialogOpen && (\n\t\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t\t<SaveChangesDialog.Title onClose={ closeSaveChangesDialog }>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.Title>\n\t\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t\t{ __( 'You have unsaved changes in Default Styles.', 'elementor' ) }\n\t\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\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\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\t\tdiscard: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Discard', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: resetAndClosePanel,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: handleSaveAndContinue,\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</SaveChangesDialog>\n\t\t\t\t) }\n\t\t\t</ThemeProvider>\n\t\t</ErrorBoundary>\n\t);\n}\n\nfunction useSave() {\n\treturn useMutation( {\n\t\tmutationFn: () => saveDefaultStyles(),\n\t} );\n}\n\nfunction usePreventUnload( isDirty: boolean ) {\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","type ExtendedWindow = Window & {\n\telementor: {\n\t\tconfig: {\n\t\t\tatomic?: {\n\t\t\t\tdefault_styles?: {\n\t\t\t\t\tallowed_tags?: string[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst getElementorConfig = () => ( window as unknown as ExtendedWindow ).elementor?.config ?? {};\n\nexport const getAllowedDefaultStyleTags = (): string[] => {\n\tconst tags = getElementorConfig().atomic?.default_styles?.allowed_tags;\n\n\tif ( ! tags?.length ) {\n\t\treturn [];\n\t}\n\n\treturn tags;\n};\n\nexport type AllowedHtmlTag = string;\n\nexport const getDefaultActiveTag = ( tags: string[] ): AllowedHtmlTag => {\n\tif ( tags.includes( 'h1' ) ) {\n\t\treturn 'h1';\n\t}\n\n\treturn tags[ 0 ] ?? '';\n};\n\nexport const isAllowedDefaultStyleTag = ( tag: string, tags = getAllowedDefaultStyleTags() ): tag is AllowedHtmlTag =>\n\ttags.includes( tag );\n","import { type StyleDefinition, type StyleDefinitionID } 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 { getAllowedDefaultStyleTags } from './allowed-tags';\nimport { getCapabilities } from './capabilities';\nimport { selectData, slice } from './store';\n\nexport const DEFAULT_STYLES_PROVIDER_KEY = 'default-styles';\nexport const DEFAULT_STYLES_CSS_NAME_PREFIX = 'e-default-';\n\nconst resolveCssName = ( id: StyleDefinitionID ) => `${ DEFAULT_STYLES_CSS_NAME_PREFIX }${ id }`;\n\nconst placeholderDefinition = ( id: StyleDefinitionID ): StyleDefinition => ( {\n\tid,\n\tlabel: id,\n\ttype: 'class',\n\tvariants: [],\n} );\n\nconst asClassDefinition = ( style: StyleDefinition ): StyleDefinition => ( {\n\t...style,\n\ttype: 'class',\n} );\n\nexport const defaultStylesStylesProvider = createStylesProvider( {\n\tkey: DEFAULT_STYLES_PROVIDER_KEY,\n\tpriority: 15,\n\tlabels: {\n\t\tsingular: __( 'tag', 'elementor' ),\n\t\tplural: __( 'tags', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithStates( cb ),\n\tcapabilities: getCapabilities(),\n\tactions: {\n\t\tall: () =>\n\t\t\tgetAllowedDefaultStyleTags().map( ( tag ) => {\n\t\t\t\tconst style = selectData( getState() )[ tag ];\n\n\t\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( tag );\n\t\t\t} ),\n\t\tget: ( id ) => {\n\t\t\tconst style = selectData( getState() )[ id ];\n\n\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( id );\n\t\t},\n\t\tresolveCssName,\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.deleteTag( 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\tmode: args.mode,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tupdateCustomCss: ( 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\tcustom_css: args.custom_css,\n\t\t\t\t\tprops: {},\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n\nconst subscribeWithStates = (\n\tcb: ( previous: Record< string, StyleDefinition >, current: Record< string, StyleDefinition > ) => void\n) => {\n\tlet previousState = selectData( getState() );\n\n\treturn subscribeWithSelector(\n\t\t( state ) => selectData( state ),\n\t\t( currentState ) => {\n\t\t\tcb( previousState, currentState );\n\t\t\tpreviousState = currentState;\n\t\t}\n\t);\n};\n","import { type UserCapabilities } from '@elementor/editor-styles-repository';\n\nexport const UPDATE_DEFAULT_STYLES_CAPABILITY_KEY = 'manage_options';\n\nexport const getCapabilities = (): UserCapabilities => {\n\treturn {\n\t\tupdate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tcreate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tdelete: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tupdateProps: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t};\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\ttype CustomCss,\n\tgetNonEmptyVariants,\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\ntype DefaultStylesState = {\n\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\tinitialData: Record< StyleDefinitionID, StyleDefinition >;\n\tisDirty: boolean;\n};\n\nconst initialState: DefaultStylesState = {\n\tdata: {},\n\tinitialData: {},\n\tisDirty: false,\n};\n\nexport type StateWithDefaultStyles = SliceState< typeof slice >;\n\nconst SLICE_NAME = 'defaultStyles';\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: { data },\n\t\t\t}: PayloadAction< {\n\t\t\t\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\t\t\t} >\n\t\t) {\n\t\t\tconst normalizedData = Array.isArray( data ) ? {} : data;\n\n\t\t\tstate.initialData = structuredClone( normalizedData );\n\t\t\tstate.data = structuredClone( normalizedData );\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tstate.data[ payload.style.id ] = {\n\t\t\t\t...state.data[ payload.style.id ],\n\t\t\t\t...payload.style,\n\t\t\t} as StyleDefinition;\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< {\n\t\t\t\tid: StyleDefinitionID;\n\t\t\t\tmeta: StyleDefinitionVariant[ 'meta' ];\n\t\t\t\tprops: Props;\n\t\t\t\tcustom_css?: CustomCss | null;\n\t\t\t\tmode?: 'merge' | 'replace';\n\t\t\t} >\n\t\t) {\n\t\t\tconst style = state.data[ payload.id ] ?? {\n\t\t\t\tid: payload.id,\n\t\t\t\tlabel: payload.id,\n\t\t\t\ttype: 'class' as const,\n\t\t\t\tvariants: [],\n\t\t\t};\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tlet customCss = ( 'custom_css' in payload ? payload.custom_css : variant?.custom_css ) ?? null;\n\t\t\tcustomCss = customCss?.raw ? customCss : null;\n\n\t\t\tconst payloadProps = JSON.parse( JSON.stringify( payload.props ) ) as Props;\n\t\t\tconst mode = payload.mode ?? 'merge';\n\n\t\t\tif ( variant ) {\n\t\t\t\tconst variantProps = extractVariantProps( mode, variant );\n\t\t\t\tvariant.props = mergeProps( variantProps, payloadProps );\n\t\t\t\tvariant.custom_css = customCss;\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( {\n\t\t\t\t\tmeta: payload.meta,\n\t\t\t\t\tprops: mergeProps( {}, payloadProps ),\n\t\t\t\t\tcustom_css: customCss,\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tstyle.variants = getNonEmptyVariants( style );\n\n\t\t\tstate.data[ payload.id ] = style;\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state ) {\n\t\t\tstate.data = state.initialData;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tcommit( state ) {\n\t\t\tstate.initialData = state.data;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tdeleteTag( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete state.data[ payload ];\n\t\t\tstate.isDirty = true;\n\t\t},\n\t},\n} );\n\nfunction extractVariantProps( mode: string, variant: StyleDefinitionVariant ) {\n\tif ( 'replace' === mode ) {\n\t\treturn {};\n\t}\n\treturn JSON.parse( JSON.stringify( variant.props ) ) as Props;\n}\n\nexport const selectData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.data,\n\t( data ) => data\n);\n\nexport const selectIsDirty = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.isDirty,\n\t( isDirty ) => isDirty\n);\n\nexport const selectInitialData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.initialData,\n\t( initialData ) => initialData\n);\n\nexport const selectTagStyle = createSelector(\n\t[ selectData, ( _state: StateWithDefaultStyles, id: StyleDefinitionID ) => id ],\n\t( data, id ) => data[ id ]\n);\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\nimport { hash } from '@elementor/utils';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\nimport { apiClient } from './api';\nimport { selectData, selectInitialData, selectIsDirty, slice, type StateWithDefaultStyles } from './store';\n\nfunction getChangedTags( state: StateWithDefaultStyles ): AllowedHtmlTag[] {\n\tconst current = selectData( state );\n\tconst initial = selectInitialData( state );\n\n\tconst changed: AllowedHtmlTag[] = [];\n\n\tObject.keys( current ).forEach( ( tag ) => {\n\t\tconst currentStyle = current[ tag ];\n\t\tconst initialStyle = initial[ tag ];\n\n\t\tif ( ! initialStyle || hash( currentStyle ) !== hash( initialStyle ) ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\tObject.keys( initial ).forEach( ( tag ) => {\n\t\tif ( ! current[ tag ] ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\treturn changed;\n}\n\nexport async function saveDefaultStyles() {\n\tconst state = getState() as StateWithDefaultStyles;\n\n\tif ( ! selectIsDirty( state ) ) {\n\t\treturn;\n\t}\n\n\tconst data = selectData( state );\n\tconst changedTags = getChangedTags( state );\n\n\tawait Promise.all(\n\t\tchangedTags.map( async ( tag ) => {\n\t\t\tconst style = data[ tag ];\n\n\t\t\tif ( ! style || style.variants.length === 0 ) {\n\t\t\t\tawait apiClient.delete( tag );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait apiClient.put( tag, style.variants );\n\t\t} )\n\t);\n\n\tdispatch( slice.actions.commit() );\n}\n","import { type StyleDefinition, type StyleDefinitionID } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\n\nconst RESOURCE_URL = '/default-styles';\nconst BASE_URL = 'elementor/v1';\n\nexport type DefaultStylesMap = Record< StyleDefinitionID, StyleDefinition >;\n\ntype DefaultStylesHttpResponse = HttpResponse< DefaultStylesMap >;\n\nexport const apiClient = {\n\tall: () => httpService().get< DefaultStylesHttpResponse >( `${ BASE_URL }${ RESOURCE_URL }` ),\n\n\tput: ( tag: AllowedHtmlTag, variants: StyleDefinition[ 'variants' ] ) =>\n\t\thttpService().put( `${ BASE_URL }${ RESOURCE_URL }/${ tag }`, {\n\t\t\ttype: 'class',\n\t\t\tvariants,\n\t\t} ),\n\n\tdelete: ( tag: AllowedHtmlTag ) => httpService().delete( `${ BASE_URL }${ RESOURCE_URL }/${ tag }` ),\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport {\n\ttype AutocompleteRenderGetTagProps,\n\tbindTrigger,\n\tChip,\n\tStack,\n\ttype Theme,\n\tTypography,\n\tUnstableChipGroup,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { TagStateMenu } from './tag-state-menu';\n\nconst CHIP_SIZE = 'tiny';\n\ntype TagChipProps = {\n\tlabel: string;\n\tchipProps: ReturnType< AutocompleteRenderGetTagProps >;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagChip( { label, chipProps, activeState, onSelectState }: TagChipProps ) {\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tpopupId: 'tag-state-menu',\n\t} );\n\tconst [ chipRef, setChipRef ] = useState< HTMLElement | null >( null );\n\n\tconst { onDelete: _onDelete, ...chipGroupProps } = chipProps;\n\tconst isShowingState = Boolean( activeState );\n\n\treturn (\n\t\t<>\n\t\t\t<UnstableChipGroup\n\t\t\t\tref={ setChipRef }\n\t\t\t\t{ ...chipGroupProps }\n\t\t\t\taria-label={ `Edit ${ label }` }\n\t\t\t\trole=\"group\"\n\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t'&.MuiChipGroup-root.MuiAutocomplete-tag': {\n\t\t\t\t\t\tmargin: theme.spacing( 0.125 ),\n\t\t\t\t\t},\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t<Chip\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={ label }\n\t\t\t\t\tvariant={ isShowingState ? 'standard' : 'filled' }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tif ( isShowingState ) {\n\t\t\t\t\t\t\tonSelectState( null );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t\t<Chip\n\t\t\t\t\ticon={ isShowingState ? undefined : <DotsVerticalIcon fontSize=\"tiny\" /> }\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={\n\t\t\t\t\t\tisShowingState ? (\n\t\t\t\t\t\t\t<Stack direction=\"row\" gap={ 0.5 } alignItems=\"center\">\n\t\t\t\t\t\t\t\t<Typography variant=\"inherit\">{ activeState }</Typography>\n\t\t\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\t{ ...bindTrigger( popupState ) }\n\t\t\t\t\taria-label={ __( 'Open tag state menu', 'elementor' ) }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t...( ! isShowingState ? { paddingLeft: 0 } : {} ),\n\t\t\t\t\t\t'.MuiChip-label': isShowingState ? { paddingRight: 0 } : { padding: 0 },\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t</UnstableChipGroup>\n\t\t\t<TagStateMenu\n\t\t\t\tpopupState={ popupState }\n\t\t\t\tanchorEl={ chipRef }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { DEFAULT_PSEUDO_STATES, PseudoStateMenuItems } from '@elementor/editor-editing-panel';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { bindMenu, Menu, type PopupState } from '@elementor/ui';\n\ntype TagStateMenuProps = {\n\tpopupState: PopupState;\n\tanchorEl: HTMLElement | null;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagStateMenu( { popupState, anchorEl, activeState, onSelectState }: TagStateMenuProps ) {\n\treturn (\n\t\t<Menu\n\t\t\tMenuListProps={ { dense: true, sx: { minWidth: '160px' } } }\n\t\t\t{ ...bindMenu( popupState ) }\n\t\t\tanchorEl={ anchorEl }\n\t\t\tanchorOrigin={ { vertical: 'bottom', horizontal: 'left' } }\n\t\t\ttransformOrigin={ { horizontal: 'left', vertical: -4 } }\n\t\t\tdisableAutoFocusItem\n\t\t>\n\t\t\t<PseudoStateMenuItems\n\t\t\t\tstates={ DEFAULT_PSEUDO_STATES }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t\tonClose={ popupState.close }\n\t\t\t/>\n\t\t</Menu>\n\t);\n}\n","import { injectIntoLogic } from '@elementor/editor';\nimport { registerElementPanelDefaults } from '@elementor/editor-editing-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { GlobalStylesImportListener } from './components/global-styles-import-listener';\nimport { PopulateStore } from './components/populate-store';\nimport { defaultStylesStylesProvider } from './default-styles-provider';\nimport { slice } from './store';\n\nexport function init() {\n\tregisterSlice( slice );\n\n\tregisterElementPanelDefaults( 'default-style', {\n\t\tdefaultTab: 'style',\n\t\tdefaultSectionsExpanded: {\n\t\t\tstyle: [],\n\t\t},\n\t} );\n\n\tstylesRepository.register( defaultStylesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-import-listener',\n\t\tcomponent: GlobalStylesImportListener,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n}\n","import { useEffect } from 'react';\nimport { GLOBAL_STYLES_IMPORTED_EVENT } from '@elementor/editor-canvas';\n\nimport { loadDefaultStyles } from '../load-default-styles';\n\nexport function GlobalStylesImportListener() {\n\tuseEffect( () => {\n\t\tconst handleGlobalStylesImported = () => {\n\t\t\tvoid loadDefaultStyles();\n\t\t};\n\n\t\twindow.addEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\t\t};\n\t}, [] );\n\n\treturn null;\n}\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from './api';\nimport { slice } from './store';\n\nexport async function loadDefaultStyles() {\n\ttry {\n\t\tconst response = await apiClient.all();\n\n\t\tconst items = response.data.data;\n\n\t\tdispatch(\n\t\t\tslice.actions.load( {\n\t\t\t\tdata: items,\n\t\t\t} )\n\t\t);\n\t} catch {}\n}\n","import { useEffect } from 'react';\nimport { __privateListenTo as listenTo, registerDataHook, routeCloseEvent } from '@elementor/editor-v1-adapters';\nimport { __getState as getState } from '@elementor/store';\n\nimport { loadDefaultStyles } from '../load-default-styles';\nimport { selectIsDirty } from '../store';\n\nconst V2_PANEL_ROUTE = 'panel/v2';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tvoid loadDefaultStyles();\n\n\t\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait loadDefaultStyles();\n\t\t} );\n\n\t\tconst unsubscribe = listenTo( routeCloseEvent( V2_PANEL_ROUTE ), () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid loadDefaultStyles();\n\t\t} );\n\n\t\treturn unsubscribe;\n\t}, [] );\n\n\treturn null;\n}\n"],"mappings":";AAAA,YAAYA,YAAW;AACvB,SAAS,aAAa,WAAW,SAAS,YAAAC,iBAAgB;AAC1D;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,2BAA2B;AAEpC,SAAS,+BAA+B;AACxC,SAAS,mBAAmB,eAAe,iBAAiB;AAC5D,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB,wBAAwB,6BAA6B;AACrF,SAAS,cAAcC,WAAU,iBAAiB,mBAAmB;AACrE;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,OACM;AACP,SAAS,MAAAC,WAAU;;;ACxBnB,IAAM,qBAAqB,MAAQ,OAAsC,WAAW,UAAU,CAAC;AAExF,IAAM,6BAA6B,MAAgB;AACzD,QAAM,OAAO,mBAAmB,EAAE,QAAQ,gBAAgB;AAE1D,MAAK,CAAE,MAAM,QAAS;AACrB,WAAO,CAAC;AAAA,EACT;AAEA,SAAO;AACR;AAIO,IAAM,sBAAsB,CAAE,SAAoC;AACxE,MAAK,KAAK,SAAU,IAAK,GAAI;AAC5B,WAAO;AAAA,EACR;AAEA,SAAO,KAAM,CAAE,KAAK;AACrB;AAEO,IAAM,2BAA2B,CAAE,KAAa,OAAO,2BAA2B,MACxF,KAAK,SAAU,GAAI;;;AClCpB,SAAS,4BAA4B;AACrC;AAAA,EACC,cAAc;AAAA,EACd,cAAc;AAAA,EACd,2BAA2B;AAAA,OACrB;AACP,SAAS,UAAU;;;ACLZ,IAAM,uCAAuC;AAE7C,IAAM,kBAAkB,MAAwB;AACtD,SAAO;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,EACd;AACD;;;ACXA,SAAS,kBAA8B;AACvC;AAAA,EAEC;AAAA,EACA;AAAA,OAIM;AAEP;AAAA,EACC,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,OAGX;AAQP,IAAM,eAAmC;AAAA,EACxC,MAAM,CAAC;AAAA,EACP,aAAa,CAAC;AAAA,EACd,SAAS;AACV;AAIA,IAAM,aAAa;AAEZ,IAAM,QAAQ,YAAa;AAAA,EACjC,MAAM;AAAA,EACN;AAAA,EACA,UAAU;AAAA,IACT,KACC,OACA;AAAA,MACC,SAAS,EAAE,KAAK;AAAA,IACjB,GAGC;AACD,YAAM,iBAAiB,MAAM,QAAS,IAAK,IAAI,CAAC,IAAI;AAEpD,YAAM,cAAc,gBAAiB,cAAe;AACpD,YAAM,OAAO,gBAAiB,cAAe;AAC7C,YAAM,UAAU;AAAA,IACjB;AAAA,IAEA,OAAQ,OAAO,EAAE,QAAQ,GAAqD;AAC7E,YAAM,KAAM,QAAQ,MAAM,EAAG,IAAI;AAAA,QAChC,GAAG,MAAM,KAAM,QAAQ,MAAM,EAAG;AAAA,QAChC,GAAG,QAAQ;AAAA,MACZ;AACA,YAAM,UAAU;AAAA,IACjB;AAAA,IAEA,YACC,OACA;AAAA,MACC;AAAA,IACD,GAOC;AACD,YAAM,QAAQ,MAAM,KAAM,QAAQ,EAAG,KAAK;AAAA,QACzC,IAAI,QAAQ;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,MAAM;AAAA,QACN,UAAU,CAAC;AAAA,MACZ;AAEA,YAAM,UAAU,iBAAkB,OAAO,QAAQ,IAAK;AAEtD,UAAI,aAAc,gBAAgB,UAAU,QAAQ,aAAa,SAAS,eAAgB;AAC1F,kBAAY,WAAW,MAAM,YAAY;AAEzC,YAAM,eAAe,KAAK,MAAO,KAAK,UAAW,QAAQ,KAAM,CAAE;AACjE,YAAM,OAAO,QAAQ,QAAQ;AAE7B,UAAK,SAAU;AACd,cAAM,eAAe,oBAAqB,MAAM,OAAQ;AACxD,gBAAQ,QAAQ,WAAY,cAAc,YAAa;AACvD,gBAAQ,aAAa;AAAA,MACtB,OAAO;AACN,cAAM,SAAS,KAAM;AAAA,UACpB,MAAM,QAAQ;AAAA,UACd,OAAO,WAAY,CAAC,GAAG,YAAa;AAAA,UACpC,YAAY;AAAA,QACb,CAAE;AAAA,MACH;AAEA,YAAM,WAAW,oBAAqB,KAAM;AAE5C,YAAM,KAAM,QAAQ,EAAG,IAAI;AAC3B,YAAM,UAAU;AAAA,IACjB;AAAA,IAEA,MAAO,OAAQ;AACd,YAAM,OAAO,MAAM;AACnB,YAAM,UAAU;AAAA,IACjB;AAAA,IAEA,OAAQ,OAAQ;AACf,YAAM,cAAc,MAAM;AAC1B,YAAM,UAAU;AAAA,IACjB;AAAA,IAEA,UAAW,OAAO,EAAE,QAAQ,GAAwC;AAEnE,aAAO,MAAM,KAAM,OAAQ;AAC3B,YAAM,UAAU;AAAA,IACjB;AAAA,EACD;AACD,CAAE;AAEF,SAAS,oBAAqB,MAAc,SAAkC;AAC7E,MAAK,cAAc,MAAO;AACzB,WAAO,CAAC;AAAA,EACT;AACA,SAAO,KAAK,MAAO,KAAK,UAAW,QAAQ,KAAM,CAAE;AACpD;AAEO,IAAM,aAAa;AAAA,EACzB,CAAE,UAAmC,MAAM,cAAc;AAAA,EACzD,CAAE,SAAU;AACb;AAEO,IAAM,gBAAgB;AAAA,EAC5B,CAAE,UAAmC,MAAM,cAAc;AAAA,EACzD,CAAE,YAAa;AAChB;AAEO,IAAM,oBAAoB;AAAA,EAChC,CAAE,UAAmC,MAAM,cAAc;AAAA,EACzD,CAAE,gBAAiB;AACpB;AAEO,IAAM,iBAAiB;AAAA,EAC7B,CAAE,YAAY,CAAE,QAAgC,OAA2B,EAAG;AAAA,EAC9E,CAAE,MAAM,OAAQ,KAAM,EAAG;AAC1B;;;AFvIO,IAAM,8BAA8B;AACpC,IAAM,iCAAiC;AAE9C,IAAM,iBAAiB,CAAE,OAA2B,GAAI,8BAA+B,GAAI,EAAG;AAE9F,IAAM,wBAAwB,CAAE,QAA8C;AAAA,EAC7E;AAAA,EACA,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,CAAC;AACZ;AAEA,IAAM,oBAAoB,CAAE,WAA+C;AAAA,EAC1E,GAAG;AAAA,EACH,MAAM;AACP;AAEO,IAAM,8BAA8B,qBAAsB;AAAA,EAChE,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,IACP,UAAU,GAAI,OAAO,WAAY;AAAA,IACjC,QAAQ,GAAI,QAAQ,WAAY;AAAA,EACjC;AAAA,EACA,WAAW,CAAE,OAAQ,oBAAqB,EAAG;AAAA,EAC7C,cAAc,gBAAgB;AAAA,EAC9B,SAAS;AAAA,IACR,KAAK,MACJ,2BAA2B,EAAE,IAAK,CAAE,QAAS;AAC5C,YAAM,QAAQ,WAAY,SAAS,CAAE,EAAG,GAAI;AAE5C,aAAO,QAAQ,kBAAmB,KAAM,IAAI,sBAAuB,GAAI;AAAA,IACxE,CAAE;AAAA,IACH,KAAK,CAAE,OAAQ;AACd,YAAM,QAAQ,WAAY,SAAS,CAAE,EAAG,EAAG;AAE3C,aAAO,QAAQ,kBAAmB,KAAM,IAAI,sBAAuB,EAAG;AAAA,IACvE;AAAA,IACA;AAAA,IACA,QAAQ,CAAE,YAAa;AACtB;AAAA,QACC,MAAM,QAAQ,OAAQ;AAAA,UACrB,OAAO;AAAA,QACR,CAAE;AAAA,MACH;AAAA,IACD;AAAA,IACA,QAAQ,CAAE,OAAQ;AACjB,eAAU,MAAM,QAAQ,UAAW,EAAG,CAAE;AAAA,IACzC;AAAA,IACA,aAAa,CAAE,SAAU;AACxB;AAAA,QACC,MAAM,QAAQ,YAAa;AAAA,UAC1B,IAAI,KAAK;AAAA,UACT,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,MAAM,KAAK;AAAA,QACZ,CAAE;AAAA,MACH;AAAA,IACD;AAAA,IACA,iBAAiB,CAAE,SAAU;AAC5B;AAAA,QACC,MAAM,QAAQ,YAAa;AAAA,UAC1B,IAAI,KAAK;AAAA,UACT,MAAM,KAAK;AAAA,UACX,YAAY,KAAK;AAAA,UACjB,OAAO,CAAC;AAAA,QACT,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD;AACD,CAAE;AAEF,IAAM,sBAAsB,CAC3B,OACI;AACJ,MAAI,gBAAgB,WAAY,SAAS,CAAE;AAE3C,SAAO;AAAA,IACN,CAAE,UAAW,WAAY,KAAM;AAAA,IAC/B,CAAE,iBAAkB;AACnB,SAAI,eAAe,YAAa;AAChC,sBAAgB;AAAA,IACjB;AAAA,EACD;AACD;;;AGjGA,SAAS,cAAcC,WAAU,cAAcC,iBAAgB;AAC/D,SAAS,YAAY;;;ACArB,SAA4B,mBAAmB;AAI/C,IAAM,eAAe;AACrB,IAAM,WAAW;AAMV,IAAM,YAAY;AAAA,EACxB,KAAK,MAAM,YAAY,EAAE,IAAkC,GAAI,QAAS,GAAI,YAAa,EAAG;AAAA,EAE5F,KAAK,CAAE,KAAqB,aAC3B,YAAY,EAAE,IAAK,GAAI,QAAS,GAAI,YAAa,IAAK,GAAI,IAAI;AAAA,IAC7D,MAAM;AAAA,IACN;AAAA,EACD,CAAE;AAAA,EAEH,QAAQ,CAAE,QAAyB,YAAY,EAAE,OAAQ,GAAI,QAAS,GAAI,YAAa,IAAK,GAAI,EAAG;AACpG;;;ADfA,SAAS,eAAgB,OAAkD;AAC1E,QAAM,UAAU,WAAY,KAAM;AAClC,QAAM,UAAU,kBAAmB,KAAM;AAEzC,QAAM,UAA4B,CAAC;AAEnC,SAAO,KAAM,OAAQ,EAAE,QAAS,CAAE,QAAS;AAC1C,UAAM,eAAe,QAAS,GAAI;AAClC,UAAM,eAAe,QAAS,GAAI;AAElC,QAAK,CAAE,gBAAgB,KAAM,YAAa,MAAM,KAAM,YAAa,GAAI;AACtE,cAAQ,KAAM,GAAsB;AAAA,IACrC;AAAA,EACD,CAAE;AAEF,SAAO,KAAM,OAAQ,EAAE,QAAS,CAAE,QAAS;AAC1C,QAAK,CAAE,QAAS,GAAI,GAAI;AACvB,cAAQ,KAAM,GAAsB;AAAA,IACrC;AAAA,EACD,CAAE;AAEF,SAAO;AACR;AAEA,eAAsB,oBAAoB;AACzC,QAAM,QAAQC,UAAS;AAEvB,MAAK,CAAE,cAAe,KAAM,GAAI;AAC/B;AAAA,EACD;AAEA,QAAM,OAAO,WAAY,KAAM;AAC/B,QAAM,cAAc,eAAgB,KAAM;AAE1C,QAAM,QAAQ;AAAA,IACb,YAAY,IAAK,OAAQ,QAAS;AACjC,YAAM,QAAQ,KAAM,GAAI;AAExB,UAAK,CAAE,SAAS,MAAM,SAAS,WAAW,GAAI;AAC7C,cAAM,UAAU,OAAQ,GAAI;AAE5B;AAAA,MACD;AAEA,YAAM,UAAU,IAAK,KAAK,MAAM,QAAS;AAAA,IAC1C,CAAE;AAAA,EACH;AAEA,EAAAC,UAAU,MAAM,QAAQ,OAAO,CAAE;AAClC;;;AExDA,YAAYC,YAAW;AACvB,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AACjC;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,MAAAC,WAAU;;;ACdnB,YAAY,WAAW;AACvB,SAAS,uBAAuB,4BAA4B;AAE5D,SAAS,UAAU,YAA6B;AASzC,SAAS,aAAc,EAAE,YAAY,UAAU,aAAa,cAAc,GAAuB;AACvG,SACC;AAAA,IAAC;AAAA;AAAA,MACA,eAAgB,EAAE,OAAO,MAAM,IAAI,EAAE,UAAU,QAAQ,EAAE;AAAA,MACvD,GAAG,SAAU,UAAW;AAAA,MAC1B;AAAA,MACA,cAAe,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,MACxD,iBAAkB,EAAE,YAAY,QAAQ,UAAU,GAAG;AAAA,MACrD,sBAAoB;AAAA;AAAA,IAEpB;AAAA,MAAC;AAAA;AAAA,QACA,QAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAU,WAAW;AAAA;AAAA,IACtB;AAAA,EACD;AAEF;;;ADZA,IAAM,YAAY;AASX,SAAS,QAAS,EAAE,OAAO,WAAW,aAAa,cAAc,GAAkB;AACzF,QAAM,aAAa,cAAe;AAAA,IACjC,SAAS;AAAA,IACT,SAAS;AAAA,EACV,CAAE;AACF,QAAM,CAAE,SAAS,UAAW,IAAI,SAAgC,IAAK;AAErE,QAAM,EAAE,UAAU,WAAW,GAAG,eAAe,IAAI;AACnD,QAAM,iBAAiB,QAAS,WAAY;AAE5C,SACC,4DACC;AAAA,IAAC;AAAA;AAAA,MACA,KAAM;AAAA,MACJ,GAAG;AAAA,MACL,cAAa,QAAS,KAAM;AAAA,MAC5B,MAAK;AAAA,MACL,IAAK,CAAE,WAAoB;AAAA,QAC1B,2CAA2C;AAAA,UAC1C,QAAQ,MAAM,QAAS,KAAM;AAAA,QAC9B;AAAA,MACD;AAAA;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACA,MAAO;AAAA,QACP;AAAA,QACA,SAAU,iBAAiB,aAAa;AAAA,QACxC,OAAM;AAAA,QACN,OAAM;AAAA,QACN,SAAU,MAAM;AACf,cAAK,gBAAiB;AACrB,0BAAe,IAAK;AAAA,UACrB;AAAA,QACD;AAAA,QACA,IAAK,CAAE,WAAoB;AAAA,UAC1B,YAAY;AAAA,UACZ,cAAc,GAAI,MAAM,MAAM,eAAe,IAAK;AAAA,QACnD;AAAA;AAAA,IACD;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,MAAO,iBAAiB,SAAY,qCAAC,oBAAiB,UAAS,QAAO;AAAA,QACtE,MAAO;AAAA,QACP,OACC,iBACC,qCAAC,SAAM,WAAU,OAAM,KAAM,KAAM,YAAW,YAC7C,qCAAC,cAAW,SAAQ,aAAY,WAAa,GAC7C,qCAAC,oBAAiB,UAAS,QAAO,CACnC,IACG;AAAA,QAEL,SAAQ;AAAA,QACR,OAAM;AAAA,QACN,OAAM;AAAA,QACJ,GAAG,YAAa,UAAW;AAAA,QAC7B,cAAaC,IAAI,uBAAuB,WAAY;AAAA,QACpD,IAAK,CAAE,WAAoB;AAAA,UAC1B,cAAc,GAAI,MAAM,MAAM,eAAe,IAAK;AAAA,UAClD,cAAc;AAAA,UACd,GAAK,CAAE,iBAAiB,EAAE,aAAa,EAAE,IAAI,CAAC;AAAA,UAC9C,kBAAkB,iBAAiB,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;AAAA,QACvE;AAAA;AAAA,IACD;AAAA,EACD,GACA;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,UAAW;AAAA,MACX;AAAA,MACA;AAAA;AAAA,EACD,CACD;AAEF;;;APjDA,IAAM,EAAE,aAAa,IAAI;AAEzB,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AACxB,IAAM,iCAAiC;AACvC,IAAM,8BAA8B;AACpC,IAAM,8BAA8B,GAAI,8BAA+B,IAAK,2BAA4B;AAExG,SAAS,oBAAqB,aAAgD;AAC7E,QAAM,YAAY,sBAAyC,2BAA4B;AAEvF,MAAK,aAAa,yBAA0B,WAAW,WAAY,GAAI;AACtE,WAAO;AAAA,EACR;AAEA,SAAO,oBAAqB,WAAY;AACzC;AAEA,SAAS,UAAW,KAA8B;AACjD,SAAO,EAAE,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK;AAC9C;AAEA,IAAM,cAAuB;AAAA,EAC5B,IAAI;AAAA,EACJ,MAAM;AACP;AAEA,IAAM,kBAA+B;AAAA,EACpC,KAAK;AAAA,EACL,UAAU,CAAC;AAAA,EACX,aAAa,CAAC;AAAA,EACd,OAAOC,IAAI,iBAAiB,WAAY;AACzC;AAOO,SAAS,yBAA0B,EAAE,gBAAgB,qBAAqB,GAAmC;AACnH,QAAM,cAAc,QAAS,MAAM,2BAA2B,GAAG,CAAC,CAAE;AACpE,QAAM,aAAa;AAAA,IAClB,MAAM,YAAY,IAAK,CAAE,SAAW,EAAE,OAAO,KAAK,OAAO,IAAI,EAAI;AAAA,IACjE,CAAE,WAAY;AAAA,EACf;AACA,QAAM,CAAE,aAAa,mBAAoB,IAAIC,UAA4B,MAAM,oBAAqB,WAAY,CAAE;AAClH,QAAM,CAAE,kBAAkB,mBAAoB,IAAIA,UAAyC,IAAK;AAChG,QAAM,aAAa,oBAAoB;AACvC,QAAM,YAAY,aAAa,EAAE;AACjC,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,UAAU,YAAa,aAAc;AAC3C,QAAM,EAAE,aAAa,MAAM,WAAW,SAAS,IAAI,QAAQ;AAC3D,QAAM,EAAE,MAAM,uBAAuB,OAAO,wBAAwB,QAAQ,wBAAwB,IAAI,UAAU;AAClH,QAAM,EAAE,QAAQ,IAAI,wBAAwB;AAC5C,QAAM,UAAU,QAAS,2BAA4B,EAAE;AAEvD,QAAM,iBAAiB,CAAE,QAAyB;AACjD,wBAAqB,GAAI;AACzB,0BAAuB,6BAA6B,GAAI;AAAA,EACzD;AAEA,QAAM,mBAAmB,YAAa,MAAM;AAC3C,QAAK,WAAW,SAAU;AACzB,4BAAsB;AACtB;AAAA,IACD;AAEA,SAAK,eAAe;AAAA,EACrB,GAAG,CAAE,SAAS,SAAS,gBAAgB,qBAAsB,CAAE;AAE/D,YAAW,MAAM;AAChB,QAAK,CAAE,sBAAuB;AAC7B;AAAA,IACD;AAEA,yBAAsB,MAAM,iBAAiB,CAAE;AAE/C,WAAO,MAAM,qBAAsB,IAAK;AAAA,EACzC,GAAG,CAAE,sBAAsB,gBAAiB,CAAE;AAE9C,mBAAkB,WAAW,OAAQ;AAErC,QAAM,kBAAkB,CAAE,WAAqB,QAAkC,WAAoB;AACpG,QAAK,WAAW,kBAAkB,CAAE,OAAO,OAAQ;AAClD;AAAA,IACD;AAEA,mBAAgB,OAAO,KAAwB;AAC/C,wBAAqB,IAAK;AAAA,EAC3B;AAEA,QAAM,qBAAqB,MAAM;AAChC,IAAAC,UAAU,MAAM,QAAQ,MAAM,CAAE;AAChC,2BAAuB;AACvB,SAAK,eAAe;AAAA,EACrB;AAEA,QAAM,wBAAwB,YAAY;AACzC,QAAI;AACH,YAAM,KAAK;AAAA,IACZ,QAAQ;AACP;AAAA,IACD;AAEA,2BAAuB;AACvB,SAAK,eAAe;AAAA,EACrB;AAEA,SACC,qCAAC,iBAAc,UAAW,QACzB,qCAAC,qBACA,qCAAC,0BAAuB,OAAQ,aAC/B,qCAAC,+BAA4B,cAAe,uBAC3C;AAAA,IAACC;AAAA,IAAA;AAAA,MACA,IAAK;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,MAChB;AAAA;AAAA,IAEA,qCAAC,OAAI,IAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,OAAO,KACnD,qCAACA,QAAA,EAAM,IAAK,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,KAClC,qCAAC,eAAY,WAAS,MAAC,MAAK,WAC3B,qCAAC,aAAU,SAAU,iBAAkB,MAAK,SAAQ,IAAK,EAAE,IAAI,EAAE,KAC9DH,IAAI,OAAO,WAAY,CAC1B,GACA;AAAA,MAAC;AAAA;AAAA,QACA,IAAK;AAAA,QACL,MAAK;AAAA,QACL,aAAcA,IAAI,iBAAiB,WAAY;AAAA,QAC/C,SAAU;AAAA,QACV,UAAW,CAAE,UAAW,WAAY,CAAE;AAAA,QACtC,UAAW;AAAA,QACX,YAAa,CAAE,QAAQ,gBACtB,OAAO,IAAK,CAAE,OAAO,UACpB;AAAA,UAAC;AAAA;AAAA,YACA,KAAM,MAAM,SAAS,MAAM;AAAA,YAC3B,OAAQ,MAAM;AAAA,YACd,WAAY,YAAa,EAAE,MAAM,CAAE;AAAA,YACnC,aAAc;AAAA,YACd,eAAgB;AAAA;AAAA,QACjB,CACC;AAAA;AAAA,IAEJ,CACD,CACD,GACA;AAAA,MAAC;AAAA;AAAA,QACA,SAAU;AAAA,QACV,aAAc;AAAA,QACd,UAAW,CAAC;AAAA;AAAA,MAEZ,qCAAC,uBAAoB,MAAO,qBAC3B;AAAA,QAAC;AAAA;AAAA,UACA,MAAO;AAAA,YACN;AAAA,YACA,OAAO;AAAA,UACR;AAAA,UACA,IAAK;AAAA,UACL,OAAQ,MAAM;AAAA,UAAC;AAAA,UACf,cAAe;AAAA;AAAA,QAEf,qCAAC,0BAAuB,QAAS,eAChC,qCAAC,gCACA,qCAAC,oBACA,qCAAC,mBAAc,GACf,qCAAC,kBAAa,CACf,GACA;AAAA,UAAC;AAAA;AAAA,YACA,IAAK;AAAA,cACJ,QAAQ;AAAA,YACT;AAAA;AAAA,QACD,CACD,CACD;AAAA,MACD,CACD;AAAA,IACD,CACD;AAAA,IACE,UACD,qCAAC,OAAI,IAAK,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,IAAI,KACzC;AAAA,MAAC;AAAA;AAAA,QACA,WAAS;AAAA,QACT,MAAK;AAAA,QACL,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,SAAU,MAAM,KAAK,KAAK;AAAA,QAC1B,UAAW,CAAE;AAAA,QACb,SAAU;AAAA;AAAA,MAERA,IAAI,gBAAgB,WAAY;AAAA,IACnC,CACD,IACG;AAAA,EACL,CACD,CACD,GAEE,WAAW,2BACZ,qCAAC,yBACA,qCAAC,kBAAkB,OAAlB,EAAwB,SAAU,0BAChCA,IAAI,4BAA4B,WAAY,CAC/C,GACA,qCAAC,kBAAkB,SAAlB,MACA,qCAAC,kBAAkB,aAAlB,MACEA,IAAI,+CAA+C,WAAY,CAClE,GACA,qCAAC,kBAAkB,aAAlB,MACEA,IAAI,mEAAmE,WAAY,CACtF,CACD,GACA;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACA,SAAU;AAAA,QACT,SAAS;AAAA,UACR,OAAOA,IAAI,WAAW,WAAY;AAAA,UAClC,QAAQ;AAAA,QACT;AAAA,QACA,SAAS;AAAA,UACR,OAAOA,IAAI,mBAAmB,WAAY;AAAA,UAC1C,QAAQ;AAAA,QACT;AAAA,MACD;AAAA;AAAA,EACD,CACD,CAEF,CACD;AAEF;AAEA,SAAS,UAAU;AAClB,SAAO,YAAa;AAAA,IACnB,YAAY,MAAM,kBAAkB;AAAA,EACrC,CAAE;AACH;AAEA,SAAS,iBAAkB,SAAmB;AAC7C,YAAW,MAAM;AAChB,UAAM,qBAAqB,CAAE,UAA8B;AAC1D,UAAK,SAAU;AACd,cAAM,eAAe;AAAA,MACtB;AAAA,IACD;AAEA,WAAO,iBAAkB,gBAAgB,kBAAmB;AAE5D,WAAO,MAAM;AACZ,aAAO,oBAAqB,gBAAgB,kBAAmB;AAAA,IAChE;AAAA,EACD,GAAG,CAAE,OAAQ,CAAE;AAChB;;;AS9SA,SAAS,uBAAuB;AAChC,SAAS,oCAAoC;AAC7C,SAAS,wBAAwB;AACjC,SAAS,mBAAmB,qBAAqB;;;ACHjD,SAAS,aAAAI,kBAAiB;AAC1B,SAAS,oCAAoC;;;ACD7C,SAAS,cAAcC,iBAAgB;AAKvC,eAAsB,oBAAoB;AACzC,MAAI;AACH,UAAM,WAAW,MAAM,UAAU,IAAI;AAErC,UAAM,QAAQ,SAAS,KAAK;AAE5B,IAAAC;AAAA,MACC,MAAM,QAAQ,KAAM;AAAA,QACnB,MAAM;AAAA,MACP,CAAE;AAAA,IACH;AAAA,EACD,QAAQ;AAAA,EAAC;AACV;;;ADZO,SAAS,6BAA6B;AAC5C,EAAAC,WAAW,MAAM;AAChB,UAAM,6BAA6B,MAAM;AACxC,WAAK,kBAAkB;AAAA,IACxB;AAEA,WAAO,iBAAkB,8BAA8B,0BAA2B;AAElF,WAAO,MAAM;AACZ,aAAO,oBAAqB,8BAA8B,0BAA2B;AAAA,IACtF;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,SAAO;AACR;;;AEnBA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,qBAAqB,UAAU,kBAAkB,uBAAuB;AACjF,SAAS,cAAcC,iBAAgB;AAKvC,IAAM,iBAAiB;AAEhB,SAAS,gBAAgB;AAC/B,EAAAC,WAAW,MAAM;AAChB,SAAK,kBAAkB;AAEvB,qBAAkB,SAAS,mCAAmC,YAAY;AACzE,UAAK,cAAeC,UAAS,CAAE,GAAI;AAClC;AAAA,MACD;AAEA,YAAM,kBAAkB;AAAA,IACzB,CAAE;AAEF,UAAM,cAAc,SAAU,gBAAiB,cAAe,GAAG,MAAM;AACtE,UAAK,cAAeA,UAAS,CAAE,GAAI;AAClC;AAAA,MACD;AAEA,WAAK,kBAAkB;AAAA,IACxB,CAAE;AAEF,WAAO;AAAA,EACR,GAAG,CAAC,CAAE;AAEN,SAAO;AACR;;;AHvBO,SAAS,OAAO;AACtB,gBAAe,KAAM;AAErB,+BAA8B,iBAAiB;AAAA,IAC9C,YAAY;AAAA,IACZ,yBAAyB;AAAA,MACxB,OAAO,CAAC;AAAA,IACT;AAAA,EACD,CAAE;AAEF,mBAAiB,SAAU,2BAA4B;AAEvD,kBAAiB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,EACZ,CAAE;AAEF,kBAAiB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,EACZ,CAAE;AACH;","names":["React","useState","dispatch","Stack","__","dispatch","getState","getState","dispatch","React","__","__","__","useState","dispatch","Stack","useEffect","dispatch","dispatch","useEffect","useEffect","getState","useEffect","getState"]}
1
+ {"version":3,"sources":["../src/components/default-styles-tab-embedded.tsx","../src/allowed-tags.ts","../src/default-styles-provider.ts","../src/capabilities.ts","../src/store.ts","../src/save-default-styles.ts","../src/api.ts","../src/modified-sections.ts","../src/utils/tracking.ts","../src/components/tag-chip.tsx","../src/components/tag-state-menu.tsx","../src/init.ts","../src/components/global-styles-import-listener.tsx","../src/load-default-styles.ts","../src/components/populate-store.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n\tControlActionsProvider,\n\tControlReplacementsProvider,\n\tgetControlReplacements,\n} from '@elementor/editor-controls';\nimport {\n\tClassesPropProvider,\n\tCreatableAutocomplete,\n\tElementProvider,\n\ttype Option,\n\tSectionsList,\n\tStyleInheritanceProvider,\n\tStyleProvider,\n\tStyleSections,\n\tStyleTabSlot,\n} from '@elementor/editor-editing-panel';\nimport { type Element, type ElementType } from '@elementor/editor-elements';\nimport { useActiveBreakpoint } from '@elementor/editor-responsive';\nimport { type StyleDefinitionID, type StyleDefinitionState } from '@elementor/editor-styles';\nimport { useUserStylesCapability } from '@elementor/editor-styles-repository';\nimport { SaveChangesDialog, ThemeProvider, useDialog } from '@elementor/editor-ui';\nimport { controlActionsMenu } from '@elementor/menus';\nimport { useMutation } from '@elementor/query';\nimport { getSessionStorageItem, SessionStorageProvider, setSessionStorageItem } from '@elementor/session';\nimport { __dispatch as dispatch, __getState as getState, __useSelector as useSelector } from '@elementor/store';\nimport {\n\ttype AutocompleteChangeReason,\n\tBox,\n\tButton,\n\tErrorBoundary,\n\tFormControl,\n\tFormLabel,\n\tStack,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport {\n\ttype AllowedHtmlTag,\n\tgetAllowedDefaultStyleTags,\n\tgetDefaultActiveTag,\n\tisAllowedDefaultStyleTag,\n} from '../allowed-tags';\nimport { DEFAULT_STYLES_PROVIDER_KEY } from '../default-styles-provider';\nimport { getChangedTags, saveDefaultStyles } from '../save-default-styles';\nimport { selectIsDirty, slice, type StateWithDefaultStyles } from '../store';\nimport { trackDefaultStyles } from '../utils/tracking';\nimport { TagChip } from './tag-chip';\n\nconst { useMenuItems } = controlActionsMenu;\n\nconst SHIM_ELEMENT_ID = 'default-styles-editor-shim';\nconst SHIM_CLASSES_PROP = '__default_styles_classes__';\nconst TAG_SELECTOR_ID = 'default-styles-tag-selector';\nconst LAST_ACTIVE_TAG_SESSION_PREFIX = 'default-styles';\nconst LAST_ACTIVE_TAG_SESSION_KEY = 'last-active-tag';\nconst LAST_ACTIVE_TAG_STORAGE_KEY = `${ LAST_ACTIVE_TAG_SESSION_PREFIX }/${ LAST_ACTIVE_TAG_SESSION_KEY }`;\n\nfunction readStoredActiveTag( allowedTags: AllowedHtmlTag[] ): AllowedHtmlTag {\n\tconst storedTag = getSessionStorageItem< AllowedHtmlTag >( LAST_ACTIVE_TAG_STORAGE_KEY );\n\n\tif ( storedTag && isAllowedDefaultStyleTag( storedTag, allowedTags ) ) {\n\t\treturn storedTag;\n\t}\n\n\treturn getDefaultActiveTag( allowedTags );\n}\n\nfunction toTagChip( tag: AllowedHtmlTag ): Option {\n\treturn { label: tag, value: tag, fixed: true };\n}\n\nconst shimElement: Element = {\n\tid: SHIM_ELEMENT_ID,\n\ttype: 'default-style',\n};\n\nconst shimElementType: ElementType = {\n\tkey: 'default-style',\n\tcontrols: [],\n\tpropsSchema: {},\n\ttitle: __( 'Default Style', 'elementor' ),\n};\n\nexport type DefaultStylesTabEmbeddedProps = {\n\tonRequestClose: () => void | Promise< void >;\n\tonExposeCloseAttempt?: ( attemptClose: ( () => void ) | null ) => void;\n};\n\nexport function DefaultStylesTabEmbedded( { onRequestClose, onExposeCloseAttempt }: DefaultStylesTabEmbeddedProps ) {\n\tconst allowedTags = useMemo( () => getAllowedDefaultStyleTags(), [] );\n\tconst tagOptions = useMemo< Option[] >(\n\t\t() => allowedTags.map( ( tag ) => ( { label: tag, value: tag } ) ),\n\t\t[ allowedTags ]\n\t);\n\tconst [ selectedTag, setSelectedTagState ] = useState< AllowedHtmlTag >( () => readStoredActiveTag( allowedTags ) );\n\tconst [ activeStyleState, setActiveStyleState ] = useState< StyleDefinitionState | null >( null );\n\tconst breakpoint = useActiveBreakpoint();\n\tconst menuItems = useMenuItems().default;\n\tconst controlReplacements = getControlReplacements();\n\tconst isDirty = useSelector( selectIsDirty );\n\tconst { mutateAsync: save, isPending: isSaving } = useSave();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\tconst { userCan } = useUserStylesCapability();\n\tconst canEdit = userCan( DEFAULT_STYLES_PROVIDER_KEY ).updateProps;\n\n\tconst setSelectedTag = ( tag: AllowedHtmlTag ) => {\n\t\tsetSelectedTagState( tag );\n\t\tsetSessionStorageItem( LAST_ACTIVE_TAG_STORAGE_KEY, tag );\n\t};\n\n\tconst handleClosePanel = useCallback( () => {\n\t\tif ( canEdit && isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\tvoid onRequestClose();\n\t}, [ canEdit, isDirty, onRequestClose, openSaveChangesDialog ] );\n\n\tuseEffect( () => {\n\t\tif ( ! onExposeCloseAttempt ) {\n\t\t\treturn;\n\t\t}\n\n\t\tonExposeCloseAttempt( () => handleClosePanel() );\n\n\t\treturn () => onExposeCloseAttempt( null );\n\t}, [ onExposeCloseAttempt, handleClosePanel ] );\n\n\tusePreventUnload( canEdit && isDirty );\n\n\tconst handleTagSelect = ( _selected: Option[], reason: AutocompleteChangeReason, option: Option ) => {\n\t\tif ( reason !== 'selectOption' || ! option.value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedTag( option.value as AllowedHtmlTag );\n\t\tsetActiveStyleState( null );\n\t};\n\n\tconst resetAndClosePanel = () => {\n\t\tconst tagsDiscarded = getChangedTags( getState() as StateWithDefaultStyles );\n\n\t\ttrackDefaultStyles( {\n\t\t\tevent: 'changesDiscarded',\n\t\t\ttags_discarded: tagsDiscarded,\n\t\t\ttags_discarded_count: tagsDiscarded.length,\n\t\t} );\n\t\tdispatch( slice.actions.reset() );\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\tconst handleSaveAndContinue = async () => {\n\t\ttry {\n\t\t\tawait save();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tcloseSaveChangesDialog();\n\t\tvoid onRequestClose();\n\t};\n\n\treturn (\n\t\t<ErrorBoundary fallback={ null }>\n\t\t\t<ThemeProvider>\n\t\t\t\t<ControlActionsProvider items={ menuItems }>\n\t\t\t\t\t<ControlReplacementsProvider replacements={ controlReplacements }>\n\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\t\tminHeight: 0,\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Box sx={ { flex: 1, minHeight: 0, overflow: 'auto' } }>\n\t\t\t\t\t\t\t\t<Stack sx={ { px: 2, pt: 1, gap: 1 } }>\n\t\t\t\t\t\t\t\t\t<FormControl fullWidth size=\"small\">\n\t\t\t\t\t\t\t\t\t\t<FormLabel htmlFor={ TAG_SELECTOR_ID } size=\"small\" sx={ { mb: 1 } }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Tag', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<CreatableAutocomplete< Option >\n\t\t\t\t\t\t\t\t\t\t\tid={ TAG_SELECTOR_ID }\n\t\t\t\t\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'Type tag name', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t\t\toptions={ tagOptions }\n\t\t\t\t\t\t\t\t\t\t\tselected={ [ toTagChip( selectedTag ) ] }\n\t\t\t\t\t\t\t\t\t\t\tonSelect={ handleTagSelect }\n\t\t\t\t\t\t\t\t\t\t\trenderTags={ ( values, getTagProps ) =>\n\t\t\t\t\t\t\t\t\t\t\t\tvalues.map( ( value, index ) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TagChip\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={ value.value ?? value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={ value.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchipProps={ getTagProps( { index } ) }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tactiveState={ activeStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelectState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) )\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t<ElementProvider\n\t\t\t\t\t\t\t\t\telement={ shimElement }\n\t\t\t\t\t\t\t\t\telementType={ shimElementType }\n\t\t\t\t\t\t\t\t\tsettings={ {} }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ClassesPropProvider prop={ SHIM_CLASSES_PROP }>\n\t\t\t\t\t\t\t\t\t\t<StyleProvider\n\t\t\t\t\t\t\t\t\t\t\tmeta={ {\n\t\t\t\t\t\t\t\t\t\t\t\tbreakpoint,\n\t\t\t\t\t\t\t\t\t\t\t\tstate: activeStyleState,\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tid={ selectedTag as StyleDefinitionID }\n\t\t\t\t\t\t\t\t\t\t\tsetId={ () => {} }\n\t\t\t\t\t\t\t\t\t\t\tsetMetaState={ setActiveStyleState }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<SessionStorageProvider prefix={ selectedTag }>\n\t\t\t\t\t\t\t\t\t\t\t\t<StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleSections />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<StyleTabSlot />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SectionsList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: '150px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</StyleInheritanceProvider>\n\t\t\t\t\t\t\t\t\t\t\t</SessionStorageProvider>\n\t\t\t\t\t\t\t\t\t\t</StyleProvider>\n\t\t\t\t\t\t\t\t\t</ClassesPropProvider>\n\t\t\t\t\t\t\t\t</ElementProvider>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t{ canEdit ? (\n\t\t\t\t\t\t\t\t<Box sx={ { flexShrink: 0, px: 2, py: 1.5 } }>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\t\t\t\tonClick={ () => void save() }\n\t\t\t\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\t\t\t\tloading={ isSaving }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</ControlReplacementsProvider>\n\t\t\t\t</ControlActionsProvider>\n\n\t\t\t\t{ canEdit && isSaveChangesDialogOpen && (\n\t\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t\t<SaveChangesDialog.Title onClose={ closeSaveChangesDialog }>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.Title>\n\t\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t\t{ __( 'You have unsaved changes in Default Styles.', 'elementor' ) }\n\t\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\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\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\t\tdiscard: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Discard', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: resetAndClosePanel,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\t\taction: handleSaveAndContinue,\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</SaveChangesDialog>\n\t\t\t\t) }\n\t\t\t</ThemeProvider>\n\t\t</ErrorBoundary>\n\t);\n}\n\nfunction useSave() {\n\treturn useMutation( {\n\t\tmutationFn: () => saveDefaultStyles(),\n\t} );\n}\n\nfunction usePreventUnload( isDirty: boolean ) {\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","type ExtendedWindow = Window & {\n\telementor: {\n\t\tconfig: {\n\t\t\tatomic?: {\n\t\t\t\tdefault_styles?: {\n\t\t\t\t\tallowed_tags?: string[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst getElementorConfig = () => ( window as unknown as ExtendedWindow ).elementor?.config ?? {};\n\nexport const getAllowedDefaultStyleTags = (): string[] => {\n\tconst tags = getElementorConfig().atomic?.default_styles?.allowed_tags;\n\n\tif ( ! tags?.length ) {\n\t\treturn [];\n\t}\n\n\treturn tags;\n};\n\nexport type AllowedHtmlTag = string;\n\nexport const getDefaultActiveTag = ( tags: string[] ): AllowedHtmlTag => {\n\tif ( tags.includes( 'h1' ) ) {\n\t\treturn 'h1';\n\t}\n\n\treturn tags[ 0 ] ?? '';\n};\n\nexport const isAllowedDefaultStyleTag = ( tag: string, tags = getAllowedDefaultStyleTags() ): tag is AllowedHtmlTag =>\n\ttags.includes( tag );\n","import { type StyleDefinition, type StyleDefinitionID } 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 { getAllowedDefaultStyleTags } from './allowed-tags';\nimport { getCapabilities } from './capabilities';\nimport { selectData, slice } from './store';\n\nexport const DEFAULT_STYLES_PROVIDER_KEY = 'default-styles';\nexport const DEFAULT_STYLES_CSS_NAME_PREFIX = 'e-default-';\n\nconst resolveCssName = ( id: StyleDefinitionID ) => `${ DEFAULT_STYLES_CSS_NAME_PREFIX }${ id }`;\n\nconst placeholderDefinition = ( id: StyleDefinitionID ): StyleDefinition => ( {\n\tid,\n\tlabel: id,\n\ttype: 'class',\n\tvariants: [],\n} );\n\nconst asClassDefinition = ( style: StyleDefinition ): StyleDefinition => ( {\n\t...style,\n\ttype: 'class',\n} );\n\nexport const defaultStylesStylesProvider = createStylesProvider( {\n\tkey: DEFAULT_STYLES_PROVIDER_KEY,\n\tpriority: 15,\n\tlabels: {\n\t\tsingular: __( 'tag', 'elementor' ),\n\t\tplural: __( 'tags', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithStates( cb ),\n\tcapabilities: getCapabilities(),\n\tactions: {\n\t\tall: () =>\n\t\t\tgetAllowedDefaultStyleTags().map( ( tag ) => {\n\t\t\t\tconst style = selectData( getState() )[ tag ];\n\n\t\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( tag );\n\t\t\t} ),\n\t\tget: ( id ) => {\n\t\t\tconst style = selectData( getState() )[ id ];\n\n\t\t\treturn style ? asClassDefinition( style ) : placeholderDefinition( id );\n\t\t},\n\t\tresolveCssName,\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.deleteTag( 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\tmode: args.mode,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tupdateCustomCss: ( 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\tcustom_css: args.custom_css,\n\t\t\t\t\tprops: {},\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n\nconst subscribeWithStates = (\n\tcb: ( previous: Record< string, StyleDefinition >, current: Record< string, StyleDefinition > ) => void\n) => {\n\tlet previousState = selectData( getState() );\n\n\treturn subscribeWithSelector(\n\t\t( state ) => selectData( state ),\n\t\t( currentState ) => {\n\t\t\tcb( previousState, currentState );\n\t\t\tpreviousState = currentState;\n\t\t}\n\t);\n};\n","import { type UserCapabilities } from '@elementor/editor-styles-repository';\n\nexport const UPDATE_DEFAULT_STYLES_CAPABILITY_KEY = 'manage_options';\n\nexport const getCapabilities = (): UserCapabilities => {\n\treturn {\n\t\tupdate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tcreate: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tdelete: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t\tupdateProps: UPDATE_DEFAULT_STYLES_CAPABILITY_KEY,\n\t};\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\ttype CustomCss,\n\tgetNonEmptyVariants,\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\ntype DefaultStylesState = {\n\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\tinitialData: Record< StyleDefinitionID, StyleDefinition >;\n\tisDirty: boolean;\n};\n\nconst initialState: DefaultStylesState = {\n\tdata: {},\n\tinitialData: {},\n\tisDirty: false,\n};\n\nexport type StateWithDefaultStyles = SliceState< typeof slice >;\n\nconst SLICE_NAME = 'defaultStyles';\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: { data },\n\t\t\t}: PayloadAction< {\n\t\t\t\tdata: Record< StyleDefinitionID, StyleDefinition >;\n\t\t\t} >\n\t\t) {\n\t\t\tconst normalizedData = Array.isArray( data ) ? {} : data;\n\n\t\t\tstate.initialData = structuredClone( normalizedData );\n\t\t\tstate.data = structuredClone( normalizedData );\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tstate.data[ payload.style.id ] = {\n\t\t\t\t...state.data[ payload.style.id ],\n\t\t\t\t...payload.style,\n\t\t\t} as StyleDefinition;\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< {\n\t\t\t\tid: StyleDefinitionID;\n\t\t\t\tmeta: StyleDefinitionVariant[ 'meta' ];\n\t\t\t\tprops: Props;\n\t\t\t\tcustom_css?: CustomCss | null;\n\t\t\t\tmode?: 'merge' | 'replace';\n\t\t\t} >\n\t\t) {\n\t\t\tconst style = state.data[ payload.id ] ?? {\n\t\t\t\tid: payload.id,\n\t\t\t\tlabel: payload.id,\n\t\t\t\ttype: 'class' as const,\n\t\t\t\tvariants: [],\n\t\t\t};\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tlet customCss = ( 'custom_css' in payload ? payload.custom_css : variant?.custom_css ) ?? null;\n\t\t\tcustomCss = customCss?.raw ? customCss : null;\n\n\t\t\tconst payloadProps = JSON.parse( JSON.stringify( payload.props ) ) as Props;\n\t\t\tconst mode = payload.mode ?? 'merge';\n\n\t\t\tif ( variant ) {\n\t\t\t\tconst variantProps = extractVariantProps( mode, variant );\n\t\t\t\tvariant.props = mergeProps( variantProps, payloadProps );\n\t\t\t\tvariant.custom_css = customCss;\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( {\n\t\t\t\t\tmeta: payload.meta,\n\t\t\t\t\tprops: mergeProps( {}, payloadProps ),\n\t\t\t\t\tcustom_css: customCss,\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tstyle.variants = getNonEmptyVariants( style );\n\n\t\t\tstate.data[ payload.id ] = style;\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state ) {\n\t\t\tstate.data = state.initialData;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tcommit( state ) {\n\t\t\tstate.initialData = state.data;\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tdeleteTag( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete state.data[ payload ];\n\t\t\tstate.isDirty = true;\n\t\t},\n\t},\n} );\n\nfunction extractVariantProps( mode: string, variant: StyleDefinitionVariant ) {\n\tif ( 'replace' === mode ) {\n\t\treturn {};\n\t}\n\treturn JSON.parse( JSON.stringify( variant.props ) ) as Props;\n}\n\nexport const selectData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.data,\n\t( data ) => data\n);\n\nexport const selectIsDirty = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.isDirty,\n\t( isDirty ) => isDirty\n);\n\nexport const selectInitialData = createSelector(\n\t( state: StateWithDefaultStyles ) => state.defaultStyles.initialData,\n\t( initialData ) => initialData\n);\n\nexport const selectTagStyle = createSelector(\n\t[ selectData, ( _state: StateWithDefaultStyles, id: StyleDefinitionID ) => id ],\n\t( data, id ) => data[ id ]\n);\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\nimport { hash } from '@elementor/utils';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\nimport { apiClient } from './api';\nimport { getModifiedSections } from './modified-sections';\nimport { selectData, selectInitialData, selectIsDirty, slice, type StateWithDefaultStyles } from './store';\nimport { trackDefaultStyles } from './utils/tracking';\n\nexport function getChangedTags( state: StateWithDefaultStyles ): AllowedHtmlTag[] {\n\tconst current = selectData( state );\n\tconst initial = selectInitialData( state );\n\n\tconst changed: AllowedHtmlTag[] = [];\n\n\tObject.keys( current ).forEach( ( tag ) => {\n\t\tconst currentStyle = current[ tag ];\n\t\tconst initialStyle = initial[ tag ];\n\n\t\tif ( ! initialStyle || hash( currentStyle ) !== hash( initialStyle ) ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\tObject.keys( initial ).forEach( ( tag ) => {\n\t\tif ( ! current[ tag ] ) {\n\t\t\tchanged.push( tag as AllowedHtmlTag );\n\t\t}\n\t} );\n\n\treturn changed;\n}\n\nexport async function saveDefaultStyles() {\n\tconst state = getState() as StateWithDefaultStyles;\n\n\tif ( ! selectIsDirty( state ) ) {\n\t\treturn;\n\t}\n\n\tconst data = selectData( state );\n\tconst initialData = selectInitialData( state );\n\tconst changedTags = getChangedTags( state );\n\n\tawait Promise.all(\n\t\tchangedTags.map( async ( tag ) => {\n\t\t\tconst style = data[ tag ];\n\n\t\t\tif ( ! style || style.variants.length === 0 ) {\n\t\t\t\tawait apiClient.delete( tag );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait apiClient.put( tag, style.variants );\n\t\t} )\n\t).catch( ( error ) => {\n\t\ttrackDefaultStyles( { event: 'saveFailed', tags_changed_count: changedTags.length } );\n\n\t\tthrow error;\n\t} );\n\n\tchangedTags.forEach( ( tag ) => {\n\t\tconst isUnset = ! data[ tag ]?.variants.length;\n\n\t\ttrackDefaultStyles( {\n\t\t\tevent: 'tagSaved',\n\t\t\ttag,\n\t\t\taction: isUnset ? 'unset' : 'set',\n\t\t\tsections_modified: isUnset ? [] : getModifiedSections( initialData[ tag ], data[ tag ] ),\n\t\t} );\n\t} );\n\n\tdispatch( slice.actions.commit() );\n}\n","import { type StyleDefinition, type StyleDefinitionID } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type AllowedHtmlTag } from './allowed-tags';\n\nconst RESOURCE_URL = '/default-styles';\nconst BASE_URL = 'elementor/v1';\n\nexport type DefaultStylesMap = Record< StyleDefinitionID, StyleDefinition >;\n\ntype DefaultStylesHttpResponse = HttpResponse< DefaultStylesMap >;\n\nexport const apiClient = {\n\tall: () => httpService().get< DefaultStylesHttpResponse >( `${ BASE_URL }${ RESOURCE_URL }` ),\n\n\tput: ( tag: AllowedHtmlTag, variants: StyleDefinition[ 'variants' ] ) =>\n\t\thttpService().put( `${ BASE_URL }${ RESOURCE_URL }/${ tag }`, {\n\t\t\ttype: 'class',\n\t\t\tvariants,\n\t\t} ),\n\n\tdelete: ( tag: AllowedHtmlTag ) => httpService().delete( `${ BASE_URL }${ RESOURCE_URL }/${ tag }` ),\n};\n","import { STYLE_SECTIONS } from '@elementor/editor-editing-panel';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { hash } from '@elementor/utils';\n\nconst CUSTOM_CSS_SECTION = 'custom_css';\n\nexport function getModifiedSections( initialStyle?: StyleDefinition, currentStyle?: StyleDefinition ): string[] {\n\tconst sectionByProp = new Map(\n\t\tSTYLE_SECTIONS.flatMap( ( { name, fields } ) => fields.map( ( field ) => [ field, name.toLowerCase() ] ) )\n\t);\n\tconst modified = new Set< string >();\n\tconst variantsOf = ( style?: StyleDefinition ) =>\n\t\tnew Map( ( style?.variants ?? [] ).map( ( variant ) => [ JSON.stringify( variant.meta ), variant ] ) );\n\tconst initialVariants = variantsOf( initialStyle );\n\tconst currentVariants = variantsOf( currentStyle );\n\n\tnew Set( [ ...initialVariants.keys(), ...currentVariants.keys() ] ).forEach( ( meta ) => {\n\t\tconst initial = initialVariants.get( meta );\n\t\tconst current = currentVariants.get( meta );\n\n\t\tnew Set( [ ...Object.keys( initial?.props ?? {} ), ...Object.keys( current?.props ?? {} ) ] ).forEach(\n\t\t\t( prop ) => {\n\t\t\t\tif ( isChanged( initial?.props[ prop ], current?.props[ prop ] ) && sectionByProp.has( prop ) ) {\n\t\t\t\t\tmodified.add( sectionByProp.get( prop ) as string );\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tif ( isChanged( initial?.custom_css, current?.custom_css ) ) {\n\t\t\tmodified.add( CUSTOM_CSS_SECTION );\n\t\t}\n\t} );\n\n\treturn [ ...modified ];\n}\n\nfunction isChanged( initial: unknown, current: unknown ) {\n\treturn hash( { value: initial ?? null } ) !== hash( { value: current ?? null } );\n}\n","import { getMixpanel } from '@elementor/events';\n\nimport { type AllowedHtmlTag } from '../allowed-tags';\n\ntype EventMap = {\n\tpanelOpened: object;\n\ttagSaved: { tag: AllowedHtmlTag; action: 'set' | 'unset'; sections_modified: string[] };\n\tsaveFailed: { tags_changed_count: number };\n\tchangesDiscarded: { tags_discarded: AllowedHtmlTag[]; tags_discarded_count: number };\n};\n\nexport type DefaultStylesTrackingEvent = {\n\t[ K in keyof EventMap ]: { event: K } & EventMap[ K ];\n}[ keyof EventMap ];\n\nconst EVENT_PROPERTIES: Record< keyof EventMap, Record< string, string > > = {\n\tpanelOpened: {\n\t\ttarget_type: 'tab',\n\t\ttarget_name: 'defaults_tab',\n\t\ttarget_location: 'design_system_panel',\n\t\tinteraction_result: 'panel_opened',\n\t},\n\ttagSaved: {\n\t\ttarget_type: 'button',\n\t\ttarget_name: 'save_changes',\n\t\ttarget_location: 'design_system_panel',\n\t\tinteraction_result: 'tag_saved',\n\t\texecuted_by: 'user',\n\t},\n\tsaveFailed: {\n\t\ttarget_type: 'button',\n\t\ttarget_name: 'save_changes',\n\t\ttarget_location: 'design_system_panel',\n\t\tinteraction_result: 'save_failed',\n\t\texecuted_by: 'user',\n\t},\n\tchangesDiscarded: {\n\t\ttarget_type: 'button',\n\t\ttarget_name: 'discard_changes',\n\t\ttarget_location: 'dialog',\n\t\tinteraction_result: 'changes_discarded',\n\t},\n};\n\nexport const trackDefaultStyles = ( payload: DefaultStylesTrackingEvent ) => {\n\tconst { dispatchEvent, config } = getMixpanel();\n\tconst name = config?.names?.default_styles?.[ payload.event ];\n\n\tif ( ! name ) {\n\t\treturn;\n\t}\n\n\tconst { event, ...eventData } = payload;\n\n\ttry {\n\t\tdispatchEvent?.( name, {\n\t\t\twindow_name: config?.appTypes?.editor,\n\t\t\tapp_type: config?.appTypes?.editor,\n\t\t\tinteraction_type: 'click',\n\t\t\t...EVENT_PROPERTIES[ event ],\n\t\t\t...eventData,\n\t\t} );\n\t} catch {\n\t\t// Silently ignore tracking errors so they don't break the user flow.\n\t}\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport {\n\ttype AutocompleteRenderGetTagProps,\n\tbindTrigger,\n\tChip,\n\tStack,\n\ttype Theme,\n\tTypography,\n\tUnstableChipGroup,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { TagStateMenu } from './tag-state-menu';\n\nconst CHIP_SIZE = 'tiny';\n\ntype TagChipProps = {\n\tlabel: string;\n\tchipProps: ReturnType< AutocompleteRenderGetTagProps >;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagChip( { label, chipProps, activeState, onSelectState }: TagChipProps ) {\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tpopupId: 'tag-state-menu',\n\t} );\n\tconst [ chipRef, setChipRef ] = useState< HTMLElement | null >( null );\n\n\tconst { onDelete: _onDelete, ...chipGroupProps } = chipProps;\n\tconst isShowingState = Boolean( activeState );\n\n\treturn (\n\t\t<>\n\t\t\t<UnstableChipGroup\n\t\t\t\tref={ setChipRef }\n\t\t\t\t{ ...chipGroupProps }\n\t\t\t\taria-label={ `Edit ${ label }` }\n\t\t\t\trole=\"group\"\n\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t'&.MuiChipGroup-root.MuiAutocomplete-tag': {\n\t\t\t\t\t\tmargin: theme.spacing( 0.125 ),\n\t\t\t\t\t},\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t<Chip\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={ label }\n\t\t\t\t\tvariant={ isShowingState ? 'standard' : 'filled' }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tif ( isShowingState ) {\n\t\t\t\t\t\t\tonSelectState( null );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t\t<Chip\n\t\t\t\t\ticon={ isShowingState ? undefined : <DotsVerticalIcon fontSize=\"tiny\" /> }\n\t\t\t\t\tsize={ CHIP_SIZE }\n\t\t\t\t\tlabel={\n\t\t\t\t\t\tisShowingState ? (\n\t\t\t\t\t\t\t<Stack direction=\"row\" gap={ 0.5 } alignItems=\"center\">\n\t\t\t\t\t\t\t\t<Typography variant=\"inherit\">{ activeState }</Typography>\n\t\t\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\t{ ...bindTrigger( popupState ) }\n\t\t\t\t\taria-label={ __( 'Open tag state menu', 'elementor' ) }\n\t\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\t\tborderRadius: `${ theme.shape.borderRadius * 0.75 }px`,\n\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t...( ! isShowingState ? { paddingLeft: 0 } : {} ),\n\t\t\t\t\t\t'.MuiChip-label': isShowingState ? { paddingRight: 0 } : { padding: 0 },\n\t\t\t\t\t} ) }\n\t\t\t\t/>\n\t\t\t</UnstableChipGroup>\n\t\t\t<TagStateMenu\n\t\t\t\tpopupState={ popupState }\n\t\t\t\tanchorEl={ chipRef }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { DEFAULT_PSEUDO_STATES, PseudoStateMenuItems } from '@elementor/editor-editing-panel';\nimport { type StyleDefinitionState } from '@elementor/editor-styles';\nimport { bindMenu, Menu, type PopupState } from '@elementor/ui';\n\ntype TagStateMenuProps = {\n\tpopupState: PopupState;\n\tanchorEl: HTMLElement | null;\n\tactiveState: StyleDefinitionState | null;\n\tonSelectState: ( state: StyleDefinitionState | null ) => void;\n};\n\nexport function TagStateMenu( { popupState, anchorEl, activeState, onSelectState }: TagStateMenuProps ) {\n\treturn (\n\t\t<Menu\n\t\t\tMenuListProps={ { dense: true, sx: { minWidth: '160px' } } }\n\t\t\t{ ...bindMenu( popupState ) }\n\t\t\tanchorEl={ anchorEl }\n\t\t\tanchorOrigin={ { vertical: 'bottom', horizontal: 'left' } }\n\t\t\ttransformOrigin={ { horizontal: 'left', vertical: -4 } }\n\t\t\tdisableAutoFocusItem\n\t\t>\n\t\t\t<PseudoStateMenuItems\n\t\t\t\tstates={ DEFAULT_PSEUDO_STATES }\n\t\t\t\tactiveState={ activeState }\n\t\t\t\tonSelectState={ onSelectState }\n\t\t\t\tonClose={ popupState.close }\n\t\t\t/>\n\t\t</Menu>\n\t);\n}\n","import { injectIntoLogic } from '@elementor/editor';\nimport { registerElementPanelDefaults } from '@elementor/editor-editing-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { GlobalStylesImportListener } from './components/global-styles-import-listener';\nimport { PopulateStore } from './components/populate-store';\nimport { defaultStylesStylesProvider } from './default-styles-provider';\nimport { slice } from './store';\n\nexport function init() {\n\tregisterSlice( slice );\n\n\tregisterElementPanelDefaults( 'default-style', {\n\t\tdefaultTab: 'style',\n\t\tdefaultSectionsExpanded: {\n\t\t\tstyle: [],\n\t\t},\n\t} );\n\n\tstylesRepository.register( defaultStylesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-import-listener',\n\t\tcomponent: GlobalStylesImportListener,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'default-styles-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n}\n","import { useEffect } from 'react';\nimport { GLOBAL_STYLES_IMPORTED_EVENT } from '@elementor/editor-canvas';\n\nimport { loadDefaultStyles } from '../load-default-styles';\n\nexport function GlobalStylesImportListener() {\n\tuseEffect( () => {\n\t\tconst handleGlobalStylesImported = () => {\n\t\t\tvoid loadDefaultStyles();\n\t\t};\n\n\t\twindow.addEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( GLOBAL_STYLES_IMPORTED_EVENT, handleGlobalStylesImported );\n\t\t};\n\t}, [] );\n\n\treturn null;\n}\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from './api';\nimport { slice } from './store';\n\nexport async function loadDefaultStyles() {\n\ttry {\n\t\tconst response = await apiClient.all();\n\n\t\tconst items = response.data.data;\n\n\t\tdispatch(\n\t\t\tslice.actions.load( {\n\t\t\t\tdata: items,\n\t\t\t} )\n\t\t);\n\t} catch {}\n}\n","import { useEffect } from 'react';\nimport { __privateListenTo as listenTo, registerDataHook, routeCloseEvent } from '@elementor/editor-v1-adapters';\nimport { __getState as getState } from '@elementor/store';\n\nimport { loadDefaultStyles } from '../load-default-styles';\nimport { selectIsDirty } from '../store';\n\nconst V2_PANEL_ROUTE = 'panel/v2';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tvoid loadDefaultStyles();\n\n\t\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait loadDefaultStyles();\n\t\t} );\n\n\t\tconst unsubscribe = listenTo( routeCloseEvent( V2_PANEL_ROUTE ), () => {\n\t\t\tif ( selectIsDirty( getState() ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid loadDefaultStyles();\n\t\t} );\n\n\t\treturn unsubscribe;\n\t}, [] );\n\n\treturn null;\n}\n"],"mappings":"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","names":["React","useState","dispatch","getState","Stack","__","dispatch","getState","hash","hash","getState","dispatch","React","__","__","__","useState","getState","dispatch","Stack","useEffect","dispatch","dispatch","useEffect","useEffect","getState","useEffect","getState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elementor/editor-default-styles",
3
- "version": "4.4.0-1140",
3
+ "version": "4.4.0-1141",
4
4
  "private": false,
5
5
  "author": "Elementor Team",
6
6
  "homepage": "https://elementor.com/",
@@ -39,28 +39,29 @@
39
39
  "dev": "tsup --config=../../tsup.dev.ts"
40
40
  },
41
41
  "dependencies": {
42
- "@elementor/editor": "4.4.0-1140",
43
- "@elementor/editor-app-bar": "4.4.0-1140",
44
- "@elementor/editor-canvas": "4.4.0-1140",
45
- "@elementor/editor-controls": "4.4.0-1140",
46
- "@elementor/editor-documents": "4.4.0-1140",
47
- "@elementor/editor-editing-panel": "4.4.0-1140",
48
- "@elementor/editor-elements": "4.4.0-1140",
49
- "@elementor/editor-panels": "4.4.0-1140",
50
- "@elementor/editor-props": "4.4.0-1140",
51
- "@elementor/editor-responsive": "4.4.0-1140",
52
- "@elementor/editor-styles": "4.4.0-1140",
53
- "@elementor/editor-styles-repository": "4.4.0-1140",
54
- "@elementor/editor-ui": "4.4.0-1140",
55
- "@elementor/editor-v1-adapters": "4.4.0-1140",
56
- "@elementor/http-client": "4.4.0-1140",
42
+ "@elementor/editor": "4.4.0-1141",
43
+ "@elementor/editor-app-bar": "4.4.0-1141",
44
+ "@elementor/editor-canvas": "4.4.0-1141",
45
+ "@elementor/editor-controls": "4.4.0-1141",
46
+ "@elementor/editor-documents": "4.4.0-1141",
47
+ "@elementor/editor-editing-panel": "4.4.0-1141",
48
+ "@elementor/editor-elements": "4.4.0-1141",
49
+ "@elementor/editor-panels": "4.4.0-1141",
50
+ "@elementor/editor-props": "4.4.0-1141",
51
+ "@elementor/editor-responsive": "4.4.0-1141",
52
+ "@elementor/editor-styles": "4.4.0-1141",
53
+ "@elementor/editor-styles-repository": "4.4.0-1141",
54
+ "@elementor/editor-ui": "4.4.0-1141",
55
+ "@elementor/editor-v1-adapters": "4.4.0-1141",
56
+ "@elementor/events": "4.4.0-1141",
57
+ "@elementor/http-client": "4.4.0-1141",
57
58
  "@elementor/icons": "~1.78.1",
58
- "@elementor/menus": "4.4.0-1140",
59
- "@elementor/query": "4.4.0-1140",
60
- "@elementor/session": "4.4.0-1140",
61
- "@elementor/store": "4.4.0-1140",
59
+ "@elementor/menus": "4.4.0-1141",
60
+ "@elementor/query": "4.4.0-1141",
61
+ "@elementor/session": "4.4.0-1141",
62
+ "@elementor/store": "4.4.0-1141",
62
63
  "@elementor/ui": "1.41.3",
63
- "@elementor/utils": "4.4.0-1140",
64
+ "@elementor/utils": "4.4.0-1141",
64
65
  "@wordpress/i18n": "^5.13.0"
65
66
  },
66
67
  "peerDependencies": {
@@ -24,7 +24,7 @@ import { SaveChangesDialog, ThemeProvider, useDialog } from '@elementor/editor-u
24
24
  import { controlActionsMenu } from '@elementor/menus';
25
25
  import { useMutation } from '@elementor/query';
26
26
  import { getSessionStorageItem, SessionStorageProvider, setSessionStorageItem } from '@elementor/session';
27
- import { __dispatch as dispatch, __useSelector as useSelector } from '@elementor/store';
27
+ import { __dispatch as dispatch, __getState as getState, __useSelector as useSelector } from '@elementor/store';
28
28
  import {
29
29
  type AutocompleteChangeReason,
30
30
  Box,
@@ -43,8 +43,9 @@ import {
43
43
  isAllowedDefaultStyleTag,
44
44
  } from '../allowed-tags';
45
45
  import { DEFAULT_STYLES_PROVIDER_KEY } from '../default-styles-provider';
46
- import { saveDefaultStyles } from '../save-default-styles';
47
- import { selectIsDirty, slice } from '../store';
46
+ import { getChangedTags, saveDefaultStyles } from '../save-default-styles';
47
+ import { selectIsDirty, slice, type StateWithDefaultStyles } from '../store';
48
+ import { trackDefaultStyles } from '../utils/tracking';
48
49
  import { TagChip } from './tag-chip';
49
50
 
50
51
  const { useMenuItems } = controlActionsMenu;
@@ -140,6 +141,13 @@ export function DefaultStylesTabEmbedded( { onRequestClose, onExposeCloseAttempt
140
141
  };
141
142
 
142
143
  const resetAndClosePanel = () => {
144
+ const tagsDiscarded = getChangedTags( getState() as StateWithDefaultStyles );
145
+
146
+ trackDefaultStyles( {
147
+ event: 'changesDiscarded',
148
+ tags_discarded: tagsDiscarded,
149
+ tags_discarded_count: tagsDiscarded.length,
150
+ } );
143
151
  dispatch( slice.actions.reset() );
144
152
  closeSaveChangesDialog();
145
153
  void onRequestClose();
package/src/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { DefaultStylesTabEmbedded } from './components/default-styles-tab-embedded';
2
2
  export { init } from './init';
3
+ export { trackDefaultStyles } from './utils/tracking';
@@ -0,0 +1,39 @@
1
+ import { STYLE_SECTIONS } from '@elementor/editor-editing-panel';
2
+ import { type StyleDefinition } from '@elementor/editor-styles';
3
+ import { hash } from '@elementor/utils';
4
+
5
+ const CUSTOM_CSS_SECTION = 'custom_css';
6
+
7
+ export function getModifiedSections( initialStyle?: StyleDefinition, currentStyle?: StyleDefinition ): string[] {
8
+ const sectionByProp = new Map(
9
+ STYLE_SECTIONS.flatMap( ( { name, fields } ) => fields.map( ( field ) => [ field, name.toLowerCase() ] ) )
10
+ );
11
+ const modified = new Set< string >();
12
+ const variantsOf = ( style?: StyleDefinition ) =>
13
+ new Map( ( style?.variants ?? [] ).map( ( variant ) => [ JSON.stringify( variant.meta ), variant ] ) );
14
+ const initialVariants = variantsOf( initialStyle );
15
+ const currentVariants = variantsOf( currentStyle );
16
+
17
+ new Set( [ ...initialVariants.keys(), ...currentVariants.keys() ] ).forEach( ( meta ) => {
18
+ const initial = initialVariants.get( meta );
19
+ const current = currentVariants.get( meta );
20
+
21
+ new Set( [ ...Object.keys( initial?.props ?? {} ), ...Object.keys( current?.props ?? {} ) ] ).forEach(
22
+ ( prop ) => {
23
+ if ( isChanged( initial?.props[ prop ], current?.props[ prop ] ) && sectionByProp.has( prop ) ) {
24
+ modified.add( sectionByProp.get( prop ) as string );
25
+ }
26
+ }
27
+ );
28
+
29
+ if ( isChanged( initial?.custom_css, current?.custom_css ) ) {
30
+ modified.add( CUSTOM_CSS_SECTION );
31
+ }
32
+ } );
33
+
34
+ return [ ...modified ];
35
+ }
36
+
37
+ function isChanged( initial: unknown, current: unknown ) {
38
+ return hash( { value: initial ?? null } ) !== hash( { value: current ?? null } );
39
+ }
@@ -3,9 +3,11 @@ import { hash } from '@elementor/utils';
3
3
 
4
4
  import { type AllowedHtmlTag } from './allowed-tags';
5
5
  import { apiClient } from './api';
6
+ import { getModifiedSections } from './modified-sections';
6
7
  import { selectData, selectInitialData, selectIsDirty, slice, type StateWithDefaultStyles } from './store';
8
+ import { trackDefaultStyles } from './utils/tracking';
7
9
 
8
- function getChangedTags( state: StateWithDefaultStyles ): AllowedHtmlTag[] {
10
+ export function getChangedTags( state: StateWithDefaultStyles ): AllowedHtmlTag[] {
9
11
  const current = selectData( state );
10
12
  const initial = selectInitialData( state );
11
13
 
@@ -37,6 +39,7 @@ export async function saveDefaultStyles() {
37
39
  }
38
40
 
39
41
  const data = selectData( state );
42
+ const initialData = selectInitialData( state );
40
43
  const changedTags = getChangedTags( state );
41
44
 
42
45
  await Promise.all(
@@ -51,7 +54,22 @@ export async function saveDefaultStyles() {
51
54
 
52
55
  await apiClient.put( tag, style.variants );
53
56
  } )
54
- );
57
+ ).catch( ( error ) => {
58
+ trackDefaultStyles( { event: 'saveFailed', tags_changed_count: changedTags.length } );
59
+
60
+ throw error;
61
+ } );
62
+
63
+ changedTags.forEach( ( tag ) => {
64
+ const isUnset = ! data[ tag ]?.variants.length;
65
+
66
+ trackDefaultStyles( {
67
+ event: 'tagSaved',
68
+ tag,
69
+ action: isUnset ? 'unset' : 'set',
70
+ sections_modified: isUnset ? [] : getModifiedSections( initialData[ tag ], data[ tag ] ),
71
+ } );
72
+ } );
55
73
 
56
74
  dispatch( slice.actions.commit() );
57
75
  }
@@ -0,0 +1,66 @@
1
+ import { getMixpanel } from '@elementor/events';
2
+
3
+ import { type AllowedHtmlTag } from '../allowed-tags';
4
+
5
+ type EventMap = {
6
+ panelOpened: object;
7
+ tagSaved: { tag: AllowedHtmlTag; action: 'set' | 'unset'; sections_modified: string[] };
8
+ saveFailed: { tags_changed_count: number };
9
+ changesDiscarded: { tags_discarded: AllowedHtmlTag[]; tags_discarded_count: number };
10
+ };
11
+
12
+ export type DefaultStylesTrackingEvent = {
13
+ [ K in keyof EventMap ]: { event: K } & EventMap[ K ];
14
+ }[ keyof EventMap ];
15
+
16
+ const EVENT_PROPERTIES: Record< keyof EventMap, Record< string, string > > = {
17
+ panelOpened: {
18
+ target_type: 'tab',
19
+ target_name: 'defaults_tab',
20
+ target_location: 'design_system_panel',
21
+ interaction_result: 'panel_opened',
22
+ },
23
+ tagSaved: {
24
+ target_type: 'button',
25
+ target_name: 'save_changes',
26
+ target_location: 'design_system_panel',
27
+ interaction_result: 'tag_saved',
28
+ executed_by: 'user',
29
+ },
30
+ saveFailed: {
31
+ target_type: 'button',
32
+ target_name: 'save_changes',
33
+ target_location: 'design_system_panel',
34
+ interaction_result: 'save_failed',
35
+ executed_by: 'user',
36
+ },
37
+ changesDiscarded: {
38
+ target_type: 'button',
39
+ target_name: 'discard_changes',
40
+ target_location: 'dialog',
41
+ interaction_result: 'changes_discarded',
42
+ },
43
+ };
44
+
45
+ export const trackDefaultStyles = ( payload: DefaultStylesTrackingEvent ) => {
46
+ const { dispatchEvent, config } = getMixpanel();
47
+ const name = config?.names?.default_styles?.[ payload.event ];
48
+
49
+ if ( ! name ) {
50
+ return;
51
+ }
52
+
53
+ const { event, ...eventData } = payload;
54
+
55
+ try {
56
+ dispatchEvent?.( name, {
57
+ window_name: config?.appTypes?.editor,
58
+ app_type: config?.appTypes?.editor,
59
+ interaction_type: 'click',
60
+ ...EVENT_PROPERTIES[ event ],
61
+ ...eventData,
62
+ } );
63
+ } catch {
64
+ // Silently ignore tracking errors so they don't break the user flow.
65
+ }
66
+ };