/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ "./packages/extensions/icon-libraries/icon-list-rows.js"
/*!**************************************************************!*\
  !*** ./packages/extensions/icon-libraries/icon-list-rows.js ***!
  \**************************************************************/
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {

eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ensureMergedIconListBuffer: () => (/* binding */ ensureMergedIconListBuffer),\n/* harmony export */   getMergedIconListTarget: () => (/* binding */ getMergedIconListTarget),\n/* harmony export */   sanitizeWebfontIconListRow: () => (/* binding */ sanitizeWebfontIconListRow)\n/* harmony export */ });\n/* harmony import */ var _vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vb-window-bridge */ \"./packages/extensions/icon-libraries/vb-window-bridge.js\");\n/**\n * Divi iconList buffer helpers — FA model (full manifest merged at memoization).\n *\n * @package DiviSupreme\n */\n\n\n\n/** @type {Set<string>|null} */\nlet webfontLibraryIdsCache = null;\n\n/**\n * @return {Set<string>}\n */\nfunction getWebfontLibraryIds() {\n  if (webfontLibraryIdsCache) {\n    return webfontLibraryIdsCache;\n  }\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  if (Array.isArray(catalog)) {\n    const ids = catalog.filter(lib => 'webfont' === lib?.pickerMode).map(lib => {\n      var _lib$id;\n      return String((_lib$id = lib?.id) !== null && _lib$id !== void 0 ? _lib$id : '');\n    }).filter(Boolean);\n    if (ids.length > 0) {\n      webfontLibraryIdsCache = new Set(ids);\n      return webfontLibraryIdsCache;\n    }\n  }\n  const bootstrapIds = window.dsmIconLibrariesVbBootstrap?.libraryIds;\n  if (Array.isArray(bootstrapIds) && bootstrapIds.length > 0) {\n    webfontLibraryIdsCache = new Set(bootstrapIds);\n    return webfontLibraryIdsCache;\n  }\n  webfontLibraryIdsCache = new Set();\n  return webfontLibraryIdsCache;\n}\n\n/**\n * @return {Window[]}\n */\nfunction getIconListStateWindows() {\n  /** @type {Window[]} */\n  const windows = [];\n  const globalHost = (0,_vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__.getGlobalIconListStateHost)();\n  if (globalHost) {\n    windows.push(globalHost);\n  }\n  if (window !== globalHost && !windows.includes(window)) {\n    windows.push(window);\n  }\n  const appWin = (0,_vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__.getVbAppWindow)();\n  if (appWin && !windows.includes(appWin)) {\n    windows.push(appWin);\n  }\n  return windows;\n}\n\n/**\n * Strip Divi ETmodules picker fields from webfont library rows.\n *\n * @param {Record<string, unknown>} row Icon list row.\n * @return {Record<string, unknown>}\n */\nfunction sanitizeWebfontIconListRow(row) {\n  if (!row || typeof row !== 'object') {\n    return row;\n  }\n  const styles = Array.isArray(row.styles) ? row.styles : [];\n  const isWebfontRow = styles.some(style => getWebfontLibraryIds().has(String(style)));\n  if (!isWebfontRow) {\n    return row;\n  }\n  const clean = {\n    ...row\n  };\n  delete clean.decodedUnicode;\n  delete clean.dsmPreviewSvg;\n  if (!clean.fontWeight) {\n    clean.fontWeight = 400;\n  }\n  if (!Array.isArray(clean.styles) || clean.styles.length === 0) {\n    clean.styles = clean.dsmLibraryId ? [String(clean.dsmLibraryId)] : [];\n  }\n  return clean;\n}\n\n/**\n * Return one stable mutable iconList array tied to Divi's memoized getter.\n *\n * @param {Array<Record<string, unknown>>} baseList Divi base icon rows.\n * @return {Array<Record<string, unknown>>}\n */\nfunction ensureMergedIconListBuffer(baseList) {\n  const globalHost = (0,_vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__.getGlobalIconListStateHost)();\n  if (!Array.isArray(globalHost.__dsmIconListMergedBuffer)) {\n    globalHost.__dsmIconListMergedBuffer = [...baseList];\n  }\n  const shared = globalHost.__dsmIconListMergedBuffer;\n  getIconListStateWindows().forEach(stateWin => {\n    stateWin.__dsmIconListMergedBuffer = shared;\n  });\n  return shared;\n}\n\n/**\n * @return {Array<Record<string, unknown>>|null}\n */\nfunction getMergedIconListTarget() {\n  const globalHost = (0,_vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__.getGlobalIconListStateHost)();\n  if (Array.isArray(globalHost.__dsmIconListMergedBuffer)) {\n    return globalHost.__dsmIconListMergedBuffer;\n  }\n  for (const stateWin of getIconListStateWindows()) {\n    if (Array.isArray(stateWin.__dsmIconListMergedBuffer)) {\n      globalHost.__dsmIconListMergedBuffer = stateWin.__dsmIconListMergedBuffer;\n      return globalHost.__dsmIconListMergedBuffer;\n    }\n  }\n  const iconList = (0,_vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__.getVbIconLibrary)()?.iconList;\n  return Array.isArray(iconList) ? iconList : null;\n}\n\n//# sourceURL=webpack://divi-supreme/./packages/extensions/icon-libraries/icon-list-rows.js?\n}");

/***/ },

/***/ "./packages/extensions/icon-libraries/register-vb-hooks-early.js"
/*!***********************************************************************!*\
  !*** ./packages/extensions/icon-libraries/register-vb-hooks-early.js ***!
  \***********************************************************************/
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {

eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _wp_hooks_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wp-hooks-api */ \"./packages/extensions/icon-libraries/wp-hooks-api.js\");\n/* harmony import */ var _icon_list_rows__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./icon-list-rows */ \"./packages/extensions/icon-libraries/icon-list-rows.js\");\n/* harmony import */ var _runtime_icon_library_sync__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./runtime-icon-library-sync */ \"./packages/extensions/icon-libraries/runtime-icon-library-sync.js\");\n/**\n * Picker integration — register custom libraries into Divi's native iconList (FA model).\n *\n * Font Awesome ships the full set through applyFilters( 'iconList' ) before memoization.\n * Custom libraries must do the same: merge the complete manifest into iconList once so\n * the picker's native rW() filter + iconsToLoad / InfiniteScroll handle lazy-load.\n *\n * @package DiviSupreme\n */\n\n\n\n\n\n/** @type {boolean} */\nlet registered = false;\n\n/** @type {boolean} */\nlet manifestMerged = false;\n\n/**\n * @param {Array<Record<string, unknown>>} buffer Target iconList buffer.\n * @param {Array<Record<string, unknown>>} rows   Bootstrap manifest rows from PHP.\n * @return {number} Rows appended.\n */\nfunction mergeBootstrapManifestRows(buffer, rows) {\n  if (!Array.isArray(buffer) || !Array.isArray(rows) || rows.length === 0) {\n    return 0;\n  }\n\n  /** @type {Set<string>} */\n  const seen = new Set();\n  buffer.forEach(row => {\n    var _row$styles$, _row$unicode;\n    if (!row || typeof row !== 'object') {\n      return;\n    }\n    const libraryId = String((_row$styles$ = row.styles?.[0]) !== null && _row$styles$ !== void 0 ? _row$styles$ : '');\n    const iconId = String((_row$unicode = row.unicode) !== null && _row$unicode !== void 0 ? _row$unicode : '');\n    if (libraryId && iconId) {\n      seen.add(`${libraryId}::${iconId}`);\n    }\n  });\n  let appended = 0;\n  rows.forEach(row => {\n    var _clean$styles$, _clean$unicode;\n    const clean = (0,_icon_list_rows__WEBPACK_IMPORTED_MODULE_1__.sanitizeWebfontIconListRow)(row);\n    if (!clean?.unicode || !Array.isArray(clean.styles)) {\n      return;\n    }\n    const libraryId = String((_clean$styles$ = clean.styles[0]) !== null && _clean$styles$ !== void 0 ? _clean$styles$ : '');\n    const iconId = String((_clean$unicode = clean.unicode) !== null && _clean$unicode !== void 0 ? _clean$unicode : '');\n    const key = `${libraryId}::${iconId}`;\n    if (seen.has(key)) {\n      return;\n    }\n    buffer.push(clean);\n    seen.add(key);\n    appended += 1;\n  });\n  return appended;\n}\n\n/**\n * @return {boolean}\n */\nfunction registerEarlyIconLibraryHooks() {\n  if (registered) {\n    return true;\n  }\n\n  /** @type {{ enabled?: boolean, libraryIds?: string[], manifestRows?: Array<Record<string, unknown>>, libraryLabels?: Record<string, string> }} */\n  const bootstrap = window.dsmIconLibrariesVbBootstrap || {};\n  if (!bootstrap.enabled) {\n    return true;\n  }\n  const libraryIds = Array.isArray(bootstrap.libraryIds) ? bootstrap.libraryIds : [];\n  if (libraryIds.length === 0) {\n    return true;\n  }\n  const typesOk = (0,_wp_hooks_api__WEBPACK_IMPORTED_MODULE_0__.wpAddFilter)('divi.iconLibrary.fontIconTypes', 'divisupreme/icon-libraries-early', types => [...new Set([...(types || []), ...libraryIds])]);\n  const filtersOk = (0,_wp_hooks_api__WEBPACK_IMPORTED_MODULE_0__.wpAddFilter)('divi.iconLibrary.fontIconFilters', 'divisupreme/icon-libraries-early', filters => [...new Set([...(filters || []), ...libraryIds])]);\n  const listOk = (0,_wp_hooks_api__WEBPACK_IMPORTED_MODULE_0__.wpAddFilter)('iconList', 'divisupreme/icon-libraries-early', list => {\n    if (!Array.isArray(list)) {\n      return list;\n    }\n    const buffer = (0,_icon_list_rows__WEBPACK_IMPORTED_MODULE_1__.ensureMergedIconListBuffer)(list);\n    if (!manifestMerged) {\n      const bootstrapRows = Array.isArray(bootstrap.manifestRows) ? bootstrap.manifestRows : [];\n      mergeBootstrapManifestRows(buffer, bootstrapRows);\n      manifestMerged = true;\n    }\n    return buffer;\n  });\n  if (!typesOk || !filtersOk || !listOk) {\n    return false;\n  }\n  registered = true;\n  window.dsmIconLibrariesShowOnlyLabels = bootstrap.libraryLabels || {};\n  (0,_runtime_icon_library_sync__WEBPACK_IMPORTED_MODULE_2__.scheduleRuntimeFontIconFilterSync)(libraryIds);\n  return true;\n}\nif (!registerEarlyIconLibraryHooks()) {\n  let attempts = 0;\n  const timer = window.setInterval(() => {\n    attempts += 1;\n    if (registerEarlyIconLibraryHooks() || attempts > 200) {\n      window.clearInterval(timer);\n    }\n  }, 25);\n}\n\n//# sourceURL=webpack://divi-supreme/./packages/extensions/icon-libraries/register-vb-hooks-early.js?\n}");

