| @@ -15,9 +15,9 @@ | ||
| 15 | 15 | !*** ./dev/admin/frame/App.jsx ***! |
| 16 | 16 | \*********************************/ |
| 17 | 17 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 18 | 18 | |
| 19 | -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sidebar/Sidebar */ \"./dev/admin/frame/Sidebar/Sidebar.jsx\");\n/* harmony import */ var _Topbar_Topbar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Topbar/Topbar */ \"./dev/admin/frame/Topbar/Topbar.jsx\");\n/* harmony import */ var _utils_uitls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/uitls */ \"./dev/admin/frame/utils/uitls.js\");\n/* harmony import */ var _Topbar_components_SearchForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Topbar/components/SearchForm */ \"./dev/admin/frame/Topbar/components/SearchForm.jsx\");\n/* harmony import */ var _HorizontalMenu_HorizontalMenu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./HorizontalMenu/HorizontalMenu */ \"./dev/admin/frame/HorizontalMenu/HorizontalMenu.jsx\");\n/* harmony import */ var _FrameGuard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FrameGuard */ \"./dev/admin/frame/FrameGuard.js\");\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\nvar PRELOADER_ID = \"Adminify-PreLoaderBar\";\nvar IFRAME_ID = \"frame-adminify-app--iframe\";\nvar togglePreloader = function togglePreloader(show) {\n var bar = document.getElementById(PRELOADER_ID);\n if (bar) bar.style.display = show ? \"block\" : \"none\";\n};\n\n// Path the admin lives under, e.g. \"/wp-admin/\" or \"/blog/wp-admin/\".\nvar getAdminBasePath = function getAdminBasePath() {\n try {\n return new URL(adminify_admin_bar_data.admin_url, window.location.origin).pathname;\n } catch (e) {\n return \"/wp-admin/\";\n }\n};\n\n// Front-end URLs (Preview, View, permalinks, logout) must take over the whole\n// window the way they do in the default admin. Loading them into the iframe\n// leaves the browser URL on the shell page and traps the front end in the frame.\nvar isAdminURL = function isAdminURL(targetUrl) {\n return targetUrl.pathname.startsWith(getAdminBasePath());\n};\n\n// Anchors the frame should take over: real links (not \"#\", not javascript:),\n// not ARIA widgets, not already handled, and not explicitly targeting a new tab.\nvar isNavigableAnchor = function isNavigableAnchor(e) {\n var el = e.target;\n var href = el.tagName === \"A\" ? el.getAttribute(\"href\") : null;\n return !!href && href.charAt(0) !== \"#\" && !href.startsWith(\"javascript:\") && !el.hasAttribute(\"role\") && !e.defaultPrevented && el.getAttribute(\"target\") !== \"_blank\" && href !== \"about:blank\";\n};\n\n// Same-page hash navigation must stay with client-side routers (SPA plugins\n// like Fluent Support / FluentCRM). Their top-bar links are ABSOLUTE urls such\n// as `admin.php?page=fluent-support#/tickets`, so a raw \"#\" prefix check misses\n// them. Re-assigning the iframe src for these would fight the SPA router and\n// leave it stuck loading.\nvar isSamePageHashNav = function isSamePageHashNav(href, iframeWindow) {\n try {\n var targetUrl = new URL(href, iframeWindow.location.href);\n var current = iframeWindow.location;\n return !!targetUrl.hash && targetUrl.pathname === current.pathname && targetUrl.search === current.search;\n } catch (err) {\n return false; // Invalid URL - continue with normal handling\n }\n};\nfunction App() {\n var _frame_adminify_menu, _Object$values;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(frame_adminify_menu.light_dark_mode),\n _useState2 = _slicedToArray(_useState, 2),\n adminifyColorMode = _useState2[0],\n setAdminifyColorMode = _useState2[1];\n // Settings Data\n var lightDarkMode = frame_adminify_menu.light_dark_mode;\n var menuLayoutSettings = frame_adminify_menu.menu_layout_settings;\n var isPro = !!((_frame_adminify_menu = frame_adminify_menu) !== null && _frame_adminify_menu !== void 0 && _frame_adminify_menu.is_pro);\n var isVertical = (menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.layout_type) === \"vertical\";\n var isHorizontal = (menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.layout_type) === \"horizontal\";\n var isHorizontalPro = isHorizontal && isPro;\n var showSidebar = isVertical || isHorizontal && !isPro;\n\n // States\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(document.body.classList.contains(\"folded\")),\n _useState4 = _slicedToArray(_useState3, 2),\n folded = _useState4[0],\n setFolded = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.setDefaultURL)((_Object$values = Object.values(frame_adminify_menu.menu)) === null || _Object$values === void 0 || (_Object$values = _Object$values[0]) === null || _Object$values === void 0 ? void 0 : _Object$values.url)),\n _useState6 = _slicedToArray(_useState5, 2),\n url = _useState6[0],\n setUrl = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(url),\n _useState8 = _slicedToArray(_useState7, 2),\n frameURL = _useState8[0],\n setFrameURL = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState9, 2),\n iframeFullReady = _useState10[0],\n setIframeFullReady = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState12 = _slicedToArray(_useState11, 2),\n iframeLoading = _useState12[0],\n setIframeLoading = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState14 = _slicedToArray(_useState13, 2),\n showSearch = _useState14[0],\n setShowSearch = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState16 = _slicedToArray(_useState15, 2),\n getWidth = _useState16[0],\n setGetWidth = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState18 = _slicedToArray(_useState17, 2),\n collapse = _useState18[0],\n setCollapse = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState20 = _slicedToArray(_useState19, 2),\n topbarHeight = _useState20[0],\n setTopbarHeight = _useState20[1];\n var _useState21 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n menu: [],\n submenu: \"\"\n }),\n _useState22 = _slicedToArray(_useState21, 2),\n iframeClickedActiveMenu = _useState22[0],\n setIframeClickedActiveMenu = _useState22[1];\n var frameGuard = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () {\n return new _FrameGuard__WEBPACK_IMPORTED_MODULE_6__[\"default\"]();\n }, []);\n var showLoading = function showLoading() {\n setIframeLoading(true);\n togglePreloader(true);\n };\n var hideLoading = function hideLoading() {\n setIframeFullReady(true);\n setIframeLoading(false);\n togglePreloader(false);\n };\n\n // External or front-end link — leave the frame. Returns true when handled.\n var leaveFrameIfOutside = function leaveFrameIfOutside(e, href) {\n try {\n var linkUrl = new URL(href);\n\n // External link (different origin) - open in new tab\n if (linkUrl.origin !== window.location.origin) {\n e.preventDefault();\n window.open(href, \"_blank\");\n return true;\n }\n\n // Same origin but outside wp-admin - leave the frame\n if (!isAdminURL(linkUrl)) {\n e.preventDefault();\n window.location.href = linkUrl.href;\n return true;\n }\n } catch (err) {\n // Invalid URL - continue with normal handling\n }\n return false;\n };\n\n /**\n * Anchor click with pre-loader. `iframeWindow` is a live reference so the\n * clicked link can be compared against the page CURRENTLY in the iframe.\n */\n var handleIframeClick = function handleIframeClick(iframeWindow) {\n return function (e) {\n // Ctrl+Click (Win/Linux), Cmd+Click (macOS), Shift+Click or middle\n // click — let the browser open the link in a new tab/window natively\n // instead of loading it into the iframe.\n if ((0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.isNewTabClick)(e)) return;\n if (!isNavigableAnchor(e)) return;\n\n // Capture URL and href immediately before they become stale\n var rawHref = e.target.getAttribute(\"href\");\n var href = e.target.href;\n if (isSamePageHashNav(href, iframeWindow)) return;\n if (leaveFrameIfOutside(e, href)) return;\n\n // Show loading overlay immediately when link is clicked\n showLoading();\n\n // Prevent default for non-trash actions to avoid double navigation;\n // trash links must submit natively so WordPress runs the action.\n var isTrashAction = !!(rawHref !== null && rawHref !== void 0 && rawHref.includes(\"action=trash\"));\n if (!isTrashAction) {\n e.preventDefault();\n }\n\n // Plugin upload Overwrite not reload iframe\n if (rawHref !== null && rawHref !== void 0 && rawHref.includes(\"action=upload-plugin\") && e.target.className.includes(\"update-from-upload-overwrite\")) {\n e.preventDefault();\n }\n\n // Use setTimeout for state updates\n setTimeout(function () {\n parent.postMessage({\n link: href\n }, \"*\");\n if (!isTrashAction) {\n (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.handleURLChange)(rawHref);\n setUrl(rawHref);\n }\n setIframeClickedActiveMenu({\n menu: (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.getActiveMenu)(frame_adminify_menu.menu, false, rawHref),\n submenu: (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.getActiveMenu)(frame_adminify_menu.menu, true, rawHref)\n });\n }, 50);\n };\n };\n var handleLoadIframe = function handleLoadIframe(e) {\n var iframe = e.target;\n\n // Hide progress bar and loading overlay - this fires reliably when iframe loads\n hideLoading();\n\n // Wrap in try-catch to handle cross-origin iframe errors\n try {\n var iframeWindow = iframe.contentWindow;\n (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.handleURLChange)(iframeWindow.location.href);\n\n // Title\n var title = iframe.contentDocument.title;\n if (title) document.title = title;\n\n // Handle Hash Change\n iframeWindow.addEventListener(\"hashchange\", function (ev) {\n return (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.handleURLChange)(ev.newURL);\n });\n iframeWindow.addEventListener(\"click\", handleIframeClick(iframeWindow));\n } catch (error) {\n // Cross-origin iframe - cannot access content\n console.log(\"Cross-origin iframe detected, cannot access content\");\n }\n };\n\n // Unfold sidebar/toolbar on small screens and measure the topbar once.\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var _document$querySelect3;\n if (window.innerWidth <= 992) {\n var _document$querySelect, _document$querySelect2;\n (_document$querySelect = document.querySelector(\".frame-adminify-sidebar-wrap\")) === null || _document$querySelect === void 0 || (_document$querySelect = _document$querySelect.classList) === null || _document$querySelect === void 0 || _document$querySelect.remove(\"adminify-sidebar-folded\");\n (_document$querySelect2 = document.querySelector(\".adminify-toolbar-wrapper\")) === null || _document$querySelect2 === void 0 || (_document$querySelect2 = _document$querySelect2.classList) === null || _document$querySelect2 === void 0 || _document$querySelect2.remove(\"adminify-toolbar-folded\");\n setGetWidth(true);\n }\n setTopbarHeight((_document$querySelect3 = document.querySelector(\".adminify-toolbar-wrapper\")) === null || _document$querySelect3 === void 0 ? void 0 : _document$querySelect3.offsetHeight);\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (frameGuard.isAllowed()) {\n setFrameURL(url);\n } else {\n parent.location.reload();\n }\n showLoading();\n (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.waitForElm)(\"#\".concat(IFRAME_ID)).then(function (elm) {\n try {\n var _elm$contentDocument, _elm$contentDocument2, _elm$contentWindow;\n // Check if document is already loaded\n if (((_elm$contentDocument = elm.contentDocument) === null || _elm$contentDocument === void 0 ? void 0 : _elm$contentDocument.readyState) === \"complete\") {\n hideLoading();\n return;\n }\n\n // Attach to contentDocument and contentWindow if same-origin\n (_elm$contentDocument2 = elm.contentDocument) === null || _elm$contentDocument2 === void 0 || _elm$contentDocument2.addEventListener(\"DOMContentLoaded\", hideLoading);\n (_elm$contentWindow = elm.contentWindow) === null || _elm$contentWindow === void 0 || _elm$contentWindow.addEventListener(\"load\", hideLoading);\n } catch (e) {\n console.log(\"Cannot access contentDocument (cross-origin or error):\", e.message);\n }\n\n // Always attach to iframe element itself - most reliable\n elm.addEventListener(\"load\", hideLoading);\n });\n }, [url]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-progress\",\n id: PRELOADER_ID\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-indeterminate\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Topbar_Topbar__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n lightDarkMode: lightDarkMode,\n setAdminifyColorMode: setAdminifyColorMode,\n adminifyColorMode: adminifyColorMode,\n setFolded: setFolded,\n setShowSearch: setShowSearch,\n getWidth: getWidth,\n setCollapse: setCollapse,\n collapse: collapse,\n setUrl: setUrl,\n iframeFullReady: iframeFullReady,\n folded: folded\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-frame-wrapper \".concat(isHorizontalPro ? \"adminify-horizontal-menu\" : \"adminify-vertical-menu\", \" \").concat(folded && isVertical ? \"adminify-folded\" : \"\")\n }, showSidebar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n lightDarkMode: lightDarkMode,\n folded: folded,\n url: url,\n iframeClickedActiveMenu: iframeClickedActiveMenu,\n setUrl: setUrl,\n getWidth: getWidth,\n collapse: collapse,\n setCollapse: setCollapse,\n topbarHeight: topbarHeight\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-frame-content\",\n style: {\n \"--adminify-topbar-height\": \"\".concat(topbarHeight || 56, \"px\")\n }\n }, isHorizontalPro ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_HorizontalMenu_HorizontalMenu__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n setUrl: setUrl,\n collapse: collapse,\n setCollapse: setCollapse,\n getWidth: getWidth\n }) : null, showSearch ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Topbar_components_SearchForm__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n setShowSearch: setShowSearch,\n setUrl: setUrl\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-iframe-loading-overlay \".concat(iframeLoading ? \"is-loading\" : \"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-loading-spinner\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"iframe\", {\n onLoad: handleLoadIframe,\n width: \"100%\",\n height: \"100%\",\n id: IFRAME_ID,\n src: frameURL,\n frameBorder: \"0\"\n }))));\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\n\n//# sourceURL=webpack://adminify/./dev/admin/frame/App.jsx?"); | |
| 19 | +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sidebar/Sidebar */ \"./dev/admin/frame/Sidebar/Sidebar.jsx\");\n/* harmony import */ var _Topbar_Topbar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Topbar/Topbar */ \"./dev/admin/frame/Topbar/Topbar.jsx\");\n/* harmony import */ var _utils_uitls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/uitls */ \"./dev/admin/frame/utils/uitls.js\");\n/* harmony import */ var _Topbar_components_SearchForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Topbar/components/SearchForm */ \"./dev/admin/frame/Topbar/components/SearchForm.jsx\");\n/* harmony import */ var _HorizontalMenu_HorizontalMenu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./HorizontalMenu/HorizontalMenu */ \"./dev/admin/frame/HorizontalMenu/HorizontalMenu.jsx\");\n/* harmony import */ var _FrameGuard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FrameGuard */ \"./dev/admin/frame/FrameGuard.js\");\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\nvar PRELOADER_ID = \"Adminify-PreLoaderBar\";\nvar IFRAME_ID = \"frame-adminify-app--iframe\";\nvar togglePreloader = function togglePreloader(show) {\n var bar = document.getElementById(PRELOADER_ID);\n if (bar) bar.style.display = show ? \"block\" : \"none\";\n};\n\n// Path the admin lives under, e.g. \"/wp-admin/\" or \"/blog/wp-admin/\".\nvar getAdminBasePath = function getAdminBasePath() {\n try {\n return new URL(adminify_admin_bar_data.admin_url, window.location.origin).pathname;\n } catch (e) {\n return \"/wp-admin/\";\n }\n};\n\n// Front-end URLs (Preview, View, permalinks, logout) must take over the whole\n// window the way they do in the default admin. Loading them into the iframe\n// leaves the browser URL on the shell page and traps the front end in the frame.\nvar isAdminURL = function isAdminURL(targetUrl) {\n return targetUrl.pathname.startsWith(getAdminBasePath());\n};\n\n// The anchor a click belongs to, or null when the frame should keep its hands\n// off: not a real link (\"#\", javascript:), an ARIA widget, already handled, or\n// explicitly targeting a new tab.\n//\n// Resolved from the click target UPWARDS. Plenty of admin links are icon-only -\n// the block editor's \"View Posts\" back button is an `<a>` wrapping nothing but\n// an `<svg>` - so the click target is the icon, and testing `e.target` alone\n// left every one of them invisible to the frame.\nvar getNavigableAnchor = function getNavigableAnchor(e) {\n var _e$target;\n // Duck-typed: `e.target` belongs to the iframe's document, so an\n // `instanceof Element` check against the shell's realm would fail.\n var el = typeof ((_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.closest) === \"function\" ? e.target.closest(\"a\") : null;\n var href = el === null || el === void 0 ? void 0 : el.getAttribute(\"href\");\n if (!href || href.charAt(0) === \"#\" || href.startsWith(\"javascript:\") || el.hasAttribute(\"role\") || e.defaultPrevented || el.getAttribute(\"target\") === \"_blank\" || href === \"about:blank\") {\n return null;\n }\n return el;\n};\n\n// Same-page hash navigation must stay with client-side routers (SPA plugins\n// like Fluent Support / FluentCRM). Their top-bar links are ABSOLUTE urls such\n// as `admin.php?page=fluent-support#/tickets`, so a raw \"#\" prefix check misses\n// them. Re-assigning the iframe src for these would fight the SPA router and\n// leave it stuck loading.\nvar isSamePageHashNav = function isSamePageHashNav(href, iframeWindow) {\n try {\n var targetUrl = new URL(href, iframeWindow.location.href);\n var current = iframeWindow.location;\n return !!targetUrl.hash && targetUrl.pathname === current.pathname && targetUrl.search === current.search;\n } catch (err) {\n return false; // Invalid URL - continue with normal handling\n }\n};\nfunction App() {\n var _frame_adminify_menu, _Object$values;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(frame_adminify_menu.light_dark_mode),\n _useState2 = _slicedToArray(_useState, 2),\n adminifyColorMode = _useState2[0],\n setAdminifyColorMode = _useState2[1];\n // Settings Data\n var lightDarkMode = frame_adminify_menu.light_dark_mode;\n var menuLayoutSettings = frame_adminify_menu.menu_layout_settings;\n var isPro = !!((_frame_adminify_menu = frame_adminify_menu) !== null && _frame_adminify_menu !== void 0 && _frame_adminify_menu.is_pro);\n var isVertical = (menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.layout_type) === \"vertical\";\n var isHorizontal = (menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.layout_type) === \"horizontal\";\n var isHorizontalPro = isHorizontal && isPro;\n var showSidebar = isVertical || isHorizontal && !isPro;\n\n // States\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(document.body.classList.contains(\"folded\")),\n _useState4 = _slicedToArray(_useState3, 2),\n folded = _useState4[0],\n setFolded = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.setDefaultURL)((_Object$values = Object.values(frame_adminify_menu.menu)) === null || _Object$values === void 0 || (_Object$values = _Object$values[0]) === null || _Object$values === void 0 ? void 0 : _Object$values.url)),\n _useState6 = _slicedToArray(_useState5, 2),\n url = _useState6[0],\n setUrl = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(url),\n _useState8 = _slicedToArray(_useState7, 2),\n frameURL = _useState8[0],\n setFrameURL = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState9, 2),\n iframeFullReady = _useState10[0],\n setIframeFullReady = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState12 = _slicedToArray(_useState11, 2),\n iframeLoading = _useState12[0],\n setIframeLoading = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState14 = _slicedToArray(_useState13, 2),\n showSearch = _useState14[0],\n setShowSearch = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState16 = _slicedToArray(_useState15, 2),\n getWidth = _useState16[0],\n setGetWidth = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState18 = _slicedToArray(_useState17, 2),\n collapse = _useState18[0],\n setCollapse = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState20 = _slicedToArray(_useState19, 2),\n topbarHeight = _useState20[0],\n setTopbarHeight = _useState20[1];\n var _useState21 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n menu: [],\n submenu: \"\"\n }),\n _useState22 = _slicedToArray(_useState21, 2),\n iframeClickedActiveMenu = _useState22[0],\n setIframeClickedActiveMenu = _useState22[1];\n var frameGuard = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () {\n return new _FrameGuard__WEBPACK_IMPORTED_MODULE_6__[\"default\"]();\n }, []);\n var showLoading = function showLoading() {\n setIframeLoading(true);\n togglePreloader(true);\n };\n var hideLoading = function hideLoading() {\n setIframeFullReady(true);\n setIframeLoading(false);\n togglePreloader(false);\n };\n\n // External or front-end link — leave the frame. Returns true when handled.\n var leaveFrameIfOutside = function leaveFrameIfOutside(e, href) {\n try {\n var linkUrl = new URL(href);\n\n // External link (different origin) - open in new tab\n if (linkUrl.origin !== window.location.origin) {\n e.preventDefault();\n window.open(href, \"_blank\");\n return true;\n }\n\n // Same origin but outside wp-admin - leave the frame\n if (!isAdminURL(linkUrl)) {\n e.preventDefault();\n window.location.href = linkUrl.href;\n return true;\n }\n } catch (err) {\n // Invalid URL - continue with normal handling\n }\n return false;\n };\n\n /**\n * Anchor click with pre-loader. `iframeWindow` is a live reference so the\n * clicked link can be compared against the page CURRENTLY in the iframe.\n */\n var handleIframeClick = function handleIframeClick(iframeWindow) {\n return function (e) {\n // Ctrl+Click (Win/Linux), Cmd+Click (macOS), Shift+Click or middle\n // click — let the browser open the link in a new tab/window natively\n // instead of loading it into the iframe.\n if ((0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.isNewTabClick)(e)) return;\n var anchor = getNavigableAnchor(e);\n if (!anchor) return;\n\n // Capture URL and href immediately before they become stale\n var rawHref = anchor.getAttribute(\"href\");\n var href = anchor.href;\n if (isSamePageHashNav(href, iframeWindow)) return;\n if (leaveFrameIfOutside(e, href)) return;\n\n // Show loading overlay immediately when link is clicked\n showLoading();\n\n // Prevent default for non-trash actions to avoid double navigation;\n // trash links must submit natively so WordPress runs the action.\n var isTrashAction = !!(rawHref !== null && rawHref !== void 0 && rawHref.includes(\"action=trash\"));\n if (!isTrashAction) {\n e.preventDefault();\n }\n\n // Plugin upload Overwrite not reload iframe\n if (rawHref !== null && rawHref !== void 0 && rawHref.includes(\"action=upload-plugin\") && anchor.className.includes(\"update-from-upload-overwrite\")) {\n e.preventDefault();\n }\n\n // Use setTimeout for state updates\n setTimeout(function () {\n parent.postMessage({\n link: href\n }, \"*\");\n if (!isTrashAction) {\n // Absolute, so it resolves against the page the IFRAME is on -\n // a relative href like `edit.php?post_type=post` would otherwise\n // be resolved against the shell document, which sits on its own\n // URL once an editor screen has rewritten its history.\n (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.handleURLChange)(href);\n setUrl(href);\n\n // React re-renders the iframe only when `src` actually changes.\n // When the frame is already pointing at this URL as far as React\n // is concerned - it was sent here once and the page then moved on\n // by itself, the editor's post-publish `replaceState` being the\n // everyday case - the click just cancelled above would be\n // swallowed. Send the frame back there directly.\n var iframe = document.getElementById(IFRAME_ID);\n if (iframe && iframe.src === href) {\n iframe.contentWindow.location.href = href;\n }\n }\n setIframeClickedActiveMenu({\n menu: (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.getActiveMenu)(frame_adminify_menu.menu, false, rawHref),\n submenu: (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.getActiveMenu)(frame_adminify_menu.menu, true, rawHref)\n });\n }, 50);\n };\n };\n var handleLoadIframe = function handleLoadIframe(e) {\n var iframe = e.target;\n\n // Hide progress bar and loading overlay - this fires reliably when iframe loads\n hideLoading();\n\n // Wrap in try-catch to handle cross-origin iframe errors\n try {\n var iframeWindow = iframe.contentWindow;\n (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.handleURLChange)(iframeWindow.location.href);\n\n // Title\n var title = iframe.contentDocument.title;\n if (title) document.title = title;\n\n // Handle Hash Change\n iframeWindow.addEventListener(\"hashchange\", function (ev) {\n return (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.handleURLChange)(ev.newURL);\n });\n\n // Screens that route client-side - the block editor swapping\n // `post-new.php` for `post.php?post=<id>` on publish, above all -\n // change URL without ever loading a document, so mirror the iframe's\n // own history calls onto the shell.\n (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.syncIframeHistory)(iframeWindow, _utils_uitls__WEBPACK_IMPORTED_MODULE_3__.handleURLChange);\n iframeWindow.addEventListener(\"click\", handleIframeClick(iframeWindow));\n } catch (error) {\n // Cross-origin iframe - cannot access content\n console.log(\"Cross-origin iframe detected, cannot access content\");\n }\n };\n\n // Unfold sidebar/toolbar on small screens and measure the topbar once.\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var _document$querySelect3;\n if (window.innerWidth <= 992) {\n var _document$querySelect, _document$querySelect2;\n (_document$querySelect = document.querySelector(\".frame-adminify-sidebar-wrap\")) === null || _document$querySelect === void 0 || (_document$querySelect = _document$querySelect.classList) === null || _document$querySelect === void 0 || _document$querySelect.remove(\"adminify-sidebar-folded\");\n (_document$querySelect2 = document.querySelector(\".adminify-toolbar-wrapper\")) === null || _document$querySelect2 === void 0 || (_document$querySelect2 = _document$querySelect2.classList) === null || _document$querySelect2 === void 0 || _document$querySelect2.remove(\"adminify-toolbar-folded\");\n setGetWidth(true);\n }\n setTopbarHeight((_document$querySelect3 = document.querySelector(\".adminify-toolbar-wrapper\")) === null || _document$querySelect3 === void 0 ? void 0 : _document$querySelect3.offsetHeight);\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (frameGuard.isAllowed()) {\n setFrameURL(url);\n } else {\n parent.location.reload();\n }\n showLoading();\n (0,_utils_uitls__WEBPACK_IMPORTED_MODULE_3__.waitForElm)(\"#\".concat(IFRAME_ID)).then(function (elm) {\n try {\n var _elm$contentDocument, _elm$contentDocument2, _elm$contentWindow;\n // Check if document is already loaded\n if (((_elm$contentDocument = elm.contentDocument) === null || _elm$contentDocument === void 0 ? void 0 : _elm$contentDocument.readyState) === \"complete\") {\n hideLoading();\n return;\n }\n\n // Attach to contentDocument and contentWindow if same-origin\n (_elm$contentDocument2 = elm.contentDocument) === null || _elm$contentDocument2 === void 0 || _elm$contentDocument2.addEventListener(\"DOMContentLoaded\", hideLoading);\n (_elm$contentWindow = elm.contentWindow) === null || _elm$contentWindow === void 0 || _elm$contentWindow.addEventListener(\"load\", hideLoading);\n } catch (e) {\n console.log(\"Cannot access contentDocument (cross-origin or error):\", e.message);\n }\n\n // Always attach to iframe element itself - most reliable\n elm.addEventListener(\"load\", hideLoading);\n });\n }, [url]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-progress\",\n id: PRELOADER_ID\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-indeterminate\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Topbar_Topbar__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n lightDarkMode: lightDarkMode,\n setAdminifyColorMode: setAdminifyColorMode,\n adminifyColorMode: adminifyColorMode,\n setFolded: setFolded,\n setShowSearch: setShowSearch,\n getWidth: getWidth,\n setCollapse: setCollapse,\n collapse: collapse,\n setUrl: setUrl,\n iframeFullReady: iframeFullReady,\n folded: folded\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-frame-wrapper \".concat(isHorizontalPro ? \"adminify-horizontal-menu\" : \"adminify-vertical-menu\", \" \").concat(folded && isVertical ? \"adminify-folded\" : \"\")\n }, showSidebar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n lightDarkMode: lightDarkMode,\n folded: folded,\n url: url,\n iframeClickedActiveMenu: iframeClickedActiveMenu,\n setUrl: setUrl,\n getWidth: getWidth,\n collapse: collapse,\n setCollapse: setCollapse,\n topbarHeight: topbarHeight\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-frame-content\",\n style: {\n \"--adminify-topbar-height\": \"\".concat(topbarHeight || 56, \"px\")\n }\n }, isHorizontalPro ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_HorizontalMenu_HorizontalMenu__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n setUrl: setUrl,\n collapse: collapse,\n setCollapse: setCollapse,\n getWidth: getWidth\n }) : null, showSearch ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Topbar_components_SearchForm__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n setShowSearch: setShowSearch,\n setUrl: setUrl\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-iframe-loading-overlay \".concat(iframeLoading ? \"is-loading\" : \"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"adminify-loading-spinner\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"iframe\", {\n onLoad: handleLoadIframe,\n width: \"100%\",\n height: \"100%\",\n id: IFRAME_ID,\n src: frameURL,\n frameBorder: \"0\"\n }))));\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\n\n//# sourceURL=webpack://adminify/./dev/admin/frame/App.jsx?"); | |
| 20 | 20 | |
| 21 | 21 | /***/ }), |
| 22 | 22 | |
| 23 | 23 | /***/ "./dev/admin/frame/FrameGuard.js": |
| @@ -155,9 +155,9 @@ | ||
| 155 | 155 | !*** ./dev/admin/frame/Topbar/components/TopSecondary.jsx ***! |
| 156 | 156 | \************************************************************/ |
| 157 | 157 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 158 | 158 | |
| 159 | -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _LightDarkSwitcher__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./LightDarkSwitcher */ \"./dev/admin/frame/Topbar/components/LightDarkSwitcher.jsx\");\n/* harmony import */ var _UserAccount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UserAccount */ \"./dev/admin/frame/Topbar/components/UserAccount.jsx\");\n/* harmony import */ var _Search__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Search */ \"./dev/admin/frame/Topbar/components/Search.jsx\");\n/* harmony import */ var _Comments__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Comments */ \"./dev/admin/frame/Topbar/components/Comments.jsx\");\n/* harmony import */ var _MenuItems__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./MenuItems */ \"./dev/admin/frame/Topbar/components/MenuItems.jsx\");\n/* harmony import */ var _utils_uitls__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/uitls */ \"./dev/admin/frame/utils/uitls.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\n\n\n\n\n\n\n\n// Check top secondary values\nfunction getTopSecondaryItems(topSecondarySubmenu) {\n var _ref;\n return (_ref = _toConsumableArray(_typeof(topSecondarySubmenu) === \"object\" ? Object.values(topSecondarySubmenu) : topSecondarySubmenu)) === null || _ref === void 0 || (_ref = _ref.filter(function (item) {\n return item.id !== \"my-account\";\n })) === null || _ref === void 0 || (_ref = _ref.filter(function (item) {\n return item.id !== \"wp-adminify-admin-bar-switcher\";\n })) === null || _ref === void 0 || (_ref = _ref.filter(function (item) {\n return item.id !== \"adminify_notification_count\";\n })) === null || _ref === void 0 ? void 0 : _ref.filter(function (item) {\n return item.id !== \"adminify-frontend-site-preview\";\n });\n}\nfunction TopSecondary(_ref2) {\n var _adminify_admin_bar_d, _getTopSecondaryItems, _getTopSecondaryItems2, _topSecondarySubmenu$, _adminify_admin_bar_d2;\n var setShowSearch = _ref2.setShowSearch,\n getWidth = _ref2.getWidth,\n iframeFullReady = _ref2.iframeFullReady,\n setAdminifyColorMode = _ref2.setAdminifyColorMode,\n setUrl = _ref2.setUrl;\n var topSecondarySubmenu = (_adminify_admin_bar_d = adminify_admin_bar_data) === null || _adminify_admin_bar_d === void 0 || (_adminify_admin_bar_d = _adminify_admin_bar_d.data) === null || _adminify_admin_bar_d === void 0 || (_adminify_admin_bar_d = _adminify_admin_bar_d.find(function (menu) {\n return (menu === null || menu === void 0 ? void 0 : menu.id) === \"top-secondary\";\n })) === null || _adminify_admin_bar_d === void 0 ? void 0 : _adminify_admin_bar_d.submenu;\n return /*#__PURE__*/React.createElement(\"div\", {\n className: \"adminify-admin-bar-top-secondary\"\n }, getWidth ? null : /*#__PURE__*/React.createElement(React.Fragment, null, (_getTopSecondaryItems = getTopSecondaryItems(topSecondarySubmenu)) !== null && _getTopSecondaryItems !== void 0 && _getTopSecondaryItems.length ? /*#__PURE__*/React.createElement(\"ul\", {\n className: \"adminify-top-menu\"\n }, (_getTopSecondaryItems2 = getTopSecondaryItems(topSecondarySubmenu)) === null || _getTopSecondaryItems2 === void 0 ? void 0 : _getTopSecondaryItems2.map(function (item, i) {\n var depthLevel = 0;\n if (item.menu_status === false) {\n return null;\n }\n return /*#__PURE__*/React.createElement(_MenuItems__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n setUrl: setUrl,\n items: item,\n key: item.key || i,\n depthLevel: depthLevel\n });\n })) : null), !!adminify_admin_bar_data.search && adminify_admin_bar_data.search !== \"0\" ? /*#__PURE__*/React.createElement(_Search__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n setShowSearch: setShowSearch\n }) : null, !!adminify_admin_bar_data.notification && adminify_admin_bar_data.notification !== \"0\" ? /*#__PURE__*/React.createElement(_Comments__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n iframeFullReady: iframeFullReady\n }) : null, !!adminify_admin_bar_data.light_dark_switcher && adminify_admin_bar_data.light_dark_switcher !== \"0\" && Array.isArray(topSecondarySubmenu) && (_topSecondarySubmenu$ = topSecondarySubmenu.find(function (item) {\n return item.id === \"wp-adminify-admin-bar-switcher\";\n })) !== null && _topSecondarySubmenu$ !== void 0 && _topSecondarySubmenu$.menu_status ? /*#__PURE__*/React.createElement(_LightDarkSwitcher__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n setAdminifyColorMode: setAdminifyColorMode\n }) : null, checkMenuStatus(topSecondarySubmenu, \"adminify-frontend-site-preview\") ? /*#__PURE__*/React.createElement(\"div\", {\n className: \"wp-adminify--preview\"\n }, /*#__PURE__*/React.createElement(\"a\", {\n className: \"wp-adminify-preview-trigger\",\n href: (_adminify_admin_bar_d2 = adminify_admin_bar_data) === null || _adminify_admin_bar_d2 === void 0 ? void 0 : _adminify_admin_bar_d2.site_url,\n target: \"_blank\"\n }, /*#__PURE__*/React.createElement(\"i\", {\n className: \"dashicons dashicons-visibility\"\n }))) : null, checkMenuStatus(topSecondarySubmenu, \"my-account\") ? /*#__PURE__*/React.createElement(_UserAccount__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null) : null);\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TopSecondary);\n\n// For Admin Bar Editor & Default adminify support\nvar checkMenuStatus = function checkMenuStatus(topSecondarySubmenu, menuId) {\n if (Array.isArray(topSecondarySubmenu)) {\n var _topSecondarySubmenu$2;\n return (_topSecondarySubmenu$2 = topSecondarySubmenu.find(function (item) {\n return item.id === menuId;\n })) !== null && _topSecondarySubmenu$2 !== void 0 && _topSecondarySubmenu$2.menu_status ? true : false;\n }\n if (topSecondarySubmenu !== null && topSecondarySubmenu !== void 0 && topSecondarySubmenu[menuId]) {\n var _topSecondarySubmenu$3;\n return topSecondarySubmenu !== null && topSecondarySubmenu !== void 0 && (_topSecondarySubmenu$3 = topSecondarySubmenu[menuId]) !== null && _topSecondarySubmenu$3 !== void 0 && _topSecondarySubmenu$3.menu_status ? true : false;\n }\n return true;\n};\n\n//# sourceURL=webpack://adminify/./dev/admin/frame/Topbar/components/TopSecondary.jsx?"); | |
| 159 | +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _LightDarkSwitcher__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./LightDarkSwitcher */ \"./dev/admin/frame/Topbar/components/LightDarkSwitcher.jsx\");\n/* harmony import */ var _UserAccount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UserAccount */ \"./dev/admin/frame/Topbar/components/UserAccount.jsx\");\n/* harmony import */ var _Search__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Search */ \"./dev/admin/frame/Topbar/components/Search.jsx\");\n/* harmony import */ var _Comments__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Comments */ \"./dev/admin/frame/Topbar/components/Comments.jsx\");\n/* harmony import */ var _MenuItems__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./MenuItems */ \"./dev/admin/frame/Topbar/components/MenuItems.jsx\");\n/* harmony import */ var _utils_uitls__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/uitls */ \"./dev/admin/frame/utils/uitls.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\n\n\n\n\n\n\n\n// Check top secondary values\nfunction getTopSecondaryItems(topSecondarySubmenu) {\n var _ref;\n return (_ref = _toConsumableArray(_typeof(topSecondarySubmenu) === \"object\" ? Object.values(topSecondarySubmenu) : topSecondarySubmenu)) === null || _ref === void 0 || (_ref = _ref.filter(function (item) {\n return item.id !== \"my-account\";\n })) === null || _ref === void 0 || (_ref = _ref.filter(function (item) {\n return item.id !== \"wp-adminify-admin-bar-switcher\";\n })) === null || _ref === void 0 || (_ref = _ref.filter(function (item) {\n return item.id !== \"adminify_notification_count\";\n })) === null || _ref === void 0 ? void 0 : _ref.filter(function (item) {\n return item.id !== \"adminify-frontend-site-preview\";\n });\n}\nfunction TopSecondary(_ref2) {\n var _adminify_admin_bar_d, _getTopSecondaryItems, _getTopSecondaryItems2, _adminify_admin_bar_d2;\n var setShowSearch = _ref2.setShowSearch,\n getWidth = _ref2.getWidth,\n iframeFullReady = _ref2.iframeFullReady,\n setAdminifyColorMode = _ref2.setAdminifyColorMode,\n setUrl = _ref2.setUrl;\n var topSecondarySubmenu = (_adminify_admin_bar_d = adminify_admin_bar_data) === null || _adminify_admin_bar_d === void 0 || (_adminify_admin_bar_d = _adminify_admin_bar_d.data) === null || _adminify_admin_bar_d === void 0 || (_adminify_admin_bar_d = _adminify_admin_bar_d.find(function (menu) {\n return (menu === null || menu === void 0 ? void 0 : menu.id) === \"top-secondary\";\n })) === null || _adminify_admin_bar_d === void 0 ? void 0 : _adminify_admin_bar_d.submenu;\n return /*#__PURE__*/React.createElement(\"div\", {\n className: \"adminify-admin-bar-top-secondary\"\n }, getWidth ? null : /*#__PURE__*/React.createElement(React.Fragment, null, (_getTopSecondaryItems = getTopSecondaryItems(topSecondarySubmenu)) !== null && _getTopSecondaryItems !== void 0 && _getTopSecondaryItems.length ? /*#__PURE__*/React.createElement(\"ul\", {\n className: \"adminify-top-menu\"\n }, (_getTopSecondaryItems2 = getTopSecondaryItems(topSecondarySubmenu)) === null || _getTopSecondaryItems2 === void 0 ? void 0 : _getTopSecondaryItems2.map(function (item, i) {\n var depthLevel = 0;\n if (item.menu_status === false) {\n return null;\n }\n return /*#__PURE__*/React.createElement(_MenuItems__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n setUrl: setUrl,\n items: item,\n key: item.key || i,\n depthLevel: depthLevel\n });\n })) : null), !!adminify_admin_bar_data.search && adminify_admin_bar_data.search !== \"0\" ? /*#__PURE__*/React.createElement(_Search__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n setShowSearch: setShowSearch\n }) : null, !!adminify_admin_bar_data.notification && adminify_admin_bar_data.notification !== \"0\" ? /*#__PURE__*/React.createElement(_Comments__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n iframeFullReady: iframeFullReady\n }) : null, !!adminify_admin_bar_data.light_dark_switcher && adminify_admin_bar_data.light_dark_switcher !== \"0\" && checkMenuStatus(topSecondarySubmenu, \"wp-adminify-admin-bar-switcher\") ? /*#__PURE__*/React.createElement(_LightDarkSwitcher__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n setAdminifyColorMode: setAdminifyColorMode\n }) : null, checkMenuStatus(topSecondarySubmenu, \"adminify-frontend-site-preview\") ? /*#__PURE__*/React.createElement(\"div\", {\n className: \"wp-adminify--preview\"\n }, /*#__PURE__*/React.createElement(\"a\", {\n className: \"wp-adminify-preview-trigger\",\n href: (_adminify_admin_bar_d2 = adminify_admin_bar_data) === null || _adminify_admin_bar_d2 === void 0 ? void 0 : _adminify_admin_bar_d2.site_url,\n target: \"_blank\"\n }, /*#__PURE__*/React.createElement(\"i\", {\n className: \"dashicons dashicons-visibility\"\n }))) : null, checkMenuStatus(topSecondarySubmenu, \"my-account\") ? /*#__PURE__*/React.createElement(_UserAccount__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null) : null);\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TopSecondary);\n\n// For Admin Bar Editor & Default adminify support\nvar checkMenuStatus = function checkMenuStatus(topSecondarySubmenu, menuId) {\n if (Array.isArray(topSecondarySubmenu)) {\n var _topSecondarySubmenu$;\n return (_topSecondarySubmenu$ = topSecondarySubmenu.find(function (item) {\n return item.id === menuId;\n })) !== null && _topSecondarySubmenu$ !== void 0 && _topSecondarySubmenu$.menu_status ? true : false;\n }\n if (topSecondarySubmenu !== null && topSecondarySubmenu !== void 0 && topSecondarySubmenu[menuId]) {\n var _topSecondarySubmenu$2;\n return topSecondarySubmenu !== null && topSecondarySubmenu !== void 0 && (_topSecondarySubmenu$2 = topSecondarySubmenu[menuId]) !== null && _topSecondarySubmenu$2 !== void 0 && _topSecondarySubmenu$2.menu_status ? true : false;\n }\n return true;\n};\n\n//# sourceURL=webpack://adminify/./dev/admin/frame/Topbar/components/TopSecondary.jsx?"); | |
| 160 | 160 | |
| 161 | 161 | /***/ }), |
| 162 | 162 | |
| 163 | 163 | /***/ "./dev/admin/frame/Topbar/components/UserAccount.jsx": |
| @@ -325,9 +325,9 @@ | ||
| 325 | 325 | !*** ./dev/admin/frame/utils/uitls.js ***! |
| 326 | 326 | \****************************************/ |
| 327 | 327 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 328 | 328 | |
| 329 | -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ changeLightDarkMode: () => (/* binding */ changeLightDarkMode),\n/* harmony export */ checkAdminUrl: () => (/* binding */ checkAdminUrl),\n/* harmony export */ checkJsVoid: () => (/* binding */ checkJsVoid),\n/* harmony export */ findAdminBarNode: () => (/* binding */ findAdminBarNode),\n/* harmony export */ generateTopBarMenuDOM: () => (/* binding */ generateTopBarMenuDOM),\n/* harmony export */ getActiveMenu: () => (/* binding */ getActiveMenu),\n/* harmony export */ getEditProfileMenu: () => (/* binding */ getEditProfileMenu),\n/* harmony export */ getIcon: () => (/* binding */ getIcon),\n/* harmony export */ getLogo: () => (/* binding */ getLogo),\n/* harmony export */ getLogoStyles: () => (/* binding */ getLogoStyles),\n/* harmony export */ getLogoutURL: () => (/* binding */ getLogoutURL),\n/* harmony export */ getPath: () => (/* binding */ getPath),\n/* harmony export */ getUserActionMenu: () => (/* binding */ getUserActionMenu),\n/* harmony export */ handleClick: () => (/* binding */ handleClick),\n/* harmony export */ handleLogout: () => (/* binding */ handleLogout),\n/* harmony export */ handleMenuItemClick: () => (/* binding */ handleMenuItemClick),\n/* harmony export */ handleURLChange: () => (/* binding */ handleURLChange),\n/* harmony export */ isExternalUrl: () => (/* binding */ isExternalUrl),\n/* harmony export */ isImageUrl: () => (/* binding */ isImageUrl),\n/* harmony export */ isNewTabClick: () => (/* binding */ isNewTabClick),\n/* harmony export */ isSubdomain: () => (/* binding */ isSubdomain),\n/* harmony export */ loadGoogleFont: () => (/* binding */ loadGoogleFont),\n/* harmony export */ normalizeCopyDeletePostsMenu: () => (/* binding */ normalizeCopyDeletePostsMenu),\n/* harmony export */ replaceAmpInUrl: () => (/* binding */ replaceAmpInUrl),\n/* harmony export */ setDefaultURL: () => (/* binding */ setDefaultURL),\n/* harmony export */ switcherIcons: () => (/* binding */ switcherIcons),\n/* harmony export */ triggerJsVoidClick: () => (/* binding */ triggerJsVoidClick),\n/* harmony export */ waitForElm: () => (/* binding */ waitForElm)\n/* harmony export */ });\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./icons */ \"./dev/admin/frame/utils/icons/index.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t[\"return\"] || t[\"return\"](); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\n\n\n/**\n * Ctrl+Click (Windows/Linux), Cmd+Click (macOS), Shift+Click or middle-button\n * click — the user wants the link in a new tab/window, so handlers must not\n * preventDefault and must let the browser handle the click natively.\n * @param {MouseEvent} e\n * @returns {boolean}\n */\nvar isNewTabClick = function isNewTabClick(e) {\n return !!e && (e.ctrlKey || e.metaKey || e.shiftKey || e.button === 1);\n};\n\n// Navigation Menu\nvar handleMenuItemClick = function handleMenuItemClick(e, href) {\n var refreshFrame = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n // Allow Ctrl/Cmd/Shift/middle click to open in new tab natively\n if (isNewTabClick(e)) {\n return;\n }\n e.preventDefault();\n if (refreshFrame) {\n document.getElementById(\"frame-adminify-app--iframe\").contentWindow.location.href = href;\n window.history.pushState({}, \"\", href);\n }\n};\n\n// URL Change\nvar handleURLChange = function handleURLChange(href) {\n try {\n // Only pushState for same-origin URLs\n var url = new URL(href, window.location.origin);\n if (url.origin === window.location.origin) {\n window.history.pushState({}, \"\", href);\n }\n } catch (e) {\n // Invalid URL or cross-origin - ignore\n }\n};\n\n// Logo out\nvar handleLogout = function handleLogout() {\n var _adminify_admin_bar_d, _adminify_admin_bar_d2;\n window.location.href = (_adminify_admin_bar_d = adminify_admin_bar_data) === null || _adminify_admin_bar_d === void 0 ? void 0 : _adminify_admin_bar_d.logout_url;\n var url = new URL((_adminify_admin_bar_d2 = adminify_admin_bar_data) === null || _adminify_admin_bar_d2 === void 0 ? void 0 : _adminify_admin_bar_d2.logout_url);\n window.location.href = \"\".concat(url.origin).concat(url.pathname);\n};\nvar getLogoutURL = function getLogoutURL() {\n var _adminify_admin_bar_d3;\n var rawUrl = (_adminify_admin_bar_d3 = adminify_admin_bar_data) === null || _adminify_admin_bar_d3 === void 0 ? void 0 : _adminify_admin_bar_d3.logout_url;\n var solidURL = rawUrl.replace(/&/g, \"&\");\n return solidURL;\n};\n\n// Get Logo\nvar getLogo = function getLogo(data) {\n var imagePath = frame_adminify_menu.image_path;\n var logo = {\n full: \"\",\n mini: \"\",\n text: \"\",\n width: 120,\n height: 32,\n styles: {}\n };\n if ((data === null || data === void 0 ? void 0 : data.admin_ui_mode) === \"dark\") {\n // Dark Logo\n if ((data === null || data === void 0 ? void 0 : data.admin_ui_logo_type) === \"image_logo\") {\n var _data$admin_ui_dark_m, _data$admin_ui_dark_m3, _data$admin_ui_dark_m5, _data$admin_ui_dark_m7;\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m = data.admin_ui_dark_mode.admin_ui_dark_logo) !== null && _data$admin_ui_dark_m !== void 0 && _data$admin_ui_dark_m.url) {\n var _data$admin_ui_dark_m2;\n logo.full = data === null || data === void 0 || (_data$admin_ui_dark_m2 = data.admin_ui_dark_mode.admin_ui_dark_logo) === null || _data$admin_ui_dark_m2 === void 0 ? void 0 : _data$admin_ui_dark_m2.url;\n } else {\n logo.full = \"\".concat(imagePath, \"logos/logo-text-dark.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m3 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) !== null && _data$admin_ui_dark_m3 !== void 0 && _data$admin_ui_dark_m3.url) {\n var _data$admin_ui_dark_m4;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_dark_m4 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) === null || _data$admin_ui_dark_m4 === void 0 ? void 0 : _data$admin_ui_dark_m4.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-dark.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m5 = data.admin_ui_dark_mode) !== null && _data$admin_ui_dark_m5 !== void 0 && (_data$admin_ui_dark_m5 = _data$admin_ui_dark_m5.dark_logo_size) !== null && _data$admin_ui_dark_m5 !== void 0 && _data$admin_ui_dark_m5.width) {\n var _data$admin_ui_dark_m6;\n logo.width = data === null || data === void 0 || (_data$admin_ui_dark_m6 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m6 === void 0 || (_data$admin_ui_dark_m6 = _data$admin_ui_dark_m6.dark_logo_size) === null || _data$admin_ui_dark_m6 === void 0 ? void 0 : _data$admin_ui_dark_m6.width;\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m7 = data.admin_ui_dark_mode) !== null && _data$admin_ui_dark_m7 !== void 0 && (_data$admin_ui_dark_m7 = _data$admin_ui_dark_m7.dark_logo_size) !== null && _data$admin_ui_dark_m7 !== void 0 && _data$admin_ui_dark_m7.height) {\n var _data$admin_ui_dark_m8;\n logo.height = data === null || data === void 0 || (_data$admin_ui_dark_m8 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m8 === void 0 || (_data$admin_ui_dark_m8 = _data$admin_ui_dark_m8.dark_logo_size) === null || _data$admin_ui_dark_m8 === void 0 ? void 0 : _data$admin_ui_dark_m8.height;\n }\n } else {\n var _data$admin_ui_dark_m9, _data$admin_ui_dark_m10, _data$admin_ui_dark_m11;\n logo.text = data === null || data === void 0 || (_data$admin_ui_dark_m9 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m9 === void 0 ? void 0 : _data$admin_ui_dark_m9.admin_ui_dark_logo_text;\n var logo_style = data === null || data === void 0 || (_data$admin_ui_dark_m10 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m10 === void 0 ? void 0 : _data$admin_ui_dark_m10.admin_ui_dark_logo_text_typo;\n logo.styles = getLogoStyles(logo_style);\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m11 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) !== null && _data$admin_ui_dark_m11 !== void 0 && _data$admin_ui_dark_m11.url) {\n var _data$admin_ui_dark_m12;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_dark_m12 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) === null || _data$admin_ui_dark_m12 === void 0 ? void 0 : _data$admin_ui_dark_m12.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-dark.svg\");\n }\n }\n } else {\n // Light Logo\n if ((data === null || data === void 0 ? void 0 : data.admin_ui_logo_type) === \"image_logo\") {\n var _data$admin_ui_light_, _data$admin_ui_light_3, _data$admin_ui_light_5, _data$admin_ui_light_7;\n if (data !== null && data !== void 0 && (_data$admin_ui_light_ = data.admin_ui_light_mode.admin_ui_light_logo) !== null && _data$admin_ui_light_ !== void 0 && _data$admin_ui_light_.url) {\n var _data$admin_ui_light_2;\n logo.full = data === null || data === void 0 || (_data$admin_ui_light_2 = data.admin_ui_light_mode.admin_ui_light_logo) === null || _data$admin_ui_light_2 === void 0 ? void 0 : _data$admin_ui_light_2.url;\n } else {\n logo.full = \"\".concat(imagePath, \"logos/logo-text-light.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_light_3 = data.admin_ui_light_mode.mini_admin_ui_light_logo) !== null && _data$admin_ui_light_3 !== void 0 && _data$admin_ui_light_3.url) {\n var _data$admin_ui_light_4;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_light_4 = data.admin_ui_light_mode.mini_admin_ui_light_logo) === null || _data$admin_ui_light_4 === void 0 ? void 0 : _data$admin_ui_light_4.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-light.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_light_5 = data.admin_ui_light_mode) !== null && _data$admin_ui_light_5 !== void 0 && (_data$admin_ui_light_5 = _data$admin_ui_light_5.light_logo_size) !== null && _data$admin_ui_light_5 !== void 0 && _data$admin_ui_light_5.width) {\n var _data$admin_ui_light_6;\n logo.width = data === null || data === void 0 || (_data$admin_ui_light_6 = data.admin_ui_light_mode) === null || _data$admin_ui_light_6 === void 0 || (_data$admin_ui_light_6 = _data$admin_ui_light_6.light_logo_size) === null || _data$admin_ui_light_6 === void 0 ? void 0 : _data$admin_ui_light_6.width;\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_light_7 = data.admin_ui_light_mode) !== null && _data$admin_ui_light_7 !== void 0 && (_data$admin_ui_light_7 = _data$admin_ui_light_7.light_logo_size) !== null && _data$admin_ui_light_7 !== void 0 && _data$admin_ui_light_7.height) {\n var _data$admin_ui_light_8;\n logo.height = data === null || data === void 0 || (_data$admin_ui_light_8 = data.admin_ui_light_mode) === null || _data$admin_ui_light_8 === void 0 || (_data$admin_ui_light_8 = _data$admin_ui_light_8.light_logo_size) === null || _data$admin_ui_light_8 === void 0 ? void 0 : _data$admin_ui_light_8.height;\n }\n } else {\n var _data$admin_ui_light_9, _data$admin_ui_light_10, _data$admin_ui_light_11;\n logo.text = data === null || data === void 0 || (_data$admin_ui_light_9 = data.admin_ui_light_mode) === null || _data$admin_ui_light_9 === void 0 ? void 0 : _data$admin_ui_light_9.admin_ui_light_logo_text;\n var _logo_style = data === null || data === void 0 || (_data$admin_ui_light_10 = data.admin_ui_light_mode) === null || _data$admin_ui_light_10 === void 0 ? void 0 : _data$admin_ui_light_10.admin_ui_light_logo_text_typo;\n logo.styles = getLogoStyles(_logo_style);\n if (data !== null && data !== void 0 && (_data$admin_ui_light_11 = data.admin_ui_light_mode.mini_admin_ui_light_logo) !== null && _data$admin_ui_light_11 !== void 0 && _data$admin_ui_light_11.url) {\n var _data$admin_ui_light_12;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_light_12 = data.admin_ui_light_mode.mini_admin_ui_light_logo) === null || _data$admin_ui_light_12 === void 0 ? void 0 : _data$admin_ui_light_12.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-light.svg\");\n }\n }\n }\n return logo;\n};\n\n/**\n * Web-safe fonts that don't need to be loaded from Google\n */\nvar WEB_SAFE_FONTS = [\"Arial\", \"Helvetica\", \"Times New Roman\", \"Times\", \"Courier New\", \"Courier\", \"Verdana\", \"Georgia\", \"Palatino\", \"Garamond\", \"Bookman\", \"Trebuchet MS\", \"Arial Black\", \"Impact\", \"Comic Sans MS\", \"system-ui\", \"sans-serif\", \"serif\", \"monospace\"];\n\n/**\n * Convert font weight string to numeric value for Google Fonts\n * @param {string|number} weight - The font weight\n * @returns {string} - Numeric font weight\n */\nfunction normalizeFontWeight(weight) {\n if (!weight) return \"400\";\n\n // If already a number or numeric string, return it\n if (!isNaN(weight)) return String(weight);\n\n // Map common weight names to numeric values\n var weightMap = {\n \"thin\": \"100\",\n \"hairline\": \"100\",\n \"extra-light\": \"200\",\n \"extralight\": \"200\",\n \"ultra-light\": \"200\",\n \"light\": \"300\",\n \"normal\": \"400\",\n \"regular\": \"400\",\n \"medium\": \"500\",\n \"semi-bold\": \"600\",\n \"semibold\": \"600\",\n \"demi-bold\": \"600\",\n \"bold\": \"700\",\n \"extra-bold\": \"800\",\n \"extrabold\": \"800\",\n \"ultra-bold\": \"800\",\n \"black\": \"900\",\n \"heavy\": \"900\"\n };\n return weightMap[String(weight).toLowerCase()] || \"400\";\n}\n\n/**\n * Load Google Font dynamically - uses local font URLs provided by PHP\n * PHP handles font download on page load, JS just creates link tags\n * @param {string} fontFamily - The font family name to load\n * @param {string} fontWeight - The font weight (optional)\n */\nfunction loadGoogleFont(fontFamily) {\n var _window$PXLBSADMINIFY;\n var fontWeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"400\";\n if (!fontFamily || fontFamily === \"\") return;\n\n // Skip web-safe fonts\n if (WEB_SAFE_FONTS.some(function (f) {\n return fontFamily.toLowerCase() === f.toLowerCase();\n })) {\n return;\n }\n\n // Create a unique ID for this font\n var fontSlug = fontFamily.replace(/\\s+/g, \"-\").toLowerCase();\n var fontId = \"adminify-local-font-\".concat(fontSlug);\n\n // Check if font is already loaded\n if (document.getElementById(fontId)) return;\n\n // Get local font URL from PHP-provided config\n var localFontsConfig = (_window$PXLBSADMINIFY = window.PXLBSADMINIFY_ADMIN) === null || _window$PXLBSADMINIFY === void 0 ? void 0 : _window$PXLBSADMINIFY.local_fonts;\n if (localFontsConfig !== null && localFontsConfig !== void 0 && localFontsConfig.base_url) {\n var localFontUrl = \"\".concat(localFontsConfig.base_url, \"/\").concat(fontSlug, \"/\").concat(fontSlug, \".css\");\n\n // Create and append the link element\n var link = document.createElement(\"link\");\n link.id = fontId;\n link.rel = \"stylesheet\";\n link.href = localFontUrl;\n document.head.appendChild(link);\n }\n}\n\n/**\n * Get Logo Styles\n */\nfunction getLogoStyles(logo_style) {\n // Load the Google Font if font-family is specified\n // The loadGoogleFont function will skip web-safe fonts automatically\n if (logo_style !== null && logo_style !== void 0 && logo_style[\"font-family\"]) {\n loadGoogleFont(logo_style[\"font-family\"], (logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-weight\"]) || \"400\");\n }\n return {\n fontFamily: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-family\"],\n fontWeight: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-weight\"],\n fontSize: logo_style !== null && logo_style !== void 0 && logo_style[\"font-size\"] ? (logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-size\"]) + (logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"unit\"]) : \"\",\n letterSpacing: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"letter-spacing\"],\n color: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"color\"]\n };\n}\n\n/**\n * Handle click\n * @param {css selector} el\n * @param {function} callback\n * @returns\n */\nfunction handleClick(el, callback) {\n return el.addEventListener(\"click\", callback);\n}\n\n// Switcher icons\nvar switcherIcons = {\n light: /*#__PURE__*/React.createElement(\"svg\", {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"24\",\n className: \"lightIcon\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"var(--adminify-menu-text-color)\",\n d: \"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z\"\n })),\n dark: /*#__PURE__*/React.createElement(\"svg\", {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"24\",\n className: \"darkIcon\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"var(--adminify-menu-text-color)\",\n d: \"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z\"\n })),\n system: /*#__PURE__*/React.createElement(\"svg\", {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 22 18\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n className: \"systemIcon\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20 13V4.2C20 3.0799 20 2.51984 19.782 2.09202C19.5903 1.71569 19.2843 1.40973 18.908 1.21799C18.4802 1 17.9201 1 16.8 1H5.2C4.07989 1 3.51984 1 3.09202 1.21799C2.71569 1.40973 2.40973 1.71569 2.21799 2.09202C2 2.51984 2 3.0799 2 4.2V13M3.66667 17H18.3333C18.9533 17 19.2633 17 19.5176 16.9319C20.2078 16.7469 20.7469 16.2078 20.9319 15.5176C21 15.2633 21 14.9533 21 14.3333C21 14.0233 21 13.8683 20.9659 13.7412C20.8735 13.3961 20.6039 13.1265 20.2588 13.0341C20.1317 13 19.9767 13 19.6667 13H2.33333C2.02334 13 1.86835 13 1.74118 13.0341C1.39609 13.1265 1.12654 13.3961 1.03407 13.7412C1 13.8683 1 14.0233 1 14.3333C1 14.9533 1 15.2633 1.06815 15.5176C1.25308 16.2078 1.79218 16.7469 2.48236 16.9319C2.73669 17 3.04669 17 3.66667 17Z\",\n stroke: \"var(--adminify-menu-text-color)\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n }))\n};\n\n// Set Light Dark Mode\nvar changeLightDarkMode = function changeLightDarkMode(mode) {\n jQuery.ajax({\n url: PXLBSADMINIFY_FRAME.ajax_url,\n type: \"post\",\n data: {\n action: \"pxlbsadminify_color_mode\",\n security: PXLBSADMINIFY_FRAME.security_nonce,\n key: \"color_mode\",\n value: mode\n }\n });\n};\n\n/**\n * Retrieves the appropriate icon for a given menu item based on its properties.\n * - If the layout type is horizontal and the menu type is text-only, returns an empty string.\n * - Supports various icon formats: base64 data URIs, image file extensions, dashicons, and font awesome icons.\n * - Defaults to displaying the first character of the menu title if no icon is specified.\n *\n * @param {Object} menu - The menu item containing icon and title properties.\n * @param {boolean} getWidth - A flag indicating if width should be considered.\n * @returns {string} - The HTML string representing the menu icon.\n */\nfunction getIcon(menu, getWidth) {\n var menuLayoutSettings = frame_adminify_menu.menu_layout_settings;\n\n // Check if icon rendering is skipped for text-only horizontal menu type\n if ((menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.horz_menu_type) === \"text_only\" && (menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.layout_type) === \"horizontal\" && getWidth === false) {\n return \"\";\n }\n var _ref = menu || {},\n icon = _ref.icon,\n title = _ref.title;\n // Determine the icon type and return corresponding HTML\n if (/data:image/g.test(icon)) {\n // Handle base64 data URIs\n return \"<span class=\\\"frame-adminify-menu-image\\\" style=\\\"mask-image: url(\".concat(icon, \")\\\"></span>\");\n } else if (/\\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i.test(icon)) {\n // Handle image file extensions\n return \"<span class=\\\"frame-adminify-menu-image\\\">\\n <img src=\\\"\".concat(icon, \"\\\" alt=\\\"menu icon\\\" />\\n </span>\");\n } else if (/dashicons/g.test(icon)) {\n // Handle dashicons\n return _icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons !== null && _icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons !== void 0 && _icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons[icon] ? \"<span class=\\\"frame-adminify-menu-icon\\\">\".concat(_icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons[icon], \"</span>\") : \"<span class=\\\"frame-adminify-menu-icon dashicons \".concat(icon, \"\\\"></span>\");\n } else if (/fa-/g.test(menu === null || menu === void 0 ? void 0 : menu.icon)) {\n // Handle FontAwesome icons (fa-)\n return \"<span class=\\\"frame-adminify-menu-icon fas \".concat(menu.icon, \"\\\"></span>\");\n } else if (/icon-/g.test(menu === null || menu === void 0 ? void 0 : menu.icon)) {\n // Handle Simple Line Icons (icon-)\n return \"<span class=\\\"frame-adminify-menu-icon \".concat(menu.icon, \"\\\"></span>\");\n }\n\n // Default: Display the first character of the menu title\n return \"<span class=\\\"frame-adminify-menu-icon-symbol\\\">\".concat((title === null || title === void 0 ? void 0 : title.charAt(0)) || '', \"</span>\");\n}\n\n// get Active Menu\nvar getActiveMenu = function getActiveMenu(menus, isSub, isURL) {\n var url = isURL ? isURL : window.location.href;\n var menuId = \"\";\n var submenuId = \"\";\n for (var menuKey in menus) {\n if (Object.hasOwnProperty.call(menus, menuKey)) {\n var _menu$children;\n var menu = menus[menuKey];\n if ((menu === null || menu === void 0 || (_menu$children = menu.children) === null || _menu$children === void 0 ? void 0 : _menu$children.length) === 0 && (menu === null || menu === void 0 ? void 0 : menu.url) === url) {\n // Active menu without Submenu\n menuId = menu === null || menu === void 0 ? void 0 : menu.key;\n } else {\n // Active Menu With Submenu\n for (var submenuKey in menu === null || menu === void 0 ? void 0 : menu.children) {\n if (Object.hasOwnProperty.call(menu === null || menu === void 0 ? void 0 : menu.children, submenuKey)) {\n var submenu = menu === null || menu === void 0 ? void 0 : menu.children[submenuKey];\n var clean_url = url.substring(0, url.indexOf(\"#\"));\n if ((submenu === null || submenu === void 0 ? void 0 : submenu.url) === url || (submenu === null || submenu === void 0 ? void 0 : submenu.url) === clean_url) {\n menuId = menu === null || menu === void 0 ? void 0 : menu.key;\n submenuId = submenu === null || submenu === void 0 ? void 0 : submenu.key;\n }\n }\n }\n }\n }\n }\n if (!!isSub) {\n return submenuId;\n }\n return [menuId];\n};\n\n// Set Default URL\nvar setDefaultURL = function setDefaultURL(href) {\n var existing_href = window.location.href;\n var url = new URL(existing_href);\n if (!href.includes(url.origin) || url.pathname.length > 10) {\n window.history.pushState({}, \"\", existing_href);\n return existing_href;\n } else {\n window.history.pushState({}, \"\", href);\n return href;\n }\n};\n\n// Decode URL\nfunction replaceAmpInUrl(fullUrl) {\n var url = new URL(fullUrl);\n var queryString = url.search;\n var decodedQueryString = decodeURIComponent(queryString).replace(/&/g, \"&\");\n url.search = decodedQueryString;\n return url.toString();\n}\nvar isSubdomain = function isSubdomain(url) {\n if (/(?:(http(s?))?:\\/\\/)?(?:www\\.)?([a-zA-Z0-9-]+\\.)[a-zA-Z0-9-]+\\.[a-zA-Z]{2,}/i.test(url)) {\n return true;\n }\n return false;\n};\nvar getPath = function getPath(url) {\n if (/(http(s?)):\\/\\//i.test(url)) {\n if (isSubdomain(url)) return url;\n var decodedURL = sanitizeURL(url);\n var urlObj = new URL(decodedURL);\n return \"\".concat(urlObj === null || urlObj === void 0 ? void 0 : urlObj.pathname).concat(urlObj === null || urlObj === void 0 ? void 0 : urlObj.search);\n }\n return url;\n};\n\n// Recommended approach\nfunction sanitizeURL(url) {\n // Decode HTML entities\n var textArea = document.createElement('textarea');\n textArea.innerHTML = url;\n var decoded = textArea.value;\n\n // Validate and return\n try {\n new URL(decoded);\n return decoded;\n } catch (_unused) {\n // If still invalid, try to fix common issues\n return decoded.replace(/&/g, '&').replace(/&/g, '&');\n }\n}\n\n/**\n *\n * @param {CSS} selector\n * @returns exits DOM\n */\nfunction waitForElm(selector) {\n return new Promise(function (resolve) {\n if (document.querySelector(selector)) {\n return resolve(document.querySelector(selector));\n }\n var observer = new MutationObserver(function (mutations) {\n if (document.querySelector(selector)) {\n observer.disconnect();\n resolve(document.querySelector(selector));\n }\n });\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n });\n}\nvar checkAdminUrl = function checkAdminUrl() {\n var _adminify_admin_bar_d4;\n var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var admin_url = (_adminify_admin_bar_d4 = adminify_admin_bar_data) === null || _adminify_admin_bar_d4 === void 0 ? void 0 : _adminify_admin_bar_d4.admin_url;\n return url.includes(admin_url);\n};\n\n/**\n * Normalize Menu Title\n * @param {*} title \n * @returns string\n */\nfunction normalizeCopyDeletePostsMenu(title) {\n if (!title || typeof title !== 'string') return title;\n var temp = document.createElement('div');\n temp.innerHTML = title;\n\n // Check if there's direct text + span together (like \"Plugins <span>...</span>\")\n var hasDirectText = Array.from(temp.childNodes).some(function (node) {\n return node.nodeType === Node.TEXT_NODE && node.textContent.trim() !== '';\n });\n var hasSpan = temp.querySelector('span') !== null;\n\n // If both direct text and span exist, return original\n if (hasDirectText && hasSpan) {\n return title;\n }\n\n // If only a span with text inside, extract the text\n if (temp.children.length === 1 && temp.children[0].tagName === 'SPAN') {\n var span = temp.children[0];\n if (span.children.length === 0) {\n return span.textContent;\n }\n }\n return title;\n}\nfunction checkJsVoid() {\n var href = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n if (!href) return false;\n if (href.includes(\"avascript:void\")) return true;\n return false;\n}\n\n/**\n * Trigger click on original WordPress admin bar element for javascript:void links\n * This enables compatibility with plugins that use javascript:void(0) hrefs\n * @param {string} itemId - The menu item ID (e.g., 'wpdn-add-note')\n * @returns {boolean} - Returns true if click was triggered successfully\n */\nfunction triggerJsVoidClick(itemId) {\n var _iframe$contentWindow;\n if (!itemId) return false;\n var iframe = document.getElementById(\"frame-adminify-app--iframe\");\n var iframeDoc = (iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) || (iframe === null || iframe === void 0 || (_iframe$contentWindow = iframe.contentWindow) === null || _iframe$contentWindow === void 0 ? void 0 : _iframe$contentWindow.document);\n\n // Try to find and click the element inside the iframe first\n if (iframeDoc) {\n var iframeElement = iframeDoc.querySelector(\"#wp-admin-bar-\".concat(itemId, \" a\"));\n if (iframeElement) {\n // Click the element inside iframe\n iframeElement.click();\n\n // Handle AJAX-based actions: wait for completion, refresh iframe, scroll to new content\n handleJsVoidAjaxAction(iframe, itemId);\n return true;\n }\n }\n\n // Fallback: Find the original WordPress admin bar element in parent\n var originalElement = document.querySelector(\"#wp-admin-bar-\".concat(itemId, \" a\"));\n if (originalElement) {\n originalElement.click();\n return true;\n }\n return false;\n}\n\n/**\n * Handle javascript:void AJAX actions generically\n * Waits for AJAX to complete, refreshes iframe, and scrolls to new content\n * @param {HTMLIFrameElement} iframe - The iframe element\n * @param {string} itemId - The menu item ID for context\n */\nfunction handleJsVoidAjaxAction(iframe, itemId) {\n var iframeWindow = iframe === null || iframe === void 0 ? void 0 : iframe.contentWindow;\n if (!iframeWindow || !iframeWindow.jQuery) return;\n\n // Use jQuery's ajaxStop to detect when all AJAX requests complete\n iframeWindow.jQuery(document).one('ajaxStop', function () {\n // Small delay to ensure DOM is updated\n setTimeout(function () {\n // Store scroll target info before refresh\n var scrollTarget = getScrollTargetSelector(itemId, iframeWindow.document);\n\n // Refresh the iframe\n iframe.contentWindow.location.reload();\n\n // After iframe loads, scroll to the new content\n iframe.onload = function () {\n setTimeout(function () {\n scrollToNewContent(iframe, scrollTarget);\n }, 300);\n };\n }, 100);\n });\n}\n\n/**\n * Get selector for scroll target based on plugin/action type\n * @param {string} itemId - The menu item ID\n * @param {Document} doc - The document to search in\n * @returns {object} - Scroll target info\n */\nfunction getScrollTargetSelector(itemId, doc) {\n // Map of known plugins and their new content selectors\n var pluginSelectors = {\n 'wpdn-add-note': {\n container: '#postbox-container-1 #normal-sortables',\n itemPrefix: 'note_',\n findLatest: true\n }\n // add more plugin support...\n };\n var config = pluginSelectors[itemId];\n if (config && config.findLatest) {\n // Find the latest item ID before refresh\n var container = doc.querySelector(config.container);\n if (container) {\n var items = container.querySelectorAll(\"[id^=\\\"\".concat(config.itemPrefix, \"\\\"]\"));\n if (items.length > 0) {\n // Get the highest ID (newest item)\n var maxId = 0;\n items.forEach(function (item) {\n var id = parseInt(item.id.replace(config.itemPrefix, ''), 10);\n if (id > maxId) maxId = id;\n });\n return {\n selector: \"#\".concat(config.itemPrefix).concat(maxId),\n isNew: true,\n prefix: config.itemPrefix\n };\n }\n }\n }\n return {\n selector: null,\n itemId: itemId\n };\n}\n\n/**\n * Scroll to newly added content in iframe after refresh\n * @param {HTMLIFrameElement} iframe - The iframe element\n * @param {object} scrollTarget - The scroll target info\n */\nfunction scrollToNewContent(iframe, scrollTarget) {\n var _iframe$contentWindow2;\n var iframeDoc = (iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) || (iframe === null || iframe === void 0 || (_iframe$contentWindow2 = iframe.contentWindow) === null || _iframe$contentWindow2 === void 0 ? void 0 : _iframe$contentWindow2.document);\n if (!iframeDoc) return;\n if (scrollTarget.isNew && scrollTarget.prefix) {\n // Find the newest item (highest ID) after refresh\n var items = iframeDoc.querySelectorAll(\"[id^=\\\"\".concat(scrollTarget.prefix, \"\\\"]\"));\n var newestElement = null;\n var maxId = 0;\n items.forEach(function (item) {\n var id = parseInt(item.id.replace(scrollTarget.prefix, ''), 10);\n if (id > maxId) {\n maxId = id;\n newestElement = item;\n }\n });\n if (newestElement) {\n newestElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n // Add highlight effect\n newestElement.style.transition = 'box-shadow 0.3s ease';\n newestElement.style.boxShadow = '0 0 10px 3px rgba(0, 123, 255, 0.5)';\n setTimeout(function () {\n newestElement.style.boxShadow = '';\n }, 2000);\n return;\n }\n }\n\n // Fallback: scroll to specific selector if provided\n if (scrollTarget.selector) {\n var element = iframeDoc.querySelector(scrollTarget.selector);\n if (element) {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n }\n }\n}\n\n/**\n * Check if a string is an image URL\n * @param {string} str - The string to check\n * @returns {boolean} - True if string is an image URL\n */\nfunction isImageUrl(str) {\n if (!str || typeof str !== 'string') return false;\n\n // Check for base64 data URI\n if (/^data:image\\//i.test(str)) return true;\n\n // Check for image file extensions\n if (/\\.(jpg|jpeg|png|gif|bmp|webp|svg|ico)(\\?.*)?$/i.test(str)) return true;\n\n // Check for URL patterns that look like images\n if (/^(https?:)?\\/\\/.+\\.(jpg|jpeg|png|gif|bmp|webp|svg|ico)(\\?.*)?$/i.test(str)) return true;\n return false;\n}\n\n/**\n * Generate icon HTML based on icon type\n * @param {string} icon - Icon class name or image URL\n * @returns {string} - HTML string for the icon\n */\nfunction generateIconHTML(icon) {\n if (!icon) return '';\n\n // Check if icon is an image URL\n if (isImageUrl(icon)) {\n return \"<img width=\\\"20\\\" height=\\\"20\\\" src=\\\"\".concat(icon, \"\\\" alt=\\\"menu icon\\\" style=\\\"width: 20px; height: 20px; object-fit: contain;\\\" />\");\n }\n\n // Otherwise treat as icon class\n return \"<span class=\\\"\".concat(icon, \"\\\"></span>\");\n}\n\n/**\n * Generate TopBar Menu DOM HTML\n * @param {Object} options - Menu options\n * @param {string|null} options.icon - Icon class name or image URL\n * @param {string} options.title - Menu title (can contain HTML)\n * @returns {string} - Generated HTML string\n */\nfunction generateTopBarMenuDOM(_ref2) {\n var _ref2$icon = _ref2.icon,\n icon = _ref2$icon === void 0 ? null : _ref2$icon,\n _ref2$title = _ref2.title,\n title = _ref2$title === void 0 ? \"\" : _ref2$title;\n var safeTitle = title || \"\";\n var trimmedTitle = safeTitle.trim();\n\n // Generate icon HTML from icon property\n var iconHTML = generateIconHTML(icon);\n var hasIconProperty = iconHTML !== '';\n\n // Check if title is a complete block-level element (div) from plugins like Yoast\n // These should be rendered as-is to preserve plugin CSS styling\n var isCompleteBlockElement = /^<div\\b[^>]*>[\\s\\S]*<\\/div>$/i.test(trimmedTitle);\n\n // Check if title contains inline HTML elements (span, img, etc.) mixed with text\n var hasInlineHTMLInTitle = /<(span|img|svg|i|a)\\b/i.test(safeTitle);\n\n // Generate title HTML\n var titleHTML;\n if (isCompleteBlockElement) {\n // Plugin HTML like Yoast - render as-is to preserve their CSS classes\n titleHTML = trimmedTitle;\n } else if (hasInlineHTMLInTitle) {\n // Mixed content like \"<span class='ab-icon'></span><span>Text</span>\"\n var cleanedTitle = safeTitle.replaceAll(' ', '');\n\n // If icon property exists, remove ab-icon and img tags from title to avoid duplicates\n if (hasIconProperty) {\n // Remove ab-icon spans\n cleanedTitle = cleanedTitle.replace(/<span[^>]*class=[\"'][^\"']*ab-icon[^\"']*[\"'][^>]*>[\\s\\S]*?<\\/span>/gi, '');\n // Remove img tags\n cleanedTitle = cleanedTitle.replace(/<img[^>]*>/gi, '');\n }\n titleHTML = \"<div class=\\\"adminify-top-menu-item-has-icon\\\" style=\\\"display: inline-flex; align-items: center; flex-wrap: wrap; gap: 8px;\\\">\".concat(cleanedTitle, \"</div>\");\n } else {\n titleHTML = \"<span>\".concat(safeTitle, \"</span>\");\n }\n return \"\".concat(iconHTML).concat(titleHTML);\n}\n\n/**\n * Recursively find an admin bar node by its id.\n * Submenus may be either arrays or keyed objects, so normalize both.\n * @param {Array|Object} nodes - Admin bar nodes / submenu\n * @param {string} id - Node id to find\n * @returns {Object|null} - Matching node or null\n */\nfunction findAdminBarNode(nodes, id) {\n if (!nodes) return null;\n var list = Array.isArray(nodes) ? nodes : Object.values(nodes);\n var _iterator = _createForOfIteratorHelper(list),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var node = _step.value;\n if (!node || _typeof(node) !== \"object\") continue;\n if (node.id === id) return node;\n var found = findAdminBarNode(node.submenu, id);\n if (found) return found;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n return null;\n}\n\n/**\n * Resolve the \"Edit Profile\" menu from the Admin Bar Editor.\n * Mirrors the editor for the profile (my-account > user-info) node:\n * - visibility: hidden nodes are removed from the tree or have menu_status === false.\n * - title: a custom title (e.g. \"Profile Editing\") is used when set; the default\n * WordPress title is an avatar/name HTML block, so fall back to \"Edit Profile\".\n * Falls back to the default label/visibility when the my-account tree is unavailable.\n * @returns {{ visible: boolean, title: string }}\n */\nfunction getEditProfileMenu() {\n var _adminify_admin_bar_d5;\n var defaultLabel = \"Edit Profile\";\n var myAccount = findAdminBarNode((_adminify_admin_bar_d5 = adminify_admin_bar_data) === null || _adminify_admin_bar_d5 === void 0 ? void 0 : _adminify_admin_bar_d5.data, \"my-account\");\n\n // No my-account data available, keep default behavior.\n if (!myAccount) return {\n visible: true,\n title: defaultLabel\n };\n var userInfo = findAdminBarNode(myAccount.submenu, \"user-info\");\n if (!userInfo || userInfo.menu_status === false) {\n return {\n visible: false,\n title: defaultLabel\n };\n }\n var rawTitle = typeof userInfo.title === \"string\" ? userInfo.title.trim() : \"\";\n // Default title is an avatar/name HTML block; use the standard label for it.\n var isDefaultHtmlTitle = /<(img|span)\\b/i.test(rawTitle);\n var title = rawTitle && !isDefaultHtmlTitle ? rawTitle : defaultLabel;\n return {\n visible: true,\n title: title\n };\n}\n\n/**\n * Get the visible items of the account menu (my-account > user-actions group).\n * Includes core items (user-info, logout) and any custom items added in the\n * Admin Bar Editor, in their saved order. Hidden items (removed from the tree\n * or menu_status === false) are excluded.\n * Returns null when the my-account/user-actions tree is unavailable so callers\n * can fall back to the default UI.\n * @returns {Array|null}\n */\nfunction getUserActionMenu() {\n var _adminify_admin_bar_d6;\n var myAccount = findAdminBarNode((_adminify_admin_bar_d6 = adminify_admin_bar_data) === null || _adminify_admin_bar_d6 === void 0 ? void 0 : _adminify_admin_bar_d6.data, \"my-account\");\n if (!myAccount) return null;\n var userActions = findAdminBarNode(myAccount.submenu, \"user-actions\");\n if (!userActions) return null;\n var submenu = userActions.submenu;\n var list = Array.isArray(submenu) ? submenu : Object.values(submenu || {});\n return list.filter(function (item) {\n return item && item.menu_status !== false;\n });\n}\n\n// Check if URL has different origin than current page\nvar isExternalUrl = function isExternalUrl(item) {\n var _item$meta;\n if (!item) return false;\n\n // check meta\n if ((item === null || item === void 0 || (_item$meta = item.meta) === null || _item$meta === void 0 ? void 0 : _item$meta.target) === \"_blank\") return true;\n var url = item === null || item === void 0 ? void 0 : item.href;\n try {\n var linkUrl = new URL(url, window.location.origin);\n return linkUrl.origin !== window.location.origin;\n } catch (e) {\n return false;\n }\n};\n\n//# sourceURL=webpack://adminify/./dev/admin/frame/utils/uitls.js?"); | |
| 329 | +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ changeLightDarkMode: () => (/* binding */ changeLightDarkMode),\n/* harmony export */ checkAdminUrl: () => (/* binding */ checkAdminUrl),\n/* harmony export */ checkJsVoid: () => (/* binding */ checkJsVoid),\n/* harmony export */ findAdminBarNode: () => (/* binding */ findAdminBarNode),\n/* harmony export */ generateTopBarMenuDOM: () => (/* binding */ generateTopBarMenuDOM),\n/* harmony export */ getActiveMenu: () => (/* binding */ getActiveMenu),\n/* harmony export */ getEditProfileMenu: () => (/* binding */ getEditProfileMenu),\n/* harmony export */ getIcon: () => (/* binding */ getIcon),\n/* harmony export */ getLogo: () => (/* binding */ getLogo),\n/* harmony export */ getLogoStyles: () => (/* binding */ getLogoStyles),\n/* harmony export */ getLogoutURL: () => (/* binding */ getLogoutURL),\n/* harmony export */ getPath: () => (/* binding */ getPath),\n/* harmony export */ getUserActionMenu: () => (/* binding */ getUserActionMenu),\n/* harmony export */ handleClick: () => (/* binding */ handleClick),\n/* harmony export */ handleLogout: () => (/* binding */ handleLogout),\n/* harmony export */ handleMenuItemClick: () => (/* binding */ handleMenuItemClick),\n/* harmony export */ handleURLChange: () => (/* binding */ handleURLChange),\n/* harmony export */ isExternalUrl: () => (/* binding */ isExternalUrl),\n/* harmony export */ isImageUrl: () => (/* binding */ isImageUrl),\n/* harmony export */ isNewTabClick: () => (/* binding */ isNewTabClick),\n/* harmony export */ isSubdomain: () => (/* binding */ isSubdomain),\n/* harmony export */ loadGoogleFont: () => (/* binding */ loadGoogleFont),\n/* harmony export */ normalizeCopyDeletePostsMenu: () => (/* binding */ normalizeCopyDeletePostsMenu),\n/* harmony export */ replaceAmpInUrl: () => (/* binding */ replaceAmpInUrl),\n/* harmony export */ setDefaultURL: () => (/* binding */ setDefaultURL),\n/* harmony export */ switcherIcons: () => (/* binding */ switcherIcons),\n/* harmony export */ syncIframeHistory: () => (/* binding */ syncIframeHistory),\n/* harmony export */ triggerJsVoidClick: () => (/* binding */ triggerJsVoidClick),\n/* harmony export */ waitForElm: () => (/* binding */ waitForElm)\n/* harmony export */ });\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./icons */ \"./dev/admin/frame/utils/icons/index.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t[\"return\"] || t[\"return\"](); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\n\n\n/**\n * Ctrl+Click (Windows/Linux), Cmd+Click (macOS), Shift+Click or middle-button\n * click — the user wants the link in a new tab/window, so handlers must not\n * preventDefault and must let the browser handle the click natively.\n * @param {MouseEvent} e\n * @returns {boolean}\n */\nvar isNewTabClick = function isNewTabClick(e) {\n return !!e && (e.ctrlKey || e.metaKey || e.shiftKey || e.button === 1);\n};\n\n// Navigation Menu\nvar handleMenuItemClick = function handleMenuItemClick(e, href) {\n var refreshFrame = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n // Allow Ctrl/Cmd/Shift/middle click to open in new tab natively\n if (isNewTabClick(e)) {\n return;\n }\n e.preventDefault();\n if (refreshFrame) {\n document.getElementById(\"frame-adminify-app--iframe\").contentWindow.location.href = href;\n window.history.pushState({}, \"\", href);\n }\n};\n\n// URL Change\nvar handleURLChange = function handleURLChange(href) {\n var replace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n try {\n // Only push/replaceState for same-origin URLs\n var url = new URL(href, window.location.origin);\n if (url.origin === window.location.origin) {\n window.history[replace ? \"replaceState\" : \"pushState\"]({}, \"\", href);\n }\n } catch (e) {\n // Invalid URL or cross-origin - ignore\n }\n};\nvar HISTORY_SYNCED = \"__adminifyHistorySynced\";\n\n/**\n * Mirror history moves made INSIDE the iframe onto the shell window.\n *\n * Admin screens that behave like SPAs change URL with the History API instead of\n * loading a document. The block editor is the visible case: the moment a draft is\n * published core calls `replaceState` to swap `post-new.php` for\n * `post.php?post=<id>&action=edit`. No `load` and no `hashchange` fires for that,\n * so the shell keeps showing the URL the frame started on - reloading then reopens\n * an empty new post instead of the published one. Same for anything the editor\n * routes client-side afterwards, e.g. the \"View Posts\" back button.\n *\n * Patch the iframe's own `pushState`/`replaceState` and listen for `popstate` so\n * every such move reaches the shell. A real navigation gives the iframe a fresh\n * `window` - and a fresh `history` - so the guard flag resets by itself and this\n * re-patches on each load.\n *\n * @param {Window} iframeWindow Same-origin iframe window.\n * @param {Function} onChange Receives (href, isReplace).\n */\nvar syncIframeHistory = function syncIframeHistory(iframeWindow, onChange) {\n try {\n var iframeHistory = iframeWindow === null || iframeWindow === void 0 ? void 0 : iframeWindow.history;\n if (!iframeHistory || iframeHistory[HISTORY_SYNCED]) return;\n\n // Never let a shell error escape into the iframe's own navigation.\n var notify = function notify(isReplace) {\n try {\n onChange(iframeWindow.location.href, isReplace);\n } catch (err) {\n // Shell-side failure - the iframe must still navigate.\n }\n };\n [\"pushState\", \"replaceState\"].forEach(function (method) {\n var original = iframeHistory[method];\n if (typeof original !== \"function\") return;\n iframeHistory[method] = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var result = original.apply(this, args);\n notify(method === \"replaceState\");\n return result;\n };\n });\n iframeHistory[HISTORY_SYNCED] = true;\n\n // Back/forward inside the iframe - replace so the shell does not stack a\n // duplicate entry on top of the one the user just moved to.\n iframeWindow.addEventListener(\"popstate\", function () {\n return notify(true);\n });\n } catch (e) {\n // Cross-origin iframe - nothing to patch.\n }\n};\n\n// Logo out\nvar handleLogout = function handleLogout() {\n var _adminify_admin_bar_d, _adminify_admin_bar_d2;\n window.location.href = (_adminify_admin_bar_d = adminify_admin_bar_data) === null || _adminify_admin_bar_d === void 0 ? void 0 : _adminify_admin_bar_d.logout_url;\n var url = new URL((_adminify_admin_bar_d2 = adminify_admin_bar_data) === null || _adminify_admin_bar_d2 === void 0 ? void 0 : _adminify_admin_bar_d2.logout_url);\n window.location.href = \"\".concat(url.origin).concat(url.pathname);\n};\nvar getLogoutURL = function getLogoutURL() {\n var _adminify_admin_bar_d3;\n var rawUrl = (_adminify_admin_bar_d3 = adminify_admin_bar_data) === null || _adminify_admin_bar_d3 === void 0 ? void 0 : _adminify_admin_bar_d3.logout_url;\n var solidURL = rawUrl.replace(/&/g, \"&\");\n return solidURL;\n};\n\n// Get Logo\nvar getLogo = function getLogo(data) {\n var imagePath = frame_adminify_menu.image_path;\n var logo = {\n full: \"\",\n mini: \"\",\n text: \"\",\n width: 120,\n height: 32,\n styles: {}\n };\n if ((data === null || data === void 0 ? void 0 : data.admin_ui_mode) === \"dark\") {\n // Dark Logo\n if ((data === null || data === void 0 ? void 0 : data.admin_ui_logo_type) === \"image_logo\") {\n var _data$admin_ui_dark_m, _data$admin_ui_dark_m3, _data$admin_ui_dark_m5, _data$admin_ui_dark_m7;\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m = data.admin_ui_dark_mode.admin_ui_dark_logo) !== null && _data$admin_ui_dark_m !== void 0 && _data$admin_ui_dark_m.url) {\n var _data$admin_ui_dark_m2;\n logo.full = data === null || data === void 0 || (_data$admin_ui_dark_m2 = data.admin_ui_dark_mode.admin_ui_dark_logo) === null || _data$admin_ui_dark_m2 === void 0 ? void 0 : _data$admin_ui_dark_m2.url;\n } else {\n logo.full = \"\".concat(imagePath, \"logos/logo-text-dark.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m3 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) !== null && _data$admin_ui_dark_m3 !== void 0 && _data$admin_ui_dark_m3.url) {\n var _data$admin_ui_dark_m4;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_dark_m4 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) === null || _data$admin_ui_dark_m4 === void 0 ? void 0 : _data$admin_ui_dark_m4.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-dark.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m5 = data.admin_ui_dark_mode) !== null && _data$admin_ui_dark_m5 !== void 0 && (_data$admin_ui_dark_m5 = _data$admin_ui_dark_m5.dark_logo_size) !== null && _data$admin_ui_dark_m5 !== void 0 && _data$admin_ui_dark_m5.width) {\n var _data$admin_ui_dark_m6;\n logo.width = data === null || data === void 0 || (_data$admin_ui_dark_m6 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m6 === void 0 || (_data$admin_ui_dark_m6 = _data$admin_ui_dark_m6.dark_logo_size) === null || _data$admin_ui_dark_m6 === void 0 ? void 0 : _data$admin_ui_dark_m6.width;\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m7 = data.admin_ui_dark_mode) !== null && _data$admin_ui_dark_m7 !== void 0 && (_data$admin_ui_dark_m7 = _data$admin_ui_dark_m7.dark_logo_size) !== null && _data$admin_ui_dark_m7 !== void 0 && _data$admin_ui_dark_m7.height) {\n var _data$admin_ui_dark_m8;\n logo.height = data === null || data === void 0 || (_data$admin_ui_dark_m8 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m8 === void 0 || (_data$admin_ui_dark_m8 = _data$admin_ui_dark_m8.dark_logo_size) === null || _data$admin_ui_dark_m8 === void 0 ? void 0 : _data$admin_ui_dark_m8.height;\n }\n } else {\n var _data$admin_ui_dark_m9, _data$admin_ui_dark_m10, _data$admin_ui_dark_m11;\n logo.text = data === null || data === void 0 || (_data$admin_ui_dark_m9 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m9 === void 0 ? void 0 : _data$admin_ui_dark_m9.admin_ui_dark_logo_text;\n var logo_style = data === null || data === void 0 || (_data$admin_ui_dark_m10 = data.admin_ui_dark_mode) === null || _data$admin_ui_dark_m10 === void 0 ? void 0 : _data$admin_ui_dark_m10.admin_ui_dark_logo_text_typo;\n logo.styles = getLogoStyles(logo_style);\n if (data !== null && data !== void 0 && (_data$admin_ui_dark_m11 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) !== null && _data$admin_ui_dark_m11 !== void 0 && _data$admin_ui_dark_m11.url) {\n var _data$admin_ui_dark_m12;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_dark_m12 = data.admin_ui_dark_mode.mini_admin_ui_dark_logo) === null || _data$admin_ui_dark_m12 === void 0 ? void 0 : _data$admin_ui_dark_m12.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-dark.svg\");\n }\n }\n } else {\n // Light Logo\n if ((data === null || data === void 0 ? void 0 : data.admin_ui_logo_type) === \"image_logo\") {\n var _data$admin_ui_light_, _data$admin_ui_light_3, _data$admin_ui_light_5, _data$admin_ui_light_7;\n if (data !== null && data !== void 0 && (_data$admin_ui_light_ = data.admin_ui_light_mode.admin_ui_light_logo) !== null && _data$admin_ui_light_ !== void 0 && _data$admin_ui_light_.url) {\n var _data$admin_ui_light_2;\n logo.full = data === null || data === void 0 || (_data$admin_ui_light_2 = data.admin_ui_light_mode.admin_ui_light_logo) === null || _data$admin_ui_light_2 === void 0 ? void 0 : _data$admin_ui_light_2.url;\n } else {\n logo.full = \"\".concat(imagePath, \"logos/logo-text-light.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_light_3 = data.admin_ui_light_mode.mini_admin_ui_light_logo) !== null && _data$admin_ui_light_3 !== void 0 && _data$admin_ui_light_3.url) {\n var _data$admin_ui_light_4;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_light_4 = data.admin_ui_light_mode.mini_admin_ui_light_logo) === null || _data$admin_ui_light_4 === void 0 ? void 0 : _data$admin_ui_light_4.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-light.svg\");\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_light_5 = data.admin_ui_light_mode) !== null && _data$admin_ui_light_5 !== void 0 && (_data$admin_ui_light_5 = _data$admin_ui_light_5.light_logo_size) !== null && _data$admin_ui_light_5 !== void 0 && _data$admin_ui_light_5.width) {\n var _data$admin_ui_light_6;\n logo.width = data === null || data === void 0 || (_data$admin_ui_light_6 = data.admin_ui_light_mode) === null || _data$admin_ui_light_6 === void 0 || (_data$admin_ui_light_6 = _data$admin_ui_light_6.light_logo_size) === null || _data$admin_ui_light_6 === void 0 ? void 0 : _data$admin_ui_light_6.width;\n }\n if (data !== null && data !== void 0 && (_data$admin_ui_light_7 = data.admin_ui_light_mode) !== null && _data$admin_ui_light_7 !== void 0 && (_data$admin_ui_light_7 = _data$admin_ui_light_7.light_logo_size) !== null && _data$admin_ui_light_7 !== void 0 && _data$admin_ui_light_7.height) {\n var _data$admin_ui_light_8;\n logo.height = data === null || data === void 0 || (_data$admin_ui_light_8 = data.admin_ui_light_mode) === null || _data$admin_ui_light_8 === void 0 || (_data$admin_ui_light_8 = _data$admin_ui_light_8.light_logo_size) === null || _data$admin_ui_light_8 === void 0 ? void 0 : _data$admin_ui_light_8.height;\n }\n } else {\n var _data$admin_ui_light_9, _data$admin_ui_light_10, _data$admin_ui_light_11;\n logo.text = data === null || data === void 0 || (_data$admin_ui_light_9 = data.admin_ui_light_mode) === null || _data$admin_ui_light_9 === void 0 ? void 0 : _data$admin_ui_light_9.admin_ui_light_logo_text;\n var _logo_style = data === null || data === void 0 || (_data$admin_ui_light_10 = data.admin_ui_light_mode) === null || _data$admin_ui_light_10 === void 0 ? void 0 : _data$admin_ui_light_10.admin_ui_light_logo_text_typo;\n logo.styles = getLogoStyles(_logo_style);\n if (data !== null && data !== void 0 && (_data$admin_ui_light_11 = data.admin_ui_light_mode.mini_admin_ui_light_logo) !== null && _data$admin_ui_light_11 !== void 0 && _data$admin_ui_light_11.url) {\n var _data$admin_ui_light_12;\n logo.mini = data === null || data === void 0 || (_data$admin_ui_light_12 = data.admin_ui_light_mode.mini_admin_ui_light_logo) === null || _data$admin_ui_light_12 === void 0 ? void 0 : _data$admin_ui_light_12.url;\n } else {\n logo.mini = \"\".concat(imagePath, \"logos/mini-logo-light.svg\");\n }\n }\n }\n return logo;\n};\n\n/**\n * Web-safe fonts that don't need to be loaded from Google\n */\nvar WEB_SAFE_FONTS = [\"Arial\", \"Helvetica\", \"Times New Roman\", \"Times\", \"Courier New\", \"Courier\", \"Verdana\", \"Georgia\", \"Palatino\", \"Garamond\", \"Bookman\", \"Trebuchet MS\", \"Arial Black\", \"Impact\", \"Comic Sans MS\", \"system-ui\", \"sans-serif\", \"serif\", \"monospace\"];\n\n/**\n * Convert font weight string to numeric value for Google Fonts\n * @param {string|number} weight - The font weight\n * @returns {string} - Numeric font weight\n */\nfunction normalizeFontWeight(weight) {\n if (!weight) return \"400\";\n\n // If already a number or numeric string, return it\n if (!isNaN(weight)) return String(weight);\n\n // Map common weight names to numeric values\n var weightMap = {\n \"thin\": \"100\",\n \"hairline\": \"100\",\n \"extra-light\": \"200\",\n \"extralight\": \"200\",\n \"ultra-light\": \"200\",\n \"light\": \"300\",\n \"normal\": \"400\",\n \"regular\": \"400\",\n \"medium\": \"500\",\n \"semi-bold\": \"600\",\n \"semibold\": \"600\",\n \"demi-bold\": \"600\",\n \"bold\": \"700\",\n \"extra-bold\": \"800\",\n \"extrabold\": \"800\",\n \"ultra-bold\": \"800\",\n \"black\": \"900\",\n \"heavy\": \"900\"\n };\n return weightMap[String(weight).toLowerCase()] || \"400\";\n}\n\n/**\n * Load Google Font dynamically - uses local font URLs provided by PHP\n * PHP handles font download on page load, JS just creates link tags\n * @param {string} fontFamily - The font family name to load\n * @param {string} fontWeight - The font weight (optional)\n */\nfunction loadGoogleFont(fontFamily) {\n var _window$PXLBSADMINIFY;\n var fontWeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"400\";\n if (!fontFamily || fontFamily === \"\") return;\n\n // Skip web-safe fonts\n if (WEB_SAFE_FONTS.some(function (f) {\n return fontFamily.toLowerCase() === f.toLowerCase();\n })) {\n return;\n }\n\n // Create a unique ID for this font\n var fontSlug = fontFamily.replace(/\\s+/g, \"-\").toLowerCase();\n var fontId = \"adminify-local-font-\".concat(fontSlug);\n\n // Check if font is already loaded\n if (document.getElementById(fontId)) return;\n\n // Get local font URL from PHP-provided config\n var localFontsConfig = (_window$PXLBSADMINIFY = window.PXLBSADMINIFY_ADMIN) === null || _window$PXLBSADMINIFY === void 0 ? void 0 : _window$PXLBSADMINIFY.local_fonts;\n if (localFontsConfig !== null && localFontsConfig !== void 0 && localFontsConfig.base_url) {\n var localFontUrl = \"\".concat(localFontsConfig.base_url, \"/\").concat(fontSlug, \"/\").concat(fontSlug, \".css\");\n\n // Create and append the link element\n var link = document.createElement(\"link\");\n link.id = fontId;\n link.rel = \"stylesheet\";\n link.href = localFontUrl;\n document.head.appendChild(link);\n }\n}\n\n/**\n * Get Logo Styles\n */\nfunction getLogoStyles(logo_style) {\n // Load the Google Font if font-family is specified\n // The loadGoogleFont function will skip web-safe fonts automatically\n if (logo_style !== null && logo_style !== void 0 && logo_style[\"font-family\"]) {\n loadGoogleFont(logo_style[\"font-family\"], (logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-weight\"]) || \"400\");\n }\n return {\n fontFamily: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-family\"],\n fontWeight: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-weight\"],\n fontSize: logo_style !== null && logo_style !== void 0 && logo_style[\"font-size\"] ? (logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"font-size\"]) + (logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"unit\"]) : \"\",\n letterSpacing: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"letter-spacing\"],\n color: logo_style === null || logo_style === void 0 ? void 0 : logo_style[\"color\"]\n };\n}\n\n/**\n * Handle click\n * @param {css selector} el\n * @param {function} callback\n * @returns\n */\nfunction handleClick(el, callback) {\n return el.addEventListener(\"click\", callback);\n}\n\n// Switcher icons\nvar switcherIcons = {\n light: /*#__PURE__*/React.createElement(\"svg\", {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"24\",\n className: \"lightIcon\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"var(--adminify-menu-text-color)\",\n d: \"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z\"\n })),\n dark: /*#__PURE__*/React.createElement(\"svg\", {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"24\",\n className: \"darkIcon\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"var(--adminify-menu-text-color)\",\n d: \"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z\"\n })),\n system: /*#__PURE__*/React.createElement(\"svg\", {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 22 18\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n className: \"systemIcon\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20 13V4.2C20 3.0799 20 2.51984 19.782 2.09202C19.5903 1.71569 19.2843 1.40973 18.908 1.21799C18.4802 1 17.9201 1 16.8 1H5.2C4.07989 1 3.51984 1 3.09202 1.21799C2.71569 1.40973 2.40973 1.71569 2.21799 2.09202C2 2.51984 2 3.0799 2 4.2V13M3.66667 17H18.3333C18.9533 17 19.2633 17 19.5176 16.9319C20.2078 16.7469 20.7469 16.2078 20.9319 15.5176C21 15.2633 21 14.9533 21 14.3333C21 14.0233 21 13.8683 20.9659 13.7412C20.8735 13.3961 20.6039 13.1265 20.2588 13.0341C20.1317 13 19.9767 13 19.6667 13H2.33333C2.02334 13 1.86835 13 1.74118 13.0341C1.39609 13.1265 1.12654 13.3961 1.03407 13.7412C1 13.8683 1 14.0233 1 14.3333C1 14.9533 1 15.2633 1.06815 15.5176C1.25308 16.2078 1.79218 16.7469 2.48236 16.9319C2.73669 17 3.04669 17 3.66667 17Z\",\n stroke: \"var(--adminify-menu-text-color)\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n }))\n};\n\n// Set Light Dark Mode\nvar changeLightDarkMode = function changeLightDarkMode(mode) {\n jQuery.ajax({\n url: PXLBSADMINIFY_FRAME.ajax_url,\n type: \"post\",\n data: {\n action: \"pxlbsadminify_color_mode\",\n security: PXLBSADMINIFY_FRAME.security_nonce,\n key: \"color_mode\",\n value: mode\n }\n });\n};\n\n/**\n * Retrieves the appropriate icon for a given menu item based on its properties.\n * - If the layout type is horizontal and the menu type is text-only, returns an empty string.\n * - Supports various icon formats: base64 data URIs, image file extensions, dashicons, and font awesome icons.\n * - Defaults to displaying the first character of the menu title if no icon is specified.\n *\n * @param {Object} menu - The menu item containing icon and title properties.\n * @param {boolean} getWidth - A flag indicating if width should be considered.\n * @returns {string} - The HTML string representing the menu icon.\n */\nfunction getIcon(menu, getWidth) {\n var menuLayoutSettings = frame_adminify_menu.menu_layout_settings;\n\n // Check if icon rendering is skipped for text-only horizontal menu type\n if ((menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.horz_menu_type) === \"text_only\" && (menuLayoutSettings === null || menuLayoutSettings === void 0 ? void 0 : menuLayoutSettings.layout_type) === \"horizontal\" && getWidth === false) {\n return \"\";\n }\n var _ref = menu || {},\n icon = _ref.icon,\n title = _ref.title;\n // Determine the icon type and return corresponding HTML\n if (/data:image/g.test(icon)) {\n // Handle base64 data URIs\n return \"<span class=\\\"frame-adminify-menu-image\\\" style=\\\"mask-image: url(\".concat(icon, \")\\\"></span>\");\n } else if (/\\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i.test(icon)) {\n // Handle image file extensions\n return \"<span class=\\\"frame-adminify-menu-image\\\">\\n <img src=\\\"\".concat(icon, \"\\\" alt=\\\"menu icon\\\" />\\n </span>\");\n } else if (/dashicons/g.test(icon)) {\n // Handle dashicons\n return _icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons !== null && _icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons !== void 0 && _icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons[icon] ? \"<span class=\\\"frame-adminify-menu-icon\\\">\".concat(_icons__WEBPACK_IMPORTED_MODULE_0__.dashboardIcons[icon], \"</span>\") : \"<span class=\\\"frame-adminify-menu-icon dashicons \".concat(icon, \"\\\"></span>\");\n } else if (/fa-/g.test(menu === null || menu === void 0 ? void 0 : menu.icon)) {\n // Handle FontAwesome icons (fa-)\n return \"<span class=\\\"frame-adminify-menu-icon fas \".concat(menu.icon, \"\\\"></span>\");\n } else if (/icon-/g.test(menu === null || menu === void 0 ? void 0 : menu.icon)) {\n // Handle Simple Line Icons (icon-)\n return \"<span class=\\\"frame-adminify-menu-icon \".concat(menu.icon, \"\\\"></span>\");\n }\n\n // Default: Display the first character of the menu title\n return \"<span class=\\\"frame-adminify-menu-icon-symbol\\\">\".concat((title === null || title === void 0 ? void 0 : title.charAt(0)) || '', \"</span>\");\n}\n\n// get Active Menu\nvar getActiveMenu = function getActiveMenu(menus, isSub, isURL) {\n var url = isURL ? isURL : window.location.href;\n var menuId = \"\";\n var submenuId = \"\";\n for (var menuKey in menus) {\n if (Object.hasOwnProperty.call(menus, menuKey)) {\n var _menu$children;\n var menu = menus[menuKey];\n if ((menu === null || menu === void 0 || (_menu$children = menu.children) === null || _menu$children === void 0 ? void 0 : _menu$children.length) === 0 && (menu === null || menu === void 0 ? void 0 : menu.url) === url) {\n // Active menu without Submenu\n menuId = menu === null || menu === void 0 ? void 0 : menu.key;\n } else {\n // Active Menu With Submenu\n for (var submenuKey in menu === null || menu === void 0 ? void 0 : menu.children) {\n if (Object.hasOwnProperty.call(menu === null || menu === void 0 ? void 0 : menu.children, submenuKey)) {\n var submenu = menu === null || menu === void 0 ? void 0 : menu.children[submenuKey];\n var clean_url = url.substring(0, url.indexOf(\"#\"));\n if ((submenu === null || submenu === void 0 ? void 0 : submenu.url) === url || (submenu === null || submenu === void 0 ? void 0 : submenu.url) === clean_url) {\n menuId = menu === null || menu === void 0 ? void 0 : menu.key;\n submenuId = submenu === null || submenu === void 0 ? void 0 : submenu.key;\n }\n }\n }\n }\n }\n }\n if (!!isSub) {\n return submenuId;\n }\n return [menuId];\n};\n\n// Set Default URL\nvar setDefaultURL = function setDefaultURL(href) {\n var existing_href = window.location.href;\n var url = new URL(existing_href);\n if (!href.includes(url.origin) || url.pathname.length > 10) {\n window.history.pushState({}, \"\", existing_href);\n return existing_href;\n } else {\n window.history.pushState({}, \"\", href);\n return href;\n }\n};\n\n// Decode URL\nfunction replaceAmpInUrl(fullUrl) {\n var url = new URL(fullUrl);\n var queryString = url.search;\n var decodedQueryString = decodeURIComponent(queryString).replace(/&/g, \"&\");\n url.search = decodedQueryString;\n return url.toString();\n}\nvar isSubdomain = function isSubdomain(url) {\n if (/(?:(http(s?))?:\\/\\/)?(?:www\\.)?([a-zA-Z0-9-]+\\.)[a-zA-Z0-9-]+\\.[a-zA-Z]{2,}/i.test(url)) {\n return true;\n }\n return false;\n};\nvar getPath = function getPath(url) {\n if (/(http(s?)):\\/\\//i.test(url)) {\n if (isSubdomain(url)) return url;\n var decodedURL = sanitizeURL(url);\n var urlObj = new URL(decodedURL);\n return \"\".concat(urlObj === null || urlObj === void 0 ? void 0 : urlObj.pathname).concat(urlObj === null || urlObj === void 0 ? void 0 : urlObj.search);\n }\n return url;\n};\n\n// Recommended approach\nfunction sanitizeURL(url) {\n // Decode HTML entities\n var textArea = document.createElement('textarea');\n textArea.innerHTML = url;\n var decoded = textArea.value;\n\n // Validate and return\n try {\n new URL(decoded);\n return decoded;\n } catch (_unused) {\n // If still invalid, try to fix common issues\n return decoded.replace(/&/g, '&').replace(/&/g, '&');\n }\n}\n\n/**\n *\n * @param {CSS} selector\n * @returns exits DOM\n */\nfunction waitForElm(selector) {\n return new Promise(function (resolve) {\n if (document.querySelector(selector)) {\n return resolve(document.querySelector(selector));\n }\n var observer = new MutationObserver(function (mutations) {\n if (document.querySelector(selector)) {\n observer.disconnect();\n resolve(document.querySelector(selector));\n }\n });\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n });\n}\nvar checkAdminUrl = function checkAdminUrl() {\n var _adminify_admin_bar_d4;\n var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var admin_url = (_adminify_admin_bar_d4 = adminify_admin_bar_data) === null || _adminify_admin_bar_d4 === void 0 ? void 0 : _adminify_admin_bar_d4.admin_url;\n return url.includes(admin_url);\n};\n\n/**\n * Normalize Menu Title\n * @param {*} title \n * @returns string\n */\nfunction normalizeCopyDeletePostsMenu(title) {\n if (!title || typeof title !== 'string') return title;\n var temp = document.createElement('div');\n temp.innerHTML = title;\n\n // Check if there's direct text + span together (like \"Plugins <span>...</span>\")\n var hasDirectText = Array.from(temp.childNodes).some(function (node) {\n return node.nodeType === Node.TEXT_NODE && node.textContent.trim() !== '';\n });\n var hasSpan = temp.querySelector('span') !== null;\n\n // If both direct text and span exist, return original\n if (hasDirectText && hasSpan) {\n return title;\n }\n\n // If only a span with text inside, extract the text\n if (temp.children.length === 1 && temp.children[0].tagName === 'SPAN') {\n var span = temp.children[0];\n if (span.children.length === 0) {\n return span.textContent;\n }\n }\n return title;\n}\nfunction checkJsVoid() {\n var href = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n if (!href) return false;\n if (href.includes(\"avascript:void\")) return true;\n return false;\n}\n\n/**\n * Trigger click on original WordPress admin bar element for javascript:void links\n * This enables compatibility with plugins that use javascript:void(0) hrefs\n * @param {string} itemId - The menu item ID (e.g., 'wpdn-add-note')\n * @returns {boolean} - Returns true if click was triggered successfully\n */\nfunction triggerJsVoidClick(itemId) {\n var _iframe$contentWindow;\n if (!itemId) return false;\n var iframe = document.getElementById(\"frame-adminify-app--iframe\");\n var iframeDoc = (iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) || (iframe === null || iframe === void 0 || (_iframe$contentWindow = iframe.contentWindow) === null || _iframe$contentWindow === void 0 ? void 0 : _iframe$contentWindow.document);\n\n // Try to find and click the element inside the iframe first\n if (iframeDoc) {\n var iframeElement = iframeDoc.querySelector(\"#wp-admin-bar-\".concat(itemId, \" a\"));\n if (iframeElement) {\n // Click the element inside iframe\n iframeElement.click();\n\n // Handle AJAX-based actions: wait for completion, refresh iframe, scroll to new content\n handleJsVoidAjaxAction(iframe, itemId);\n return true;\n }\n }\n\n // Fallback: Find the original WordPress admin bar element in parent\n var originalElement = document.querySelector(\"#wp-admin-bar-\".concat(itemId, \" a\"));\n if (originalElement) {\n originalElement.click();\n return true;\n }\n return false;\n}\n\n/**\n * Handle javascript:void AJAX actions generically\n * Waits for AJAX to complete, refreshes iframe, and scrolls to new content\n * @param {HTMLIFrameElement} iframe - The iframe element\n * @param {string} itemId - The menu item ID for context\n */\nfunction handleJsVoidAjaxAction(iframe, itemId) {\n var iframeWindow = iframe === null || iframe === void 0 ? void 0 : iframe.contentWindow;\n if (!iframeWindow || !iframeWindow.jQuery) return;\n\n // Use jQuery's ajaxStop to detect when all AJAX requests complete\n iframeWindow.jQuery(document).one('ajaxStop', function () {\n // Small delay to ensure DOM is updated\n setTimeout(function () {\n // Store scroll target info before refresh\n var scrollTarget = getScrollTargetSelector(itemId, iframeWindow.document);\n\n // Refresh the iframe\n iframe.contentWindow.location.reload();\n\n // After iframe loads, scroll to the new content\n iframe.onload = function () {\n setTimeout(function () {\n scrollToNewContent(iframe, scrollTarget);\n }, 300);\n };\n }, 100);\n });\n}\n\n/**\n * Get selector for scroll target based on plugin/action type\n * @param {string} itemId - The menu item ID\n * @param {Document} doc - The document to search in\n * @returns {object} - Scroll target info\n */\nfunction getScrollTargetSelector(itemId, doc) {\n // Map of known plugins and their new content selectors\n var pluginSelectors = {\n 'wpdn-add-note': {\n container: '#postbox-container-1 #normal-sortables',\n itemPrefix: 'note_',\n findLatest: true\n }\n // add more plugin support...\n };\n var config = pluginSelectors[itemId];\n if (config && config.findLatest) {\n // Find the latest item ID before refresh\n var container = doc.querySelector(config.container);\n if (container) {\n var items = container.querySelectorAll(\"[id^=\\\"\".concat(config.itemPrefix, \"\\\"]\"));\n if (items.length > 0) {\n // Get the highest ID (newest item)\n var maxId = 0;\n items.forEach(function (item) {\n var id = parseInt(item.id.replace(config.itemPrefix, ''), 10);\n if (id > maxId) maxId = id;\n });\n return {\n selector: \"#\".concat(config.itemPrefix).concat(maxId),\n isNew: true,\n prefix: config.itemPrefix\n };\n }\n }\n }\n return {\n selector: null,\n itemId: itemId\n };\n}\n\n/**\n * Scroll to newly added content in iframe after refresh\n * @param {HTMLIFrameElement} iframe - The iframe element\n * @param {object} scrollTarget - The scroll target info\n */\nfunction scrollToNewContent(iframe, scrollTarget) {\n var _iframe$contentWindow2;\n var iframeDoc = (iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) || (iframe === null || iframe === void 0 || (_iframe$contentWindow2 = iframe.contentWindow) === null || _iframe$contentWindow2 === void 0 ? void 0 : _iframe$contentWindow2.document);\n if (!iframeDoc) return;\n if (scrollTarget.isNew && scrollTarget.prefix) {\n // Find the newest item (highest ID) after refresh\n var items = iframeDoc.querySelectorAll(\"[id^=\\\"\".concat(scrollTarget.prefix, \"\\\"]\"));\n var newestElement = null;\n var maxId = 0;\n items.forEach(function (item) {\n var id = parseInt(item.id.replace(scrollTarget.prefix, ''), 10);\n if (id > maxId) {\n maxId = id;\n newestElement = item;\n }\n });\n if (newestElement) {\n newestElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n // Add highlight effect\n newestElement.style.transition = 'box-shadow 0.3s ease';\n newestElement.style.boxShadow = '0 0 10px 3px rgba(0, 123, 255, 0.5)';\n setTimeout(function () {\n newestElement.style.boxShadow = '';\n }, 2000);\n return;\n }\n }\n\n // Fallback: scroll to specific selector if provided\n if (scrollTarget.selector) {\n var element = iframeDoc.querySelector(scrollTarget.selector);\n if (element) {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n }\n }\n}\n\n/**\n * Check if a string is an image URL\n * @param {string} str - The string to check\n * @returns {boolean} - True if string is an image URL\n */\nfunction isImageUrl(str) {\n if (!str || typeof str !== 'string') return false;\n\n // Check for base64 data URI\n if (/^data:image\\//i.test(str)) return true;\n\n // Check for image file extensions\n if (/\\.(jpg|jpeg|png|gif|bmp|webp|svg|ico)(\\?.*)?$/i.test(str)) return true;\n\n // Check for URL patterns that look like images\n if (/^(https?:)?\\/\\/.+\\.(jpg|jpeg|png|gif|bmp|webp|svg|ico)(\\?.*)?$/i.test(str)) return true;\n return false;\n}\n\n/**\n * Generate icon HTML based on icon type\n * @param {string} icon - Icon class name or image URL\n * @returns {string} - HTML string for the icon\n */\nfunction generateIconHTML(icon) {\n if (!icon) return '';\n\n // Check if icon is an image URL\n if (isImageUrl(icon)) {\n return \"<img width=\\\"20\\\" height=\\\"20\\\" src=\\\"\".concat(icon, \"\\\" alt=\\\"menu icon\\\" style=\\\"width: 20px; height: 20px; object-fit: contain;\\\" />\");\n }\n\n // Otherwise treat as icon class\n return \"<span class=\\\"\".concat(icon, \"\\\"></span>\");\n}\n\n/**\n * Generate TopBar Menu DOM HTML\n * @param {Object} options - Menu options\n * @param {string|null} options.icon - Icon class name or image URL\n * @param {string} options.title - Menu title (can contain HTML)\n * @returns {string} - Generated HTML string\n */\nfunction generateTopBarMenuDOM(_ref2) {\n var _ref2$icon = _ref2.icon,\n icon = _ref2$icon === void 0 ? null : _ref2$icon,\n _ref2$title = _ref2.title,\n title = _ref2$title === void 0 ? \"\" : _ref2$title;\n var safeTitle = title || \"\";\n var trimmedTitle = safeTitle.trim();\n\n // Generate icon HTML from icon property\n var iconHTML = generateIconHTML(icon);\n var hasIconProperty = iconHTML !== '';\n\n // Check if title is a complete block-level element (div) from plugins like Yoast\n // These should be rendered as-is to preserve plugin CSS styling\n var isCompleteBlockElement = /^<div\\b[^>]*>[\\s\\S]*<\\/div>$/i.test(trimmedTitle);\n\n // Check if title contains inline HTML elements (span, img, etc.) mixed with text\n var hasInlineHTMLInTitle = /<(span|img|svg|i|a)\\b/i.test(safeTitle);\n\n // Generate title HTML\n var titleHTML;\n if (isCompleteBlockElement) {\n // Plugin HTML like Yoast - render as-is to preserve their CSS classes\n titleHTML = trimmedTitle;\n } else if (hasInlineHTMLInTitle) {\n // Mixed content like \"<span class='ab-icon'></span><span>Text</span>\"\n var cleanedTitle = safeTitle.replaceAll(' ', '');\n\n // If icon property exists, remove ab-icon and img tags from title to avoid duplicates\n if (hasIconProperty) {\n // Remove ab-icon spans\n cleanedTitle = cleanedTitle.replace(/<span[^>]*class=[\"'][^\"']*ab-icon[^\"']*[\"'][^>]*>[\\s\\S]*?<\\/span>/gi, '');\n // Remove img tags\n cleanedTitle = cleanedTitle.replace(/<img[^>]*>/gi, '');\n }\n titleHTML = \"<div class=\\\"adminify-top-menu-item-has-icon\\\" style=\\\"display: inline-flex; align-items: center; flex-wrap: wrap; gap: 8px;\\\">\".concat(cleanedTitle, \"</div>\");\n } else {\n titleHTML = \"<span>\".concat(safeTitle, \"</span>\");\n }\n return \"\".concat(iconHTML).concat(titleHTML);\n}\n\n/**\n * Recursively find an admin bar node by its id.\n * Submenus may be either arrays or keyed objects, so normalize both.\n * @param {Array|Object} nodes - Admin bar nodes / submenu\n * @param {string} id - Node id to find\n * @returns {Object|null} - Matching node or null\n */\nfunction findAdminBarNode(nodes, id) {\n if (!nodes) return null;\n var list = Array.isArray(nodes) ? nodes : Object.values(nodes);\n var _iterator = _createForOfIteratorHelper(list),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var node = _step.value;\n if (!node || _typeof(node) !== \"object\") continue;\n if (node.id === id) return node;\n var found = findAdminBarNode(node.submenu, id);\n if (found) return found;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n return null;\n}\n\n/**\n * Resolve the \"Edit Profile\" menu from the Admin Bar Editor.\n * Mirrors the editor for the profile (my-account > user-info) node:\n * - visibility: hidden nodes are removed from the tree or have menu_status === false.\n * - title: a custom title (e.g. \"Profile Editing\") is used when set; the default\n * WordPress title is an avatar/name HTML block, so fall back to \"Edit Profile\".\n * Falls back to the default label/visibility when the my-account tree is unavailable.\n * @returns {{ visible: boolean, title: string }}\n */\nfunction getEditProfileMenu() {\n var _adminify_admin_bar_d5;\n var defaultLabel = \"Edit Profile\";\n var myAccount = findAdminBarNode((_adminify_admin_bar_d5 = adminify_admin_bar_data) === null || _adminify_admin_bar_d5 === void 0 ? void 0 : _adminify_admin_bar_d5.data, \"my-account\");\n\n // No my-account data available, keep default behavior.\n if (!myAccount) return {\n visible: true,\n title: defaultLabel\n };\n var userInfo = findAdminBarNode(myAccount.submenu, \"user-info\");\n if (!userInfo || userInfo.menu_status === false) {\n return {\n visible: false,\n title: defaultLabel\n };\n }\n var rawTitle = typeof userInfo.title === \"string\" ? userInfo.title.trim() : \"\";\n // Default title is an avatar/name HTML block; use the standard label for it.\n var isDefaultHtmlTitle = /<(img|span)\\b/i.test(rawTitle);\n var title = rawTitle && !isDefaultHtmlTitle ? rawTitle : defaultLabel;\n return {\n visible: true,\n title: title\n };\n}\n\n/**\n * Get the visible items of the account menu (my-account > user-actions group).\n * Includes core items (user-info, logout) and any custom items added in the\n * Admin Bar Editor, in their saved order. Hidden items (removed from the tree\n * or menu_status === false) are excluded.\n * Returns null when the my-account/user-actions tree is unavailable so callers\n * can fall back to the default UI.\n * @returns {Array|null}\n */\nfunction getUserActionMenu() {\n var _adminify_admin_bar_d6;\n var myAccount = findAdminBarNode((_adminify_admin_bar_d6 = adminify_admin_bar_data) === null || _adminify_admin_bar_d6 === void 0 ? void 0 : _adminify_admin_bar_d6.data, \"my-account\");\n if (!myAccount) return null;\n var userActions = findAdminBarNode(myAccount.submenu, \"user-actions\");\n if (!userActions) return null;\n var submenu = userActions.submenu;\n var list = Array.isArray(submenu) ? submenu : Object.values(submenu || {});\n return list.filter(function (item) {\n return item && item.menu_status !== false;\n });\n}\n\n// Check if URL has different origin than current page\nvar isExternalUrl = function isExternalUrl(item) {\n var _item$meta;\n if (!item) return false;\n\n // check meta\n if ((item === null || item === void 0 || (_item$meta = item.meta) === null || _item$meta === void 0 ? void 0 : _item$meta.target) === \"_blank\") return true;\n var url = item === null || item === void 0 ? void 0 : item.href;\n try {\n var linkUrl = new URL(url, window.location.origin);\n return linkUrl.origin !== window.location.origin;\n } catch (e) {\n return false;\n }\n};\n\n//# sourceURL=webpack://adminify/./dev/admin/frame/utils/uitls.js?"); | |
| 330 | 330 | |
| 331 | 331 | /***/ }), |
| 332 | 332 | |
| 333 | 333 | /***/ "./node_modules/react-dom/cjs/react-dom.development.js": |