{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import type { FancyboxInstance, CarouselSlide, FancyboxOptions } from \"@fancyapps/ui\";\r\nimport { Fancybox } from \"@fancyapps/ui/dist/fancybox/index.js\";\r\nimport { isSelectorValid } from \"@web3r/flowerkit/css\";\r\nimport { isNode } from \"@web3r/flowerkit/dom\";\r\nimport { bubble } from \"@web3r/flowerkit/evt\";\r\nimport { wait } from \"@web3r/flowerkit/fn\";\r\nimport { getJSONFromStr } from \"@web3r/flowerkit/json\";\r\nimport { getMergedObj, isObjHasOwnProp } from \"@web3r/flowerkit/obj\";\r\nimport { getId } from \"@web3r/flowerkit/str\";\r\nimport { createElement } from \"react\";\r\nimport type { PropsWithChildren } from \"react\";\r\nimport { getDocument, getWindow } from \"ssr-window\";\r\nimport { locales } from \"./config/locales\";\r\nimport type { TLocales } from \"./config/locales\";\r\nimport type {\r\n  TCallbackArg, TControls, TFbOptions, TModalCfg, TPresets, TResult, TModalId, TLayout, TAsset, TActions,\r\n} from \"./config/types\";\r\nimport {\r\n  getAsyncModalLayout, getTemplateLayout, getCfgProp, getLocaleCluster, isAssetsValid,\r\n} from \"./utils/index\";\r\nimport type { IBtn } from \"../../components/btn\";\r\nimport { Btn } from \"../../components/btn\";\r\nimport { Icon } from \"../../components/icon\";\r\nimport { Locale } from \"../../components/locale\";\r\nimport { Modal } from \"../../components/modal\";\r\nimport type { IModal } from \"../../components/modal/config/types\";\r\nimport { getPresetPartials } from \"../../components/modal/lib\";\r\nimport { constants } from \"../../constants\";\r\nimport type { IComponentBaseProps } from \"../../types\";\r\nimport { dispatchContentLoaded } from \"../../utils/dispatchContentLoaded\";\r\nimport { getAttr } from \"../../utils/getAttr\";\r\nimport { getClassString } from \"../../utils/getClassString\";\r\nimport { getSanitizedHTML } from \"../../utils/getSanitizedHTML\";\r\nimport { getStaticMarkupForClient } from \"../../utils/react/getStaticMarkup.client\";\r\nimport { Localisation } from \"../localisation\";\r\n\r\n\r\n/**\r\n * Singleton. Плагин модальных окон.\r\n * Асинхронно загружает внутренние ресурсы и предоставляет методы для работы с модальными окнами.\r\n */\r\nexport class Modals {\r\n\r\n  /**\r\n   * Статусы операций во время показа модального окна\r\n   */\r\n  static reasons = {\r\n    open: \"MODAL_IS_OPEN\",\r\n    close: \"MODAL_IS_CLOSE\",\r\n    error: \"MODAL_IS_ERROR\",\r\n  };\r\n\r\n  /**\r\n   * Всплывающие события\r\n   */\r\n  static bubbles = {\r\n    // открытие модального окна после анимации\r\n    open: \"modals::open\",\r\n    // модальное окно готово к закрытию\r\n    beforeClose: \"modals::beforeClose\",\r\n    // закрытие модального окна после анимации\r\n    close: \"modals::close\",\r\n    // подтверждение внутри модального окна\r\n    confirm: \"modals::confirm\",\r\n    // отмена внутри модального окна\r\n    cancel: \"modals::cancel\",\r\n    // загрузка асинхронного модального окна\r\n    loading: \"modals::loading\",\r\n    // ошибка открытия модального окна\r\n    error: \"modals::error\",\r\n  };\r\n\r\n  /**\r\n   * Singleton-экземпляр плагина модальных окон.\r\n   * @type {Modals|null}\r\n   */\r\n  static instance: Modals | null = null;\r\n\r\n  /**\r\n   * Текущая ссылка на Fancybox API.\r\n   * Допускает замену реализации при интеграции.\r\n   * @type {typeof Fancybox}\r\n   */\r\n  static fancybox: typeof Fancybox = Fancybox;\r\n\r\n  /**\r\n   * Базовые селекторы модальных блоков и интерактивных элементов.\r\n   */\r\n  static selectors = {\r\n    modal: \"[data-js-modal]\",\r\n    handler: \"[data-js-modal-handler]\",\r\n    interaction: \"input, textarea, select, form, label, a\",\r\n  };\r\n\r\n  /**\r\n   * Стандартная конфигурация Fancybox\r\n   * @see https://fancyapps.com/fancybox/api/options\r\n   */\r\n  static fancyboxDefaultCfg: TFbOptions = {\r\n    mainTpl: `<div class=\"fancybox__dialog\">\r\n      <div class=\"fancybox__container\" tabindex=\"0\" aria-label=\"{{MODAL}}\">\r\n        <div class=\"fancybox__backdrop\"></div>\r\n        <div class=\"fancybox__carousel\"></div>\r\n      </div>\r\n    </div>`,\r\n    mainClass: \"modal\",\r\n    animated: false,\r\n    hideScrollbar: true,\r\n    closeButton: false,\r\n    compact: true,\r\n    idle: false,\r\n    on: {\r\n      [\"Carousel.ready\"]: (instance: FancyboxInstance, slide: CarouselSlide) => null,\r\n      close: (instance: FancyboxInstance, slide: CarouselSlide) => null,\r\n    },\r\n    trapFocus: false,\r\n    autoFocus: false,\r\n    placeFocusBack: false,\r\n    showClass: \"isModalShow\",\r\n    hideClass: \"isModalHide\",\r\n    triggerEl: null,\r\n  };\r\n\r\n  /**\r\n   * Конфигурация модального окна по умолчанию.\r\n   * Используется как база при открытии через `getOpen` и парсинге handler-конфига.\r\n   * @type {TModalCfg}\r\n   */\r\n  static modalDefaultCfg: TModalCfg = {\r\n    type: \"inline\",\r\n    src: null,\r\n    async: null,\r\n    assets: null,\r\n    redirectAfterClose: null,\r\n    isReloadAfterClose: false,\r\n    onAction: null,\r\n    fancyboxCfg: {},\r\n  };\r\n\r\n  static #getModalElFromInstance(instance: FancyboxInstance) {\r\n    const container = instance.getContainer();\r\n    return container?.querySelector(Modals.selectors.modal) ?? null;\r\n  }\r\n\r\n  static #getCfg(node: HTMLElement, selector: string): TModalCfg {\r\n\r\n    const attrValue = node.getAttribute(getAttr(selector));\r\n    const parsedCfg: TModalCfg = attrValue ? getJSONFromStr<TModalCfg>(attrValue) : {};\r\n\r\n    if (selector === Modals.selectors.handler) {\r\n      if (parsedCfg.assign) {\r\n        return {\r\n          assign: parsedCfg.assign,\r\n        };\r\n      } else {\r\n        return {\r\n          ...Modals.modalDefaultCfg,\r\n          ...parsedCfg,\r\n          src: getCfgProp(\"src\", node, parsedCfg) as TModalCfg[\"src\"],\r\n          id: getCfgProp(\"id\", node, parsedCfg) as TModalCfg[\"id\"],\r\n          type: getCfgProp(\"type\", node, parsedCfg) as TModalCfg[\"type\"],\r\n          action: parsedCfg.action,\r\n          preset: parsedCfg.preset,\r\n          triggerEl: node,\r\n          fancyboxCfg: parsedCfg?.fancyboxCfg ?? {},\r\n        };\r\n      }\r\n    } else {\r\n      const { redirectAfterClose, isReloadAfterClose } = parsedCfg;\r\n      return {\r\n        redirectAfterClose,\r\n        isReloadAfterClose,\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Генерирует HTML-кнопку управления Fancybox-панелью.\r\n   * @returns {Promise<string>}\r\n   */\r\n  static getControlsLayout = async (type: TControls): Promise<string> => {\r\n\r\n    if (!type) {\r\n      return \"\";\r\n    }\r\n\r\n    const props: Partial<{\r\n      localeCode: string;\r\n      type: IBtn[\"type\"];\r\n      icon: IBtn[\"icon\"];\r\n      extraAttrs: IComponentBaseProps[\"extraAttrs\"];\r\n    }> = {\r\n      type: \"button\" as const,\r\n      icon: type,\r\n      localeCode: type.toUpperCase(),\r\n    };\r\n\r\n    switch (type) {\r\n      case \"zoomOut\":\r\n        props.extraAttrs = {\r\n          \"data-panzoom-action\": \"zoomOut\",\r\n        };\r\n        break;\r\n      case \"zoomIn\":\r\n        props.extraAttrs = {\r\n          \"data-panzoom-action\": \"zoomIn\",\r\n        };\r\n        break;\r\n      case \"download\":\r\n        props.type = \"link\";\r\n        props.extraAttrs = {\r\n          \"download\": true,\r\n          \"data-carousel-download\": \"\",\r\n        };\r\n        break;\r\n      case \"close\":\r\n        props.extraAttrs = {\r\n          \"data-fancybox-close\": \"\",\r\n        };\r\n        break;\r\n      case \"fullscreen\":\r\n        props.extraAttrs = {\r\n          \"data-fullscreen-action\": \"toggle\",\r\n        };\r\n        break;\r\n    }\r\n\r\n    return getStaticMarkupForClient(createElement(Locale, {\r\n      code: `modals.${props.localeCode}`,\r\n      attr: \"title\",\r\n    }, createElement(Btn, {\r\n      extraAttrs: props.extraAttrs,\r\n      label: null,\r\n      type: props.type,\r\n      icon: props.icon,\r\n      iconSize: \"medium\",\r\n    })));\r\n\r\n  };\r\n\r\n  static #getCN(el?: string, mod?: IComponentBaseProps[\"extraClasses\"], utilClasses?: string[]) {\r\n    return getClassString(\"modal\", el, mod);\r\n  }\r\n\r\n  /**\r\n   * Получает HTML-разметку модального окна на основе готового шаблона\r\n   * @param preset{TPresets}\r\n   * @param props{Object=}\r\n   * @returns {IModal}\r\n   */\r\n  static getLayoutPresetProps = (preset: TPresets, props?: PropsWithChildren<IModal>): IModal => {\r\n\r\n    const id: string = props?.id ?? getId(9);\r\n    const cfg = props?.cfg ?? {};\r\n\r\n    const presetPartials = getPresetPartials(preset, id, Modals.#getCN);\r\n    const userPartials: TLayout = {\r\n      children: props?.children || presetPartials.contentSlot,\r\n      titleSlot: props?.titleSlot,\r\n      footerSlot: props?.footerSlot,\r\n      headerSlot: props?.headerSlot,\r\n    };\r\n\r\n    const layout: TLayout = getMergedObj(userPartials, presetPartials);\r\n\r\n    return {\r\n      isInline: true,\r\n      cfg,\r\n      id,\r\n      ...layout,\r\n    };\r\n  };\r\n\r\n  constructor() {\r\n\r\n    if (Modals.instance) {\r\n      return Modals.instance;\r\n    }\r\n\r\n    Modals.instance = this;\r\n    Modals.locales = locales;\r\n    this.bindEvents();\r\n  }\r\n\r\n  static set locales(locales: TLocales) {\r\n    const setLocales = async (instance: Localisation) => {\r\n      const currentLang: string = instance.lang;\r\n      const langList: string[] = instance.langList;\r\n      Modals.fancyboxDefaultCfg.l10n = getLocaleCluster(locales, currentLang, langList);\r\n      // silent mode\r\n      await instance.getResourceAppend({\r\n        modals: locales,\r\n      }, true, true);\r\n    };\r\n    const instance: Localisation | null = Localisation.instance;\r\n    if (instance) {\r\n      void setLocales(instance);\r\n    } else {\r\n      void Localisation.create()\r\n        .then((created) => setLocales(created));\r\n    }\r\n  }\r\n\r\n  static getInstance(id?: TModalId) {\r\n    if (Modals.instance) {\r\n      return Modals.fancybox?.getInstance(id) ?? null;\r\n    } else {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  static async getClose(id: TModalId | undefined): Promise<{\r\n    reason: string;\r\n    instance: FancyboxInstance | null;\r\n  }> {\r\n    return new Promise((resolve, reject) => {\r\n      const resolveClose = (instance: FancyboxInstance | null = null) => {\r\n        resolve({\r\n          reason: Modals.reasons.close,\r\n          instance,\r\n        });\r\n      };\r\n\r\n      const closeInstance = (instance: FancyboxInstance) => {\r\n        Modals.#onAfterAnimated(instance)\r\n          .finally(() => {\r\n            resolveClose(instance);\r\n          });\r\n        instance.close();\r\n      };\r\n\r\n      if (Modals.instance) {\r\n        if (typeof id === \"undefined\") {\r\n          Modals.fancybox?.close(true);\r\n          resolveClose(null);\r\n        } else {\r\n          const instance = Modals.getInstance(id);\r\n          if (instance) {\r\n            closeInstance(instance);\r\n          } else {\r\n            const currentInstance = Modals.getInstance();\r\n            if (currentInstance) {\r\n              console.warn(`[Modals] Instance with id \"${id}\" not found. The current modal will be closed as fallback`);\r\n              closeInstance(currentInstance);\r\n            } else {\r\n              resolveClose(null);\r\n            }\r\n          }\r\n        }\r\n      } else {\r\n        reject({\r\n          reason: Modals.reasons.error,\r\n          instance: null,\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  static #getDraggableCfg(cfg: TFbOptions, isDraggable: boolean): TFbOptions {\r\n    return {\r\n      ...cfg,\r\n      dragToClose: isDraggable,\r\n      Carousel: {\r\n        ...cfg?.Carousel ?? {},\r\n        gestures: isDraggable ? cfg?.Carousel?.gestures : false,\r\n        dragFree: isDraggable ? cfg?.Carousel?.dragFree : false,\r\n        singleClickAction: isDraggable ? cfg?.Carousel?.singleClickAction : false,\r\n        wheelAction: isDraggable ? cfg?.Carousel?.wheelAction : false,\r\n      },\r\n    };\r\n  }\r\n\r\n  static async #getInlineModal(src: string, cfg: TFbOptions) {\r\n    if (isSelectorValid(src)) {\r\n      const el = getDocument().querySelector(src);\r\n\r\n      if (el) {\r\n\r\n        const isDraggable = isObjHasOwnProp(cfg, \"dragToClose\") ? !!cfg.dragToClose : !Modals.#isHasInteraction(el);\r\n\r\n        const instanceCfg = Modals.#getDraggableCfg({\r\n          ...cfg,\r\n          parentEl: isNode(cfg.parentEl) ? cfg.parentEl as HTMLElement : (el?.parentNode ?? getDocument()),\r\n        }, isDraggable);\r\n\r\n        if (el.tagName.toLowerCase() === \"template\") { // template element\r\n          const content = getTemplateLayout(el);\r\n          if (content.length) {\r\n            const instance = Modals.fancybox?.show([\r\n              {\r\n                html: content,\r\n              },\r\n            ], instanceCfg) ?? null;\r\n            // with fallback\r\n            return instance || Modals.getInstance(cfg.id);\r\n          } else {\r\n            return null;\r\n          }\r\n        } else { // other elements\r\n          const instance = Modals.fancybox?.show([\r\n            {\r\n              src,\r\n              type: \"inline\",\r\n            },\r\n          ], instanceCfg) ?? null;\r\n          // with fallback\r\n          return instance || Modals.getInstance(cfg.id);\r\n        }\r\n      } else {\r\n        return null;\r\n      }\r\n    } else {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  static async #getAssetsModal(src: TAsset[], cfg: TFbOptions) {\r\n\r\n    const options: FancyboxOptions = {\r\n      Carousel: {\r\n        Thumbs: false,\r\n        enabled: false,\r\n        Toolbar: {\r\n          items: {\r\n            zoomPlus: {\r\n              tpl: await Modals.getControlsLayout(\"zoomOut\"),\r\n            },\r\n            zoomMinus: {\r\n              tpl: await Modals.getControlsLayout(\"zoomIn\"),\r\n            },\r\n            download: {\r\n              tpl: await Modals.getControlsLayout(\"download\"),\r\n            },\r\n            prev: {\r\n              tpl: await Modals.getControlsLayout(\"prev\"),\r\n            },\r\n            next: {\r\n              tpl: await Modals.getControlsLayout(\"next\"),\r\n            },\r\n            fullscreen: {\r\n              tpl: await Modals.getControlsLayout(\"fullscreen\"),\r\n            },\r\n            close: {\r\n              tpl: await Modals.getControlsLayout(\"close\"),\r\n            },\r\n          },\r\n          display: {\r\n            left: [],\r\n            middle: [],\r\n            right: [\r\n              \"fullscreen\",\r\n              \"download\",\r\n              \"zoomPlus\",\r\n              \"zoomMinus\",\r\n              \"close\",\r\n            ],\r\n          },\r\n        },\r\n        Arrows: {\r\n          prevTpl: await getStaticMarkupForClient(createElement(\"span\", { className: \"btn__icon\" }, createElement(Icon, { size: \"medium\", src: \"prev\" }))),\r\n          nextTpl: await getStaticMarkupForClient(createElement(\"span\", { className: \"btn__icon\" }, createElement(Icon, { size: \"medium\", src: \"next\" }))),\r\n        },\r\n      },\r\n      ...cfg,\r\n    };\r\n\r\n    const items = src.map((item, index) => {\r\n      return {\r\n        ...item,\r\n        caption: (typeof item.caption === \"function\") ? item.caption(index) : item.caption,\r\n      };\r\n    });\r\n\r\n    const instance = Modals.fancybox?.show(items, options) ?? null;\r\n\r\n    return instance || Modals.getInstance(cfg.id);\r\n  }\r\n\r\n  static async #getHTMLModal(src: string, cfg: TFbOptions) {\r\n    // replace `template` tags to `div`\r\n    const source = `<div>${src.replace(/<(\\/?)template\\b([^>]*)>/g, \"<$1div$2>\")}</div>`;\r\n    const html = getSanitizedHTML(source);\r\n    const instance = Modals.fancybox?.show([\r\n      {\r\n        html,\r\n      },\r\n    ], cfg) ?? null;\r\n    return instance || Modals.getInstance(cfg.id);\r\n  }\r\n\r\n  static onClick({ instance, event, onAction }: TCallbackArg) {\r\n\r\n    let action: TActions = \"click\";\r\n\r\n    const { target } = event!;\r\n\r\n    if (!!target && (target as HTMLElement).matches(Modals.selectors.handler)) {\r\n      const handlerCfg = Modals.#getCfg(target as HTMLElement, Modals.selectors.handler);\r\n      if (handlerCfg.action && handlerCfg.action !== \"close\") {\r\n        action = handlerCfg.action;\r\n      }\r\n    }\r\n\r\n    if (typeof onAction === \"function\") {\r\n      onAction({\r\n        instance,\r\n        action,\r\n        event,\r\n      });\r\n    }\r\n  }\r\n\r\n  static #isHasInteraction(el: Element) {\r\n    return !!el.querySelectorAll(Modals.selectors.interaction).length;\r\n  }\r\n\r\n  static onRender({\r\n    instance, actions, slide, onAction, cfg,\r\n  }: TCallbackArg) {\r\n    const container = instance.getContainer();\r\n    if (!container) {\r\n      return;\r\n    }\r\n    const arrows = container?.querySelectorAll(\".is-arrow\") ?? [];\r\n    arrows.forEach((arrow) => {\r\n      arrow.classList.add(\"btn\");\r\n      arrow.classList.remove(\"f-button\");\r\n    });\r\n  }\r\n\r\n  static onAfterOpen({\r\n    instance, actions, slide, onAction, cfg,\r\n  }: TCallbackArg) {\r\n    const options: FancyboxOptions = instance.getOptions();\r\n    const container = instance.getContainer();\r\n    if (options.dragToClose && container) {\r\n      container.classList.add(\"is-draggable\");\r\n    }\r\n\r\n    const el = Modals.#getModalElFromInstance(instance);\r\n    if (el) {\r\n      el.removeAttribute(\"hidden\");\r\n      el.setAttribute(\"aria-hidden\", \"false\");\r\n    }\r\n    Modals.#onAfterAnimated(instance)\r\n      .finally(() => {\r\n        if (typeof onAction === \"function\") {\r\n          onAction({\r\n            instance,\r\n            action: \"open\",\r\n          });\r\n        }\r\n        const container = instance.getContainer();\r\n        if (container) {\r\n          dispatchContentLoaded({\r\n            content: container,\r\n          });\r\n          bubble(container || getDocument(), Modals.bubbles.open, { ...cfg, instance });\r\n        }\r\n        actions.resolve({\r\n          reason: Modals.reasons.open,\r\n          instance,\r\n        });\r\n      });\r\n  }\r\n\r\n  static async #onAfterAnimated(instance: FancyboxInstance) {\r\n    const container = instance.getContainer();\r\n    if (container) {\r\n      return Promise.race<AnimationEvent | undefined>([\r\n        new Promise<AnimationEvent>((resolve) => {\r\n          const onAnimationEnd = (e: AnimationEvent) => {\r\n            resolve(e);\r\n          };\r\n          container.addEventListener(\"animationend\", onAnimationEnd, {\r\n            once: true,\r\n          });\r\n        }),\r\n        wait(5000).then(() => undefined),\r\n      ])\r\n        .then((event: AnimationEvent | undefined) => {\r\n          if (!event) {\r\n            console.error(`[Modals] Force callback after 5000ms: can't catch \"animationend\" event. Please check animation CSS for this instance: `, instance);\r\n          }\r\n          return Promise.resolve();\r\n        });\r\n    } else {\r\n      return Promise.resolve();\r\n    }\r\n  }\r\n\r\n  static onBeforeClose({\r\n    instance, actions, onAction, cfg, event, customEvent,\r\n  }: TCallbackArg) {\r\n    if (event && event.type === \"cancel\" && customEvent) { // fix the bug of file dialog closing\r\n      customEvent.preventDefault();\r\n    } else {\r\n      const container = instance.getContainer();\r\n      bubble(container || getDocument(), Modals.bubbles.beforeClose, { ...cfg, instance });\r\n    }\r\n  }\r\n\r\n  static onAfterClose({\r\n    instance, actions, onAction, cfg, event,\r\n  }: TCallbackArg) {\r\n    const el = Modals.#getModalElFromInstance(instance);\r\n    if (el) {\r\n      const {\r\n        redirectAfterClose,\r\n        isReloadAfterClose,\r\n      } = Modals.#getCfg(el as HTMLElement, Modals.selectors.modal);\r\n      switch (true) {\r\n        case typeof redirectAfterClose === \"string\":\r\n          getWindow().location.href = redirectAfterClose.toString();\r\n          break;\r\n        case isReloadAfterClose:\r\n          getWindow().location.reload();\r\n          break;\r\n        default:\r\n      }\r\n    }\r\n    Modals.#onAfterAnimated(instance)\r\n      .finally(() => {\r\n        if (el) {\r\n          el.setAttribute(\"aria-hidden\", \"true\");\r\n          el.setAttribute(\"hidden\", \"\");\r\n        }\r\n        if (typeof onAction === \"function\") {\r\n          onAction({\r\n            instance,\r\n            action: \"close\",\r\n          });\r\n        }\r\n        const bubbleEl = instance.getContainer() || getDocument();\r\n        bubble(bubbleEl, Modals.bubbles.close, { ...cfg, instance });\r\n        actions.resolve({\r\n          reason: Modals.reasons.close,\r\n          instance,\r\n        });\r\n      });\r\n  }\r\n\r\n  static isOpen(id?: TModalId) {\r\n    const instance = Modals.getInstance(id);\r\n    if (instance) {\r\n      const state = instance.getState();\r\n      return ![ 2, 3, 4 ].includes(state);\r\n    } else {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  static async getOpen(cfg: Omit<TModalCfg, \"action\" | \"assign\">) {\r\n    const {\r\n      src, type, preset, fancyboxCfg, id, async, assets, onAction,\r\n    } = {\r\n      ...Modals.modalDefaultCfg,\r\n      ...cfg,\r\n    };\r\n    return new Promise((resolve, reject) => {\r\n\r\n      // Действия с результатом\r\n      const actions = {\r\n        resolve: (result: TResult = { reason: Modals.reasons.open, instance: null }) => resolve(result),\r\n        reject: (result: TResult = { reason: Modals.reasons.error, instance: null }) => reject(result),\r\n      };\r\n\r\n      void (async () => {\r\n\r\n        // Адаптированная конфигурация для Fancybox\r\n        const fbCfg = getMergedObj(Modals.fancyboxDefaultCfg, fancyboxCfg || {});\r\n\r\n        // Уникальный ID\r\n        fbCfg.id = id;\r\n\r\n        // Элемент триггера\r\n        fbCfg.triggerEl = cfg.triggerEl;\r\n\r\n        // Переопредление предварительного закрытия\r\n        fbCfg.on.shouldClose = (...args: [ FancyboxInstance, CustomEvent, Event ]) => {\r\n          const [ instance, customEvent, event ] = args;\r\n          const callbackArg: TCallbackArg = {\r\n            instance, actions, onAction, cfg, event, customEvent,\r\n          };\r\n          Modals.onBeforeClose(callbackArg);\r\n        };\r\n\r\n        // Переопределение закрытия\r\n        fbCfg.on.close = (...args: [ FancyboxInstance, CarouselSlide, Event ]) => {\r\n          const [ instance, slide, event ] = args;\r\n          const callbackArg: TCallbackArg = {\r\n            instance, slide, actions, onAction, cfg, event,\r\n          };\r\n          Modals.onAfterClose(callbackArg);\r\n        };\r\n\r\n        fbCfg.on[\"Carousel.click\"] = (...args: [ FancyboxInstance, CarouselSlide, Event ]) => {\r\n          const [ instance, slide, event ] = args;\r\n          const callbackArg: TCallbackArg = {\r\n            instance, slide, event, actions, onAction, cfg,\r\n          };\r\n          Modals.onClick(callbackArg);\r\n        };\r\n\r\n        // Переопределение рендера\r\n        fbCfg.on[\"Carousel.render\"] = (...args: [ FancyboxInstance, CarouselSlide ]) => {\r\n          const [ instance, slide ] = args;\r\n          const callbackArg: TCallbackArg = {\r\n            instance, slide, actions, onAction, cfg,\r\n          };\r\n          Modals.onRender(callbackArg);\r\n        };\r\n\r\n        // Переопределение открытия\r\n        fbCfg.on[\"Carousel.ready\"] = (...args: [ FancyboxInstance, CarouselSlide ]) => {\r\n          const [ instance, slide ] = args;\r\n          const callbackArg: TCallbackArg = {\r\n            instance, slide, actions, onAction, cfg,\r\n          };\r\n          Modals.onAfterOpen(callbackArg);\r\n        };\r\n\r\n        if (preset) { // готовый шаблон (только программное открытие через `getOpen`)\r\n          switch (preset) {\r\n            case \"assets\":\r\n              if (!!assets && isAssetsValid(assets)) {\r\n                fbCfg.id = \"modalAssets_\" + getId(9); // for multiple instances\r\n                await Modals.#getAssetsModal(assets, fbCfg);\r\n              } else {\r\n                console.error(`[Modals] Preset \"assets\" needs non-empty array in \"assets\" prop with \"type\" and \"src\" in every child`);\r\n                actions.reject({\r\n                  reason: Modals.reasons.error,\r\n                  instance: null,\r\n                });\r\n              }\r\n              break;\r\n            case \"confirm\": {\r\n              fbCfg.id = \"modalConfirm_\" + getId(9); // for multiple instances\r\n              fbCfg.dragToClose = true;\r\n              const props = Modals.getLayoutPresetProps(\"confirm\", { id: fbCfg.id });\r\n              const html = await getStaticMarkupForClient(createElement(Modal, props));\r\n              await Modals.#getHTMLModal(html, fbCfg);\r\n              break;\r\n            }\r\n            case \"success\": {\r\n              fbCfg.id = \"modalSuccess_\" + getId(9); // for multiple instances\r\n              fbCfg.dragToClose = true;\r\n              const props = Modals.getLayoutPresetProps(\"success\", { id: fbCfg.id });\r\n              const html = await getStaticMarkupForClient(createElement(Modal, props));\r\n              await Modals.#getHTMLModal(html, fbCfg);\r\n              break;\r\n            }\r\n            case \"error\": {\r\n              fbCfg.id = \"modalError_\" + getId(9); // for multiple instances\r\n              fbCfg.dragToClose = true;\r\n              const props = Modals.getLayoutPresetProps(\"error\", { id: fbCfg.id });\r\n              const html = await getStaticMarkupForClient(createElement(Modal, props));\r\n              await Modals.#getHTMLModal(html, fbCfg);\r\n              break;\r\n            }\r\n            default: {\r\n              console.error(`[Modals] Preset \"${preset}\" not found. Only \"confirm\", \"success\", \"error\" are supported`);\r\n              actions.reject({\r\n                reason: Modals.reasons.error,\r\n                instance: null,\r\n              });\r\n            }\r\n          }\r\n        } else {\r\n          if (!!type && !!src) { // Открытие нужного типа окна\r\n            switch (type) {\r\n              case \"async\": {\r\n                bubble(getDocument(), Modals.bubbles.loading, { ...cfg, instance: null });\r\n                return await getAsyncModalLayout({\r\n                  url: src,\r\n                  ...(async || {}),\r\n                })\r\n                  .then((data) => {\r\n                    return Modals.#getHTMLModal(data, fbCfg);\r\n                  })\r\n                  .catch((msg) => {\r\n                    console.error(`[Modals] ${msg}`);\r\n                    actions.reject({\r\n                      reason: Modals.reasons.error,\r\n                      instance: null,\r\n                    });\r\n                  });\r\n              }\r\n              case \"inline\": {\r\n                const instance = await Modals.#getInlineModal(src, fbCfg);\r\n                if (!instance) {\r\n                  console.error(`[Modals] Element with anchor \"${src}\" not found or empty`);\r\n                  actions.reject({\r\n                    reason: Modals.reasons.error,\r\n                    instance: null,\r\n                  });\r\n                }\r\n                break;\r\n              }\r\n              case \"html\": {\r\n                const instance = await Modals.#getHTMLModal(src, fbCfg);\r\n                if (!instance) {\r\n                  console.error(`[Modals] Can't open HTML modal`);\r\n                  actions.reject({\r\n                    reason: Modals.reasons.error,\r\n                    instance: null,\r\n                  });\r\n                }\r\n                break;\r\n              }\r\n              default: {\r\n                console.error(`[Modals] Type \"${type}\" not found. Only \"async\", \"inline\", \"html\" are supported`);\r\n                actions.reject({\r\n                  reason: Modals.reasons.error,\r\n                  instance: null,\r\n                });\r\n              }\r\n            }\r\n          } else {\r\n            console.error(`[Modals] Props \"type\" or \"src\" are missing`);\r\n            actions.reject({\r\n              reason: Modals.reasons.error,\r\n              instance: null,\r\n            });\r\n          }\r\n        }\r\n      })().catch((error: unknown) => {\r\n        console.error(\"[Modals] Unexpected error while opening modal\", error);\r\n        actions.reject({ reason: Modals.reasons.error, instance: null });\r\n      });\r\n\r\n    });\r\n  }\r\n\r\n  #lockHandler(handlerNode: HTMLElement, isLock = true) {\r\n    if (handlerNode.matches(\"button, input\")) {\r\n      (handlerNode as HTMLButtonElement | HTMLInputElement).disabled = isLock;\r\n    }\r\n    handlerNode.classList.toggle(\"isDisabled\", isLock);\r\n  }\r\n\r\n  async #actionFromHandler(handlerNode: HTMLElement) {\r\n\r\n    // Cfg from clicked element\r\n    let parsedCfg: TModalCfg = Modals.#getCfg(handlerNode, Modals.selectors.handler);\r\n\r\n    // Labels or links with `assign` cfg\r\n    if (parsedCfg.assign) {\r\n\r\n      // Original element\r\n      const getHandler: ((id: string) => HTMLElement) = (id) => {\r\n        return !!id ? getDocument().getElementById(id) : null;\r\n      };\r\n\r\n      // Merge `assign` to cfg\r\n      const getMergedConfigs: ((handlerCfg: TModalCfg) => TModalCfg) = (handlerCfg) => {\r\n        const merged: TModalCfg = getMergedObj(parsedCfg.assign || {}, handlerCfg);\r\n        delete merged.assign;\r\n        return merged;\r\n      };\r\n\r\n      switch (handlerNode.tagName.toLowerCase()) {\r\n        case \"label\":\r\n          if (handlerNode.hasAttribute(\"for\")) {\r\n            const id = (handlerNode as HTMLLabelElement)?.getAttribute(\"for\") || \"\";\r\n            const handler = getHandler(id);\r\n            if (handler) {\r\n              const handlerCfg = Modals.#getCfg(handler, Modals.selectors.handler);\r\n              handlerNode = handler;\r\n              parsedCfg = getMergedConfigs(handlerCfg);\r\n            }\r\n          }\r\n          break;\r\n        case \"a\":\r\n          if (handlerNode.hasAttribute(\"href\")) {\r\n            const id = (handlerNode as HTMLLinkElement).getAttribute(\"href\")?.replace(\"#\", \"\") ?? \"\";\r\n            const handler = getHandler(id);\r\n            if (handler) {\r\n              const handlerCfg = Modals.#getCfg(handler, Modals.selectors.handler);\r\n              handlerNode = handler;\r\n              parsedCfg = getMergedConfigs(handlerCfg);\r\n            }\r\n          }\r\n          break;\r\n        default:\r\n          console.error(`[Modals] Assign prop in cfg only applyed to \"a\" or \"label\" elements with non-empty \"href\" or \"for\" attributes`);\r\n      }\r\n    }\r\n\r\n    if (parsedCfg.id) {\r\n      switch (parsedCfg.action) {\r\n        case \"open\":\r\n          this.#lockHandler(handlerNode, true);\r\n          parsedCfg.onAction = ({ action }) => {\r\n            if (action === \"close\") {\r\n              this.#lockHandler(handlerNode, false);\r\n            }\r\n          };\r\n          await Modals.getOpen(parsedCfg)\r\n            .catch(async (err) => {\r\n              this.#lockHandler(handlerNode, false);\r\n              bubble(getDocument(), Modals.bubbles.error, { ...parsedCfg, instance: null });\r\n              if (err?.reason === Modals.reasons.error) {\r\n                await Modals.getOpen({\r\n                  preset: \"error\",\r\n                });\r\n              }\r\n            });\r\n          break;\r\n        case \"close\":\r\n          await Modals.getClose(parsedCfg.id)\r\n            .catch((err) => {\r\n              bubble(getDocument(), Modals.bubbles.error, { ...parsedCfg, instance: null });\r\n              throw err;\r\n            });\r\n          break;\r\n        case \"confirm\":\r\n          bubble(handlerNode, Modals.bubbles.confirm, { ...parsedCfg, instance: Modals.getInstance(parsedCfg.id) });\r\n          break;\r\n        case \"cancel\":\r\n          bubble(handlerNode, Modals.bubbles.cancel, { ...parsedCfg, instance: Modals.getInstance(parsedCfg.id) });\r\n          break;\r\n        default:\r\n          console.error(`[Modals] Action for handler not found, only \"open\", \"close\", \"confirm\", \"cancel\" are supported`);\r\n      }\r\n    } else {\r\n      console.error(`[Modals] Prop \"id\" for handler not found`);\r\n    }\r\n  }\r\n\r\n  #onLangChange(e: CustomEvent) {\r\n    const instance: Localisation = e.detail.instance;\r\n    const locales = instance.getResource(\"modals\");\r\n    if (locales) {\r\n      Modals.locales = locales;\r\n    }\r\n  }\r\n\r\n  #onClick(e: Event) {\r\n    const triggerEl = (e.target as HTMLElement).closest<HTMLElement>(Modals.selectors.handler);\r\n\r\n    if (triggerEl) {\r\n      e.preventDefault();\r\n      this.#actionFromHandler(triggerEl)\r\n        .catch((error) => {\r\n          console.error(`[Modals] Can't run action from handler`, error);\r\n        });\r\n    }\r\n  }\r\n\r\n  bindEvents() {\r\n    getDocument().addEventListener(constants.localisationBubbles.localisationChange, this.#onLangChange.bind(this));\r\n    getDocument().addEventListener(\"click\", this.#onClick.bind(this));\r\n  }\r\n\r\n}\r\n"],"names":["Modals","static","open","close","error","beforeClose","confirm","cancel","loading","Fancybox","modal","handler","interaction","mainTpl","mainClass","animated","hideScrollbar","closeButton","compact","idle","on","Carousel.ready","instance","slide","trapFocus","autoFocus","placeFocusBack","showClass","hideClass","triggerEl","type","src","async","assets","redirectAfterClose","isReloadAfterClose","onAction","fancyboxCfg","getModalElFromInstance","container","getContainer","querySelector","selectors","getCfg","node","selector","attrValue","getAttribute","getAttr","parsedCfg","getJSONFromStr","assign","modalDefaultCfg","getCfgProp","id","action","preset","props","icon","localeCode","toUpperCase","extraAttrs","download","getStaticMarkupForClient","createElement","Locale","code","attr","Btn","label","iconSize","getCN","el","mod","utilClasses","getClassString","getId","cfg","presetPartials","getPresetPartials","userPartials","children","contentSlot","titleSlot","footerSlot","headerSlot","layout","getMergedObj","isInline","constructor","this","locales","bindEvents","setLocales","currentLang","lang","langList","fancyboxDefaultCfg","l10n","getLocaleCluster","getResourceAppend","modals","Localisation","create","then","created","getInstance","fancybox","getClose","Promise","resolve","reject","resolveClose","reason","reasons","closeInstance","onAfterAnimated","finally","currentInstance","console","warn","getDraggableCfg","isDraggable","dragToClose","Carousel","gestures","dragFree","singleClickAction","wheelAction","getInlineModal","isSelectorValid","getDocument","isObjHasOwnProp","isHasInteraction","instanceCfg","parentEl","isNode","parentNode","tagName","toLowerCase","content","getTemplateLayout","length","show","html","getAssetsModal","options","Thumbs","enabled","Toolbar","items","zoomPlus","tpl","getControlsLayout","zoomMinus","prev","next","fullscreen","display","left","middle","right","Arrows","prevTpl","className","Icon","size","nextTpl","map","item","index","caption","getHTMLModal","source","replace","getSanitizedHTML","onClick","event","target","matches","handlerCfg","querySelectorAll","onRender","actions","arrows","forEach","arrow","classList","add","remove","onAfterOpen","getOptions","removeAttribute","setAttribute","dispatchContentLoaded","bubble","bubbles","race","onAnimationEnd","e","addEventListener","once","wait","onBeforeClose","customEvent","preventDefault","onAfterClose","getWindow","location","href","toString","reload","bubbleEl","isOpen","state","getState","includes","getOpen","result","fbCfg","shouldClose","args","callbackArg","isAssetsValid","getLayoutPresetProps","Modal","getAsyncModalLayout","url","data","catch","msg","lockHandler","handlerNode","isLock","disabled","toggle","actionFromHandler","getHandler","getElementById","getMergedConfigs","merged","hasAttribute","err","onLangChange","detail","getResource","closest","constants","localisationBubbles","localisationChange","bind"],"mappings":"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"}