/***/ },

/***/ "./packages/extensions/icon-libraries/runtime-icon-library-sync.js"
/*!*************************************************************************!*\
  !*** ./packages/extensions/icon-libraries/runtime-icon-library-sync.js ***!
  \*************************************************************************/
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {

eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ensureRuntimeFontIconFilters: () => (/* binding */ ensureRuntimeFontIconFilters),\n/* harmony export */   scheduleRuntimeFontIconFilterSync: () => (/* binding */ scheduleRuntimeFontIconFilterSync)\n/* harmony export */ });\n/* harmony import */ var _vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vb-window-bridge */ \"./packages/extensions/icon-libraries/vb-window-bridge.js\");\n/**\n * Runtime sync for Divi iconLibrary filter metadata (fontIconFilters / types).\n *\n * Early wp.hooks registration covers the app iframe at parse time; this mutates\n * the memoized arrays as a safety net and for cross-window picker UI.\n *\n * @package DiviSupreme\n */\n\n\n\n/**\n * @param {unknown} value Divi export (array or getter).\n * @return {string[]|null}\n */\nfunction coerceFilterArray(value) {\n  if (Array.isArray(value)) {\n    return value;\n  }\n  if (typeof value === 'function') {\n    const resolved = value();\n    return Array.isArray(resolved) ? resolved : null;\n  }\n  return null;\n}\n\n/**\n * @param {string[]} libraryIds Enabled library slugs.\n * @return {boolean}\n */\nfunction ensureRuntimeFontIconFilters(libraryIds) {\n  const iconLibrary = (0,_vb_window_bridge__WEBPACK_IMPORTED_MODULE_0__.getVbIconLibrary)();\n  if (!iconLibrary || libraryIds.length === 0) {\n    return false;\n  }\n  const filters = coerceFilterArray(iconLibrary.fontIconFilters);\n  const types = coerceFilterArray(iconLibrary.fontIconTypes);\n  if (!filters || !types) {\n    return false;\n  }\n  let changed = false;\n  libraryIds.forEach(libraryId => {\n    if (!filters.includes(libraryId)) {\n      filters.push(libraryId);\n      changed = true;\n    }\n    if (!types.includes(libraryId)) {\n      types.push(libraryId);\n      changed = true;\n    }\n  });\n  return changed;\n}\n\n/**\n * @param {string[]} libraryIds Enabled library slugs.\n * @return {void}\n */\nfunction scheduleRuntimeFontIconFilterSync(libraryIds) {\n  if (libraryIds.length === 0) {\n    return;\n  }\n  if (ensureRuntimeFontIconFilters(libraryIds)) {\n    return;\n  }\n  let attempts = 0;\n  const timer = window.setInterval(() => {\n    attempts += 1;\n    if (ensureRuntimeFontIconFilters(libraryIds) || attempts > 200) {\n      window.clearInterval(timer);\n    }\n  }, 25);\n}\n\n//# sourceURL=webpack://divi-supreme/./packages/extensions/icon-libraries/runtime-icon-library-sync.js?\n}");

/***/ },

/***/ "./packages/extensions/icon-libraries/vb-top-window-entry.js"
/*!********************************************************************************!*\
  !*** ./packages/extensions/icon-libraries/vb-top-window-entry.js + 10 modules ***!
  \********************************************************************************/
