{"version":3,"file":"main.CIZEo3.js","sources":["theme-476/virtual:theme","theme-476/discourse/api-initializers/custom-lightbox.js","theme-476/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(476);\n\nexport function themePrefix(key) {\n  return `theme_translations.476.${key}`;\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport { iconHTML } from \"discourse-common/lib/icon-library\";\n\nexport default apiInitializer(\"1.8.0\", (api) => { \n  const capabilities = api.container.lookup(\"service:capabilities\");\n\n  // Create a MutationObserver to monitor changes to the body's class list.\n  const observer = new MutationObserver(handleBodyClassChanges);\n  observer.observe(document.body, {\n    attributes: true,\n    attributeFilter: [\"class\"]\n  });\n\n  // Variables for touch handling (swipe gestures)\n  let touchStartX = 0;\n  let touchStartY = 0;\n  let touchEndX = 0;\n  let touchEndY = 0;\n  let touchStartTime = 0;\n  let touchCount = 0;\n  const minSwipeDistance = 50;  // Minimum distance required for a swipe gesture\n  const maxSwipeTime = 300;     // Maximum allowed time (ms) for a swipe gesture\n\n  // Variable to store the original theme color (for restoring when the lightbox is closed)\n  let originalThemeColor;\n\n  // This function monitors changes in the body class list to detect when the lightbox opens/closes.\n  function handleBodyClassChanges(mutations) {\n    mutations.forEach((mutation) => {\n      // When the lightbox opens, the body gets the \"mfp-zoom-out-cur\" class.\n      if (mutation.target.classList.contains(\"mfp-zoom-out-cur\")) {\n        setupLightbox();\n      } else if (!mutation.target.classList.contains(\"mfp-zoom-out-cur\")) {\n        // When the lightbox closes, restore the original theme color\n        // and remove the keydown event listener.\n        restoreThemeColor();\n        document.removeEventListener(\"keydown\", handleKeyPress);\n      }\n    });\n  }\n\n  // Determine if swipe handling should proceed (only when not zoomed and a single touch is detected)\n  function shouldHandleSwipe() {\n    const mfpWrap = document.querySelector(\".mfp-wrap\");\n    const isZoomed = mfpWrap?.classList.contains(\"mfp-force-scrollbars\");\n    return !isZoomed && touchCount === 1;\n  }\n\n  // Touch start handler for swipe gestures\n  function handleTouchStart(event) {\n    touchCount = event.touches.length;\n    if (!shouldHandleSwipe()) return;\n    touchStartX = event.touches[0].clientX;\n    touchStartY = event.touches[0].clientY;\n    touchStartTime = Date.now();\n  }\n\n  // Touch end handler for swipe gestures\n  function handleTouchEnd(event) {\n    if (!shouldHandleSwipe()) return;\n    touchEndX = event.changedTouches[0].clientX;\n    touchEndY = event.changedTouches[0].clientY;\n    const touchEndTime = Date.now();\n    // If the swipe was fast enough, handle the swipe gesture.\n    if (touchEndTime - touchStartTime < maxSwipeTime) {\n      handleSwipe();\n    }\n    touchCount = 0;\n  }\n\n  // Touch cancel handler (resets the touch counter)\n  function handleTouchCancel() {\n    touchCount = 0;\n  }\n\n  // Process swipe gestures: horizontal swipes change images and vertical swipe (down) closes the lightbox.\n  function handleSwipe() {\n    const deltaX = touchEndX - touchStartX;\n    const deltaY = touchEndY - touchStartY;\n    const absX = Math.abs(deltaX);\n    const absY = Math.abs(deltaY);\n\n    // Handle horizontal swipe for image navigation.\n    if (absX > absY && absX > minSwipeDistance) {\n      if (deltaX > 0) {\n        document.querySelector(\".mfp-arrow-left\")?.click();\n      } else {\n        document.querySelector(\".mfp-arrow-right\")?.click();\n      }\n    }\n    // Handle vertical swipe (down) to close the lightbox.\n    else if (absY > absX && absY > minSwipeDistance) {\n      if (deltaY > 0) {\n        document.querySelector(\".mfp-close\")?.click();\n      }\n    }\n  }\n\n  // Check for native fullscreen support.\n  function supportsNativeFullscreen() {\n    const elem = document.documentElement;\n    return (\n      elem.requestFullscreen ||\n      elem.webkitRequestFullscreen ||\n      elem.mozRequestFullScreen ||\n      elem.msRequestFullscreen\n    );\n  }\n\n  // Request fullscreen with vendor prefix support.\n  function requestFullscreenWithFallback(element) {\n    if (element.requestFullscreen) return element.requestFullscreen();\n    else if (element.webkitRequestFullscreen) return element.webkitRequestFullscreen();\n    else if (element.mozRequestFullScreen) return element.mozRequestFullScreen();\n    else if (element.msRequestFullscreen) return element.msRequestFullscreen();\n  }\n\n  // Exit fullscreen mode with vendor prefix support.\n  function exitFullscreenWithFallback() {\n    if (document.exitFullscreen) return document.exitFullscreen();\n    else if (document.webkitExitFullscreen) return document.webkitExitFullscreen();\n    else if (document.mozCancelFullScreen) return document.mozCancelFullScreen();\n    else if (document.msExitFullscreen) return document.msExitFullscreen();\n  }\n\n  // Update the fullscreen button icon based on whether fullscreen mode is active.\n  function updateFullscreenButtonIcon(isFullscreen) {\n    const fullscreenButton = document.querySelector(\".fullscreen-lightbox-btn\");\n    if (fullscreenButton) {\n      fullscreenButton.innerHTML = iconHTML(\n        isFullscreen ? \"discourse-compress\" : \"discourse-expand\",\n        { class: \"mfp-prevent-close\" }\n      );\n    }\n  }\n\n  // Toggle fullscreen mode for the lightbox container.\n  function toggleFullscreen() {\n    const lightboxContainer = document.querySelector(\".mfp-container\");\n    if (!supportsNativeFullscreen()) {\n      console.log(\"Fullscreen API is not supported on this device\");\n      return;\n    }\n    if (\n      !document.fullscreenElement &&\n      !document.webkitFullscreenElement &&\n      !document.mozFullScreenElement &&\n      !document.msFullscreenElement\n    ) {\n      requestFullscreenWithFallback(lightboxContainer).catch(err => {\n        console.log(`Error attempting to enable fullscreen: ${err.message}`);\n      });\n    } else {\n      exitFullscreenWithFallback();\n    }\n  }\n\n  // Handle keypress events ('F' to toggle fullscreen)\n  function handleKeyPress(e) {\n    if (e.key.toLowerCase() === \"f\" && !e.ctrlKey && !e.altKey) {\n      e.preventDefault();\n      toggleFullscreen();\n    }\n  }\n\n  // Toggle zoom on the image (mobile).\n  function toggleZoom() {\n    const mfpWrap = document.querySelector(\".mfp-wrap\");\n    const mfpImg = document.querySelector(\".mfp-img\");\n    if (mfpWrap && mfpImg) {\n      const isZoomed = mfpWrap.classList.contains(\"mfp-force-scrollbars\");\n      if (isZoomed) {\n        mfpWrap.classList.remove(\"mfp-force-scrollbars\");\n        mfpImg.style.maxHeight = `${window.innerHeight}px`;\n        mfpImg.style.cursor = \"zoom-in\";\n      } else {\n        mfpWrap.classList.add(\"mfp-force-scrollbars\");\n        mfpImg.style.maxHeight = \"none\";\n        mfpImg.style.cursor = \"zoom-out\";\n      }\n    }\n  }\n\n  // Setup the lightbox when it opens.\n  function setupLightbox() {\n    // Change the theme color to black when the lightbox opens.\n    const siteThemeColor = document.querySelector('meta[name=\"theme-color\"]');\n    if (siteThemeColor) {\n      originalThemeColor = siteThemeColor.getAttribute(\"content\");\n      siteThemeColor.setAttribute(\"content\", \"#000000\");\n    }\n\n    // Add keydown listener for fullscreen toggling.\n    document.addEventListener(\"keydown\", handleKeyPress);\n\n    // Add fullscreen change listeners to update the fullscreen button icon.\n    document.addEventListener(\"fullscreenchange\", () => {\n      updateFullscreenButtonIcon(!!document.fullscreenElement);\n    });\n    document.addEventListener(\"webkitfullscreenchange\", () => {\n      updateFullscreenButtonIcon(!!document.webkitFullscreenElement);\n    });\n    document.addEventListener(\"mozfullscreenchange\", () => {\n      updateFullscreenButtonIcon(!!document.mozFullScreenElement);\n    });\n    document.addEventListener(\"MSFullscreenChange\", () => {\n      updateFullscreenButtonIcon(!!document.msFullscreenElement);\n    });\n\n    // Add touch event listeners for swipe gestures on the lightbox container.\n    const container = document.querySelector(\".mfp-container\");\n    if (container) {\n      container.addEventListener(\"touchstart\", handleTouchStart, { passive: true });\n      container.addEventListener(\"touchend\", handleTouchEnd, { passive: true });\n      container.addEventListener(\"touchcancel\", handleTouchCancel, { passive: true });\n    }\n\n    // Zoom buttons and fullscreen controls\n    const buttonsContainer = createButtonsContainer();\n    const mfpWrap = document.querySelector(\".mfp-wrap\");\n    const mfpContainer = document.querySelector(\".mfp-container\");\n\n    function updateImageStyle(isZoomed) {\n      const mfpImg = document.querySelector(\".mfp-img\");\n      if (mfpImg) {\n        mfpImg.style.maxHeight = isZoomed ? \"none\" : `${window.innerHeight}px`;\n      }\n    }\n\n    function updateZoomButton() {\n      const isZoomed = mfpWrap.classList.contains(\"mfp-force-scrollbars\");\n      buttonsContainer.innerHTML = \"\"; // Clear existing buttons\n      if (isZoomed) {\n        const minusButton = createMinusButton();\n        buttonsContainer.appendChild(minusButton);\n        minusButton.addEventListener(\"click\", () => {\n          mfpWrap.classList.remove(\"mfp-force-scrollbars\");\n          updateImageStyle(false);\n          updateZoomButton();\n        });\n      } else {\n        const plusButton = createPlusButton();\n        buttonsContainer.appendChild(plusButton);\n        plusButton.addEventListener(\"click\", () => {\n          mfpWrap.classList.add(\"mfp-force-scrollbars\");\n          updateImageStyle(true);\n          updateZoomButton();\n        });\n      }\n    }\n\n    // Observe changes in the lightbox wrapper's class to update zoom buttons accordingly.\n    const wrapObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        if (mutation.attributeName === \"class\") {\n          const isZoomed = mfpWrap.classList.contains(\"mfp-force-scrollbars\");\n          updateImageStyle(isZoomed);\n          updateZoomButton();\n        }\n      });\n    });\n    wrapObserver.observe(mfpWrap, {\n      attributes: true,\n      attributeFilter: [\"class\"]\n    });\n\n    if (!document.querySelector(\".full-size-btn\")) {\n      mfpContainer.append(buttonsContainer);\n      const isZoomed = mfpWrap.classList.contains(\"mfp-force-scrollbars\");\n      updateImageStyle(isZoomed);\n      updateZoomButton();\n    }\n\n    // Create top container for close and fullscreen buttons.\n    const controlButtonsTopContainer = document.createElement(\"div\");\n    controlButtonsTopContainer.classList.add(\"lightbox-control-buttons-top\");\n\n    // Create title toggle container and button.\n    const titleToggleContainer = document.createElement(\"div\");\n    titleToggleContainer.classList.add(\"title-toggle-container\", \"mfp-prevent-close\");\n    if (!document.querySelector(\".title-toggle-btn\")) {\n      const titleToggleButton = createTitleToggleButton();\n      titleToggleContainer.appendChild(titleToggleButton);\n      mfpContainer.appendChild(titleToggleContainer);\n    }\n\n    // Append close and fullscreen buttons if they are not already present.\n    if (!document.querySelector(\".close-lightbox-btn\")) {\n      const closeButton = createCloseButton();\n      const fullscreenButton = createFullscreenButton();\n      controlButtonsTopContainer.append(fullscreenButton);\n      controlButtonsTopContainer.append(closeButton);\n      mfpContainer.append(controlButtonsTopContainer);\n    }\n\n    function enableMouseScroll(container) {\n      if (capabilities.touch) return;\n      if (!container) return;\n\n      let targetScrollLeft = 0;\n      let targetScrollTop = 0;\n      let currentScrollLeft = 0;\n      let currentScrollTop = 0;\n      \n      document.addEventListener(\"mousemove\", (event) => {\n        if (!container.classList.contains(\"mfp-force-scrollbars\")) return;\n    \n        const rect = container.getBoundingClientRect();\n        const mouseX = (event.clientX - rect.left) / rect.width;  // 0-1\n        const mouseY = (event.clientY - rect.top) / rect.height; // 0-1\n    \n        const maxScrollLeft = container.scrollWidth - container.clientWidth;\n        const maxScrollTop = container.scrollHeight - container.clientHeight;\n    \n        // Set targetpoints\n        targetScrollLeft = maxScrollLeft * mouseX;\n        targetScrollTop = maxScrollTop * mouseY;\n      });\n\n      function smoothScroll() {\n        // LERP (Linear Interpolation)\n        currentScrollLeft += (targetScrollLeft - currentScrollLeft) * 0.1;\n        currentScrollTop += (targetScrollTop - currentScrollTop) * 0.1;\n    \n        container.scrollLeft = currentScrollLeft;\n        container.scrollTop = currentScrollTop;\n    \n        requestAnimationFrame(smoothScroll);\n      }\n    \n      smoothScroll();\n    }\n    \n    // Watch the mfp-force-scrollbars class\n    const observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        if (mutation.attributeName === \"class\") {\n          const target = mutation.target;\n          if (target.classList.contains(\"mfp-force-scrollbars\")) {\n            enableMouseScroll(target);\n          }\n        }\n      });\n    });\n    \n    // Watch mfp-wrap class\n    if (mfpWrap) {\n      observer.observe(mfpWrap, { attributes: true, attributeFilter: [\"class\"] });\n    }\n  }\n\n  // Restore the original theme color when the lightbox is closed.\n  function restoreThemeColor() {\n    const siteThemeColor = document.querySelector('meta[name=\"theme-color\"]');\n    if (siteThemeColor && originalThemeColor) {\n      siteThemeColor.setAttribute(\"content\", originalThemeColor);\n    }\n  }\n\n  // Functions to create buttons\n\n  function createButtonsContainer() {\n    const container = document.createElement(\"div\");\n    container.classList.add(\"full-size-btn\", \"mfp-prevent-close\");\n    return container;\n  }\n\n  function createPlusButton() {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"btn\", \"btn-icon\", \"no-text\", \"btn-transparent\", \"plus-btn\", \"mfp-prevent-close\");\n    button.title = I18n.t(themePrefix(\"zoom_in_button_title\"));\n    button.innerHTML = iconHTML(\"magnifying-glass-plus\", { class: \"mfp-prevent-close\" });\n    return button;\n  }\n\n  function createMinusButton() {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"btn\", \"btn-icon\", \"no-text\", \"btn-transparent\", \"minus-btn\", \"mfp-prevent-close\");\n    button.title = I18n.t(themePrefix(\"zoom_out_button_title\"));\n    button.innerHTML = iconHTML(\"magnifying-glass-minus\", { class: \"mfp-prevent-close\" });\n    return button;\n  }\n\n  function createCloseButton() {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"btn\", \"btn-icon\", \"no-text\", \"btn-transparent\", \"close-lightbox-btn\");\n    button.title = I18n.t(themePrefix(\"close_button_title\"));\n    button.innerHTML = iconHTML(\"xmark\");\n    return button;\n  }\n\n  function createFullscreenButton() {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"btn\", \"btn-icon\", \"no-text\", \"btn-transparent\", \"fullscreen-lightbox-btn\", \"mfp-prevent-close\");\n    button.title = I18n.t(themePrefix(\"fullscreen_button_title\"));\n    button.innerHTML = iconHTML(\"discourse-expand\", { class: \"mfp-prevent-close\" });\n    button.addEventListener(\"click\", () => {\n      toggleFullscreen();\n    });\n    return button;\n  }\n\n  function createTitleToggleButton() {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"btn\", \"btn-icon\", \"no-text\", \"btn-transparent\", \"title-toggle-btn\", \"mfp-prevent-close\");\n    button.title = I18n.t(themePrefix(\"toggle_title_button_title\"));\n    button.innerHTML = iconHTML(\"circle-info\", { class: \"mfp-prevent-close\" });\n    let isTitleVisible = true;\n    button.addEventListener(\"click\", () => {\n      const title = document.querySelector(\".mfp-title\");\n      if (title) {\n        isTitleVisible = !isTitleVisible;\n        title.style.visibility = isTitleVisible ? \"hidden\" : \"visible\";\n      }\n    });\n    return button;\n  }\n\n  // Override the image click behavior on mobile\n  if (capabilities.touch) {\n    document.addEventListener(\n      \"click\",\n      function (e) {\n        if (e.target.matches(\".mfp-img\")) {\n          e.stopPropagation();\n          e.preventDefault();\n          toggleZoom();\n        }\n      },\n      true\n    );\n  }\n});\n","import * as Mod1 from \"./discourse/api-initializers/custom-lightbox\";\nconst compatModules = {\n  \"discourse/api-initializers/custom-lightbox\": Mod1,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["themePrefix","key","getObjectForTheme","customLightbox","apiInitializer","api","capabilities","container","lookup","MutationObserver","mutations","forEach","mutation","target","classList","contains","siteThemeColor","document","querySelector","originalThemeColor","getAttribute","setAttribute","addEventListener","handleKeyPress","updateFullscreenButtonIcon","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","handleTouchStart","passive","handleTouchEnd","handleTouchCancel","buttonsContainer","createElement","add","createButtonsContainer","mfpWrap","mfpContainer","updateImageStyle","isZoomed","mfpImg","style","maxHeight","window","innerHeight","updateZoomButton","innerHTML","minusButton","button","title","I18n","t","iconHTML","class","createMinusButton","appendChild","remove","plusButton","createPlusButton","wrapObserver","attributeName","observe","attributes","attributeFilter","append","controlButtonsTopContainer","titleToggleContainer","titleToggleButton","isTitleVisible","visibility","createTitleToggleButton","closeButton","createCloseButton","fullscreenButton","toggleFullscreen","createFullscreenButton","enableMouseScroll","touch","targetScrollLeft","targetScrollTop","currentScrollLeft","currentScrollTop","smoothScroll","scrollLeft","scrollTop","requestAnimationFrame","event","rect","getBoundingClientRect","mouseX","clientX","left","width","mouseY","clientY","top","height","maxScrollLeft","scrollWidth","clientWidth","maxScrollTop","scrollHeight","clientHeight","observer","setupLightbox","restoreThemeColor","removeEventListener","body","touchStartX","touchStartY","touchEndX","touchEndY","touchStartTime","touchCount","minSwipeDistance","maxSwipeTime","shouldHandleSwipe","touches","length","Date","now","changedTouches","deltaX","deltaY","absX","Math","abs","absY","click","handleSwipe","isFullscreen","lightboxContainer","element","elem","documentElement","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","supportsNativeFullscreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","catch","err","console","log","message","e","toLowerCase","ctrlKey","altKey","preventDefault","matches","stopPropagation","cursor","toggleZoom","compatModules"],"mappings":"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"}