{
  "version": 3,
  "sources": ["/cdn/shop/t/6/assets/slideshow.js?v=28306258147874261831790720035"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport {\n  center,\n  closest,\n  clamp,\n  mediaQueryLarge,\n  prefersReducedMotion,\n  preventDefault,\n  viewTransition,\n  scheduler,\n} from '@theme/utilities';\nimport { Scroller, scrollIntoView } from '@theme/scrolling';\nimport { SlideshowSelectEvent } from '@theme/events';\n\n// The threshold for determining visibility of slides.\nconst SLIDE_VISIBLITY_THRESHOLD = 0.7;\n\n/**\n * Shared viewport observer manager for lazy scroll enablement.\n *\n * Limit the number of compositor layers created by slideshows by only enabling scrolling when the slideshow is in the viewport.\n * Resolves known issues with iOS Safari where too many composition layers will crash the page.\n * When a slideshow is NOT in the viewport, it has overflow: hidden (no compositor layer).\n * When a slideshow enters the viewport, the [in-viewport] attribute is added, enabling scrolling.\n */\nclass SlideshowViewportObserver {\n  /** @type {SlideshowViewportObserver | null} */\n  static #instance = null;\n\n  /** @type {IntersectionObserver | null} */\n  #observer = null;\n\n  /**\n   * Gets the singleton instance\n   * @returns {SlideshowViewportObserver}\n   */\n  static getInstance() {\n    if (!this.#instance) {\n      this.#instance = new SlideshowViewportObserver();\n    }\n    return this.#instance;\n  }\n\n  /**\n   * Registers a slideshow to be observed for viewport visibility\n   * @param {Slideshow} slideshow - The slideshow to observe\n   */\n  observe(slideshow) {\n    if (!this.#observer) {\n      this.#observer = new IntersectionObserver(\n        (entries) => {\n          for (const entry of entries) {\n            const slideshowElement = /** @type {Slideshow} */ (entry.target);\n            if (entry.isIntersecting) {\n              slideshowElement.setAttribute('in-viewport', '');\n            } else {\n              slideshowElement.removeAttribute('in-viewport');\n            }\n          }\n        },\n        {\n          rootMargin: '100px',\n        }\n      );\n    }\n\n    this.#observer.observe(slideshow);\n  }\n\n  /**\n   * Unregisters a slideshow from viewport observation\n   * @param {Slideshow} slideshow - The slideshow to unobserve\n   */\n  unobserve(slideshow) {\n    this.#observer?.unobserve(slideshow);\n    slideshow.removeAttribute('in-viewport');\n  }\n}\n\n/**\n * Slideshow custom element that allows sliding between content.\n *\n * @typedef {Object} Refs\n * @property {HTMLElement} scroller\n * @property {HTMLElement} slideshowContainer\n * @property {HTMLElement[]} [slides]\n * @property {HTMLElement} [current]\n * @property {HTMLElement[]} [thumbnails]\n * @property {HTMLElement[]} [dots]\n * @property {HTMLButtonElement} [previous]\n * @property {HTMLButtonElement} [next]\n *\n * @extends {Component<Refs>}\n */\nexport class Slideshow extends Component {\n  static get observedAttributes() {\n    return ['initial-slide'];\n  }\n\n  /**\n   * @param {string} name\n   * @param {string} oldValue\n   * @param {string} newValue\n   */\n  attributeChangedCallback(name, oldValue, newValue) {\n    // Collection page filtering will Morph slideshow galleries in place, updating\n    // the slideshow[initial-slide] and slideshow-slide[hidden] attributes.\n    // We need to re-select() the slide after the morph is complete, but not before\n    // slideshow-slide elements have their [hidden] attribute updated.\n    if (name === 'initial-slide' && oldValue !== newValue) {\n      queueMicrotask(() => {\n        // Only select if the component is connected and initialized\n        if (!this.isConnected || !this.#scroll || !this.refs.slides) return;\n        const index = parseInt(newValue, 10) || 0;\n        const slide_id = this.refs.slides[index]?.getAttribute('slide-id');\n        if (slide_id) {\n          this.select({ id: slide_id }, undefined, { animate: false });\n        }\n      });\n    }\n  }\n\n  requiredRefs = ['scroller'];\n\n  async connectedCallback() {\n    super.connectedCallback();\n\n    // Register with shared viewport observer for lazy scroll enablement.\n    // This prevents iOS Safari crashes caused by too many compositor layers.\n    SlideshowViewportObserver.getInstance().observe(this);\n\n    // Wait for any in-progress view transitions to finish\n    if (viewTransition.current) {\n      await viewTransition.current;\n      // It's possible that the slideshow was disconnected before the view transition finished\n      if (!this.isConnected) return;\n    }\n\n    const slideCount = this.slides?.length || 0;\n    slideCount <= 1 ? this.#setupSlideshowWithoutControls() : this.#setupSlideshow();\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    // Unregister from shared viewport observer\n    SlideshowViewportObserver.getInstance().unobserve(this);\n\n    if (this.#scroll) {\n      const { scroller } = this.refs;\n      scroller.removeEventListener('mousedown', this.#handleMouseDown);\n      this.#scroll.destroy();\n    }\n\n    const slideCount = this.slides?.length || 0;\n    if (slideCount > 1) {\n      this.removeEventListener('mouseenter', this.suspend);\n      this.removeEventListener('mouseleave', this.resume);\n      this.removeEventListener('pointerenter', this.#handlePointerEnter);\n      document.removeEventListener('visibilitychange', this.#handleVisibilityChange);\n    }\n\n    if (this.#resizeObserver) {\n      this.#resizeObserver.disconnect();\n    }\n\n    if (this.#intersectionObserver) {\n      this.#intersectionObserver.disconnect();\n      this.#intersectionObserver = null;\n    }\n  }\n\n  /** Indicates whether the slideshow is nested inside another slideshow. */\n  get isNested() {\n    return this.parentElement?.closest('slideshow-component') !== null;\n  }\n\n  get initialSlide() {\n    return this.refs.slides?.[this.initialSlideIndex];\n  }\n\n  /**\n   * Selects a slide based on the input index.\n   * @param {number|string|{id: string}} input - The index or id of the slide to select.\n   * @param {Event} [event] - The event that triggered the selection.\n   * @param {Object} [options] - The options for the selection.\n   * @param {boolean} [options.animate=true] - Whether to animate the selection.\n   */\n  async select(input, event, options = {}) {\n    if (this.#disabled || !this.refs.slides?.length) return;\n    if (!this.#scroll) return;\n\n    // Store the actual current slide before any mutations\n    const currentSlide = this.slides?.[this.current];\n\n    for (const slide of this.refs.slides) {\n      if (slide.hasAttribute('reveal')) {\n        slide.removeAttribute('reveal');\n        slide.setAttribute('aria-hidden', 'true');\n      }\n    }\n\n    // Figure out the raw desired index (could be -1 if user is on first slide and clicks prev)\n    let requestedIndex = (() => {\n      if (typeof input === 'number') return input;\n      if (typeof input === 'string') return parseInt(input, 10);\n      if ('id' in input) {\n        const requestedSlide = this.refs.slides.find((slide) => slide.getAttribute('slide-id') == input.id);\n\n        if (!requestedSlide || !this.slides) return;\n\n        // Force the slide to be revealed if it is hidden\n        if (requestedSlide.hasAttribute('hidden')) {\n          requestedSlide.setAttribute('reveal', '');\n          requestedSlide.setAttribute('aria-hidden', 'false');\n        }\n\n        return this.slides.indexOf(requestedSlide);\n      }\n    })();\n\n    const { current } = this;\n    const { slides } = this;\n\n    // Guard checks: no slides, invalid index, or selecting the same slide\n    if (!slides?.length || requestedIndex === undefined || isNaN(requestedIndex)) return;\n\n    const requestedSlideElement = slides?.[requestedIndex];\n    if (currentSlide === requestedSlideElement) return;\n\n    if (!this.infinite) requestedIndex = clamp(requestedIndex, 0, slides.length - 1);\n\n    event?.preventDefault();\n\n    const { animate = true } = options;\n    const lastIndex = slides.length - 1;\n\n    // Decide the actual target index (clamp for infinite loop)\n    let index = requestedIndex;\n    if (requestedIndex < 0) index = lastIndex;\n    else if (requestedIndex > lastIndex) index = 0;\n\n    const isAdjacentSlide = Math.abs(index - current) <= 1 && requestedIndex >= 0 && requestedIndex <= lastIndex;\n    const { visibleSlides } = this;\n    const instant = prefersReducedMotion() || !animate;\n\n    // If jump is more than 1 or we looped, do the placeholder + reorder trick\n    if (!instant && !isAdjacentSlide && visibleSlides.length === 1) {\n      this.#disabled = true;\n      await this.#scroll.finished; // ensure we're not mid-scroll\n\n      const targetSlide = slides[index];\n      if (!targetSlide || !currentSlide) return;\n\n      // Create a placeholder in the original DOM position of targetSlide\n      const placeholder = document.createElement('slideshow-slide');\n      targetSlide.before(placeholder);\n\n      // Decide whether targetSlide goes before or after currentSlide\n      // so that we scroll a short distance in the correct direction\n      if (requestedIndex < current) {\n        currentSlide.before(targetSlide);\n      } else {\n        currentSlide.after(targetSlide);\n      }\n\n      if (current === 0) this.#scroll.to(currentSlide, { instant: true });\n\n      // Once that scroll finishes, restore the DOM\n      queueMicrotask(async () => {\n        await this.#scroll.finished;\n        this.#disabled = false;\n\n        // Restore the slide back to its original position. This triggers a scroll event.\n        placeholder.replaceWith(targetSlide);\n\n        // Instantly scroll to the target slide as its position will have changed\n        this.#scroll.to(targetSlide, { instant: true });\n\n        // Force Safari to recalculate the timeline state on timeline refresh (after loop)\n        requestAnimationFrame(() => {\n          this.setAttribute('refreshing-timeline', '');\n          requestAnimationFrame(() => {\n            this.removeAttribute('refreshing-timeline');\n          });\n        });\n      });\n    }\n\n    const slide = slides[index];\n    if (!slide) return;\n\n    const previousIndex = this.current;\n\n    slide.setAttribute('aria-hidden', 'false');\n\n    if (this.#scroll) {\n      this.#scroll.to(slide, { instant });\n    }\n\n    this.current = this.slides?.indexOf(slide) || 0;\n\n    this.#centerSelectedThumbnail(index, instant ? 'instant' : 'smooth');\n\n    this.dispatchEvent(\n      new SlideshowSelectEvent({\n        index,\n        previousIndex,\n        userInitiated: event != null,\n        trigger: 'select',\n        slide,\n        id: slide.getAttribute('slide-id'),\n      })\n    );\n  }\n\n  /**\n   * Advances to the next slide.\n   * @param {Event} [event] - The event that triggered the next slide.\n   * @param {Object} [options] - The options for the next slide.\n   * @param {boolean} [options.animate=true] - Whether to animate the next slide.\n   */\n  next(event, options) {\n    event?.preventDefault();\n    this.select(this.nextIndex, event, options);\n  }\n\n  /**\n   * Goes back to the previous slide.\n   * @param {Event} [event] - The event that triggered the previous slide.\n   * @param {Object} [options] - The options for the previous slide.\n   * @param {boolean} [options.animate=true] - Whether to animate the previous slide.\n   */\n  previous(event, options) {\n    event?.preventDefault();\n    this.select(this.previousIndex, event, options);\n  }\n\n  /**\n   * Starts automatic slide playback.\n   * @param {number} [interval] - The time interval in seconds between slides.\n   */\n  play(interval = this.autoplayInterval) {\n    if (this.#interval) return;\n\n    this.paused = false;\n\n    this.#interval = setInterval(() => {\n      if (this.matches(':hover') || document.hidden) return;\n\n      this.next();\n    }, interval);\n  }\n\n  /**\n   * Pauses automatic slide playback.\n   */\n  pause() {\n    this.paused = true;\n    this.suspend();\n  }\n\n  get paused() {\n    return this.hasAttribute('paused');\n  }\n\n  set paused(value) {\n    if (value) {\n      this.setAttribute('paused', '');\n    } else {\n      this.removeAttribute('paused');\n    }\n  }\n\n  /**\n   * Suspends automatic slide playback.\n   */\n  suspend() {\n    clearInterval(this.#interval);\n    this.#interval = undefined;\n  }\n\n  /**\n   * Resumes automatic slide playback if autoplay is enabled.\n   */\n  resume() {\n    if (!this.autoplay || this.paused) return;\n\n    this.pause();\n    this.play();\n  }\n\n  get autoplay() {\n    return Boolean(this.autoplayInterval);\n  }\n\n  get autoplayInterval() {\n    const interval = this.getAttribute('autoplay');\n    const value = parseInt(`${interval}`, 10);\n\n    if (Number.isNaN(value)) return undefined;\n\n    return value * 1000;\n  }\n\n  /**\n   * The current slide index.\n   * @type {number}\n   */\n  #current = 0;\n\n  get current() {\n    return this.#current;\n  }\n\n  /**\n   * Sets the current slide index and update the DOM\n   * @type {number}\n   */\n  set current(value) {\n    const { current, thumbnails, dots, slides, previous, next } = this.refs;\n\n    this.#current = value;\n\n    if (current) current.textContent = `${value + 1}`;\n\n    for (const controls of [thumbnails, dots]) {\n      controls?.forEach((el, i) => el.setAttribute('aria-selected', `${i === value}`));\n    }\n\n    if (previous) previous.disabled = Boolean(!this.infinite && value === 0);\n    if (next) next.disabled = Boolean(!this.infinite && slides && this.nextIndex >= slides.length);\n  }\n\n  get infinite() {\n    return this.getAttribute('infinite') != null;\n  }\n\n  get visibleSlides() {\n    return this.#visibleSlides;\n  }\n\n  get previousIndex() {\n    const { current, visibleSlides } = this;\n    const modifier = visibleSlides.length > 1 ? visibleSlides.length : 1;\n\n    return current - modifier;\n  }\n\n  get nextIndex() {\n    const { current, visibleSlides } = this;\n    const modifier = visibleSlides.length > 1 ? visibleSlides.length : 1;\n\n    return current + modifier;\n  }\n\n  get atStart() {\n    const { current, slides } = this;\n\n    return slides?.length ? current === 0 : false;\n  }\n\n  get atEnd() {\n    const { current, slides } = this;\n\n    return slides?.length ? current === slides.length - 1 : false;\n  }\n\n  /**\n   * Sets the disabled attribute.\n   * @param {boolean} value - The value to set the disabled attribute to.\n   */\n  set disabled(value) {\n    this.setAttribute('disabled', String(value));\n  }\n  /**\n   * Whether the slideshow is disabled.\n   * @type {boolean}\n   */\n  get disabled() {\n    return (\n      this.getAttribute('disabled') === 'true' || (this.hasAttribute('mobile-disabled') && !mediaQueryLarge.matches)\n    );\n  }\n\n  /**\n   * Indicates whether the slideshow is temporarily disabled (e.g., during infinite loop transition).\n   * @type {boolean}\n   */\n  #disabled = false;\n\n  /**\n   * The interval ID for automatic playback.\n   * @type {number|undefined}\n   */\n  #interval = undefined;\n\n  /**\n   * The Scroller instance that manages scrolling.\n   * @type {Scroller}\n   */\n  #scroll;\n\n  /**\n   * The ResizeObserver instance for monitoring scroller size changes\n   * @type {ResizeObserver}\n   */\n  #resizeObserver;\n\n  /**\n   * IntersectionObserver for efficient visibility tracking of slides\n   * @type {IntersectionObserver | null}\n   */\n  #intersectionObserver = null;\n\n  /**\n   * Cached visible slides result from IntersectionObserver\n   * @type {HTMLElement[]}\n   */\n  #visibleSlides = [];\n\n  /**\n   * Setup the slideshow without controls for zero or one slides\n   */\n  #setupSlideshowWithoutControls() {\n    this.current = 0;\n    if (this.hasAttribute('auto-hide-controls')) {\n      const { slideshowControls } = this.refs;\n      if (slideshowControls instanceof HTMLElement) {\n        slideshowControls.hidden = true;\n      }\n    }\n\n    if (this.refs.slides?.[0]) {\n      this.refs.slides[0].setAttribute('aria-hidden', 'false');\n    }\n  }\n\n  /**\n   * Setup the slideshow with controls for when there are multiple slides\n   */\n  #setupSlideshow() {\n    // Setup IntersectionObserver first for efficient visibility tracking\n    this.#setupIntersectionObserver();\n\n    // Setup the scroll instance\n    const { scroller } = this.refs;\n    this.#scroll = new Scroller(scroller, {\n      onScroll: this.#handleScroll,\n      onScrollStart: this.#onTransitionInit,\n      onScrollEnd: this.#onTransitionEnd,\n    });\n\n    scroller.addEventListener('mousedown', this.#handleMouseDown);\n\n    this.addEventListener('mouseenter', this.suspend);\n    this.addEventListener('mouseleave', this.resume);\n    this.addEventListener('pointerenter', this.#handlePointerEnter);\n    document.addEventListener('visibilitychange', this.#handleVisibilityChange);\n\n    this.#updateControlsVisibility();\n\n    this.disabled = this.isNested || this.disabled;\n\n    this.resume();\n\n    this.current = this.initialSlideIndex;\n\n    // Batch reads and writes to the DOM\n    scheduler.schedule(() => {\n      let visibleSlidesAmount = 0;\n      const initialSlideId = this.initialSlide?.getAttribute('slide-id');\n\n      // Wait for next frame to ensure layout is fully calculated before setting initial scroll position\n      // This prevents race conditions on Safari mobile when section_width is 'full-width'\n      requestAnimationFrame(() => {\n        if (this.initialSlideIndex !== 0 && initialSlideId) {\n          this.select({ id: initialSlideId }, undefined, { animate: false });\n          visibleSlidesAmount = 1;\n        } else {\n          visibleSlidesAmount = this.#updateVisibleSlides();\n          if (visibleSlidesAmount === 0) {\n            this.select(0, undefined, { animate: false });\n            visibleSlidesAmount = 1;\n          }\n        }\n      });\n\n      this.#resizeObserver = new ResizeObserver(async () => {\n        if (viewTransition.current) await viewTransition.current;\n\n        if (visibleSlidesAmount > 1) {\n          this.#updateVisibleSlides();\n        }\n\n        if (this.hasAttribute('auto-hide-controls')) {\n          this.#updateControlsVisibility();\n        }\n      });\n\n      this.#resizeObserver.observe(this.refs.slideshowContainer);\n    });\n  }\n\n  /**\n   * Callback invoked on user initiated scroll to sync the current slide index\n   * and emit a slide change event if the index has changed.\n   */\n  #handleScroll = () => {\n    const previousIndex = this.#current;\n    const index = this.#sync();\n\n    if (index === previousIndex) return;\n\n    const slide = this.slides?.[index];\n    if (!slide) return;\n\n    this.dispatchEvent(\n      new SlideshowSelectEvent({\n        index,\n        previousIndex,\n        userInitiated: true,\n        trigger: 'scroll',\n        slide,\n        id: slide.getAttribute('slide-id'),\n      })\n    );\n  };\n\n  #onTransitionInit = () => {\n    this.setAttribute('transitioning', '');\n  };\n\n  #onTransitionEnd = () => {\n    this.#updateVisibleSlides();\n    this.removeAttribute('transitioning');\n  };\n\n  /**\n   * Synchronizes the scroll position and updates the current slide index.\n   * @returns {number} The index of the current slide.\n   */\n  #sync = () => {\n    const { slides } = this;\n    if (!slides) return (this.current = 0);\n\n    if (!this.#scroll) return (this.current = 0);\n\n    const visibleSlides = this.visibleSlides;\n\n    if (!visibleSlides.length) return this.current;\n\n    const { axis } = this.#scroll;\n    const { scroller } = this.refs;\n    const centers = visibleSlides.map((slide) => center(slide, axis));\n    const referencePoint = visibleSlides.length > 1 ? scroller.getBoundingClientRect()[axis] : center(scroller, axis);\n    const closestCenter = closest(centers, referencePoint);\n    const closestVisibleSlide = visibleSlides[centers.indexOf(closestCenter)];\n\n    if (!closestVisibleSlide) return (this.current = 0);\n\n    const index = slides.indexOf(closestVisibleSlide);\n\n    return (this.current = index);\n  };\n\n  #dragging = false;\n\n  /**\n   * Handles the 'mousedown' event to start dragging slides.\n   * @param {MouseEvent} event - The mousedown event.\n   */\n  #handleMouseDown = (event) => {\n    const { slides } = this;\n\n    if (!slides || slides.length <= 1) return;\n    if (!(event.target instanceof Element)) return;\n    if (this.disabled || this.#dragging) return;\n\n    // Check if the event target is within a 3D model interactive element\n    // This prevents the slideshow from capturing drag events when interacting with 3D models\n    if (event.target.closest('model-viewer')) {\n      return;\n    }\n\n    event.preventDefault();\n    // Store initial position but don't start handling yet\n    const { axis } = this.#scroll;\n    const startPosition = event[axis];\n\n    const controller = new AbortController();\n    const { signal } = controller;\n    const startTime = performance.now();\n    let previous = startPosition;\n    let velocity = 0;\n    let moved = false;\n    let distanceTravelled = 0;\n\n    this.#dragging = true;\n\n    /**\n     * Handles the 'pointermove' event to update the scroll position.\n     * @param {PointerEvent} event - The pointermove event.\n     */\n    const onPointerMove = (event) => {\n      const current = event[axis];\n      const initialDelta = startPosition - current;\n\n      if (!initialDelta) return;\n\n      if (!moved) {\n        moved = true;\n        this.setPointerCapture(event.pointerId);\n\n        // Prevent clicks once the user starts dragging\n        document.addEventListener('click', preventDefault, { once: true, signal });\n\n        const movingRight = initialDelta < 0;\n        const movingLeft = initialDelta > 0;\n\n        // Check if the current slideshow should handle this drag\n        const closestSlideshow = this.parentElement?.closest('slideshow-component');\n        const isNested = closestSlideshow instanceof Slideshow && closestSlideshow !== this;\n        const cannotMoveInDirection = (movingRight && this.atStart) || (movingLeft && this.atEnd);\n\n        // Abort and let the parent slideshow handle the drag if we're moving in a direction where nested slideshow can't move\n        if (isNested && cannotMoveInDirection) {\n          controller.abort();\n          return;\n        }\n\n        this.pause();\n        this.setAttribute('dragging', '');\n      }\n\n      // Stop the event from bubbling up to parent slideshow components\n      event.stopImmediatePropagation();\n\n      const delta = previous - current;\n      const timeDelta = performance.now() - startTime;\n      velocity = Math.round((delta / timeDelta) * 1000);\n      previous = current;\n      distanceTravelled += Math.abs(delta);\n\n      this.#scroll.by(delta, { instant: true });\n    };\n\n    /**\n     * Handles the 'pointerup' event to stop dragging slides.\n     * @param {PointerEvent} event - The pointerup event.\n     */\n    const onPointerUp = async (event) => {\n      controller.abort();\n      const { current, slides } = this;\n      const { scroller } = this.refs;\n\n      this.#dragging = false;\n\n      if (!slides?.length || !scroller) return;\n\n      const direction = Math.sign(velocity);\n      const next = this.#sync();\n\n      const modifier = current !== next || Math.abs(velocity) < 10 || distanceTravelled < 10 ? 0 : direction;\n      const newIndex = clamp(next + modifier, 0, slides.length - 1);\n\n      const newSlide = slides[newIndex];\n      const currentIndex = this.current;\n\n      if (!newSlide) throw new Error(`Slide not found at index ${newIndex}`);\n\n      this.#scroll.to(newSlide);\n\n      this.removeAttribute('dragging');\n      this.releasePointerCapture(event.pointerId);\n\n      this.#centerSelectedThumbnail(newIndex);\n\n      this.dispatchEvent(\n        new SlideshowSelectEvent({\n          index: newIndex,\n          previousIndex: currentIndex,\n          userInitiated: true,\n          trigger: 'drag',\n          slide: newSlide,\n          id: newSlide.getAttribute('slide-id'),\n        })\n      );\n\n      this.current = newIndex;\n\n      await this.#scroll.finished;\n\n      // It's possible that the user started dragging again before the scroll finished\n      if (this.#dragging) return;\n\n      this.#scroll.snap = true;\n      this.resume();\n    };\n\n    this.#scroll.snap = false;\n\n    document.addEventListener('pointermove', onPointerMove, { signal });\n    document.addEventListener('pointerup', onPointerUp, { signal });\n    /**\n     * pointerDown calls onPointerUp to fix an issue where the first tap-and-drag\n     * on the zoom dialog is captured by the pointerMove/pointerUp listeners,\n     * sometimes causing the slideshow to change slides unexpectedly\n     */\n    document.addEventListener('pointerdown', onPointerUp, { signal });\n    document.addEventListener('pointercancel', onPointerUp, { signal });\n    document.addEventListener('pointercapturelost', onPointerUp, { signal });\n  };\n\n  #handlePointerEnter = () => {\n    this.setAttribute('actioned', '');\n  };\n\n  get slides() {\n    return this.refs.slides?.filter((slide) => !slide.hasAttribute('hidden') || slide.hasAttribute('reveal'));\n  }\n\n  /**\n   * The initial slide index.\n   * @type {number}\n   */\n  get initialSlideIndex() {\n    const initialSlide = this.getAttribute('initial-slide');\n    if (initialSlide == null) return 0;\n\n    return parseInt(initialSlide, 10);\n  }\n\n  /**\n   * Pause the slideshow when the page is hidden.\n   */\n  #handleVisibilityChange = () => (document.hidden ? this.suspend() : this.resume());\n\n  #updateControlsVisibility() {\n    if (!this.hasAttribute('auto-hide-controls')) return;\n\n    const { scroller, slideshowControls } = this.refs;\n\n    if (!(slideshowControls instanceof HTMLElement)) return;\n\n    slideshowControls.hidden = scroller.scrollWidth <= scroller.offsetWidth;\n  }\n\n  /**\n   * Setup IntersectionObserver for efficient visibility tracking of slides\n   */\n  #setupIntersectionObserver() {\n    const { slides, scroller } = this.refs;\n    if (!slides?.length) return;\n\n    if (this.#intersectionObserver) {\n      this.#intersectionObserver.disconnect();\n    }\n\n    this.#intersectionObserver = new IntersectionObserver(\n      (entries) => {\n        const allEntries = [\n          ...entries,\n          ...(this.#intersectionObserver ? this.#intersectionObserver.takeRecords() : []),\n        ];\n\n        for (const entry of allEntries) {\n          const slide = /** @type {HTMLElement} */ (entry.target);\n          const isCurrentlyVisible = this.#visibleSlides.includes(slide);\n          const shouldBeVisible = entry.intersectionRatio >= SLIDE_VISIBLITY_THRESHOLD;\n\n          if (shouldBeVisible && !isCurrentlyVisible) {\n            this.#visibleSlides.push(slide);\n          } else if (!shouldBeVisible && isCurrentlyVisible) {\n            const index = this.#visibleSlides.indexOf(slide);\n            if (index > -1) {\n              this.#visibleSlides.splice(index, 1);\n            }\n          }\n        }\n\n        this.#visibleSlides.sort((a, b) => slides.indexOf(a) - slides.indexOf(b));\n        this.#updateVisibleSlides();\n      },\n      {\n        root: scroller,\n        threshold: SLIDE_VISIBLITY_THRESHOLD,\n        // Add small margin to account for sub-pixel rendering\n        rootMargin: '1px',\n      }\n    );\n\n    // Observe all slides - observer will fire initial callback asynchronously\n    slides.forEach((slide) => {\n      this.#intersectionObserver?.observe(slide);\n    });\n  }\n\n  /**\n   * Centers the selected thumbnail in the thumbnails container\n   * @param {number} index - The index of the selected thumbnail\n   * @param {ScrollBehavior} [behavior] - The scroll behavior.\n   */\n  #centerSelectedThumbnail(index, behavior = 'smooth') {\n    const selectedThumbnail = this.refs.thumbnails?.[index];\n    if (!selectedThumbnail) return;\n\n    const { thumbnailsContainer } = this.refs;\n    if (!thumbnailsContainer || !(thumbnailsContainer instanceof HTMLElement)) return;\n\n    const { slideshowControls } = this.refs;\n    if (!slideshowControls || !(slideshowControls instanceof HTMLElement)) return;\n\n    scrollIntoView(selectedThumbnail, {\n      ancestor: thumbnailsContainer,\n      behavior,\n      block: 'center',\n      inline: 'center',\n    });\n  }\n\n  #updateVisibleSlides() {\n    const { slides } = this;\n    if (!slides || !slides.length) return 0;\n\n    const visibleSlides = this.visibleSlides;\n\n    // If the IntersectionObserver reports zero visible slides, then the slideshow has intersected, but no slides meet the visibility threshold.\n    // Probably that the slideshow's host is mid-animation or zero-layout, like in an animating modal.\n    // Don't stamp aria-hidden=\"true\" on every slide. Set the current slide to the first visible slide.\n    if (visibleSlides.length === 0) return 0;\n\n    // Batch writes to the DOM\n    scheduler.schedule(() => {\n      // Update aria-hidden based on visibility\n      slides.forEach((slide) => {\n        const isVisible = visibleSlides.includes(slide);\n        slide.setAttribute('aria-hidden', `${!isVisible}`);\n      });\n    });\n\n    return visibleSlides.length;\n  }\n}\n\nif (!customElements.get('slideshow-component')) {\n  customElements.define('slideshow-component', Slideshow);\n}\n"],
  "mappings": "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",
  "names": ["slide", "event", "slides"]
}
