# elementor/4.3.2/assets/js/packages/menus/menus.js

Elementor Website Builder – more than just a page builder, version 4.3.2. 172 lines.

- Page: https://pluginprobe.com/plugins/elementor/4.3.2/code/assets/js/packages/menus/menus.js
- Raw: https://pluginprobe.com/plugins/elementor/4.3.2/raw/assets/js/packages/menus/menus.js
- Modified: 2026-09-01T11:47:36+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/elementor/4.3.2/code/assets/js/packages/menus/menus.js#L10-L20`.

```javascript
(function(_elementor_locations, _elementor_utils, react, _elementor_editor_ui, _elementor_ui) {

//#region \0rolldown/runtime.js
	var __create = Object.create;
	var __defProp = Object.defineProperty;
	var __name = (target, value) => __defProp(target, "name", {
		value,
		configurable: true
	});
	var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
	var __getOwnPropNames = Object.getOwnPropertyNames;
	var __getProtoOf = Object.getPrototypeOf;
	var __hasOwnProp = Object.prototype.hasOwnProperty;
	var __exportAll = (all, no_symbols) => {
		let target = {};
		for (var name in all) {
			__defProp(target, name, {
				get: all[name],
				enumerable: true
			});
		}
		if (!no_symbols) {
			__defProp(target, Symbol.toStringTag, { value: "Module" });
		}
		return target;
	};
	var __copyProps = (to, from, except, desc) => {
		if (from && typeof from === "object" || typeof from === "function") {
			for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
				key = keys[i];
				if (!__hasOwnProp.call(to, key) && key !== except) {
					__defProp(to, key, {
						get: ((k) => from[k]).bind(null, key),
						enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
					});
				}
			}
		}
		return to;
	};
	var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
		value: mod,
		enumerable: true
	}) : target, mod));

//#endregion
react = __toESM(react);

//#region packages/packages/libs/menus/src/create-register-item.tsx
	function createRegisterItem(locations, component, notify) {
		return ({ id, group = "default", priority = 10, overwrite = false, props: _props, useProps: _useProps }) => {
			if (!(group in locations)) return;
			const Component = component;
			const useProps = _useProps || (() => _props);
			const InjectedComponent = (props) => {
				const componentProps = useProps();
				return /* @__PURE__ */ react.createElement(Component, {
					...props,
					...componentProps
				});
			};
			locations[group].inject({
				id,
				component: InjectedComponent,
				options: {
					priority,
					overwrite
				}
			});
			notify();
		};
	}

//#endregion
//#region packages/packages/libs/menus/src/create-use-menu-items.ts
	function createUseMenuItems(locations, subscribe) {
		let snapshot = null;
		subscribe(() => {
			snapshot = null;
		});
		const getMenuItems = () => {
			if (snapshot) return snapshot;
			snapshot = Object.entries(locations).reduce((carry, [groupName, location]) => {
				const items = location.getInjections().map((injection) => ({
					id: injection.id,
					MenuItem: injection.component
				}));
				return {
					...carry,
					[groupName]: items
				};
			}, {});
			return snapshot;
		};
		return () => (0, react.useSyncExternalStore)(subscribe, getMenuItems);
	}

//#endregion
//#region packages/packages/libs/menus/src/create-menu.ts
	function createSubscription() {
		const listeners = /* @__PURE__ */ new Set();
		return {
			subscribe: (listener) => {
				listeners.add(listener);
				return () => listeners.delete(listener);
			},
			notify: () => listeners.forEach((listener) => listener())
		};
	}
	function createMenu({ groups = [], components }) {
		const locations = createLocations([...groups, "default"]);
		const { subscribe, notify } = createSubscription();
		const registerFns = createRegisterFns(locations, components, notify);
		return {
			useMenuItems: createUseMenuItems(locations, subscribe),
			...registerFns
		};
	}
	function createLocations(groups) {
		return groups.reduce((acc, group) => {
			acc[group] = (0, _elementor_locations.createLocation)();
			return acc;
		}, {});
	}
	function createRegisterFns(locations, components, notify) {
		return Object.entries(components).reduce((acc, [key, component]) => {
			const name = `register${(0, _elementor_utils.capitalize)(key)}`;
			return {
				...acc,
				[name]: createRegisterItem(locations, component, notify)
			};
		}, {});
	}

//#endregion
//#region packages/packages/libs/menus/src/action.tsx
	var SIZE = "tiny";
	function Action({ title, visible = true, icon: Icon, onClick }) {
		if (!visible) return null;
		return /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, {
			placement: "top",
			title,
			arrow: true
		}, /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, {
			"aria-label": title,
			size: SIZE,
			onClick
		}, /* @__PURE__ */ react.createElement(Icon, { fontSize: SIZE })));
	}

//#endregion
//#region packages/packages/libs/menus/src/controls-actions.ts
	var controlActionsMenu = createMenu({ components: {
		Action,
		PopoverAction: _elementor_editor_ui.PopoverAction
	} });

//#endregion
//#region packages/packages/libs/menus/src/index.ts
	var src_exports = /* @__PURE__ */ __exportAll({
		controlActionsMenu: () => controlActionsMenu,
		createMenu: () => createMenu
	});

//#endregion
//#region \0elementor-package-library-entry
	(window.elementorV2 = window.elementorV2 || {}).menus = src_exports;

//#endregion
})(elementorV2.locations, elementorV2.utils, React, elementorV2.editorUi, elementorV2.ui);
window.elementorV2.menus?.init?.();
//# sourceMappingURL=menus.js.map
```
