{"version":3,"file":"imagelightbox.umd.cjs","sources":["../src/lib/query.ts","../src/lib/TransitionDirection.ts","../src/lib/history.ts","../src/lib/container.ts","../src/lib/activity-indicator.ts","../src/lib/arrows.ts","../src/lib/caption.ts","../src/lib/close-button.ts","../src/lib/fullscreen.ts","../src/lib/fullscreen-button.ts","../src/lib/ImageView.ts","../src/lib/keyboard-navigation.ts","../src/lib/navigation.ts","../src/lib/PreloadedVideo.ts","../src/lib/VideoCache.ts","../src/lib/State.ts","../src/lib/imagelightbox.ts"],"sourcesContent":["export function addQueryField(\n  query: string,\n  key: string,\n  value: string,\n): string {\n  const newField = `${key}=${value}`;\n  let newQuery = `?${newField}`;\n\n  if (query) {\n    const keyRegex = new RegExp(`([?&])${key}=[^&]*`);\n    if (keyRegex.exec(query) !== null) {\n      newQuery = query.replace(keyRegex, `$1${newField}`);\n    } else {\n      newQuery = `${query}&${newField}`;\n    }\n  }\n  return newQuery;\n}\n\nexport function getQueryField(key: string): string | undefined {\n  const keyValuePair = new RegExp(`[?&]${key}(=([^&#]*)|&|#|$)`).exec(\n    document.location.search,\n  );\n  if (keyValuePair?.[2] === undefined) {\n    return undefined;\n  }\n  return decodeURIComponent(keyValuePair[2].replace(/\\+/g, \" \"));\n}\n\nexport function removeQueryField(query: string, key: string): string {\n  let newQuery = query;\n  if (newQuery) {\n    const keyRegex1 = new RegExp(`\\\\?${key}=[^&]*`);\n    const keyRegex2 = new RegExp(`&${key}=[^&]*`);\n    newQuery = newQuery.replace(keyRegex1, \"?\");\n    newQuery = newQuery.replace(keyRegex2, \"\");\n  }\n  return newQuery;\n}\n","export const enum TransitionDirection {\n  Left = 1,\n  None = 0,\n  Right = -1,\n}\n","import { addQueryField, getQueryField, removeQueryField } from \"./query\";\nimport { TransitionDirection } from \"./TransitionDirection\";\n\ninterface HistoryState {\n  imageLightboxIndex?: string;\n  imageLightboxSet?: string;\n}\n\nexport function openHistory(\n  set: string | undefined,\n  images: Array<HTMLAnchorElement>,\n  open: (index: number, skipHistory?: boolean) => void,\n): void {\n  if (getQueryField(\"imageLightboxSet\") !== set) {\n    return;\n  }\n  const id = getQueryField(\"imageLightboxIndex\");\n  if (id === undefined) {\n    return;\n  }\n  let newIndex = images.findIndex((image) => image.dataset[\"ilb2Id\"] === id);\n  if (newIndex < 0) {\n    newIndex = parseInt(id, 10);\n  }\n  open(newIndex, true);\n}\n\nexport function popHistory(\n  event: PopStateEvent,\n  set: string | undefined,\n  images: Array<HTMLAnchorElement>,\n  currentIndex: number | null,\n  open: (index: number, skipHistory?: boolean) => void,\n  close: (skipHistory?: boolean) => void,\n  change: (\n    index: number,\n    transitionDirection: TransitionDirection,\n    skipHistory?: boolean,\n  ) => void,\n): void {\n  const historyState = event.state as\n    | HistoryState\n    | Record<string, never>\n    | null\n    | undefined;\n  // This needs to be before checking the set in order to close the lightbox when navigating to a non-imagelightbox state\n  if (!historyState || Object.keys(historyState).length === 0) {\n    close(true);\n    return;\n  }\n  if (historyState.imageLightboxSet !== set) {\n    return;\n  }\n  const newId = historyState.imageLightboxIndex;\n  if (newId === undefined) {\n    close(true);\n    return;\n  }\n  let newIndex = images.findIndex(\n    (e: HTMLElement) => e.dataset[\"ilb2Id\"] === newId,\n  );\n  if (newIndex < 0) {\n    newIndex = parseInt(newId, 10);\n  }\n  if (currentIndex === null) {\n    open(newIndex, true);\n    return;\n  }\n  change(\n    newIndex,\n    newIndex > currentIndex\n      ? TransitionDirection.Right\n      : TransitionDirection.Left,\n    true,\n  );\n}\n\nexport function pushQuitToHistory(): void {\n  let newQuery = removeQueryField(\n    document.location.search,\n    \"imageLightboxIndex\",\n  );\n  newQuery = removeQueryField(newQuery, \"imageLightboxSet\");\n  window.history.pushState({}, \"\", document.location.pathname + newQuery);\n}\n\nexport function pushToHistory(\n  index: number,\n  set: string | undefined,\n  images: Array<HTMLAnchorElement>,\n): void {\n  const newIndex = images[index].dataset[\"ilb2Id\"] ?? index.toString();\n  let newQuery = addQueryField(\n    document.location.search,\n    \"imageLightboxIndex\",\n    newIndex,\n  );\n  const newHistoryState: HistoryState = {\n    imageLightboxIndex: newIndex,\n    imageLightboxSet: \"\",\n  };\n  if (set !== undefined) {\n    newHistoryState.imageLightboxSet = set;\n    newQuery = addQueryField(newQuery, \"imageLightboxSet\", set);\n  }\n  window.history.pushState(\n    newHistoryState,\n    \"\",\n    document.location.pathname + newQuery,\n  );\n}\n","import \"./container.css\";\n\nconst container = document.createElement(\"dialog\");\ncontainer.setAttribute(\"id\", \"ilb-container\");\ndocument.body.appendChild(container);\n\nlet wrappedOnclick: ((e: Event) => void) | null = null;\n\nexport function addContainerToDOM(\n  animationSpeed: number,\n  attachOnclick: boolean,\n  onclick: () => void,\n): void {\n  container.classList.remove(\"ilb-overlay\");\n  document.body.classList.add(\"ilb-body\");\n  container.showModal();\n  if (attachOnclick) {\n    wrappedOnclick = (e): void => {\n      e.stopPropagation();\n      onclick();\n    };\n    container.addEventListener(\"click\", wrappedOnclick);\n    container.addEventListener(\"touchend\", wrappedOnclick);\n  }\n  container.style.transition = `opacity ${animationSpeed.toString()}ms ease`;\n  setTimeout(() => {\n    container.style.opacity = \"1\";\n  }, 50);\n}\n\nexport function darkenOverlay(): void {\n  container.classList.add(\"ilb-overlay\");\n}\n\nexport function getContainer(): HTMLDialogElement {\n  return container;\n}\n\nexport function removeContainerFromDOM(): void {\n  if (wrappedOnclick !== null) {\n    container.removeEventListener(\"click\", wrappedOnclick);\n    container.removeEventListener(\"touchend\", wrappedOnclick);\n  }\n  container.close();\n  container.textContent = \"\";\n  document.body.classList.remove(\"ilb-body\");\n}\n\nexport function transitionOutContainer(): void {\n  container.style.opacity = \"0\";\n}\n","import \"./activity-indicator.css\";\nimport { getContainer } from \"./container\";\n\nconst activityIndicator = document.createElement(\"div\");\nactivityIndicator.setAttribute(\"id\", \"ilb-activity-indicator\");\nactivityIndicator.appendChild(document.createElement(\"div\"));\n\nexport function addActivityIndicatorToDOM(): void {\n  getContainer().appendChild(activityIndicator);\n}\n\nexport function removeActivityIndicatorFromDOM(): void {\n  activityIndicator.remove();\n}\n","import \"./arrows.css\";\nimport \"./button.css\";\nimport { getContainer } from \"./container\";\n\nconst leftArrow = document.createElement(\"div\");\nleftArrow.classList.add(\"ilb-button\", \"ilb-arrow\");\nleftArrow.setAttribute(\"id\", \"ilb-arrow-left\");\nconst rightArrow = document.createElement(\"div\");\nrightArrow.classList.add(\"ilb-button\", \"ilb-arrow\");\nrightArrow.setAttribute(\"id\", \"ilb-arrow-right\");\n\nlet wrappedLeft: ((e: Event) => void) | null = null;\nlet wrappedRight: ((e: Event) => void) | null = null;\n\nexport function addArrowsToDOM(onleft: () => void, onright: () => void): void {\n  wrappedLeft = (e): void => {\n    e.stopPropagation();\n    onleft();\n  };\n  wrappedRight = (e): void => {\n    e.stopPropagation();\n    onright();\n  };\n  leftArrow.addEventListener(\"click\", wrappedLeft);\n  leftArrow.addEventListener(\"touchend\", wrappedLeft);\n  rightArrow.addEventListener(\"click\", wrappedRight);\n  rightArrow.addEventListener(\"touchend\", wrappedRight);\n  getContainer().append(leftArrow, rightArrow);\n}\n\nexport function removeArrowsFromDOM(): void {\n  leftArrow.remove();\n  if (wrappedLeft !== null) {\n    leftArrow.removeEventListener(\"click\", wrappedLeft);\n    leftArrow.removeEventListener(\"touchend\", wrappedLeft);\n  }\n  if (wrappedRight !== null) {\n    rightArrow.removeEventListener(\"click\", wrappedRight);\n    rightArrow.removeEventListener(\"touchend\", wrappedRight);\n  }\n  wrappedLeft = null;\n  wrappedRight = null;\n}\n","import \"./caption.css\";\nimport { getContainer } from \"./container\";\n\nconst caption = document.createElement(\"caption\");\ncaption.setAttribute(\"id\", \"ilb-caption\");\ncaption.textContent = \"&nbsp;\";\ncaption.addEventListener(\"click\", (e) => {\n  e.stopPropagation();\n});\n\nexport function setCaption(captionText: string, animationSpeed: number): void {\n  if (captionText !== \"\") {\n    getContainer().appendChild(caption);\n    caption.style.transition = `opacity ${animationSpeed.toString()}ms ease`;\n    setTimeout(() => {\n      caption.style.opacity = \"1\";\n    }, 1);\n    caption.textContent = captionText;\n  } else {\n    caption.style.opacity = \"0\";\n    setTimeout(() => {\n      caption.remove();\n    }, animationSpeed);\n  }\n}\n","import \"./button.css\";\nimport \"./close-button.css\";\nimport { getContainer } from \"./container\";\n\nconst closeButton = document.createElement(\"button\");\ncloseButton.classList.add(\"ilb-button\");\ncloseButton.setAttribute(\"id\", \"ilb-close-button\");\n\nlet wrappedClose: ((e: Event) => void) | null = null;\n\nexport function addCloseButtonToDOM(onclick: () => void): void {\n  wrappedClose = (e): void => {\n    e.stopPropagation();\n    onclick();\n  };\n  closeButton.addEventListener(\"click\", wrappedClose);\n  getContainer().appendChild(closeButton);\n}\n\nexport function removeCloseButtonFromDOM(): void {\n  if (wrappedClose !== null) {\n    closeButton.removeEventListener(\"click\", wrappedClose);\n  }\n  closeButton.remove();\n}\n","import { getContainer } from \"./container\";\n\nexport const fullscreenEnabled: boolean =\n  // eslint-disable-next-line compat/compat -- The prefixed version fixes the incompatibility\n  document.fullscreenEnabled ||\n  ((document as LegacyDocument).webkitFullscreenEnabled ?? false);\n\nfunction fullscreenElement(): Element | null {\n  return (\n    // eslint-disable-next-line compat/compat -- The prefixed version fixes the incompatibility\n    document.fullscreenElement ??\n    (document as LegacyDocument).webkitFullscreenElement ??\n    null\n  );\n}\n\n/* eslint-disable compat/compat, @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions -- Polyfills for very old browsers */\nconst requestFullscreen = (element: HTMLElement): void => {\n  void (\n    element.requestFullscreen ||\n    (element as LegacyHTMLElement).webkitRequestFullScreen\n  ).call(element);\n};\n\nconst exitFullscreen = (): void => {\n  void (\n    document.exitFullscreen || (document as LegacyDocument).webkitExitFullscreen\n  ).call(document);\n};\n/* eslint-enable */\n\nexport function toggleFullscreen(): void {\n  if (fullscreenElement() === null) {\n    requestFullscreen(getContainer());\n  } else {\n    exitFullscreen();\n  }\n}\n","import \"./button.css\";\nimport { getContainer } from \"./container\";\nimport { toggleFullscreen } from \"./fullscreen\";\nimport \"./fullscreen-button.css\";\n\nconst fullscreenButton = document.createElement(\"button\");\nfullscreenButton.classList.add(\"ilb-button\");\nfullscreenButton.setAttribute(\"id\", \"ilb-fullscreen-button\");\nfullscreenButton.innerHTML = \"&#x26F6;\";\nfullscreenButton.addEventListener(\"click\", (e): void => {\n  e.stopPropagation();\n  toggleFullscreen();\n});\n\nexport function addFullscreenButtonToDOM(): void {\n  getContainer().appendChild(fullscreenButton);\n}\n\nexport function removeFullscreenButtonFromDOM(): void {\n  fullscreenButton.remove();\n}\n","import type { VideoCache } from \"./VideoCache\";\n\nimport { getContainer } from \"./container\";\nimport \"./ImageView.css\";\nimport { TransitionDirection } from \"./TransitionDirection\";\n\nexport interface ImageView {\n  addToDOM(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void;\n  removeFromDOM(): void;\n  startLoading(onload: () => void, onerror: () => void): void;\n  transitionIn(\n    callback: () => void,\n    previousImage: () => void,\n    nextImage: () => void,\n    closeLightbox: () => void,\n  ): void;\n  transitionOut(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void;\n}\n\nexport function ImageView(\n  image: HTMLAnchorElement,\n  options: ILBOptions,\n  videoCache: VideoCache,\n): ImageView {\n  let swipeStart = 0;\n  let swipeDiff = 0;\n  let imageElement: HTMLImageElement | HTMLVideoElement =\n    document.createElement(\"img\");\n  imageElement.addEventListener(\"error\", (e) => {\n    getContainer().dispatchEvent(\n      new CustomEvent(\"ilb:error\", {\n        bubbles: true,\n        detail: { target: e.target },\n      }),\n    );\n  });\n  imageElement.setAttribute(\"id\", \"ilb-image\");\n  imageElement.setAttribute(\"src\", image.getAttribute(\"href\") ?? \"\");\n  imageElement.setAttribute(\"srcset\", image.dataset[\"ilb2Srcset\"] ?? \"\");\n  imageElement.setAttribute(\"sizes\", image.dataset[\"ilb2Sizes\"] ?? \"\");\n  const containerElement = document.createElement(\"div\");\n  containerElement.classList.add(\"ilb-image-container\");\n  let isVideoPreloaded: boolean | undefined = undefined;\n\n  const videoId = image.dataset[\"ilb2VideoId\"];\n  let isVideo =\n    image.dataset[\"ilb2Video\"] !== undefined && videoId !== undefined;\n  if (isVideo) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Checked by the if above\n    const preloadedVideo = videoCache.get(videoId!);\n    if (preloadedVideo !== undefined) {\n      [imageElement, isVideoPreloaded] = preloadedVideo.element();\n    } else {\n      isVideo = false;\n    }\n  }\n  containerElement.appendChild(imageElement);\n\n  function onready(\n    callback: () => void,\n    previousImage: () => void,\n    nextImage: () => void,\n    closeLightbox: () => void,\n  ): void {\n    if (isVideo) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Checked by the if in the constructor\n      const preloadedVideo = videoCache.get(videoId!);\n      if (preloadedVideo?.shouldAutoplay() === true) {\n        const [videoElement, isLoaded] = preloadedVideo.element();\n        if (isLoaded) {\n          void videoElement.play();\n        } else {\n          videoElement.autoplay = true;\n        }\n      }\n    } else {\n      (imageElement as HTMLImageElement).addEventListener(\"click\", (e) => {\n        e.stopPropagation();\n        if (options.quitOnImgClick) {\n          closeLightbox();\n          return;\n        }\n        const xPosRelativeToImage =\n          (e.pageX - imageElement.offsetLeft) / imageElement.width;\n        if (xPosRelativeToImage <= 1 / 3) {\n          previousImage();\n        } else {\n          nextImage();\n        }\n      });\n    }\n    imageElement.addEventListener(\"touchstart\", (e) => {\n      swipeStart = (e as TouchEvent).touches[0].pageX;\n      imageElement.style.transitionProperty = \"opacity\";\n    });\n    imageElement.addEventListener(\"touchmove\", (e) => {\n      swipeDiff = (e as TouchEvent).touches[0].pageX - swipeStart;\n      imageElement.style.left = `${swipeDiff.toString()}px`;\n    });\n    imageElement.addEventListener(\"touchend\", (e) => {\n      e.stopPropagation();\n      imageElement.style.transitionProperty = \"left, opacity\";\n      if (swipeDiff > 50) {\n        previousImage();\n      }\n      if (swipeDiff < -50) {\n        nextImage();\n      }\n      imageElement.style.left = \"0\";\n    });\n    imageElement.addEventListener(\"touchcancel\", (e) => {\n      e.stopPropagation();\n      imageElement.style.transitionProperty = \"left, opacity\";\n      imageElement.style.left = \"0\";\n    });\n    callback();\n  }\n\n  function addToDOM(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void {\n    getContainer().appendChild(containerElement);\n    const maxSize = Math.abs(100 - options.gutter);\n    imageElement.style.maxHeight = `${maxSize.toString()}%`;\n    imageElement.style.maxWidth = `${maxSize.toString()}%`;\n    imageElement.style.left = `${(-100 * transitionDirection).toString()}px`;\n    imageElement.style.transition = `all ease ${options.animationSpeed.toString()}ms`;\n    setTimeout(callback, 50);\n  }\n\n  function startLoading(onload: () => void, onerror: () => void): void {\n    imageElement.addEventListener(\"error\", onerror);\n    if (isVideoPreloaded === true) {\n      onload();\n    } else {\n      imageElement.addEventListener(\"load\", onload);\n      imageElement.addEventListener(\"loadedmetadata\", onload);\n    }\n  }\n\n  function transitionIn(\n    callback: () => void,\n    previousImage: () => void,\n    nextImage: () => void,\n    closeLightbox: () => void,\n  ): void {\n    imageElement.style.left = \"0\";\n    imageElement.style.opacity = \"1\";\n    setTimeout(() => {\n      onready(callback, previousImage, nextImage, closeLightbox);\n    }, options.animationSpeed);\n  }\n\n  function transitionOut(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void {\n    if (transitionDirection !== TransitionDirection.None) {\n      const currentLeft = parseInt(imageElement.style.left, 10) || 0;\n      imageElement.style.left = `${(currentLeft + 100 * transitionDirection).toString()}px`;\n    }\n    imageElement.style.opacity = \"0\";\n    setTimeout(() => {\n      callback();\n    }, options.animationSpeed);\n  }\n\n  function removeFromDOM(): void {\n    containerElement.remove();\n  }\n\n  return {\n    addToDOM,\n    removeFromDOM,\n    startLoading,\n    transitionIn,\n    transitionOut,\n  };\n}\n","let keyHandler: ((e: KeyboardEvent) => void) | null = null;\n\nexport function addKeyboardNavigation(\n  options: ILBOptions,\n  closeLightbox: () => void,\n  previousImage: () => void,\n  nextImage: () => void,\n): void {\n  if (!options.enableKeyboard) {\n    return;\n  }\n  keyHandler = (e): void => {\n    if (e.key === \"Escape\") {\n      e.preventDefault();\n      closeLightbox();\n    }\n    if (e.key === \"ArrowLeft\") {\n      e.preventDefault();\n      previousImage();\n    }\n    if (e.key === \"ArrowRight\") {\n      e.preventDefault();\n      nextImage();\n    }\n  };\n  document.addEventListener(\"keyup\", keyHandler);\n}\n\nexport function removeKeyboardNavigation(): void {\n  if (keyHandler !== null) {\n    document.removeEventListener(\"keyup\", keyHandler);\n  }\n}\n","import { getContainer } from \"./container\";\nimport \"./navigation.css\";\nimport { TransitionDirection } from \"./TransitionDirection\";\n\nconst navigation = document.createElement(\"div\");\nnavigation.classList.add(\"ilb-navigation\");\n\nexport function addNavigationItems(\n  images: Array<HTMLAnchorElement>,\n  currentIndexFn: () => number | null,\n  change: (index: number, transitionDirection: TransitionDirection) => void,\n  animationSpeed: number,\n): void {\n  // eslint-disable-next-line @typescript-eslint/prefer-for-of -- The result won't be used anyway\n  for (let i = 0; i < images.length; i++) {\n    const button = document.createElement(\"button\");\n    button.style.transition = `background-color ${animationSpeed.toString()}ms ease`;\n    const buttonClick = (): void => {\n      const currentIndex = currentIndexFn();\n      if (\n        button.classList.contains(\"ilb-navigation-active\") ||\n        currentIndex === null ||\n        button.parentNode === null\n      ) {\n        return;\n      }\n      const buttonIndex = Array.prototype.indexOf.call(\n        button.parentNode.childNodes,\n        button,\n      );\n      const loadDirection =\n        buttonIndex < currentIndex\n          ? TransitionDirection.Left\n          : TransitionDirection.Right;\n      change(buttonIndex, loadDirection);\n    };\n    button.addEventListener(\"click\", buttonClick);\n    button.addEventListener(\"touchend\", buttonClick);\n    navigation.appendChild(button);\n  }\n}\n\nexport function addNavigationToDOM(\n  images: Array<HTMLAnchorElement>,\n  currentIndexFn: () => number | null,\n  change: (index: number, transitionDirection: TransitionDirection) => void,\n  animationSpeed: number,\n): void {\n  navigation.textContent = \"\";\n  addNavigationItems(images, currentIndexFn, change, animationSpeed);\n  const currentIndex = currentIndexFn();\n  if (currentIndex !== null) {\n    changeNavigationCurrent(currentIndex);\n  }\n  getContainer().appendChild(navigation);\n\n  navigation.addEventListener(\"click\", (e) => {\n    e.stopPropagation();\n  });\n  navigation.addEventListener(\"touchend\", (e) => {\n    e.stopPropagation();\n  });\n}\n\nexport function changeNavigationCurrent(currentIndex: number): void {\n  for (let i = 0; i < navigation.children.length; i++) {\n    navigation.children.item(i)?.classList.remove(\"ilb-navigation-active\");\n  }\n  navigation.children\n    .item(currentIndex)\n    ?.classList.add(\"ilb-navigation-active\");\n}\n","import type { VideoOptions } from \"./interfaces/VideoOptions\";\n\nexport interface PreloadedVideo {\n  element(): [HTMLVideoElement, boolean];\n  id(): string;\n  shouldAutoplay(): boolean;\n}\n\nexport function PreloadedVideo(\n  image: HTMLAnchorElement,\n  videoOptions: VideoOptions,\n): PreloadedVideo {\n  let tempId = image.dataset[\"ilb2Id\"];\n  // Random id\n  tempId ??= `a${(((1 + Math.random()) * 0x10000) | 0).toString(16)}`;\n  image.dataset[\"ilb2VideoId\"] = tempId;\n  const videoId = tempId;\n\n  const videoElement = document.createElement(\"video\");\n  videoElement.setAttribute(\"id\", \"ilb-image\");\n  videoElement.preload = \"metadata\";\n  videoElement.dataset[\"ilb2VideoId\"] = videoId;\n  let isLoaded = false;\n  let autoplay = false;\n\n  for (const [key, value] of Object.entries(videoOptions)) {\n    switch (key) {\n      case \"autoplay\":\n        autoplay = true;\n        break;\n      case \"controls\":\n      case \"loop\":\n      case \"muted\":\n      case \"poster\":\n      case \"preload\":\n      case \"src\":\n        videoElement.setAttribute(key, (value as number | string).toString());\n        break;\n      default:\n    }\n  }\n  if (videoOptions.sources) {\n    for (const source of videoOptions.sources) {\n      const sourceElement = document.createElement(\"source\");\n      for (const [key, value] of Object.entries(source)) {\n        sourceElement.setAttribute(key, value as string);\n      }\n      videoElement.appendChild(sourceElement);\n    }\n  }\n  videoElement.addEventListener(\"loadedmetadata\", () => {\n    isLoaded = true;\n  });\n\n  function id(): string {\n    return videoId;\n  }\n\n  function element(): [HTMLVideoElement, boolean] {\n    return [videoElement, isLoaded];\n  }\n\n  function shouldAutoplay(): boolean {\n    return autoplay;\n  }\n\n  return {\n    element,\n    id,\n    shouldAutoplay,\n  };\n}\n","import type { VideoOptions } from \"./interfaces/VideoOptions\";\n\nimport { PreloadedVideo } from \"./PreloadedVideo\";\n\nexport interface VideoCache {\n  add(elements: Array<HTMLAnchorElement>): void;\n  get(videoId: string): PreloadedVideo | undefined;\n}\n\nexport function VideoCache(): VideoCache {\n  const videos: Array<PreloadedVideo> = [];\n\n  function add(elements: Array<HTMLAnchorElement>): void {\n    for (const image of elements) {\n      const videoOptions = image.dataset[\"ilb2Video\"];\n      if (videoOptions === undefined) {\n        continue;\n      }\n      videos.push(\n        PreloadedVideo(image, JSON.parse(videoOptions) as VideoOptions),\n      );\n    }\n  }\n\n  function get(videoId: string): PreloadedVideo | undefined {\n    return videos.find((x) => x.id() === videoId);\n  }\n\n  return {\n    add,\n    get,\n  };\n}\n","import {\n  addActivityIndicatorToDOM,\n  removeActivityIndicatorFromDOM,\n} from \"./activity-indicator\";\nimport { addArrowsToDOM, removeArrowsFromDOM } from \"./arrows\";\nimport { setCaption } from \"./caption\";\nimport { addCloseButtonToDOM, removeCloseButtonFromDOM } from \"./close-button\";\nimport {\n  addContainerToDOM,\n  darkenOverlay,\n  getContainer,\n  removeContainerFromDOM,\n  transitionOutContainer,\n} from \"./container\";\nimport { fullscreenEnabled } from \"./fullscreen\";\nimport {\n  addFullscreenButtonToDOM,\n  removeFullscreenButtonFromDOM,\n} from \"./fullscreen-button\";\nimport { popHistory, pushQuitToHistory, pushToHistory } from \"./history\";\nimport { ImageView } from \"./ImageView\";\nimport {\n  addKeyboardNavigation,\n  removeKeyboardNavigation,\n} from \"./keyboard-navigation\";\nimport {\n  addNavigationItems,\n  addNavigationToDOM,\n  changeNavigationCurrent,\n} from \"./navigation\";\nimport { TransitionDirection } from \"./TransitionDirection\";\nimport { VideoCache } from \"./VideoCache\";\n\nexport interface State {\n  addImages(images: Array<HTMLAnchorElement>): void;\n  close(skipHistory?: boolean): void;\n  images(): Array<HTMLAnchorElement>;\n  next(): void;\n  open(index: number, skipHistory?: boolean): void;\n  openWithImage(image: HTMLAnchorElement): void;\n  previous(): void;\n  set(): string | undefined;\n}\n\nexport function State(\n  // The lightbox options\n  options: ILBOptions,\n  // The value of data-imagelightbox on the images\n  lightboxSet: string,\n  initialImages: Array<HTMLAnchorElement>,\n): State {\n  // The clickable images in the lightbox\n  const targetImages: Array<HTMLAnchorElement> = [];\n\n  // Cached preloaded videos\n  const videoCache: VideoCache = VideoCache();\n\n  // The index of the currently open image, or null if the lightbox is closed\n  let currentImage: number | null = null;\n\n  // The currently displayed image view\n  let currentImageView: ImageView | null = null;\n\n  // !!! State initialization is at the bottom!\n\n  function set(): string {\n    return lightboxSet;\n  }\n\n  function images(): Array<HTMLAnchorElement> {\n    return targetImages;\n  }\n\n  /**\n   * The lightbox transition functions.\n   *\n   * The most important part of the State is managing the transition lifecycle. When transitioning between images, the lifecycle takes the following steps:\n   *\n   * For transitioning out an old image:\n   *\n   * 1. Start visually transitioning the old image out (slide + fade out)\n   * 2. When the image is visually gone, actually remove it from the DOM\n   *\n   * For transitioning in a new image:\n   *\n   * 1. Start loading the new image in the background (startLoadingNewImage)\n   * 2. When the new image is loaded, add it to the DOM, but keep it invisible (addNewImage)\n   * 3. After adding the image to the DOM, transition it into place - slide + fade in (transitionInNewImage)\n   */\n\n  function removeOldImage(\n    transitionDirection: TransitionDirection,\n    callback?: () => void,\n  ): void {\n    if (currentImageView === null) {\n      return;\n    }\n    const oldImageView = currentImageView;\n    oldImageView.transitionOut(transitionDirection, () => {\n      oldImageView.removeFromDOM();\n      callback?.();\n    });\n  }\n\n  function transitionInNewImage(): void {\n    currentImageView?.transitionIn(\n      removeActivityIndicatorFromDOM,\n      previous,\n      next,\n      close,\n    );\n  }\n\n  function addNewImage(transitionDirection: TransitionDirection): void {\n    currentImageView?.addToDOM(transitionDirection, () => {\n      if (currentImage === null) {\n        return;\n      }\n      const image = targetImages[currentImage];\n      if (options.caption) {\n        setCaption(\n          image.dataset[\"ilb2Caption\"] ??\n            image.getElementsByTagName(\"img\").item(0)?.alt ??\n            \"\",\n          options.animationSpeed,\n        );\n      }\n      transitionInNewImage();\n      if (options.preloadNext && currentImage + 1 < targetImages.length) {\n        const nextImage = targetImages[currentImage + 1];\n        const nextImageElement = document.createElement(\"img\");\n        nextImageElement.setAttribute(\n          \"src\",\n          nextImage.getAttribute(\"href\") ?? \"\",\n        );\n        nextImageElement.setAttribute(\n          \"srcset\",\n          nextImage.dataset[\"ilb2Srcset\"] ?? \"\",\n        );\n        nextImageElement.setAttribute(\n          \"sizes\",\n          nextImage.dataset[\"ilb2Sizes\"] ?? \"\",\n        );\n      }\n      getContainer().dispatchEvent(new Event(\"ilb:loaded\", { bubbles: true }));\n    });\n  }\n\n  function startLoadingNewImage(\n    newIndex: number,\n    transitionDirection: TransitionDirection,\n  ): void {\n    const newImageView = ImageView(targetImages[newIndex], options, videoCache);\n    currentImage = newIndex;\n    currentImageView = newImageView;\n    newImageView.startLoading(\n      () => {\n        addNewImage(transitionDirection);\n      },\n      () => {\n        removeActivityIndicatorFromDOM();\n      },\n    );\n  }\n\n  // Public functions wrapping the state transition functions\n\n  function close(skipHistory = false): void {\n    if (currentImage === null) {\n      return;\n    }\n    if (options.activity) {\n      addActivityIndicatorToDOM();\n    }\n\n    removeKeyboardNavigation();\n\n    if (options.history && !skipHistory) {\n      pushQuitToHistory();\n    }\n\n    getContainer().dispatchEvent(new Event(\"ilb:quit\", { bubbles: true }));\n\n    transitionOutContainer();\n    removeOldImage(TransitionDirection.None, () => {\n      currentImage = null;\n      currentImageView = null;\n      removeArrowsFromDOM();\n      removeCloseButtonFromDOM();\n      removeFullscreenButtonFromDOM();\n      removeContainerFromDOM();\n    });\n  }\n\n  function change(\n    index: number,\n    transitionDirection: TransitionDirection,\n    skipHistory = false,\n  ): void {\n    if (currentImage === null) {\n      return;\n    }\n\n    if (options.history && !skipHistory) {\n      pushToHistory(index, set(), images());\n    }\n\n    if (options.activity) {\n      addActivityIndicatorToDOM();\n    }\n    changeNavigationCurrent(index);\n\n    removeOldImage(transitionDirection);\n    startLoadingNewImage(index, transitionDirection);\n  }\n\n  function previous(): void {\n    if (currentImage === null) {\n      return;\n    }\n\n    let newIndex = currentImage - 1;\n    if (currentImage === 0) {\n      if (options.quitOnEnd) {\n        close();\n        return;\n      }\n      newIndex = targetImages.length - 1;\n    }\n    targetImages[newIndex].dispatchEvent(\n      new Event(\"ilb:previous\", { bubbles: true }),\n    );\n    change(newIndex, TransitionDirection.Left);\n  }\n\n  function next(): void {\n    if (currentImage === null) {\n      return;\n    }\n\n    let newIndex = currentImage + 1;\n    if (currentImage === targetImages.length - 1) {\n      if (options.quitOnEnd) {\n        close();\n        return;\n      }\n      newIndex = 0;\n    }\n    targetImages[newIndex].dispatchEvent(\n      new Event(\"ilb:next\", { bubbles: true }),\n    );\n    change(newIndex, TransitionDirection.Right);\n  }\n\n  function open(index: number, skipHistory = false): void {\n    if (currentImage !== null) {\n      return;\n    }\n    addContainerToDOM(options.animationSpeed, options.quitOnDocClick, close);\n    if (options.activity) {\n      addActivityIndicatorToDOM();\n    }\n    addKeyboardNavigation(options, close, previous, next);\n    if (options.arrows) {\n      addArrowsToDOM(previous, next);\n    }\n    if (options.button) {\n      addCloseButtonToDOM(close);\n    }\n    if (options.fullscreen && fullscreenEnabled) {\n      addFullscreenButtonToDOM();\n    }\n    if (options.overlay) {\n      darkenOverlay();\n    }\n\n    if (options.history && !skipHistory) {\n      pushToHistory(index, set(), images());\n    }\n\n    targetImages[index].dispatchEvent(\n      new Event(\"ilb:start\", { bubbles: true }),\n    );\n    startLoadingNewImage(index, TransitionDirection.None);\n\n    // Navigation needs to know current image, so it needs to be added after startLoadingNewImage\n    if (options.navigation) {\n      addNavigationToDOM(\n        images(),\n        () => currentImage,\n        change,\n        options.animationSpeed,\n      );\n    }\n  }\n\n  function openWithImage(image: HTMLAnchorElement): void {\n    const index = targetImages.indexOf(image);\n    if (index < 0) {\n      return;\n    }\n    open(index);\n  }\n\n  function addImages(newImages: Array<HTMLAnchorElement>): void {\n    const validImages = newImages\n      .filter((x) => !targetImages.includes(x))\n      .filter(\n        (element): boolean =>\n          element.tagName.toLowerCase() === \"a\" &&\n          (new RegExp(`.(${options.allowedTypes})$`, \"i\").test(element.href) ||\n            element.dataset[\"ilb2Srcset\"] !== undefined ||\n            element.dataset[\"ilb2Video\"] !== undefined),\n      );\n    videoCache.add(validImages);\n    targetImages.push(...validImages);\n    for (const image of validImages) {\n      image.addEventListener(\"click\", (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        openWithImage(image);\n      });\n    }\n    addNavigationItems(\n      validImages,\n      () => currentImage,\n      change,\n      options.animationSpeed,\n    );\n  }\n\n  // State initialization\n\n  addImages(initialImages);\n\n  if (options.history) {\n    window.addEventListener(\"popstate\", (e) => {\n      popHistory(e, set(), images(), currentImage, open, close, change);\n    });\n  }\n\n  return {\n    addImages,\n    close,\n    images,\n    next,\n    open,\n    openWithImage,\n    previous,\n    set,\n  };\n}\n","import { openHistory } from \"./history\";\nimport { State } from \"./State\";\n\nexport class ImageLightbox {\n  private readonly s: State;\n\n  public constructor(\n    images:\n      | Array<HTMLAnchorElement>\n      | HTMLCollectionOf<HTMLAnchorElement>\n      | NodeListOf<HTMLAnchorElement>,\n    options?: Partial<ILBOptions>,\n  ) {\n    const opts: ILBOptions = {\n      activity: true,\n      allowedTypes: \"\",\n      animationSpeed: 250,\n      arrows: true,\n      button: true,\n      caption: false,\n      enableKeyboard: true,\n      fullscreen: true,\n      gutter: 10,\n      history: false,\n      navigation: false,\n      overlay: true,\n      preloadNext: true,\n      quitOnDocClick: true,\n      quitOnEnd: true,\n      quitOnImgClick: false,\n      ...options,\n    };\n    this.s = State(\n      opts,\n      images.length > 0 ? (images[0].dataset[\"imagelightbox\"] ?? \"\") : \"\",\n      Array.from(images),\n    );\n\n    if (opts.history) {\n      this.openHistory();\n    }\n  }\n\n  public addImages(\n    images:\n      | Array<HTMLAnchorElement>\n      | HTMLCollectionOf<HTMLAnchorElement>\n      | NodeListOf<HTMLAnchorElement>,\n  ): void {\n    this.s.addImages(Array.from(images));\n  }\n\n  public close(): void {\n    this.s.close();\n  }\n\n  public next(): void {\n    this.s.next();\n  }\n\n  public open(image?: HTMLAnchorElement): void {\n    if (image !== undefined) {\n      this.s.openWithImage(image);\n    } else {\n      this.s.open(0);\n    }\n  }\n\n  public openHistory(): void {\n    openHistory(\n      this.s.set(),\n      this.s.images(),\n      (index: number, skipHistory?: boolean) => {\n        this.s.open(index, skipHistory);\n      },\n    );\n  }\n\n  public previous(): void {\n    this.s.previous();\n  }\n}\n"],"names":["addQueryField","query","key","value","newField","newQuery","keyRegex","getQueryField","keyValuePair","removeQueryField","keyRegex1","keyRegex2","TransitionDirection","openHistory","set","images","open","id","newIndex","image","popHistory","event","currentIndex","close","change","historyState","newId","e","pushQuitToHistory","pushToHistory","index","newHistoryState","container","wrappedOnclick","addContainerToDOM","animationSpeed","attachOnclick","onclick","darkenOverlay","getContainer","removeContainerFromDOM","transitionOutContainer","activityIndicator","addActivityIndicatorToDOM","removeActivityIndicatorFromDOM","leftArrow","rightArrow","wrappedLeft","wrappedRight","addArrowsToDOM","onleft","onright","removeArrowsFromDOM","caption","setCaption","captionText","closeButton","wrappedClose","addCloseButtonToDOM","removeCloseButtonFromDOM","fullscreenEnabled","fullscreenElement","requestFullscreen","element","exitFullscreen","toggleFullscreen","fullscreenButton","addFullscreenButtonToDOM","removeFullscreenButtonFromDOM","ImageView","options","videoCache","swipeStart","swipeDiff","imageElement","containerElement","isVideoPreloaded","videoId","isVideo","preloadedVideo","onready","callback","previousImage","nextImage","closeLightbox","videoElement","isLoaded","addToDOM","transitionDirection","maxSize","startLoading","onload","onerror","transitionIn","transitionOut","currentLeft","removeFromDOM","keyHandler","addKeyboardNavigation","removeKeyboardNavigation","navigation","addNavigationItems","currentIndexFn","i","button","buttonClick","buttonIndex","loadDirection","addNavigationToDOM","changeNavigationCurrent","_a","_b","PreloadedVideo","videoOptions","tempId","autoplay","source","sourceElement","shouldAutoplay","VideoCache","videos","add","elements","get","x","State","lightboxSet","initialImages","targetImages","currentImage","currentImageView","removeOldImage","oldImageView","transitionInNewImage","previous","next","addNewImage","nextImageElement","startLoadingNewImage","newImageView","skipHistory","openWithImage","addImages","newImages","validImages","ImageLightbox","opts"],"mappings":"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"}