(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {

eval("{\n// EXTERNAL MODULE: ./packages/extensions/icon-libraries/wp-hooks-api.js\nvar wp_hooks_api = __webpack_require__(\"./packages/extensions/icon-libraries/wp-hooks-api.js\");\n;// ./packages/extensions/icon-libraries/registry.js\n/**\n * Client-side registry bootstrap — mirrors PHP catalog from diviSupreme5.\n *\n * @package DiviSupreme\n */\n\n/** Icons fetched per REST request (matches PHP default). */\nconst MANIFEST_PAGE_SIZE = 60;\n\n/**\n * Pagination state must live on a window shared by the top-window picker bundle\n * and the app iframe bundle (each has its own module scope).\n *\n * @return {Window}\n */\nfunction getGlobalPaginationHost() {\n  try {\n    var _window$top;\n    return (_window$top = window.top) !== null && _window$top !== void 0 ? _window$top : window;\n  } catch {\n    return window;\n  }\n}\n\n/**\n * @return {Map<string, { query: string, nextOffset: number, hasMore: boolean, total: number, loading: boolean }>}\n */\nfunction getPaginationStateMap() {\n  const host = getGlobalPaginationHost();\n  if (!host.__dsmIconLibraryPaginationState) {\n    host.__dsmIconLibraryPaginationState = new Map();\n  }\n  return host.__dsmIconLibraryPaginationState;\n}\n\n/**\n * @return {Array<{ id: string, label: string, enabled: boolean, iconCount: number, sampleIconId: string, licenseNote: string, variants: Record<string,string>, defaultVariant: string }>}\n */\nfunction getEnabledLibrariesFromConfig() {\n  const bootstrap = window.dsmIconLibrariesVbBootstrap;\n  if (bootstrap?.enabled && Array.isArray(bootstrap.libraryIds)) {\n    return bootstrap.libraryIds.map(id => ({\n      id,\n      label: bootstrap.libraryLabels?.[id] || id,\n      enabled: true\n    }));\n  }\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  if (!Array.isArray(catalog)) {\n    return [];\n  }\n  return catalog.filter(lib => lib && lib.enabled);\n}\n\n/**\n * @return {string[]}\n */\nfunction getEnabledLibraryIds() {\n  const bootstrap = window.dsmIconLibrariesVbBootstrap;\n  if (bootstrap?.enabled && Array.isArray(bootstrap.libraryIds)) {\n    return bootstrap.libraryIds;\n  }\n  return getEnabledLibrariesFromConfig().map(lib => lib.id);\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @return {{ label: string } | null}\n */\nfunction getLibraryMeta(libraryId) {\n  var _found$label;\n  const bootstrap = window.dsmIconLibrariesVbBootstrap;\n  if (bootstrap?.libraryLabels?.[libraryId]) {\n    return {\n      label: String(bootstrap.libraryLabels[libraryId])\n    };\n  }\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  if (!Array.isArray(catalog)) {\n    return null;\n  }\n  const found = catalog.find(lib => lib?.id === libraryId);\n  return found ? {\n    label: String((_found$label = found.label) !== null && _found$label !== void 0 ? _found$label : libraryId)\n  } : null;\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @param {object} [options]\n * @param {string} [options.query=''] Search string.\n * @param {number} [options.offset=0] Zero-based offset.\n * @param {number} [options.perPage=MANIFEST_PAGE_SIZE] Page size.\n * @return {Promise<{ icons: Array<Record<string, unknown>>, total: number, offset: number, perPage: number, hasMore: boolean }>}\n */\nasync function fetchLibraryManifestPage(libraryId, {\n  query = '',\n  offset = 0,\n  perPage = MANIFEST_PAGE_SIZE\n} = {}) {\n  var _data$total, _data$offset, _data$per_page;\n  const base = window.dsmIconLibraries?.restUrl || '/wp-json/dsm/v1/icon-libraries';\n  const url = new URL(`${base.replace(/\\/$/, '')}/${libraryId}/manifest`, window.location.origin);\n  if (query) {\n    url.searchParams.set('q', query);\n  }\n  url.searchParams.set('offset', String(Math.max(0, offset)));\n  url.searchParams.set('per_page', String(perPage));\n  const headers = {};\n  if (window.dsmIconLibraries?.restNonce) {\n    headers['X-WP-Nonce'] = window.dsmIconLibraries.restNonce;\n  }\n  const response = await fetch(url.toString(), {\n    credentials: 'same-origin',\n    headers\n  });\n  if (!response.ok) {\n    return {\n      icons: [],\n      total: 0,\n      offset,\n      perPage,\n      hasMore: false\n    };\n  }\n  const data = await response.json();\n  const icons = Array.isArray(data?.icons) ? data.icons : [];\n  return {\n    icons,\n    total: Number((_data$total = data?.total) !== null && _data$total !== void 0 ? _data$total : icons.length),\n    offset: Number((_data$offset = data?.offset) !== null && _data$offset !== void 0 ? _data$offset : offset),\n    perPage: Number((_data$per_page = data?.per_page) !== null && _data$per_page !== void 0 ? _data$per_page : perPage),\n    hasMore: Boolean(data?.has_more)\n  };\n}\n\n/**\n * @deprecated Use fetchLibraryManifestPage — kept for callers expecting a flat array.\n * @param {string} libraryId Library slug.\n * @param {string} query     Optional search string.\n * @return {Promise<Array<Record<string, unknown>>>}\n */\nasync function fetchLibraryManifest(libraryId, query = '') {\n  const page = await fetchLibraryManifestPage(libraryId, {\n    query,\n    offset: 0\n  });\n  return page.icons;\n}\n\n/**\n * Fetch the full manifest for one library in a single REST request (`all=1`).\n *\n * @param {string} libraryId Library slug.\n * @param {string} [query=''] Optional search string.\n * @return {Promise<Array<Record<string, unknown>>>}\n */\nasync function fetchLibraryManifestAll(libraryId, query = '') {\n  const base = window.dsmIconLibraries?.restUrl || '/wp-json/dsm/v1/icon-libraries';\n  const url = new URL(`${base.replace(/\\/$/, '')}/${libraryId}/manifest`, window.location.origin);\n  if (query) {\n    url.searchParams.set('q', query);\n  }\n  url.searchParams.set('all', '1');\n  const headers = {};\n  if (window.dsmIconLibraries?.restNonce) {\n    headers['X-WP-Nonce'] = window.dsmIconLibraries.restNonce;\n  }\n  const response = await fetch(url.toString(), {\n    credentials: 'same-origin',\n    headers\n  });\n  if (!response.ok) {\n    return [];\n  }\n  const data = await response.json();\n  return Array.isArray(data?.icons) ? data.icons : [];\n}\n\n/** @type {Map<string, { query: string, nextOffset: number, hasMore: boolean, total: number, loading: boolean }>} */\nconst paginationState = getPaginationStateMap();\n\n/**\n * @param {string} libraryId Library slug.\n * @param {string} [query=''] Search string.\n * @return {string}\n */\nfunction paginationKey(libraryId, query = '') {\n  return `${libraryId}::${query.trim().toLowerCase()}`;\n}\n\n/**\n * Reset pagination and load the first page for a library filter.\n *\n * @param {string} libraryId Library slug.\n * @param {string} [query=''] Optional search string.\n * @return {Promise<Array<Record<string, unknown>>>}\n */\nasync function loadLibraryManifestFirstPage(libraryId, query = '') {\n  const key = paginationKey(libraryId, query);\n  paginationState.set(key, {\n    query,\n    nextOffset: 0,\n    hasMore: true,\n    total: 0,\n    loading: false\n  });\n  return loadNextLibraryManifestPage(libraryId, query);\n}\n\n/**\n * Load the next paginated manifest slice for a library.\n *\n * @param {string} libraryId Library slug.\n * @param {string} [query=''] Optional search string.\n * @return {Promise<Array<Record<string, unknown>>>}\n */\nasync function loadNextLibraryManifestPage(libraryId, query = '') {\n  const key = paginationKey(libraryId, query);\n  let state = paginationState.get(key);\n  if (!state) {\n    state = {\n      query,\n      nextOffset: 0,\n      hasMore: true,\n      total: 0,\n      loading: false\n    };\n    paginationState.set(key, state);\n  }\n  if (state.loading || !state.hasMore) {\n    return [];\n  }\n  state.loading = true;\n  try {\n    const page = await fetchLibraryManifestPage(libraryId, {\n      query,\n      offset: state.nextOffset\n    });\n    state.total = page.total;\n    state.hasMore = page.hasMore;\n    state.nextOffset = page.offset + page.icons.length;\n    return page.icons;\n  } finally {\n    state.loading = false;\n  }\n}\n\n/**\n * Whether more manifest pages remain for a library + query.\n *\n * @param {string} libraryId Library slug.\n * @param {string} [query=''] Search string.\n * @return {boolean}\n */\nfunction libraryManifestHasMore(libraryId, query = '') {\n  const state = paginationState.get(paginationKey(libraryId, query));\n  return Boolean(state?.hasMore);\n}\n\n/**\n * Clear pagination state for one library (all search queries).\n *\n * @param {string} libraryId Library slug.\n * @return {void}\n */\nfunction resetLibraryManifestPaginationForLibrary(libraryId) {\n  const prefix = `${libraryId}::`;\n  for (const key of paginationState.keys()) {\n    if (key.startsWith(prefix) || key === `${libraryId}::`) {\n      paginationState.delete(key);\n    }\n  }\n}\n;// ./packages/extensions/shared/extension-runtime.js\n/**\n * Shared extension runtime helpers (VB performance + gating).\n *\n * @package DiviSupreme\n */\n\n/**\n * Opt-in extension: enabled only when PHP sets the flag to true (settings default off).\n *\n * @param {string}      configKey  Key on `window.diviSupreme5` (e.g. `dsmImageParallaxExtensionEnabled`).\n * @param {string}      windowFlag Optional `window.__dsm*ExtensionEnabled` override.\n * @return {boolean}\n */\nfunction dsmExtensionOptInEnabled(configKey, windowFlag) {\n  if (windowFlag && typeof window[windowFlag] === 'boolean') {\n    return window[windowFlag];\n  }\n  return window.diviSupreme5?.[configKey] === true;\n}\n\n/**\n * Opt-out extension: enabled when the flag is not explicitly false (legacy defaults on).\n *\n * @param {string}      configKey  Key on `window.diviSupreme5`.\n * @param {string}      windowFlag Optional `window.__dsm*ExtensionEnabled` override.\n * @return {boolean}\n */\nfunction dsmExtensionOptOutEnabled(configKey, windowFlag) {\n  if (windowFlag && typeof window[windowFlag] === 'boolean') {\n    return window[windowFlag];\n  }\n  return window.diviSupreme5?.[configKey] !== false;\n}\n\n/**\n * @return {boolean}\n */\nfunction dsmPopupExtensionGloballyEnabled() {\n  return dsmExtensionOptOutEnabled('dsmSupremePopupExtensionEnabled', '__dsmSupremePopupExtensionEnabled');\n}\n\n/**\n * @return {boolean}\n */\nfunction dsmSupremeParallaxExtensionGloballyEnabled() {\n  return dsmExtensionOptOutEnabled('dsmSupremeParallaxExtensionEnabled', '__dsmSupremeParallaxExtensionEnabled');\n}\n\n/**\n * @return {boolean}\n */\nfunction dsmLineHoverAnimationExtensionGloballyEnabled() {\n  return dsmExtensionOptOutEnabled('dsmSupremeLineHoverAnimationExtensionEnabled', '__dsmSupremeLineHoverAnimationExtensionEnabled');\n}\n\n/**\n * @return {boolean}\n */\nfunction dsmImageParallaxExtensionGloballyEnabled() {\n  return dsmExtensionOptInEnabled('dsmImageParallaxExtensionEnabled', '__dsmImageParallaxExtensionEnabled');\n}\n\n/**\n * @return {boolean}\n */\nfunction dsmCustomCursorExtensionGloballyEnabled() {\n  return dsmExtensionOptInEnabled('dsmCustomCursorExtensionEnabled', '__dsmCustomCursorExtensionEnabled');\n}\n\n/**\n * @return {boolean}\n */\nfunction dsmIconLibrariesExtensionGloballyEnabled() {\n  return dsmExtensionOptInEnabled('dsmIconLibrariesExtensionEnabled', '__dsmIconLibrariesExtensionEnabled');\n}\n\n/**\n * Coalesce high-frequency VB callbacks (store subscribe, MutationObserver) to one frame.\n *\n * @param {() => void} fn\n * @return {() => void}\n */\nfunction dsmExtensionCreateRafCoalescer(fn) {\n  let queued = false;\n  return () => {\n    if (queued) {\n      return;\n    }\n    queued = true;\n    window.requestAnimationFrame(() => {\n      queued = false;\n      fn();\n    });\n  };\n}\n// EXTERNAL MODULE: ./packages/extensions/icon-libraries/icon-list-rows.js\nvar icon_list_rows = __webpack_require__(\"./packages/extensions/icon-libraries/icon-list-rows.js\");\n;// ./packages/extensions/icon-libraries/picker-font-class.js\n/**\n * Resolve VB picker webfont CSS classes from stored icon values.\n *\n * Mirrors PHP IconLibraryInterface webfont class helpers.\n *\n * @package DiviSupreme\n */\n\n\n\n/** @type {Record<string, string>} */\nconst PHOSPHOR_WEIGHT_CLASS = {\n  thin: 'ph-thin',\n  light: 'ph-light',\n  regular: 'ph',\n  bold: 'ph-bold',\n  fill: 'ph-fill'\n};\n\n/** @type {Record<string, string>} */\nconst PHOSPHOR_FONT_FAMILY = {\n  thin: 'Phosphor-Thin',\n  light: 'Phosphor-Light',\n  regular: 'Phosphor',\n  bold: 'Phosphor-Bold',\n  fill: 'Phosphor-Fill'\n};\nconst TABLER_OUTLINE_SCOPE = 'dsm-tabler-outline-glyph';\nconst TABLER_FILLED_SCOPE = 'dsm-tabler-filled-glyph';\nconst LUCIDE_SCOPE = 'dsm-lucide-glyph';\n\n/** @type {Record<string, unknown>|null} */\nlet tablerWebfontIndexCache = null;\n\n/** @type {Promise<Record<string, unknown>|null>|null} */\nlet tablerWebfontIndexPromise = null;\n\n/**\n * @return {Record<string, unknown>|null}\n */\nfunction getTablerWebfontIndexSync() {\n  if (tablerWebfontIndexCache) {\n    return tablerWebfontIndexCache;\n  }\n  if (window.__dsmTablerWebfontIndex && typeof window.__dsmTablerWebfontIndex === 'object') {\n    tablerWebfontIndexCache = window.__dsmTablerWebfontIndex;\n    return tablerWebfontIndexCache;\n  }\n  return null;\n}\n\n/**\n * Lazy-load Tabler filled-glyph index (only when Tabler picker is opened).\n *\n * @return {Promise<Record<string, unknown>|null>}\n */\nasync function ensureTablerWebfontIndexLoaded() {\n  const cached = getTablerWebfontIndexSync();\n  if (cached) {\n    return cached;\n  }\n  if (tablerWebfontIndexPromise) {\n    return tablerWebfontIndexPromise;\n  }\n  const base = window.dsmIconLibraries?.restUrl || '/wp-json/dsm/v1/icon-libraries';\n  const url = `${String(base).replace(/\\/$/, '')}/tabler/webfont-index`;\n  const headers = {};\n  if (window.dsmIconLibraries?.restNonce) {\n    headers['X-WP-Nonce'] = window.dsmIconLibraries.restNonce;\n  }\n  tablerWebfontIndexPromise = fetch(url, {\n    credentials: 'same-origin',\n    headers\n  }).then(response => response.ok ? response.json() : null).then(data => {\n    if (data && typeof data === 'object') {\n      tablerWebfontIndexCache = data;\n      window.__dsmTablerWebfontIndex = data;\n      return data;\n    }\n    return null;\n  }).catch(() => null).finally(() => {\n    tablerWebfontIndexPromise = null;\n  });\n  return tablerWebfontIndexPromise;\n}\n\n/**\n * @param {string} iconId Icon slug.\n * @return {boolean}\n */\nfunction tablerIconHasFilledWebfont(iconId) {\n  const index = getTablerWebfontIndexSync();\n  const filled = index?.filled;\n  if (!Array.isArray(filled)) {\n    return false;\n  }\n  return filled.includes(iconId);\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @param {string} iconId    Icon slug.\n * @return {Record<string, unknown>|null}\n */\nfunction lookupManifestRow(libraryId, iconId) {\n  var _iconList$find;\n  const iconList = (0,icon_list_rows.getMergedIconListTarget)();\n  if (!iconList) {\n    return null;\n  }\n  return (_iconList$find = iconList.find(row => {\n    var _row$styles$, _row$unicode;\n    return String((_row$styles$ = row?.styles?.[0]) !== null && _row$styles$ !== void 0 ? _row$styles$ : '') === libraryId && String((_row$unicode = row?.unicode) !== null && _row$unicode !== void 0 ? _row$unicode : '') === iconId;\n  })) !== null && _iconList$find !== void 0 ? _iconList$find : null;\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @return {string}\n */\nfunction getLibraryDefaultVariant(libraryId) {\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  const bootstrap = window.dsmIconLibrariesVbBootstrap;\n  if (Array.isArray(catalog)) {\n    const found = catalog.find(lib => lib?.id === libraryId);\n    if (found?.defaultVariant) {\n      return String(found.defaultVariant);\n    }\n  }\n  if (bootstrap?.libraryIds?.includes(libraryId)) {\n    if ('phosphor' === libraryId) {\n      return 'regular';\n    }\n    if ('tabler' === libraryId) {\n      return 'outline';\n    }\n  }\n  return '';\n}\n\n/**\n * Whether a library uses webfont previews in the picker.\n *\n * @param {string} libraryId Library slug.\n * @return {boolean}\n */\nfunction isWebfontPickerLibrary(libraryId) {\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  if (Array.isArray(catalog)) {\n    const found = catalog.find(lib => lib?.id === libraryId);\n    if (found?.pickerMode) {\n      return 'webfont' === found.pickerMode;\n    }\n  }\n  return false;\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @param {string} iconId    Icon slug (stored unicode).\n * @param {string} [variant] Variant / weight slug.\n * @return {string}\n */\nfunction getPickerWebfontFamily(libraryId, iconId, variant = '') {\n  const iconSlug = String(iconId || '').trim();\n  const variantSlug = variant || getLibraryDefaultVariant(libraryId);\n  if (!iconSlug) {\n    return '';\n  }\n  const manifestRow = lookupManifestRow(libraryId, iconSlug);\n  if (manifestRow?.dsmWebfontFamily) {\n    return String(manifestRow.dsmWebfontFamily);\n  }\n  if ('tabler' === libraryId) {\n    if ('filled' === variantSlug && tablerIconHasFilledWebfont(iconSlug)) {\n      return 'tabler-icons-filled';\n    }\n    return 'tabler-icons';\n  }\n  if ('phosphor' === libraryId) {\n    return PHOSPHOR_FONT_FAMILY[variantSlug] || 'Phosphor';\n  }\n  if ('lucide' === libraryId) {\n    return 'lucide';\n  }\n  const catalogFamily = window.diviSupreme5?.iconLibrariesCatalog?.find(lib => lib?.id === libraryId)?.webfontFamily;\n  return catalogFamily ? String(catalogFamily) : '';\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @param {string} iconId    Icon slug (stored unicode).\n * @param {string} [variant] Variant / weight slug.\n * @return {string}\n */\nfunction getPickerFontClass(libraryId, iconId, variant = '') {\n  const iconSlug = String(iconId || '').trim();\n  const variantSlug = variant || getLibraryDefaultVariant(libraryId);\n  if (!iconSlug) {\n    return '';\n  }\n  const manifestRow = lookupManifestRow(libraryId, iconSlug);\n  if (manifestRow?.dsmPickerFontClass) {\n    return String(manifestRow.dsmPickerFontClass);\n  }\n  if ('tabler' === libraryId) {\n    const scopeClass = 'filled' === variantSlug && tablerIconHasFilledWebfont(iconSlug) ? TABLER_FILLED_SCOPE : TABLER_OUTLINE_SCOPE;\n    return `ti ti-${iconSlug} ${scopeClass}`;\n  }\n  if ('phosphor' === libraryId) {\n    const weightClass = PHOSPHOR_WEIGHT_CLASS[variantSlug] || 'ph';\n    return `${weightClass} ph-${iconSlug}`;\n  }\n  if ('lucide' === libraryId) {\n    return `icon-${iconSlug} ${LUCIDE_SCOPE}`;\n  }\n  return '';\n}\n\n/**\n * Resolve font class from a manifest row or picker button.\n *\n * @param {Element|null} button   Picker button (optional).\n * @param {string}       libraryId Library slug.\n * @param {string}       iconId    Icon slug.\n * @param {string}       [variant] Variant slug.\n * @return {string}\n */\nfunction resolvePickerFontClass(button, libraryId, iconId, variant = '') {\n  const rowClass = button?.getAttribute('data-dsm-picker-font-class');\n  if (rowClass) {\n    return rowClass;\n  }\n  const dataVariant = button?.getAttribute('data-dsm-variant') || button?.getAttribute('data-variant') || variant;\n  return getPickerFontClass(libraryId, iconId, dataVariant);\n}\n\n/**\n * @param {Element|null} button   Picker button (optional).\n * @param {string}       libraryId Library slug.\n * @param {string}       iconId    Icon slug.\n * @param {string}       [variant] Variant slug.\n * @return {string}\n */\nfunction resolvePickerWebfontFamily(button, libraryId, iconId, variant = '') {\n  const rowFamily = button?.getAttribute('data-dsm-webfont-family');\n  if (rowFamily) {\n    return rowFamily;\n  }\n  const dataVariant = button?.getAttribute('data-dsm-variant') || button?.getAttribute('data-variant') || variant;\n  return getPickerWebfontFamily(libraryId, iconId, dataVariant);\n}\n;// ./packages/extensions/icon-libraries/picker-webfonts.js\n/**\n * Inject picker webfont CSS into every VB document that can host the icon grid.\n *\n * @package DiviSupreme\n */\n\n/**\n * @return {Set<string>}\n */\nfunction getInjectedWebfontUrls() {\n  if (!window.__dsmInjectedWebfontUrls) {\n    window.__dsmInjectedWebfontUrls = new Set();\n  }\n  return window.__dsmInjectedWebfontUrls;\n}\n\n/**\n * @return {Document[]}\n */\nfunction getTargetDocuments() {\n  /** @type {Document[]} */\n  const docs = [document];\n  const candidates = [window.top?.document, window.parent?.document, window.divi?.window?.topWindow?.document];\n  candidates.forEach(doc => {\n    if (doc && !docs.includes(doc)) {\n      docs.push(doc);\n    }\n  });\n  return docs;\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @return {Array<{ libraryId?: string, variant?: string, url?: string }>}\n */\nfunction getPickerWebfontStylesheets(libraryId) {\n  const bootstrap = window.dsmIconLibrariesVbBootstrap;\n  const bootstrapSheets = Array.isArray(bootstrap?.pickerWebfontStylesheets) ? bootstrap.pickerWebfontStylesheets : [];\n  const fromBootstrap = bootstrapSheets.filter(sheet => sheet?.libraryId === libraryId && sheet?.url);\n  if (fromBootstrap.length > 0) {\n    return fromBootstrap;\n  }\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  if (!Array.isArray(catalog)) {\n    return [];\n  }\n  const library = catalog.find(lib => lib?.id === libraryId);\n  return Array.isArray(library?.webfontStylesheets) ? library.webfontStylesheets : [];\n}\n\n/**\n * Picker preview only needs the default weight stylesheets (not all variants).\n *\n * @param {string}                                                       libraryId Library slug.\n * @param {Array<{ libraryId?: string, variant?: string, url?: string }>} sheets    Stylesheets.\n * @return {Array<{ libraryId?: string, variant?: string, url?: string }>}\n */\nfunction getLibraryDefaultVariantForPicker(libraryId) {\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  const found = catalog?.find(lib => lib?.id === libraryId);\n  if (found?.defaultVariant !== undefined && found?.defaultVariant !== null) {\n    return String(found.defaultVariant);\n  }\n  if ('phosphor' === libraryId) {\n    return 'regular';\n  }\n  if ('tabler' === libraryId) {\n    return 'outline';\n  }\n  return '';\n}\n\n/**\n * @param {string}                                                       libraryId Library slug.\n * @param {Array<{ libraryId?: string, variant?: string, url?: string }>} sheets    Stylesheets.\n * @return {Array<{ libraryId?: string, variant?: string, url?: string }>}\n */\nfunction filterPickerWebfontSheets(libraryId, sheets) {\n  if ('phosphor' === libraryId) {\n    return sheets.filter(sheet => 'regular' === sheet?.variant);\n  }\n  if ('tabler' === libraryId) {\n    return sheets.filter(sheet => {\n      var _sheet$variant;\n      return ['outline', 'filled'].includes(String((_sheet$variant = sheet?.variant) !== null && _sheet$variant !== void 0 ? _sheet$variant : ''));\n    });\n  }\n  const defaultVariant = getLibraryDefaultVariantForPicker(libraryId);\n  const variantSheets = sheets.filter(sheet => {\n    var _sheet$variant2;\n    return String((_sheet$variant2 = sheet?.variant) !== null && _sheet$variant2 !== void 0 ? _sheet$variant2 : '') === defaultVariant;\n  });\n  return variantSheets.length > 0 ? variantSheets : sheets;\n}\n\n/**\n * @param {Document} doc       Target document.\n * @param {string}   url       Stylesheet URL.\n * @param {string}   libraryId Library slug.\n * @return {Promise<void>}\n */\nfunction injectStylesheet(doc, url, libraryId) {\n  var _doc$location$href;\n  const injectionKey = `${String((_doc$location$href = doc.location?.href) !== null && _doc$location$href !== void 0 ? _doc$location$href : 'doc')}::${url}`;\n  const injectedWebfontUrls = getInjectedWebfontUrls();\n  if (injectedWebfontUrls.has(injectionKey) || !doc.head) {\n    return Promise.resolve();\n  }\n  injectedWebfontUrls.add(injectionKey);\n  return new Promise(resolve => {\n    const link = doc.createElement('link');\n    link.rel = 'stylesheet';\n    link.href = url;\n    link.dataset.dsmIconLibraryWebfont = libraryId;\n    const finish = () => {\n      resolve();\n    };\n    link.addEventListener('load', finish, {\n      once: true\n    });\n    link.addEventListener('error', finish, {\n      once: true\n    });\n    doc.head.appendChild(link);\n  });\n}\n\n/**\n * Inject self-hosted webfont CSS for a library into all VB documents.\n *\n * @param {string} libraryId Library slug.\n * @return {Promise<void>}\n */\nasync function ensurePickerWebfontsLoaded(libraryId) {\n  const sheets = filterPickerWebfontSheets(libraryId, getPickerWebfontStylesheets(libraryId));\n  if (sheets.length === 0) {\n    return;\n  }\n  const jobs = [];\n  getTargetDocuments().forEach(doc => {\n    sheets.forEach(sheet => {\n      var _sheet$url;\n      const url = String((_sheet$url = sheet?.url) !== null && _sheet$url !== void 0 ? _sheet$url : '').trim();\n      if (url) {\n        jobs.push(injectStylesheet(doc, url, libraryId));\n      }\n    });\n  });\n  await Promise.all(jobs);\n}\n// EXTERNAL MODULE: ./packages/extensions/icon-libraries/runtime-icon-library-sync.js\nvar runtime_icon_library_sync = __webpack_require__(\"./packages/extensions/icon-libraries/runtime-icon-library-sync.js\");\n;// ./packages/extensions/icon-libraries/icon-picker-ui-patch.js\n/**\n * Icon picker UI — showOnly labels + webfont glyph previews only.\n *\n * Lazy-load and filtering use Divi's native iconList + rW() + InfiniteScroll (FA model).\n * No REST sessions, fiber state sync, or custom scroll handlers here.\n *\n * @package DiviSupreme\n */\n\n\n\n\n\n\n\n/** @type {boolean} */\nlet showOnlyOptionsPatched = false;\n\n/** @type {MutationObserver|null} */\nlet pickerPresenceObserver = null;\n\n/** @type {MutationObserver|null} */\nlet pickerListObserver = null;\n\n/** @type {MutationObserver|null} */\nlet pickerFilterObserver = null;\n\n/** @type {boolean} */\nlet pickerModalOpen = false;\n\n/** @type {number} */\nlet fontEnhancementGeneration = 0;\n\n/**\n * Resolve the active webfont library for a single icon picker instance.\n *\n * @param {Element}                  list         Icon grid for one picker field.\n * @param {string[]}                 libraryIds   Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {string}\n */\nfunction resolvePickerLibraryIdForList(list, libraryIds, getLibraryMeta) {\n  const pickerRoot = list.closest('.et-vb-icon-picker');\n  const filterRoot = pickerRoot?.querySelector('.et-vb-icon-picker-filter') || list.closest('.et-vb-icon-picker-filter');\n  const selectedChip = filterRoot?.querySelector('.et-vb-icon-picker-filter-button-group-selected .et-vb-button');\n  if (selectedChip) {\n    const chipText = selectedChip.textContent?.trim().toLowerCase() || '';\n    const matched = libraryIds.find(id => {\n      const label = getLibraryFilterLabel(id, getLibraryMeta).toLowerCase();\n      return chipText === id.toLowerCase() || chipText === label || chipText.includes(label) || chipText.includes(id.toLowerCase());\n    });\n    if (matched && isWebfontPickerLibrary(matched)) {\n      return matched;\n    }\n  }\n  const firstButton = list.querySelector('.et-vb-button[data-type]');\n  const visibleType = firstButton?.getAttribute('data-type') || '';\n  if (visibleType && libraryIds.includes(visibleType) && isWebfontPickerLibrary(visibleType)) {\n    return visibleType;\n  }\n  return '';\n}\n\n/**\n * Collect active webfont libraries across every open picker (supports 2+ fields).\n *\n * @param {string[]} libraryIds Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {string[]}\n */\nfunction collectActivePickerLibraryIds(libraryIds, getLibraryMeta) {\n  /** @type {Set<string>} */\n  const activeIds = new Set();\n  icon_picker_ui_patch_getTargetDocuments().forEach(doc => {\n    doc.querySelectorAll('.et-vb-icon-picker-list').forEach(list => {\n      const libraryId = resolvePickerLibraryIdForList(list, libraryIds, getLibraryMeta);\n      if (libraryId) {\n        activeIds.add(libraryId);\n      }\n    });\n  });\n  if (activeIds.size === 0) {\n    const fallback = libraryIds.find(id => isWebfontPickerLibrary(id));\n    if (fallback) {\n      activeIds.add(fallback);\n    }\n  }\n  return [...activeIds];\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @return {string}\n */\nfunction getCatalogWebfontFamily(libraryId) {\n  const catalog = window.diviSupreme5?.iconLibrariesCatalog;\n  const found = catalog?.find(lib => lib?.id === libraryId);\n  return found?.webfontFamily ? String(found.webfontFamily) : '';\n}\n\n/**\n * @param {string[]} webfontLibraryIds Libraries whose CSS should be injected.\n * @return {Promise<void>}\n */\nfunction waitForPickerWebfontFaces(webfontLibraryIds) {\n  /** @type {string[]} */\n  const fontSpecs = [];\n  webfontLibraryIds.forEach(libraryId => {\n    if ('tabler' === libraryId) {\n      fontSpecs.push('18px tabler-icons', '18px tabler-icons-filled');\n      return;\n    }\n    if ('phosphor' === libraryId) {\n      fontSpecs.push('18px Phosphor', '18px Phosphor-Thin', '18px Phosphor-Light', '18px Phosphor-Bold', '18px Phosphor-Fill');\n      return;\n    }\n    const family = getCatalogWebfontFamily(libraryId);\n    if (family) {\n      fontSpecs.push(`18px ${family}`);\n    }\n  });\n  if (fontSpecs.length === 0) {\n    return Promise.resolve();\n  }\n  const jobs = icon_picker_ui_patch_getTargetDocuments().flatMap(doc => {\n    const docJobs = [];\n    if (doc.fonts?.ready) {\n      docJobs.push(doc.fonts.ready);\n    }\n    fontSpecs.forEach(spec => {\n      if (doc.fonts?.load) {\n        docJobs.push(doc.fonts.load(spec).catch(() => undefined));\n      }\n    });\n    return docJobs;\n  });\n  return Promise.all(jobs).then(() => undefined);\n}\n\n/**\n * @param {string[]} libraryIds Enabled libraries.\n * @return {string[]}\n */\nfunction getEnabledWebfontLibraryIds(libraryIds) {\n  return libraryIds.filter(id => isWebfontPickerLibrary(id));\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @param {Record<string, { label: string }>} optionMap Divi showOnly options.\n * @return {boolean}\n */\nfunction registerShowOnlyCategory(libraryId, getLibraryMeta, optionMap) {\n  if (optionMap[libraryId]) {\n    return false;\n  }\n  optionMap[libraryId] = {\n    label: getLibraryFilterLabel(libraryId, getLibraryMeta)\n  };\n  return true;\n}\n\n/**\n * @return {Document[]}\n */\nfunction icon_picker_ui_patch_getTargetDocuments() {\n  /** @type {Document[]} */\n  const docs = [document];\n  const candidates = [window.top?.document, window.parent?.document, window.divi?.window?.topWindow?.document];\n  candidates.forEach(doc => {\n    if (doc && !docs.includes(doc)) {\n      docs.push(doc);\n    }\n  });\n  return docs;\n}\n\n/**\n * @param {Document} doc Document.\n * @return {boolean}\n */\nfunction documentHasIconPickerList(doc) {\n  return Boolean(doc.querySelector('.et-vb-icon-picker-list'));\n}\n\n/**\n * @param {string[]} libraryIds Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {string}\n */\nfunction getLibraryFilterLabel(libraryId, getLibraryMeta) {\n  const labels = window.dsmIconLibrariesShowOnlyLabels || {};\n  const meta = getLibraryMeta(libraryId);\n  return meta?.label || labels[libraryId] || libraryId;\n}\n\n/**\n * @param {Element} node DOM node.\n * @return {object|null}\n */\nfunction getReactFiber(node) {\n  const fiberKey = Object.keys(node).find(key => key.startsWith('__reactFiber'));\n  return fiberKey ? node[fiberKey] : null;\n}\n\n/**\n * @param {string[]} libraryIds Libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta.\n * @param {Record<string, { label: string }>} optionMap Divi showOnly options.\n * @return {boolean}\n */\nfunction patchShowOnlyOptionMap(libraryIds, getLibraryMeta, optionMap) {\n  if (!optionMap || typeof optionMap !== 'object') {\n    return false;\n  }\n  let changed = false;\n  libraryIds.forEach(libraryId => {\n    if (registerShowOnlyCategory(libraryId, getLibraryMeta, optionMap)) {\n      changed = true;\n    }\n  });\n  return changed;\n}\n\n/**\n * Add Tabler / Phosphor to Divi's hardcoded showOnly dropdown (no wp.hooks API).\n *\n * @param {string[]} libraryIds Libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta.\n * @return {void}\n */\nfunction patchGlobalShowOnlyOptions(libraryIds, getLibraryMeta) {\n  (0,runtime_icon_library_sync.ensureRuntimeFontIconFilters)(libraryIds);\n  icon_picker_ui_patch_getTargetDocuments().forEach(doc => {\n    doc.querySelectorAll('.et-vb-icon-picker-filter-dropdown-wrapper').forEach(wrapper => {\n      const selectRoot = wrapper.querySelector('.et-vb-settings-option-select') || wrapper;\n      let fiber = getReactFiber(selectRoot);\n      while (fiber) {\n        const props = fiber.memoizedProps || fiber.pendingProps;\n        if (props?.name === 'icon-filter-dropdown' && props?.options?.showOnly?.options) {\n          patchShowOnlyOptionMap(libraryIds, getLibraryMeta, props.options.showOnly.options);\n          showOnlyOptionsPatched = true;\n          window.__dsmIconLibraryShowOnlyOptionsPatched = true;\n          return;\n        }\n        fiber = fiber.return;\n      }\n    });\n  });\n}\n\n/**\n * @param {Element} wrapper Dropdown wrapper.\n * @param {string[]} libraryIds Libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta.\n * @return {void}\n */\nfunction patchSelectedFilterChip(wrapper, libraryIds, getLibraryMeta) {\n  const filterRoot = wrapper.closest('.et-vb-icon-picker-filter');\n  const selectedChip = filterRoot?.querySelector('.et-vb-icon-picker-filter-button-group-selected .et-vb-button');\n  if (!selectedChip || selectedChip.dataset.dsmLabelPatched) {\n    return;\n  }\n  const chipText = selectedChip.textContent?.trim().toLowerCase() || '';\n  const activeId = libraryIds.find(id => chipText === id.toLowerCase() || chipText.includes(id.toLowerCase()));\n  if (activeId) {\n    selectedChip.textContent = getLibraryFilterLabel(activeId, getLibraryMeta);\n    selectedChip.dataset.dsmLabelPatched = '1';\n  }\n}\n\n/**\n * @param {string} libraryId Library slug.\n * @param {string} iconId    Icon slug.\n * @return {Record<string, unknown>|undefined}\n */\nfunction findIconListRow(libraryId, iconId) {\n  const iconList = (0,icon_list_rows.getMergedIconListTarget)();\n  if (!Array.isArray(iconList)) {\n    return undefined;\n  }\n  return iconList.find(row => {\n    var _row$unicode;\n    const styles = Array.isArray(row?.styles) ? row.styles : [];\n    return styles.includes(libraryId) && String((_row$unicode = row?.unicode) !== null && _row$unicode !== void 0 ? _row$unicode : '') === iconId;\n  });\n}\n\n/**\n * @param {Element} button Icon picker button.\n * @return {void}\n */\nfunction injectIconPickerButtonFont(button) {\n  const libraryId = button.getAttribute('data-type') || '';\n  const iconId = button.getAttribute('data-unicode') || button.getAttribute('data-icon') || '';\n  if (!libraryId || !iconId) {\n    return;\n  }\n  const manifestRow = findIconListRow(libraryId, iconId);\n  if (manifestRow?.dsmPickerFontClass) {\n    button.setAttribute('data-dsm-picker-font-class', String(manifestRow.dsmPickerFontClass));\n  }\n  if (manifestRow?.dsmWebfontFamily) {\n    button.setAttribute('data-dsm-webfont-family', String(manifestRow.dsmWebfontFamily));\n  }\n  if (manifestRow?.dsmVariant) {\n    button.setAttribute('data-dsm-variant', String(manifestRow.dsmVariant));\n  }\n  const fontClass = resolvePickerFontClass(button, libraryId, iconId);\n  const fontFamily = resolvePickerWebfontFamily(button, libraryId, iconId);\n  if (!fontClass) {\n    return;\n  }\n  const ownerDoc = button.ownerDocument || document;\n  let host = button.querySelector('.dsm-icon-picker-font-host');\n  if (!host) {\n    host = ownerDoc.createElement('span');\n    host.className = 'dsm-icon-picker-font-host';\n    host.setAttribute('aria-hidden', 'true');\n    button.appendChild(host);\n  }\n  let glyph = host.querySelector('i');\n  if (!glyph) {\n    glyph = ownerDoc.createElement('i');\n    host.appendChild(glyph);\n  }\n  glyph.className = fontClass;\n  button.classList.add('dsm-icon-picker-font-button');\n  button.dataset.dsmFontEnhanced = '1';\n  button.removeAttribute('data-icon');\n  if (fontFamily) {\n    button.dataset.dsmWebfontFamily = fontFamily;\n  }\n  const legacyHost = button.querySelector('.dsm-icon-picker-svg-host');\n  if (legacyHost) {\n    legacyHost.remove();\n  }\n  button.classList.remove('dsm-icon-picker-svg-button');\n  delete button.dataset.dsmSvgEnhanced;\n  delete button.dataset.dsmSvgQueued;\n  delete button.dataset.dsmSvgInjecting;\n}\n\n/**\n * @param {Element}  list              Icon grid container.\n * @param {string[]} enabledLibraryIds Enabled libraries.\n * @return {void}\n */\nfunction enhanceIconPickerButtons(list, enabledLibraryIds) {\n  list.querySelectorAll('.et-vb-button[data-type]').forEach(button => {\n    const libraryId = button.getAttribute('data-type') || '';\n    if (!enabledLibraryIds.includes(libraryId) || !isWebfontPickerLibrary(libraryId)) {\n      return;\n    }\n    const hasGlyph = button.querySelector('.dsm-icon-picker-font-host i[class]');\n    if (button.dataset.dsmFontEnhanced === '1' && hasGlyph) {\n      if (button.dataset.dsmFontCssReady === '1') {\n        return;\n      }\n    }\n    injectIconPickerButtonFont(button);\n    button.dataset.dsmFontCssReady = '1';\n  });\n}\n\n/**\n * @param {string[]} libraryIds Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {void}\n */\nfunction schedulePickerFontEnhancement(libraryIds, getLibraryMeta) {\n  const generation = ++fontEnhancementGeneration;\n  const run = () => {\n    patchGlobalShowOnlyOptions(libraryIds, getLibraryMeta);\n    icon_picker_ui_patch_getTargetDocuments().forEach(doc => {\n      doc.querySelectorAll('.et-vb-icon-picker-filter-dropdown-wrapper').forEach(wrapper => {\n        patchSelectedFilterChip(wrapper, libraryIds, getLibraryMeta);\n      });\n      doc.querySelectorAll('.et-vb-icon-picker-list').forEach(list => {\n        list.querySelectorAll('.et-vb-button[data-type]').forEach(button => {\n          delete button.dataset.dsmFontCssReady;\n        });\n        enhanceIconPickerButtons(list, libraryIds);\n      });\n    });\n  };\n  const activeLibraryIds = collectActivePickerLibraryIds(libraryIds, getLibraryMeta);\n  const webfontLibraryIds = [...new Set([...activeLibraryIds, ...getEnabledWebfontLibraryIds(libraryIds)].filter(Boolean))];\n\n  /** @type {Promise<unknown>[]} */\n  const assetJobs = webfontLibraryIds.map(id => ensurePickerWebfontsLoaded(id));\n  if (webfontLibraryIds.includes('tabler')) {\n    assetJobs.push(ensureTablerWebfontIndexLoaded());\n  }\n  if (assetJobs.length === 0) {\n    run();\n    return;\n  }\n  Promise.all(assetJobs).then(() => {\n    if (generation !== fontEnhancementGeneration) {\n      return undefined;\n    }\n    return waitForPickerWebfontFaces(webfontLibraryIds);\n  }).then(() => {\n    if (generation !== fontEnhancementGeneration) {\n      return;\n    }\n    window.requestAnimationFrame(() => {\n      window.requestAnimationFrame(() => {\n        run();\n      });\n    });\n  });\n}\n\n/**\n * @return {void}\n */\nfunction disconnectPickerListObserver() {\n  if (pickerListObserver) {\n    pickerListObserver.disconnect();\n    pickerListObserver = null;\n  }\n  if (pickerFilterObserver) {\n    pickerFilterObserver.disconnect();\n    pickerFilterObserver = null;\n  }\n  icon_picker_ui_patch_getTargetDocuments().forEach(doc => {\n    doc.querySelectorAll('.et-vb-icon-picker-list[data-dsm-picker-list-observed], .et-vb-icon-picker-filter[data-dsm-picker-filter-observed]').forEach(node => {\n      delete node.dataset.dsmPickerListObserved;\n      delete node.dataset.dsmPickerFilterObserved;\n    });\n  });\n}\n\n/**\n * @param {string[]} libraryIds Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {void}\n */\nfunction connectPickerListObserver(libraryIds, getLibraryMeta) {\n  const coalescedRun = dsmExtensionCreateRafCoalescer(() => {\n    schedulePickerFontEnhancement(libraryIds, getLibraryMeta);\n  });\n  if (!pickerListObserver) {\n    pickerListObserver = new MutationObserver(coalescedRun);\n  }\n  icon_picker_ui_patch_getTargetDocuments().forEach(doc => {\n    doc.querySelectorAll('.et-vb-icon-picker-list').forEach(list => {\n      if ('1' === list.dataset.dsmPickerListObserved) {\n        return;\n      }\n      list.dataset.dsmPickerListObserved = '1';\n      pickerListObserver?.observe(list, {\n        childList: true,\n        subtree: true\n      });\n    });\n  });\n}\n\n/**\n * Re-run webfont injection when the showOnly filter chip changes (e.g. Lucide).\n *\n * @param {string[]} libraryIds Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {void}\n */\nfunction connectPickerFilterObserver(libraryIds, getLibraryMeta) {\n  const coalescedRun = dsmExtensionCreateRafCoalescer(() => {\n    schedulePickerFontEnhancement(libraryIds, getLibraryMeta);\n  });\n  if (!pickerFilterObserver) {\n    pickerFilterObserver = new MutationObserver(coalescedRun);\n  }\n  icon_picker_ui_patch_getTargetDocuments().forEach(doc => {\n    doc.querySelectorAll('.et-vb-icon-picker-filter').forEach(filter => {\n      if ('1' === filter.dataset.dsmPickerFilterObserved) {\n        return;\n      }\n      filter.dataset.dsmPickerFilterObserved = '1';\n      pickerFilterObserver?.observe(filter, {\n        childList: true,\n        subtree: true,\n        characterData: true\n      });\n    });\n  });\n}\n\n/**\n * @param {Node} node DOM node.\n * @return {boolean}\n */\nfunction isIconPickerRelatedNode(node) {\n  if (!node || node.nodeType !== 1) {\n    return false;\n  }\n  const element = /** @type {Element} */node;\n  return Boolean(element.closest?.('.et-vb-icon-picker') || element.matches?.('.et-vb-icon-picker, .et-vb-icon-picker-list') || element.querySelector?.('.et-vb-icon-picker-list'));\n}\n\n/**\n * @param {string[]} libraryIds Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {void}\n */\nfunction syncPickerObserverState(libraryIds, getLibraryMeta) {\n  const open = icon_picker_ui_patch_getTargetDocuments().some(documentHasIconPickerList);\n  if (open) {\n    if (!pickerModalOpen) {\n      pickerModalOpen = true;\n      schedulePickerFontEnhancement(libraryIds, getLibraryMeta);\n    }\n    connectPickerListObserver(libraryIds, getLibraryMeta);\n    connectPickerFilterObserver(libraryIds, getLibraryMeta);\n    schedulePickerFontEnhancement(libraryIds, getLibraryMeta);\n    return;\n  }\n  pickerModalOpen = false;\n  disconnectPickerListObserver();\n}\n\n/**\n * @param {string[]} libraryIds Enabled libraries.\n * @param {(id: string) => { label: string } | null} getLibraryMeta Meta resolver.\n * @return {void}\n */\nfunction enhanceIconPickerUi(libraryIds, getLibraryMeta) {\n  if (libraryIds.length === 0) {\n    return;\n  }\n  (0,runtime_icon_library_sync.scheduleRuntimeFontIconFilterSync)(libraryIds);\n  patchGlobalShowOnlyOptions(libraryIds, getLibraryMeta);\n  schedulePickerFontEnhancement(libraryIds, getLibraryMeta);\n  if (pickerPresenceObserver) {\n    return;\n  }\n  const coalescedPresenceCheck = dsmExtensionCreateRafCoalescer(() => {\n    syncPickerObserverState(libraryIds, getLibraryMeta);\n  });\n  pickerPresenceObserver = new MutationObserver(mutations => {\n    const relevant = mutations.some(mutation => {\n      const nodes = [...Array.from(mutation.addedNodes), ...Array.from(mutation.removedNodes)];\n      return nodes.some(isIconPickerRelatedNode);\n    });\n    if (!relevant) {\n      return;\n    }\n    coalescedPresenceCheck();\n  });\n  icon_picker_ui_patch_getTargetDocuments().forEach(doc => {\n    if (doc.body) {\n      pickerPresenceObserver?.observe(doc.body, {\n        childList: true,\n        subtree: true\n      });\n    }\n  });\n  syncPickerObserverState(libraryIds, getLibraryMeta);\n}\n;// external [\"vendor\",\"React\"]\nconst external_vendor_React_namespaceObject = vendor.React;\n;// ./packages/extensions/icon-libraries/icon-value.js\n/**\n * Stored icon value helpers for DSM webfont icon libraries.\n *\n * @package DiviSupreme\n */\n\n/**\n * @param {unknown} icon Icon settings object.\n * @return {boolean}\n */\nfunction isDsmIcon(icon) {\n  var _icon$type;\n  if (!icon || typeof icon !== 'object') {\n    return false;\n  }\n  const type = String(/** @type {{ type?: string }} */(_icon$type = icon.type) !== null && _icon$type !== void 0 ? _icon$type : '');\n  if ('' === type) {\n    return false;\n  }\n  const bootstrapIds = window.dsmIconLibrariesVbBootstrap?.libraryIds;\n  if (Array.isArray(bootstrapIds) && bootstrapIds.length > 0) {\n    return bootstrapIds.includes(type);\n  }\n  return false;\n}\n\n/**\n * Normalize picker output — preserve variant for Phosphor weights.\n *\n * @param {{ unicode?: string, type?: string, weight?: string, variant?: string }} icon Raw picker value.\n * @return {{ unicode: string, type: string, weight: string, variant?: string }}\n */\nfunction normalizeStoredIconValue(icon) {\n  var _icon$type2, _icon$unicode, _icon$weight;\n  const type = String((_icon$type2 = icon?.type) !== null && _icon$type2 !== void 0 ? _icon$type2 : '');\n  const unicode = String((_icon$unicode = icon?.unicode) !== null && _icon$unicode !== void 0 ? _icon$unicode : '');\n  const weight = String((_icon$weight = icon?.weight) !== null && _icon$weight !== void 0 ? _icon$weight : '400');\n  let variant = typeof icon?.variant === 'string' && icon.variant !== '' ? icon.variant : type === 'phosphor' ? 'regular' : '';\n  if ('duotone' === variant) {\n    variant = 'regular';\n  }\n  const out = {\n    unicode,\n    type,\n    weight\n  };\n  if (variant) {\n    /** @type {{ unicode: string, type: string, weight: string, variant?: string }} */out.variant = variant;\n  }\n  return out;\n}\n\n/**\n * Build composite icon map key for icon.map entries (preview components).\n *\n * @param {string} libraryId Library slug.\n * @param {string} iconId    Icon slug.\n * @return {string}\n */\nfunction buildIconMapKey(libraryId, iconId) {\n  return `divi-supreme/${libraryId}/${iconId}`;\n}\n;// ./packages/extensions/icon-libraries/icon-map.js\n/**\n * Visual Builder icon.map entries — webfont previews for DSM libraries.\n *\n * @package DiviSupreme\n */\n\n\n\n\n\n/**\n * @param {string} libraryId Library slug.\n * @param {string} iconId    Icon slug.\n * @param {string} variant   Variant slug.\n * @return {() => JSX.Element}\n */\nfunction createFontPreviewComponent(libraryId, iconId, variant = '', fontClass = '') {\n  const resolvedClass = fontClass || getPickerFontClass(libraryId, iconId, variant);\n  return function DsmFontIconPreview() {\n    return /*#__PURE__*/(0,external_vendor_React_namespaceObject.createElement)('span', {\n      className: 'dsm-icon-map-preview dsm-icon-map-preview--font',\n      'aria-hidden': true\n    }, /*#__PURE__*/(0,external_vendor_React_namespaceObject.createElement)('i', {\n      className: resolvedClass\n    }));\n  };\n}\n\n/**\n * @return {Record<string, () => JSX.Element>}\n */\nfunction getLazyIconMapEntries() {\n  if (!window.__dsmIconMapLazyEntries || typeof window.__dsmIconMapLazyEntries !== 'object') {\n    window.__dsmIconMapLazyEntries = {};\n  }\n  return window.__dsmIconMapLazyEntries;\n}\n\n/**\n * Register icon.map preview components for manifest rows (lazy, per library).\n *\n * @param {Array<Record<string, unknown>>} rows Manifest rows.\n * @return {void}\n */\nfunction registerIconMapEntriesForRows(rows) {\n  if (!Array.isArray(rows) || rows.length === 0) {\n    return;\n  }\n  const entries = getLazyIconMapEntries();\n  rows.forEach(row => {\n    var _ref, _row$dsmLibraryId, _row$unicode, _row$dsmVariant, _row$dsmPickerFontCla;\n    if (!row || typeof row !== 'object') {\n      return;\n    }\n    const libraryId = String((_ref = (_row$dsmLibraryId = row.dsmLibraryId) !== null && _row$dsmLibraryId !== void 0 ? _row$dsmLibraryId : row.styles?.[0]) !== null && _ref !== void 0 ? _ref : '');\n    const iconId = String((_row$unicode = row.unicode) !== null && _row$unicode !== void 0 ? _row$unicode : '');\n    const variant = String((_row$dsmVariant = row.dsmVariant) !== null && _row$dsmVariant !== void 0 ? _row$dsmVariant : '');\n    if (!libraryId || !iconId || !isWebfontPickerLibrary(libraryId)) {\n      return;\n    }\n    const key = buildIconMapKey(libraryId, iconId);\n    if (entries[key]) {\n      return;\n    }\n    entries[key] = createFontPreviewComponent(libraryId, iconId, variant, String((_row$dsmPickerFontCla = row.dsmPickerFontClass) !== null && _row$dsmPickerFontCla !== void 0 ? _row$dsmPickerFontCla : ''));\n  });\n}\n\n/**\n * Register icon.map preview components for enabled libraries (lazy entries only).\n *\n * @param {string[]} libraryIds Enabled library ids.\n * @return {Record<string, () => JSX.Element>}\n */\nfunction buildIconMapEntries(libraryIds) {\n  const entries = getLazyIconMapEntries();\n  /** @type {Record<string, () => JSX.Element>} */\n  const scoped = {};\n  libraryIds.forEach(libraryId => {\n    const prefix = `divi-supreme/${libraryId}/`;\n    Object.entries(entries).forEach(([key, component]) => {\n      if (key.startsWith(prefix)) {\n        scoped[key] = component;\n      }\n    });\n  });\n  return scoped;\n}\n\n/**\n * Ensure icon.map has a preview entry for a single icon (canvas / settings).\n *\n * @param {string} libraryId Library slug.\n * @param {string} iconId    Icon slug.\n * @param {string} [variant] Variant slug.\n * @return {void}\n */\nfunction ensureIconMapEntryForIcon(libraryId, iconId, variant = '') {\n  if (!libraryId || !iconId || !isWebfontPickerLibrary(libraryId)) {\n    return;\n  }\n  const entries = getLazyIconMapEntries();\n  const key = buildIconMapKey(libraryId, iconId);\n  if (!entries[key]) {\n    entries[key] = createFontPreviewComponent(libraryId, iconId, variant);\n  }\n}\n;// ./packages/extensions/icon-libraries/vb-hooks.js\n/**\n * Visual Builder hooks — fontIconTypes, iconList, icon.map.\n *\n * @package DiviSupreme\n */\n\n\n\n\n\n\n\n/** @type {boolean} */\nlet hooksRegistered = false;\n\n/**\n * Register Divi icon-library filters once (icon.map + UI patch; core hooks are early-loaded).\n *\n * @return {boolean}\n */\nfunction registerIconLibraryVbHooks() {\n  if (hooksRegistered) {\n    return true;\n  }\n  const libraryIds = getEnabledLibraryIds();\n  if (libraryIds.length === 0) {\n    return true;\n  }\n  const mapOk = (0,wp_hooks_api.wpAddFilter)('divi.iconLibrary.icon.map', 'divisupreme/icon-libraries', map => {\n    const merged = {\n      ...(map || {}),\n      ...buildIconMapEntries(libraryIds)\n    };\n    return merged;\n  });\n  if (!mapOk) {\n    return false;\n  }\n  hooksRegistered = true;\n  (0,runtime_icon_library_sync.scheduleRuntimeFontIconFilterSync)(libraryIds);\n\n  // fontIconTypes / fontIconFilters / iconList register in register-vb-hooks-early.js\n  // (before Divi's icon-library bundle initializes).\n\n  enhanceIconPickerUi(libraryIds, getLibraryMeta);\n  return true;\n}\n\n/**\n * Register VB hooks with retry until WordPress hooks API is available.\n *\n * @return {void}\n */\nfunction registerIconLibraryVbHooksWithRetry() {\n  if (registerIconLibraryVbHooks()) {\n    return;\n  }\n  let attempts = 0;\n  const timer = window.setInterval(() => {\n    attempts += 1;\n    if (registerIconLibraryVbHooks() || attempts > 200) {\n      window.clearInterval(timer);\n    }\n  }, 25);\n}\n// EXTERNAL MODULE: ./packages/extensions/icon-libraries/register-vb-hooks-early.js\nvar register_vb_hooks_early = __webpack_require__(\"./packages/extensions/icon-libraries/register-vb-hooks-early.js\");\n;// ./packages/extensions/icon-libraries/vb.scss\n// extracted by mini-css-extract-plugin\n\n;// ./packages/extensions/icon-libraries/vb-top-window-entry.js\n/**\n * Icon Libraries — Visual Builder top-window entry (field panel / icon picker).\n *\n * The icon picker UI lives in the VB top window, not the app iframe where\n * `extensions.js` loads. This bundle wires icon.map + filter UI there.\n *\n * @package DiviSupreme\n */\n\n\n\n\nconst bootstrap = window.dsmIconLibrariesVbBootstrap;\nif (bootstrap?.enabled && Array.isArray(bootstrap.libraryIds) && bootstrap.libraryIds.length > 0) {\n  registerIconLibraryVbHooksWithRetry();\n}\n\n//# sourceURL=webpack://divi-supreme/./packages/extensions/icon-libraries/vb-top-window-entry.js_+_10_modules?\n}");

/***/ },

/***/ "./packages/extensions/icon-libraries/vb-window-bridge.js"
/*!****************************************************************!*\
  !*** ./packages/extensions/icon-libraries/vb-window-bridge.js ***!
  \****************************************************************/
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {

eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getGlobalIconListStateHost: () => (/* binding */ getGlobalIconListStateHost),\n/* harmony export */   getSharedStateWindow: () => (/* binding */ getSharedStateWindow),\n/* harmony export */   getVbAppWindow: () => (/* binding */ getVbAppWindow),\n/* harmony export */   getVbIconLibrary: () => (/* binding */ getVbIconLibrary)\n/* harmony export */ });\n/**\n * Resolve the VB app iframe where Divi's iconLibrary lives.\n *\n * The icon picker DOM is portaled into the top window, but filtering uses\n * `divi.iconLibrary` in the app iframe. Manifest rows must mutate that list.\n *\n * @package DiviSupreme\n */\n\n/** @type {Window|null} */\nlet cachedAppWindow = null;\n\n/**\n * @param {Window} win Window.\n * @return {boolean}\n */\nfunction windowHasIconLibrary(win) {\n  return Boolean(win?.divi?.iconLibrary && Array.isArray(win.divi.iconLibrary.iconList));\n}\n\n/**\n * @return {Document[]}\n */\nfunction getIframeOwnerDocuments() {\n  /** @type {Document[]} */\n  const docs = [document];\n  try {\n    if (window.top?.document && !docs.includes(window.top.document)) {\n      docs.push(window.top.document);\n    }\n  } catch {\n    // Ignore cross-origin top access.\n  }\n  try {\n    if (window.parent?.document && window.parent !== window && !docs.includes(window.parent.document)) {\n      docs.push(window.parent.document);\n    }\n  } catch {\n    // Ignore.\n  }\n  return docs;\n}\n\n/**\n * @return {Window|null}\n */\nfunction findAppWindowViaIframes() {\n  for (const ownerDoc of getIframeOwnerDocuments()) {\n    /** @type {HTMLIFrameElement[]} */\n    const iframes = Array.from(ownerDoc.querySelectorAll('iframe'));\n    for (const iframe of iframes) {\n      try {\n        const contentWindow = iframe.contentWindow;\n        if (contentWindow && windowHasIconLibrary(contentWindow)) {\n          return contentWindow;\n        }\n      } catch {\n        // Cross-origin iframe — skip.\n      }\n    }\n  }\n  return null;\n}\n\n/**\n * Move lazy iconList state from the top window onto the app iframe once ready.\n *\n * @param {Window} appWin App iframe window.\n * @return {void}\n */\nfunction migrateIconLibraryStateToAppWindow(appWin) {\n  if (!appWin || appWin === window) {\n    return;\n  }\n  const sourceRows = window.__dsmIconLibraryLazyRows;\n  if (Array.isArray(sourceRows) && sourceRows.length > 0) {\n    if (!Array.isArray(appWin.__dsmIconLibraryLazyRows)) {\n      appWin.__dsmIconLibraryLazyRows = [];\n    }\n    sourceRows.forEach(row => {\n      if (!appWin.__dsmIconLibraryLazyRows.includes(row)) {\n        appWin.__dsmIconLibraryLazyRows.push(row);\n      }\n    });\n    window.__dsmIconLibraryLazyRows = [];\n  }\n  const sourceBuffer = window.__dsmIconListMergedBuffer;\n  if (Array.isArray(sourceBuffer) && sourceBuffer.length > 0) {\n    const targetList = appWin.divi?.iconLibrary?.iconList;\n    if (Array.isArray(targetList)) {\n      sourceBuffer.forEach(row => {\n        if (!targetList.includes(row)) {\n          targetList.push(row);\n        }\n      });\n    }\n    window.__dsmIconListMergedBuffer = undefined;\n  }\n  const sourceSessions = window.__dsmIconLibraryLoadedSessions;\n  if (sourceSessions instanceof Set && sourceSessions.size > 0) {\n    if (!(appWin.__dsmIconLibraryLoadedSessions instanceof Set)) {\n      appWin.__dsmIconLibraryLoadedSessions = new Set();\n    }\n    sourceSessions.forEach(session => {\n      appWin.__dsmIconLibraryLoadedSessions.add(session);\n    });\n    sourceSessions.clear();\n  }\n}\n\n/**\n * @return {Window}\n */\nfunction getVbAppWindow() {\n  if (cachedAppWindow && windowHasIconLibrary(cachedAppWindow)) {\n    return cachedAppWindow;\n  }\n  if (windowHasIconLibrary(window)) {\n    cachedAppWindow = window;\n    return window;\n  }\n  const viaIframe = findAppWindowViaIframes();\n  if (viaIframe) {\n    migrateIconLibraryStateToAppWindow(viaIframe);\n    cachedAppWindow = viaIframe;\n    return viaIframe;\n  }\n  const viaDiviWindow = window.divi?.window?.getWindow?.('app');\n  if (viaDiviWindow && windowHasIconLibrary(viaDiviWindow)) {\n    migrateIconLibraryStateToAppWindow(viaDiviWindow);\n    cachedAppWindow = viaDiviWindow;\n    return viaDiviWindow;\n  }\n  return window;\n}\n\n/**\n * @return {import('@divi/icon-library')|null}\n */\nfunction getVbIconLibrary() {\n  var _appWin$divi$iconLibr;\n  const appWin = getVbAppWindow();\n  return (_appWin$divi$iconLibr = appWin.divi?.iconLibrary) !== null && _appWin$divi$iconLibr !== void 0 ? _appWin$divi$iconLibr : null;\n}\n\n/**\n * Cross-window host for iconList/lazy state (top picker + app iframe bundles).\n *\n * @return {Window}\n */\nfunction getGlobalIconListStateHost() {\n  try {\n    var _window$top;\n    return (_window$top = window.top) !== null && _window$top !== void 0 ? _window$top : window;\n  } catch {\n    return window;\n  }\n}\n\n/**\n * Shared lazy-row store lives on the global host so top-window picker UI can sync.\n *\n * @return {Window}\n */\nfunction getSharedStateWindow() {\n  return getGlobalIconListStateHost();\n}\n\n//# sourceURL=webpack://divi-supreme/./packages/extensions/icon-libraries/vb-window-bridge.js?\n}");

/***/ },

/***/ "./packages/extensions/icon-libraries/wp-hooks-api.js"
/*!************************************************************!*\
  !*** ./packages/extensions/icon-libraries/wp-hooks-api.js ***!
  \************************************************************/
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {

eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getWpHooks: () => (/* binding */ getWpHooks),\n/* harmony export */   wpAddFilter: () => (/* binding */ wpAddFilter)\n/* harmony export */ });\n/**\n * Safe access to WordPress hooks in VB (top + app windows).\n *\n * Avoids webpack `window.vendor.wp.hooks` externals that throw when vendor\n * is not initialised yet at module parse time.\n *\n * @package DiviSupreme\n */\n\n/**\n * @return {import('@wordpress/hooks').Hooks | null}\n */\nfunction getWpHooks() {\n  if (window.vendor?.wp?.hooks) {\n    return window.vendor.wp.hooks;\n  }\n  if (window.wp?.hooks) {\n    return window.wp.hooks;\n  }\n  return null;\n}\n\n/**\n * @param {string}   hookName Hook name.\n * @param {string}   namespace Namespace.\n * @param {Function} callback Callback.\n * @param {number}   [priority=10] Priority.\n * @return {boolean} Whether the filter was registered.\n */\nfunction wpAddFilter(hookName, namespace, callback, priority = 10) {\n  const hooks = getWpHooks();\n  if (!hooks?.addFilter) {\n    return false;\n  }\n  hooks.addFilter(hookName, namespace, callback, priority);\n  return true;\n}\n\n//# sourceURL=webpack://divi-supreme/./packages/extensions/icon-libraries/wp-hooks-api.js?\n}");

/***/ }

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		if (!(moduleId in __webpack_modules__)) {
/******/ 			delete __webpack_module_cache__[moduleId];
/******/ 			var e = new Error("Cannot find module '" + moduleId + "'");
/******/ 			e.code = 'MODULE_NOT_FOUND';
/******/ 			throw e;
/******/ 		}
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = __webpack_require__("./packages/extensions/icon-libraries/vb-top-window-entry.js");
/******/ 	
/******/ })()
;