@mantine-vue/lightbox 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cjs/index.cjs CHANGED
@@ -987,7 +987,7 @@ var LightboxThumbnails_default = /* @__PURE__ */ (0, vue.defineComponent)({
987
987
  "aria-current": index === (0, vue.unref)(ctx).currentIndex || void 0,
988
988
  onClick: ($event) => (0, vue.unref)(ctx).setIndex(index)
989
989
  }), {
990
- default: (0, vue.withCtx)(() => [slide.type === "custom" && slide.renderThumb ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)(() => slide.renderThumb?.()), { key: 0 })) : getThumbnailSource(slide) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("img", (0, vue.mergeProps)({
990
+ default: (0, vue.withCtx)(() => [slide.renderThumb ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)(() => slide.renderThumb?.({ active: index === (0, vue.unref)(ctx).currentIndex })), { key: 0 })) : getThumbnailSource(slide) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("img", (0, vue.mergeProps)({
991
991
  key: 1,
992
992
  ref_for: true
993
993
  }, (0, vue.unref)(ctx).getStyles("thumbnailImage"), {
package/cjs/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/lightbox.context.ts","../src/LightboxCaption/LightboxCaption.vue","../src/LightboxCaption/LightboxCaption.vue","../src/LightboxNavigation/LightboxNavigation.vue","../src/LightboxNavigation/LightboxNavigation.vue","../src/default-labels.ts","../src/hooks/use-lightbox-zoom.ts","../src/Lightbox.module.css","../src/LightboxRoot/LightboxRoot.vue","../src/LightboxRoot/LightboxRoot.vue","../src/LightboxSlide/LightboxSlide.vue","../src/LightboxSlide/LightboxSlide.vue","../src/LightboxSlides/LightboxSlides.vue","../src/LightboxSlides/LightboxSlides.vue","../src/LightboxThumbnails/LightboxThumbnails.vue","../src/LightboxThumbnails/LightboxThumbnails.vue","../src/LightboxToolbar/toolbar-items.ts","../src/LightboxToolbar/LightboxToolbar.vue","../src/LightboxToolbar/LightboxToolbar.vue","../src/Lightbox.vue","../src/Lightbox.vue","../src/lightbox.store.ts","../src/LightboxCloseButton/LightboxCloseButton.vue","../src/LightboxCloseButton/LightboxCloseButton.vue","../src/LightboxProvider/LightboxProvider.vue","../src/LightboxProvider/LightboxProvider.vue","../src/Lightbox.ts"],"sourcesContent":["import { createSafeContext } from '@mantine-vue/core'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport type { LightboxLabels, ToolbarItemsPayload } from './types'\n\nexport interface LightboxContextValue extends ToolbarItemsPayload {\n getStyles: (selector: string, options?: Record<string, any>) => Record<string, any>\n opened: boolean\n withZoom: boolean\n withThumbnails: boolean\n withFullscreen: boolean\n withDownload: boolean\n loop: boolean\n closeOnSwipeDown: boolean\n closeOnClickOutside: boolean\n withSlideTransition: boolean\n transitionDuration: number\n emblaOptions?: EmblaOptionsType\n labels: LightboxLabels\n zoomScale: number\n panZoom: (deltaX: number, deltaY: number) => boolean\n getImageZoomProps: () => Record<string, any>\n}\n\nexport const [provideLightboxContext, useLightboxContext] = createSafeContext<LightboxContextValue>(\n 'Lightbox component was not found in tree',\n)\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCaption', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst caption = computed(() => ctx.slides[ctx.currentIndex]?.caption)\n</script>\n<template>\n <Box v-if=\"caption\" v-bind=\"{ ...attrs, ...ctx.getStyles('caption') }\"\n ><component :is=\"() => caption\"\n /></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCaption', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst caption = computed(() => ctx.slides[ctx.currentIndex]?.caption)\n</script>\n<template>\n <Box v-if=\"caption\" v-bind=\"{ ...attrs, ...ctx.getStyles('caption') }\"\n ><component :is=\"() => caption\"\n /></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxNavigation', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst canPrev = computed(() => (ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex > 0))\nconst canNext = computed(() =>\n ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex < ctx.slides.length - 1,\n)\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('navigation') }\"\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canPrev || undefined\"\n :aria-disabled=\"!canPrev || undefined\"\n :aria-label=\"ctx.labels.previousSlideLabel\"\n :tabindex=\"canPrev ? 0 : -1\"\n @click=\"ctx.prev\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '9 18 15 12 9 6' : '15 18 9 12 15 6'\"\n /></svg></UnstyledButton\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canNext || undefined\"\n :aria-disabled=\"!canNext || undefined\"\n :aria-label=\"ctx.labels.nextSlideLabel\"\n :tabindex=\"canNext ? 0 : -1\"\n @click=\"ctx.next\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '15 18 9 12 15 6' : '9 18 15 12 9 6'\"\n /></svg></UnstyledButton\n ></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxNavigation', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst canPrev = computed(() => (ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex > 0))\nconst canNext = computed(() =>\n ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex < ctx.slides.length - 1,\n)\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('navigation') }\"\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canPrev || undefined\"\n :aria-disabled=\"!canPrev || undefined\"\n :aria-label=\"ctx.labels.previousSlideLabel\"\n :tabindex=\"canPrev ? 0 : -1\"\n @click=\"ctx.prev\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '9 18 15 12 9 6' : '15 18 9 12 15 6'\"\n /></svg></UnstyledButton\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canNext || undefined\"\n :aria-disabled=\"!canNext || undefined\"\n :aria-label=\"ctx.labels.nextSlideLabel\"\n :tabindex=\"canNext ? 0 : -1\"\n @click=\"ctx.next\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '15 18 9 12 15 6' : '9 18 15 12 9 6'\"\n /></svg></UnstyledButton\n ></Box>\n</template>\n","import type { LightboxLabels } from './types'\n\nexport const DEFAULT_LABELS: LightboxLabels = {\n lightboxLabel: 'Gallery',\n slideLabel: (index, total) => `Slide ${index} of ${total}`,\n slidesLabel: 'Slides',\n previousSlideLabel: 'Previous slide',\n nextSlideLabel: 'Next slide',\n thumbnailLabel: (index) => `Go to slide ${index}`,\n enterFullscreenLabel: 'Enter fullscreen',\n exitFullscreenLabel: 'Exit fullscreen',\n showThumbnailsLabel: 'Show thumbnails',\n hideThumbnailsLabel: 'Hide thumbnails',\n downloadLabel: 'Download',\n closeLabel: 'Close',\n}\n","import { computed, onBeforeUnmount, reactive, ref, watch, type CSSProperties } from 'vue'\n\nexport interface LightboxZoomState {\n scale: number\n translateX: number\n translateY: number\n isZoomed: boolean\n}\n\ninterface UseLightboxZoomInput {\n enabled: () => boolean\n maxScale: () => number\n currentIndex: () => number\n}\n\nconst INITIAL_ZOOM_STATE: LightboxZoomState = {\n scale: 1,\n translateX: 0,\n translateY: 0,\n isZoomed: false,\n}\n\nfunction clampTranslate(\n state: LightboxZoomState,\n image: HTMLImageElement | null,\n): LightboxZoomState {\n if (!image) return state\n\n const maxX = (image.offsetWidth * (state.scale - 1)) / 2\n const maxY = (image.offsetHeight * (state.scale - 1)) / 2\n\n return {\n ...state,\n translateX: Math.max(-maxX, Math.min(maxX, state.translateX)),\n translateY: Math.max(-maxY, Math.min(maxY, state.translateY)),\n }\n}\n\nexport function useLightboxZoom({ enabled, maxScale, currentIndex }: UseLightboxZoomInput) {\n const state = reactive<LightboxZoomState>({ ...INITIAL_ZOOM_STATE })\n const imageRef = ref<HTMLImageElement | null>(null)\n const isDragging = ref(false)\n const isAdjusting = ref(false)\n const didDrag = ref(false)\n const dragStart = { x: 0, y: 0 }\n const translateStart = { x: 0, y: 0 }\n const lastPinchDistance = ref<number | null>(null)\n const lastPointerType = ref('mouse')\n const lastClickPointerType = ref('mouse')\n let adjustTimeout = -1\n\n const setState = (next: LightboxZoomState) => Object.assign(state, next)\n const resetZoom = () => {\n setState(INITIAL_ZOOM_STATE)\n isDragging.value = false\n }\n const beginAdjust = () => {\n isAdjusting.value = true\n window.clearTimeout(adjustTimeout)\n adjustTimeout = window.setTimeout(() => {\n isAdjusting.value = false\n }, 120)\n }\n const toggleZoom = () => {\n if (!enabled()) return\n setState(\n state.isZoomed\n ? INITIAL_ZOOM_STATE\n : {\n scale: Math.min(2, maxScale()),\n translateX: 0,\n translateY: 0,\n isZoomed: true,\n },\n )\n }\n const zoomAtPoint = (deltaScale: number, clientX?: number, clientY?: number) => {\n const nextScale = Math.max(1, Math.min(maxScale(), state.scale + deltaScale))\n if (nextScale === 1) {\n resetZoom()\n return\n }\n\n const image = imageRef.value\n let translateX = state.translateX\n let translateY = state.translateY\n\n if (image && clientX !== undefined && clientY !== undefined) {\n const rect = image.getBoundingClientRect()\n const scaleRatio = nextScale / state.scale\n const offsetX = clientX - (rect.left + rect.width / 2) + state.translateX\n const offsetY = clientY - (rect.top + rect.height / 2) + state.translateY\n translateX = offsetX * (1 - scaleRatio) + state.translateX * scaleRatio\n translateY = offsetY * (1 - scaleRatio) + state.translateY * scaleRatio\n }\n\n setState(clampTranslate({ scale: nextScale, translateX, translateY, isZoomed: true }, image))\n }\n const panZoom = (deltaX: number, deltaY: number) => {\n if (!state.isZoomed) return false\n setState(\n clampTranslate(\n {\n ...state,\n translateX: state.translateX + deltaX,\n translateY: state.translateY + deltaY,\n },\n imageRef.value,\n ),\n )\n return true\n }\n const handleWheel = (event: WheelEvent) => {\n if (event.deltaY === 0) return\n event.preventDefault()\n beginAdjust()\n zoomAtPoint(event.deltaY > 0 ? -0.2 : 0.2, event.clientX, event.clientY)\n }\n const setImageRef = (node: unknown) => {\n imageRef.value?.removeEventListener('wheel', handleWheel)\n imageRef.value = node instanceof HTMLImageElement ? node : null\n imageRef.value?.addEventListener('wheel', handleWheel, { passive: false })\n }\n const handlePointerDown = (event: PointerEvent) => {\n lastPointerType.value = event.pointerType || 'mouse'\n if (!state.isZoomed || !enabled()) return\n\n isDragging.value = true\n didDrag.value = false\n dragStart.x = event.clientX\n dragStart.y = event.clientY\n translateStart.x = state.translateX\n translateStart.y = state.translateY\n if (typeof (event.target as HTMLElement | null)?.setPointerCapture === 'function') {\n ;(event.target as HTMLElement).setPointerCapture(event.pointerId)\n }\n }\n const handlePointerMove = (event: PointerEvent) => {\n if (!isDragging.value || !enabled()) return\n const dx = event.clientX - dragStart.x\n const dy = event.clientY - dragStart.y\n if (Math.abs(dx) > 3 || Math.abs(dy) > 3) didDrag.value = true\n setState(\n clampTranslate(\n {\n ...state,\n translateX: translateStart.x + dx,\n translateY: translateStart.y + dy,\n },\n imageRef.value,\n ),\n )\n }\n const handlePointerUp = () => {\n isDragging.value = false\n }\n const handlePointerCancel = () => {\n isDragging.value = false\n didDrag.value = false\n lastPinchDistance.value = null\n }\n const handleTouchMove = (event: TouchEvent) => {\n if (!enabled() || event.touches.length !== 2) {\n lastPinchDistance.value = null\n return\n }\n\n const [touch1, touch2] = event.touches\n const distance = Math.hypot(touch1.clientX - touch2.clientX, touch1.clientY - touch2.clientY)\n if (lastPinchDistance.value !== null) {\n beginAdjust()\n zoomAtPoint(\n (distance - lastPinchDistance.value) * 0.01,\n (touch1.clientX + touch2.clientX) / 2,\n (touch1.clientY + touch2.clientY) / 2,\n )\n }\n lastPinchDistance.value = distance\n }\n const handleTouchEnd = () => {\n lastPinchDistance.value = null\n }\n const handleClick = (event: MouseEvent) => {\n if (!enabled() || event.detail > 1) return\n if (didDrag.value) {\n didDrag.value = false\n return\n }\n\n const pointerType = lastPointerType.value\n lastPointerType.value = 'mouse'\n lastClickPointerType.value = pointerType\n if (pointerType !== 'touch') toggleZoom()\n }\n const handleDoubleClick = () => {\n if (enabled() && lastClickPointerType.value === 'touch') toggleZoom()\n }\n\n const imageStyle = computed<CSSProperties>(() => ({\n transform: `scale(${state.scale}) translate(${state.translateX / state.scale}px, ${state.translateY / state.scale}px)`,\n }))\n const publicState = computed(() => ({ scale: state.scale, isZoomed: state.isZoomed }))\n const getImageProps = () => ({\n ref: setImageRef,\n style: imageStyle.value,\n 'data-zoom-enabled': enabled() || undefined,\n 'data-zoomed': state.isZoomed || undefined,\n 'data-dragging': isDragging.value || isAdjusting.value || undefined,\n onPointerdown: handlePointerDown,\n onPointermove: handlePointerMove,\n onPointerup: handlePointerUp,\n onPointercancel: handlePointerCancel,\n onLostpointercapture: handlePointerUp,\n onClick: handleClick,\n onDblclick: handleDoubleClick,\n onTouchmove: handleTouchMove,\n onTouchend: handleTouchEnd,\n })\n\n watch([currentIndex, enabled], ([, isEnabled]) => {\n if (!isEnabled || state.isZoomed) resetZoom()\n if (!isEnabled) {\n lastPinchDistance.value = null\n didDrag.value = false\n }\n })\n\n onBeforeUnmount(() => {\n window.clearTimeout(adjustTimeout)\n imageRef.value?.removeEventListener('wheel', handleWheel)\n })\n\n return { zoomState: publicState, toggleZoom, resetZoom, panZoom, getImageProps }\n}\n",".root {\n --lightbox-transition-duration: 200ms;\n --lightbox-overlay-color: rgba(0, 0, 0, 0.9);\n --lightbox-z-index: 400;\n --lightbox-toolbar-height: 56px;\n --lightbox-thumbnails-height: 100px;\n display: contents;\n}\n.overlay {\n position: fixed;\n inset: 0;\n z-index: var(--lightbox-z-index);\n background-color: var(--lightbox-overlay-color);\n}\n.content {\n position: fixed;\n inset: 0;\n z-index: var(--lightbox-z-index);\n display: flex;\n flex-direction: column;\n color: var(--mantine-color-white);\n outline: none;\n}\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--lightbox-toolbar-height);\n padding: 0 var(--mantine-spacing-md);\n flex-shrink: 0;\n z-index: 1;\n}\n.toolbarGroup {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-xs);\n}\n.toolbarButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: var(--mantine-radius-sm);\n color: var(--mantine-color-white);\n opacity: 0.8;\n transition:\n opacity var(--lightbox-transition-duration) ease,\n background-color var(--lightbox-transition-duration) ease;\n &:hover {\n opacity: 1;\n background-color: rgba(255, 255, 255, 0.1);\n }\n}\n.counter {\n font-size: var(--mantine-font-size-sm);\n color: var(--mantine-color-white);\n opacity: 0.8;\n user-select: none;\n}\n.slides {\n flex: 1;\n position: relative;\n overflow: hidden;\n min-height: 0;\n}\n.slidesViewport {\n height: 100%;\n overflow: hidden;\n touch-action: pan-y pinch-zoom;\n}\n.slidesContainer {\n display: flex;\n height: 100%;\n}\n.slide {\n position: relative;\n flex: 0 0 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mantine-spacing-md);\n min-width: 0;\n}\n.slideImage {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n user-select: none;\n -webkit-user-drag: none;\n transition: transform var(--lightbox-transition-duration) ease;\n &[data-zoom-enabled] {\n touch-action: none;\n }\n &[data-zoom-enabled]:not([data-zoomed]) {\n cursor: zoom-in;\n }\n &[data-zoomed] {\n cursor: grab;\n &:active {\n cursor: grabbing;\n }\n }\n &[data-dragging] {\n transition: none;\n }\n}\n.slideVideo {\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n.thumbnails {\n display: block;\n padding: 0 var(--mantine-spacing-md);\n flex-shrink: 0;\n overflow: hidden;\n}\n.thumbnailsViewport {\n width: fit-content;\n max-width: 100%;\n margin-inline: auto;\n height: var(--lightbox-thumbnails-height);\n overflow: hidden;\n}\n.thumbnailsContainer {\n display: flex;\n gap: var(--mantine-spacing-xs);\n height: 100%;\n align-items: center;\n}\n.thumbnail {\n flex: 0 0 auto;\n width: 64px;\n height: 64px;\n border-radius: var(--mantine-radius-sm);\n overflow: hidden;\n opacity: 0.5;\n border: 2px solid transparent;\n cursor: pointer;\n transition:\n opacity var(--lightbox-transition-duration) ease,\n border-color var(--lightbox-transition-duration) ease;\n padding: 0;\n background: none;\n &:hover {\n opacity: 0.8;\n }\n &[data-active] {\n opacity: 1;\n border-color: var(--mantine-primary-color-filled);\n }\n}\n.thumbnailImage {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.navigation {\n position: absolute;\n top: 50%;\n display: flex;\n justify-content: space-between;\n width: 100%;\n padding: 0 var(--mantine-spacing-md);\n pointer-events: none;\n transform: translateY(-50%);\n z-index: 1;\n}\n.navigationButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n color: var(--mantine-color-white);\n pointer-events: all;\n opacity: 0.7;\n transition: opacity var(--lightbox-transition-duration) ease;\n &:hover {\n opacity: 1;\n }\n &[data-inactive] {\n opacity: 0.3;\n pointer-events: none;\n }\n}\n.caption {\n text-align: center;\n padding: var(--mantine-spacing-xs) var(--mantine-spacing-md);\n font-size: var(--mantine-font-size-sm);\n color: var(--mantine-color-white);\n opacity: 0.8;\n flex-shrink: 0;\n}\n.closeButton {\n color: var(--mantine-color-white);\n}\n","<script lang=\"ts\">\nexport const lightboxRootDefaultProps = {\n withZoom: false,\n withThumbnails: false,\n withFullscreen: false,\n withDownload: false,\n loop: false,\n closeOnClickOutside: false,\n closeOnSwipeDown: true,\n withKeyboardEvents: true,\n returnFocus: true,\n withInitialFocusPlaceholder: true,\n withinPortal: true,\n transitionDuration: 200,\n zoomMaxScale: 3,\n withSlideTransition: false,\n} as const\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport {\n Box,\n FocusTrap,\n Transition as MantineTransition,\n VisuallyHidden,\n useDirection,\n useProps,\n useStyles,\n} from '@mantine-vue/core'\nimport { DEFAULT_LABELS } from '../default-labels'\nimport { provideLightboxContext } from '../lightbox.context'\nimport type {\n LightboxRootEmits,\n LightboxRootOwnProps,\n LightboxRootSlots,\n} from './LightboxRoot.types'\nimport { useLightboxZoom } from '../hooks/use-lightbox-zoom'\nimport classes from '../Lightbox.module.css'\n\ndefineOptions({ name: 'LightboxRoot', inheritAttrs: false })\nconst rawProps = withDefaults(defineProps<LightboxRootOwnProps>(), {\n currentIndex: undefined,\n labels: undefined,\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n zIndex: undefined,\n transitionDuration: undefined,\n transitionProps: undefined,\n emblaOptions: undefined,\n zoomMaxScale: undefined,\n withSlideTransition: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n})\ndefineSlots<LightboxRootSlots>()\nconst emit = defineEmits<LightboxRootEmits>()\nconst props = useProps('LightboxRoot', lightboxRootDefaultProps, rawProps)\nconst attrs = useAttrs()\nconst contentRef = ref<HTMLElement | null>(null)\nconst internalIndex = ref(props.currentIndex ?? 0)\nconst thumbnailsVisible = ref(Boolean(props.withThumbnails))\nconst isFullscreen = ref(false)\nconst ownsFullscreen = ref(false)\nconst { dir } = useDirection()\nlet previousActive: HTMLElement | null = null\nlet previousOverflow = ''\n\nconst labels = computed(() => ({ ...DEFAULT_LABELS, ...props.labels }))\nconst currentIndex = computed(() => props.currentIndex ?? internalIndex.value)\nconst currentSlideLabel = computed(() => {\n const slide = props.slides[currentIndex.value]\n if (!slide || slide.type === 'custom') return undefined\n return slide.type === 'video' ? slide.label : slide.alt\n})\nconst zoom = useLightboxZoom({\n enabled: () => props.withZoom!,\n maxScale: () => props.zoomMaxScale!,\n currentIndex: () => currentIndex.value,\n})\nconst getStyles = useStyles({\n name: 'Lightbox',\n props,\n classes,\n classNames: props.classNames as any,\n styles: props.styles as any,\n unstyled: props.unstyled,\n vars: props.vars as any,\n})\nconst rootStyle = computed(() => ({\n '--lightbox-transition-duration': `${props.transitionDuration}ms`,\n '--lightbox-z-index': props.zIndex == null ? undefined : String(props.zIndex),\n}))\nconst contentTransition = computed(() => ({\n transition: {\n common: { transformOrigin: 'center center' },\n in: { opacity: 1, transform: 'scale(1)' },\n out: { opacity: 0, transform: 'scale(0.95)' },\n transitionProperty: 'transform, opacity',\n },\n duration: props.transitionDuration,\n timingFunction: 'ease',\n ...props.transitionProps,\n}))\nconst overlayTransition = computed(() => ({\n transition: 'fade' as const,\n duration: contentTransition.value.duration,\n exitDuration: contentTransition.value.exitDuration,\n timingFunction: contentTransition.value.timingFunction,\n enterDelay: contentTransition.value.enterDelay,\n exitDelay: contentTransition.value.exitDelay,\n keepMounted: contentTransition.value.keepMounted,\n}))\nconst setIndex = (index: number) => {\n const next = Math.max(0, Math.min(Math.round(index), Math.max(0, props.slides.length - 1)))\n if (next === currentIndex.value) return\n internalIndex.value = next\n emit('update:currentIndex', next)\n emit('indexChange', next)\n}\nconst next = () =>\n setIndex(\n currentIndex.value + 1 < props.slides.length\n ? currentIndex.value + 1\n : props.loop && props.slides.length\n ? 0\n : currentIndex.value,\n )\nconst prev = () =>\n setIndex(\n currentIndex.value > 0\n ? currentIndex.value - 1\n : props.loop && props.slides.length\n ? props.slides.length - 1\n : 0,\n )\nconst close = () => {\n emit('update:opened', false)\n emit('close')\n}\nconst toggleThumbnails = () => {\n thumbnailsVisible.value = !thumbnailsVisible.value\n}\nconst toggleFullscreen = async () => {\n if (!props.withFullscreen || typeof document === 'undefined') return\n if (document.fullscreenElement) {\n ownsFullscreen.value = false\n await document.exitFullscreen?.()\n } else {\n await contentRef.value?.requestFullscreen?.()\n ownsFullscreen.value = document.fullscreenElement === contentRef.value\n }\n isFullscreen.value = Boolean(document.fullscreenElement)\n}\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!props.opened) return\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n return\n }\n if (\n !props.withKeyboardEvents ||\n event.defaultPrevented ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n )\n return\n\n if (event.target instanceof Element) {\n if (event.target.closest('input, textarea, select, video, audio, [contenteditable]')) return\n if (\n event.target.closest('[data-lightbox-slide]') &&\n event.target.closest(\n 'button, a[href], [role=\"button\"], [role=\"link\"], [role=\"slider\"], [role=\"textbox\"], [role=\"combobox\"], [role=\"listbox\"], [role=\"menu\"], [role=\"tablist\"], [role=\"tree\"], [role=\"grid\"]',\n )\n )\n return\n }\n\n const leading = dir.value === 'rtl' ? next : prev\n const trailing = dir.value === 'rtl' ? prev : next\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n if (!zoom.panZoom(50, 0)) leading()\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n if (!zoom.panZoom(-50, 0)) trailing()\n }\n if (event.key === 'ArrowUp' && zoom.panZoom(0, 50)) event.preventDefault()\n if (event.key === 'ArrowDown' && zoom.panZoom(0, -50)) event.preventDefault()\n if (event.key.toLowerCase() === 'f' && props.withFullscreen) {\n event.preventDefault()\n toggleFullscreen()\n }\n if (event.key.toLowerCase() === 't' && props.withThumbnails) {\n event.preventDefault()\n toggleThumbnails()\n }\n if (event.key.toLowerCase() === 'z' && props.withZoom) {\n event.preventDefault()\n zoom.toggleZoom()\n }\n}\nconst handleFullscreen = () => {\n isFullscreen.value = Boolean(document.fullscreenElement)\n if (!document.fullscreenElement) ownsFullscreen.value = false\n}\n\nwatch(\n () => props.currentIndex,\n (value) => {\n if (value != null) internalIndex.value = value\n },\n)\nwatch(\n () => props.withThumbnails,\n (value) => {\n thumbnailsVisible.value = Boolean(value)\n },\n)\nwatch(\n () => props.slides.length,\n (length) => {\n if (length > 0 && currentIndex.value > length - 1) setIndex(length - 1)\n },\n)\nwatch(\n () => props.opened,\n async (opened) => {\n if (typeof document === 'undefined') return\n if (opened) {\n previousActive = document.activeElement instanceof HTMLElement ? document.activeElement : null\n previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('fullscreenchange', handleFullscreen)\n await nextTick()\n contentRef.value?.focus({ preventScroll: true })\n } else {\n zoom.resetZoom()\n thumbnailsVisible.value = Boolean(props.withThumbnails)\n if (ownsFullscreen.value && document.fullscreenElement) {\n ownsFullscreen.value = false\n document.exitFullscreen?.().catch(() => {})\n }\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n if (props.returnFocus) previousActive?.focus({ preventScroll: true })\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n if (typeof document !== 'undefined') {\n if (ownsFullscreen.value && document.fullscreenElement)\n document.exitFullscreen?.().catch(() => {})\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n }\n})\n\nprovideLightboxContext({\n getStyles,\n get labels() {\n return labels.value\n },\n get opened() {\n return props.opened\n },\n get slides() {\n return props.slides\n },\n get currentIndex() {\n return currentIndex.value\n },\n setIndex,\n next,\n prev,\n close,\n get thumbnailsVisible() {\n return thumbnailsVisible.value\n },\n toggleThumbnails,\n get isFullscreen() {\n return isFullscreen.value\n },\n toggleFullscreen,\n get zoomed() {\n return zoom.zoomState.value.isZoomed\n },\n toggleZoom: zoom.toggleZoom,\n get zoomScale() {\n return zoom.zoomState.value.scale\n },\n panZoom: zoom.panZoom,\n getImageZoomProps: zoom.getImageProps,\n get withZoom() {\n return props.withZoom!\n },\n get withThumbnails() {\n return props.withThumbnails!\n },\n get withFullscreen() {\n return props.withFullscreen!\n },\n get withDownload() {\n return props.withDownload!\n },\n get loop() {\n return props.loop!\n },\n get closeOnSwipeDown() {\n return props.closeOnSwipeDown!\n },\n get closeOnClickOutside() {\n return props.closeOnClickOutside!\n },\n get withSlideTransition() {\n return props.withSlideTransition!\n },\n get transitionDuration() {\n return props.transitionDuration!\n },\n get emblaOptions() {\n return props.emblaOptions\n },\n})\n</script>\n\n<template>\n <Teleport to=\"body\" :disabled=\"!props.withinPortal\">\n <Box v-bind=\"getStyles('root')\" :style=\"rootStyle\">\n <MantineTransition :mounted=\"props.opened\" v-bind=\"overlayTransition\">\n <template #default=\"transitionStyles\">\n <div\n v-bind=\"getStyles('overlay', { style: transitionStyles })\"\n @click=\"props.closeOnClickOutside ? close() : undefined\"\n />\n </template>\n </MantineTransition>\n <MantineTransition :mounted=\"props.opened\" v-bind=\"contentTransition\">\n <template #default=\"transitionStyles\">\n <FocusTrap :active=\"props.opened\">\n <div\n ref=\"contentRef\"\n v-bind=\"{ ...attrs, ...getStyles('content', { style: transitionStyles }) }\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"labels.lightboxLabel\"\n tabindex=\"-1\"\n @click.self=\"props.closeOnClickOutside ? close() : undefined\"\n >\n <span\n v-if=\"props.withInitialFocusPlaceholder\"\n data-autofocus\n tabindex=\"0\"\n style=\"position: fixed; width: 1px; height: 1px; overflow: hidden\"\n />\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <template v-if=\"props.slides.length\">\n {{ labels.slideLabel(currentIndex + 1, props.slides.length)\n }}<template v-if=\"currentSlideLabel\">: {{ currentSlideLabel }}</template>\n </template>\n </VisuallyHidden>\n <slot />\n </div>\n </FocusTrap>\n </template>\n </MantineTransition>\n </Box>\n </Teleport>\n</template>\n","<script lang=\"ts\">\nexport const lightboxRootDefaultProps = {\n withZoom: false,\n withThumbnails: false,\n withFullscreen: false,\n withDownload: false,\n loop: false,\n closeOnClickOutside: false,\n closeOnSwipeDown: true,\n withKeyboardEvents: true,\n returnFocus: true,\n withInitialFocusPlaceholder: true,\n withinPortal: true,\n transitionDuration: 200,\n zoomMaxScale: 3,\n withSlideTransition: false,\n} as const\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport {\n Box,\n FocusTrap,\n Transition as MantineTransition,\n VisuallyHidden,\n useDirection,\n useProps,\n useStyles,\n} from '@mantine-vue/core'\nimport { DEFAULT_LABELS } from '../default-labels'\nimport { provideLightboxContext } from '../lightbox.context'\nimport type {\n LightboxRootEmits,\n LightboxRootOwnProps,\n LightboxRootSlots,\n} from './LightboxRoot.types'\nimport { useLightboxZoom } from '../hooks/use-lightbox-zoom'\nimport classes from '../Lightbox.module.css'\n\ndefineOptions({ name: 'LightboxRoot', inheritAttrs: false })\nconst rawProps = withDefaults(defineProps<LightboxRootOwnProps>(), {\n currentIndex: undefined,\n labels: undefined,\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n zIndex: undefined,\n transitionDuration: undefined,\n transitionProps: undefined,\n emblaOptions: undefined,\n zoomMaxScale: undefined,\n withSlideTransition: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n})\ndefineSlots<LightboxRootSlots>()\nconst emit = defineEmits<LightboxRootEmits>()\nconst props = useProps('LightboxRoot', lightboxRootDefaultProps, rawProps)\nconst attrs = useAttrs()\nconst contentRef = ref<HTMLElement | null>(null)\nconst internalIndex = ref(props.currentIndex ?? 0)\nconst thumbnailsVisible = ref(Boolean(props.withThumbnails))\nconst isFullscreen = ref(false)\nconst ownsFullscreen = ref(false)\nconst { dir } = useDirection()\nlet previousActive: HTMLElement | null = null\nlet previousOverflow = ''\n\nconst labels = computed(() => ({ ...DEFAULT_LABELS, ...props.labels }))\nconst currentIndex = computed(() => props.currentIndex ?? internalIndex.value)\nconst currentSlideLabel = computed(() => {\n const slide = props.slides[currentIndex.value]\n if (!slide || slide.type === 'custom') return undefined\n return slide.type === 'video' ? slide.label : slide.alt\n})\nconst zoom = useLightboxZoom({\n enabled: () => props.withZoom!,\n maxScale: () => props.zoomMaxScale!,\n currentIndex: () => currentIndex.value,\n})\nconst getStyles = useStyles({\n name: 'Lightbox',\n props,\n classes,\n classNames: props.classNames as any,\n styles: props.styles as any,\n unstyled: props.unstyled,\n vars: props.vars as any,\n})\nconst rootStyle = computed(() => ({\n '--lightbox-transition-duration': `${props.transitionDuration}ms`,\n '--lightbox-z-index': props.zIndex == null ? undefined : String(props.zIndex),\n}))\nconst contentTransition = computed(() => ({\n transition: {\n common: { transformOrigin: 'center center' },\n in: { opacity: 1, transform: 'scale(1)' },\n out: { opacity: 0, transform: 'scale(0.95)' },\n transitionProperty: 'transform, opacity',\n },\n duration: props.transitionDuration,\n timingFunction: 'ease',\n ...props.transitionProps,\n}))\nconst overlayTransition = computed(() => ({\n transition: 'fade' as const,\n duration: contentTransition.value.duration,\n exitDuration: contentTransition.value.exitDuration,\n timingFunction: contentTransition.value.timingFunction,\n enterDelay: contentTransition.value.enterDelay,\n exitDelay: contentTransition.value.exitDelay,\n keepMounted: contentTransition.value.keepMounted,\n}))\nconst setIndex = (index: number) => {\n const next = Math.max(0, Math.min(Math.round(index), Math.max(0, props.slides.length - 1)))\n if (next === currentIndex.value) return\n internalIndex.value = next\n emit('update:currentIndex', next)\n emit('indexChange', next)\n}\nconst next = () =>\n setIndex(\n currentIndex.value + 1 < props.slides.length\n ? currentIndex.value + 1\n : props.loop && props.slides.length\n ? 0\n : currentIndex.value,\n )\nconst prev = () =>\n setIndex(\n currentIndex.value > 0\n ? currentIndex.value - 1\n : props.loop && props.slides.length\n ? props.slides.length - 1\n : 0,\n )\nconst close = () => {\n emit('update:opened', false)\n emit('close')\n}\nconst toggleThumbnails = () => {\n thumbnailsVisible.value = !thumbnailsVisible.value\n}\nconst toggleFullscreen = async () => {\n if (!props.withFullscreen || typeof document === 'undefined') return\n if (document.fullscreenElement) {\n ownsFullscreen.value = false\n await document.exitFullscreen?.()\n } else {\n await contentRef.value?.requestFullscreen?.()\n ownsFullscreen.value = document.fullscreenElement === contentRef.value\n }\n isFullscreen.value = Boolean(document.fullscreenElement)\n}\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!props.opened) return\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n return\n }\n if (\n !props.withKeyboardEvents ||\n event.defaultPrevented ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n )\n return\n\n if (event.target instanceof Element) {\n if (event.target.closest('input, textarea, select, video, audio, [contenteditable]')) return\n if (\n event.target.closest('[data-lightbox-slide]') &&\n event.target.closest(\n 'button, a[href], [role=\"button\"], [role=\"link\"], [role=\"slider\"], [role=\"textbox\"], [role=\"combobox\"], [role=\"listbox\"], [role=\"menu\"], [role=\"tablist\"], [role=\"tree\"], [role=\"grid\"]',\n )\n )\n return\n }\n\n const leading = dir.value === 'rtl' ? next : prev\n const trailing = dir.value === 'rtl' ? prev : next\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n if (!zoom.panZoom(50, 0)) leading()\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n if (!zoom.panZoom(-50, 0)) trailing()\n }\n if (event.key === 'ArrowUp' && zoom.panZoom(0, 50)) event.preventDefault()\n if (event.key === 'ArrowDown' && zoom.panZoom(0, -50)) event.preventDefault()\n if (event.key.toLowerCase() === 'f' && props.withFullscreen) {\n event.preventDefault()\n toggleFullscreen()\n }\n if (event.key.toLowerCase() === 't' && props.withThumbnails) {\n event.preventDefault()\n toggleThumbnails()\n }\n if (event.key.toLowerCase() === 'z' && props.withZoom) {\n event.preventDefault()\n zoom.toggleZoom()\n }\n}\nconst handleFullscreen = () => {\n isFullscreen.value = Boolean(document.fullscreenElement)\n if (!document.fullscreenElement) ownsFullscreen.value = false\n}\n\nwatch(\n () => props.currentIndex,\n (value) => {\n if (value != null) internalIndex.value = value\n },\n)\nwatch(\n () => props.withThumbnails,\n (value) => {\n thumbnailsVisible.value = Boolean(value)\n },\n)\nwatch(\n () => props.slides.length,\n (length) => {\n if (length > 0 && currentIndex.value > length - 1) setIndex(length - 1)\n },\n)\nwatch(\n () => props.opened,\n async (opened) => {\n if (typeof document === 'undefined') return\n if (opened) {\n previousActive = document.activeElement instanceof HTMLElement ? document.activeElement : null\n previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('fullscreenchange', handleFullscreen)\n await nextTick()\n contentRef.value?.focus({ preventScroll: true })\n } else {\n zoom.resetZoom()\n thumbnailsVisible.value = Boolean(props.withThumbnails)\n if (ownsFullscreen.value && document.fullscreenElement) {\n ownsFullscreen.value = false\n document.exitFullscreen?.().catch(() => {})\n }\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n if (props.returnFocus) previousActive?.focus({ preventScroll: true })\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n if (typeof document !== 'undefined') {\n if (ownsFullscreen.value && document.fullscreenElement)\n document.exitFullscreen?.().catch(() => {})\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n }\n})\n\nprovideLightboxContext({\n getStyles,\n get labels() {\n return labels.value\n },\n get opened() {\n return props.opened\n },\n get slides() {\n return props.slides\n },\n get currentIndex() {\n return currentIndex.value\n },\n setIndex,\n next,\n prev,\n close,\n get thumbnailsVisible() {\n return thumbnailsVisible.value\n },\n toggleThumbnails,\n get isFullscreen() {\n return isFullscreen.value\n },\n toggleFullscreen,\n get zoomed() {\n return zoom.zoomState.value.isZoomed\n },\n toggleZoom: zoom.toggleZoom,\n get zoomScale() {\n return zoom.zoomState.value.scale\n },\n panZoom: zoom.panZoom,\n getImageZoomProps: zoom.getImageProps,\n get withZoom() {\n return props.withZoom!\n },\n get withThumbnails() {\n return props.withThumbnails!\n },\n get withFullscreen() {\n return props.withFullscreen!\n },\n get withDownload() {\n return props.withDownload!\n },\n get loop() {\n return props.loop!\n },\n get closeOnSwipeDown() {\n return props.closeOnSwipeDown!\n },\n get closeOnClickOutside() {\n return props.closeOnClickOutside!\n },\n get withSlideTransition() {\n return props.withSlideTransition!\n },\n get transitionDuration() {\n return props.transitionDuration!\n },\n get emblaOptions() {\n return props.emblaOptions\n },\n})\n</script>\n\n<template>\n <Teleport to=\"body\" :disabled=\"!props.withinPortal\">\n <Box v-bind=\"getStyles('root')\" :style=\"rootStyle\">\n <MantineTransition :mounted=\"props.opened\" v-bind=\"overlayTransition\">\n <template #default=\"transitionStyles\">\n <div\n v-bind=\"getStyles('overlay', { style: transitionStyles })\"\n @click=\"props.closeOnClickOutside ? close() : undefined\"\n />\n </template>\n </MantineTransition>\n <MantineTransition :mounted=\"props.opened\" v-bind=\"contentTransition\">\n <template #default=\"transitionStyles\">\n <FocusTrap :active=\"props.opened\">\n <div\n ref=\"contentRef\"\n v-bind=\"{ ...attrs, ...getStyles('content', { style: transitionStyles }) }\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"labels.lightboxLabel\"\n tabindex=\"-1\"\n @click.self=\"props.closeOnClickOutside ? close() : undefined\"\n >\n <span\n v-if=\"props.withInitialFocusPlaceholder\"\n data-autofocus\n tabindex=\"0\"\n style=\"position: fixed; width: 1px; height: 1px; overflow: hidden\"\n />\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <template v-if=\"props.slides.length\">\n {{ labels.slideLabel(currentIndex + 1, props.slides.length)\n }}<template v-if=\"currentSlideLabel\">: {{ currentSlideLabel }}</template>\n </template>\n </VisuallyHidden>\n <slot />\n </div>\n </FocusTrap>\n </template>\n </MantineTransition>\n </Box>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, useAttrs, watch } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxCustomSlide, LightboxImageSlide, LightboxVideoSlide } from '../types'\nimport type { LightboxSlideProps, LightboxSlideSlots } from './LightboxSlide.types'\ndefineOptions({ name: 'LightboxSlide', inheritAttrs: false })\nconst props = defineProps<LightboxSlideProps>()\ndefineSlots<LightboxSlideSlots>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst active = computed(() => props.index === ctx.currentIndex)\nconst image = computed(() => props.slide as LightboxImageSlide)\nconst video = computed(() => props.slide as LightboxVideoSlide)\nconst custom = computed(() => props.slide as LightboxCustomSlide)\nconst videoRef = ref<HTMLVideoElement | null>(null)\n\nwatch(\n active,\n (isActive) => {\n if (!videoRef.value) {\n return\n }\n\n if (!isActive) {\n videoRef.value.pause()\n } else if (video.value.autoPlay) {\n videoRef.value.play().catch(() => {})\n }\n },\n { flush: 'post' },\n)\n\nfunction handleClick(event: MouseEvent) {\n if (ctx.closeOnClickOutside && !event.defaultPrevented && event.target === event.currentTarget) {\n ctx.close()\n }\n}\n</script>\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slide') }\"\n role=\"group\"\n aria-roledescription=\"slide\"\n data-lightbox-slide\n :aria-label=\"ctx.labels.slideLabel(index + 1, ctx.slides.length)\"\n :aria-hidden=\"!active || undefined\"\n :inert=\"!active || undefined\"\n @click=\"handleClick\"\n >\n <slot :slide=\"slide\" :active=\"active\">\n <component :is=\"() => custom.render({ active })\" v-if=\"slide.type === 'custom'\" />\n <video\n ref=\"videoRef\"\n v-else-if=\"slide.type === 'video'\"\n v-bind=\"ctx.getStyles('slideVideo')\"\n :src=\"video.src\"\n :poster=\"video.poster\"\n :aria-label=\"video.label\"\n :autoplay=\"video.autoPlay && active\"\n controls\n :tabindex=\"active ? 0 : -1\"\n >\n <track\n v-for=\"track in video.tracks\"\n :key=\"`${track.src}-${track.srcLang}`\"\n :src=\"track.src\"\n :kind=\"track.kind ?? 'subtitles'\"\n :srclang=\"track.srcLang\"\n :label=\"track.label\"\n :default=\"track.default\"\n />\n </video>\n <img\n v-else\n v-bind=\"{\n ...ctx.getStyles('slideImage'),\n ...(active && ctx.withZoom ? ctx.getImageZoomProps() : {}),\n }\"\n :src=\"image.src\"\n :alt=\"image.alt ?? ''\"\n :srcset=\"image.srcSet\"\n :sizes=\"image.sizes\"\n :loading=\"image.loading ?? (active ? 'eager' : 'lazy')\"\n draggable=\"false\"\n />\n </slot>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, useAttrs, watch } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxCustomSlide, LightboxImageSlide, LightboxVideoSlide } from '../types'\nimport type { LightboxSlideProps, LightboxSlideSlots } from './LightboxSlide.types'\ndefineOptions({ name: 'LightboxSlide', inheritAttrs: false })\nconst props = defineProps<LightboxSlideProps>()\ndefineSlots<LightboxSlideSlots>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst active = computed(() => props.index === ctx.currentIndex)\nconst image = computed(() => props.slide as LightboxImageSlide)\nconst video = computed(() => props.slide as LightboxVideoSlide)\nconst custom = computed(() => props.slide as LightboxCustomSlide)\nconst videoRef = ref<HTMLVideoElement | null>(null)\n\nwatch(\n active,\n (isActive) => {\n if (!videoRef.value) {\n return\n }\n\n if (!isActive) {\n videoRef.value.pause()\n } else if (video.value.autoPlay) {\n videoRef.value.play().catch(() => {})\n }\n },\n { flush: 'post' },\n)\n\nfunction handleClick(event: MouseEvent) {\n if (ctx.closeOnClickOutside && !event.defaultPrevented && event.target === event.currentTarget) {\n ctx.close()\n }\n}\n</script>\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slide') }\"\n role=\"group\"\n aria-roledescription=\"slide\"\n data-lightbox-slide\n :aria-label=\"ctx.labels.slideLabel(index + 1, ctx.slides.length)\"\n :aria-hidden=\"!active || undefined\"\n :inert=\"!active || undefined\"\n @click=\"handleClick\"\n >\n <slot :slide=\"slide\" :active=\"active\">\n <component :is=\"() => custom.render({ active })\" v-if=\"slide.type === 'custom'\" />\n <video\n ref=\"videoRef\"\n v-else-if=\"slide.type === 'video'\"\n v-bind=\"ctx.getStyles('slideVideo')\"\n :src=\"video.src\"\n :poster=\"video.poster\"\n :aria-label=\"video.label\"\n :autoplay=\"video.autoPlay && active\"\n controls\n :tabindex=\"active ? 0 : -1\"\n >\n <track\n v-for=\"track in video.tracks\"\n :key=\"`${track.src}-${track.srcLang}`\"\n :src=\"track.src\"\n :kind=\"track.kind ?? 'subtitles'\"\n :srclang=\"track.srcLang\"\n :label=\"track.label\"\n :default=\"track.default\"\n />\n </video>\n <img\n v-else\n v-bind=\"{\n ...ctx.getStyles('slideImage'),\n ...(active && ctx.withZoom ? ctx.getImageZoomProps() : {}),\n }\"\n :src=\"image.src\"\n :alt=\"image.alt ?? ''\"\n :srcset=\"image.srcSet\"\n :sizes=\"image.sizes\"\n :loading=\"image.loading ?? (active ? 'eager' : 'lazy')\"\n draggable=\"false\"\n />\n </slot>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel'\nimport { Box, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\n\ndefineOptions({ name: 'LightboxSlides', inheritAttrs: false })\n\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst swipeStart = ref<{ x: number; y: number } | null>(null)\nconst startIndex = ctx.currentIndex\n\nconst options = computed<EmblaOptionsType>(() => {\n const userWatchDrag = ctx.emblaOptions?.watchDrag\n\n return {\n align: 'center',\n containScroll: false,\n direction: dir.value,\n ...ctx.emblaOptions,\n axis: 'x',\n loop: ctx.loop,\n startIndex,\n watchDrag: (api, event) => {\n if (ctx.zoomed) return false\n return typeof userWatchDrag === 'function'\n ? userWatchDrag(api, event)\n : (userWatchDrag ?? true)\n },\n }\n})\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction handleSelect(api: EmblaCarouselType) {\n const index = api.selectedScrollSnap()\n if (index !== ctx.currentIndex) ctx.setIndex(index)\n}\n\nwatch(\n emblaApi,\n (api, previousApi) => {\n previousApi?.off('select', handleSelect)\n api?.on('select', handleSelect)\n },\n { immediate: true },\n)\n\nwatch(\n () => ctx.currentIndex,\n (index) => {\n const api = emblaApi.value\n if (api && api.selectedScrollSnap() !== index) {\n api.scrollTo(index, !ctx.withSlideTransition)\n }\n },\n)\n\nfunction handlePointerDown(event: PointerEvent) {\n swipeStart.value = { x: event.clientX, y: event.clientY }\n}\n\nfunction handlePointerUp(event: PointerEvent) {\n if (!swipeStart.value || !ctx.closeOnSwipeDown || ctx.zoomed) return\n const x = event.clientX - swipeStart.value.x\n const y = event.clientY - swipeStart.value.y\n swipeStart.value = null\n if (y > 80 && y > Math.abs(x)) ctx.close()\n}\n\nonBeforeUnmount(() => emblaApi.value?.off('select', handleSelect))\n</script>\n\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slides') }\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n :aria-label=\"ctx.labels.slidesLabel\"\n >\n <div\n ref=\"emblaNode\"\n v-bind=\"ctx.getStyles('slidesViewport')\"\n @pointerdown=\"handlePointerDown\"\n @pointerup=\"handlePointerUp\"\n @pointercancel=\"swipeStart = null\"\n >\n <div v-bind=\"ctx.getStyles('slidesContainer')\"><slot /></div>\n </div>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel'\nimport { Box, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\n\ndefineOptions({ name: 'LightboxSlides', inheritAttrs: false })\n\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst swipeStart = ref<{ x: number; y: number } | null>(null)\nconst startIndex = ctx.currentIndex\n\nconst options = computed<EmblaOptionsType>(() => {\n const userWatchDrag = ctx.emblaOptions?.watchDrag\n\n return {\n align: 'center',\n containScroll: false,\n direction: dir.value,\n ...ctx.emblaOptions,\n axis: 'x',\n loop: ctx.loop,\n startIndex,\n watchDrag: (api, event) => {\n if (ctx.zoomed) return false\n return typeof userWatchDrag === 'function'\n ? userWatchDrag(api, event)\n : (userWatchDrag ?? true)\n },\n }\n})\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction handleSelect(api: EmblaCarouselType) {\n const index = api.selectedScrollSnap()\n if (index !== ctx.currentIndex) ctx.setIndex(index)\n}\n\nwatch(\n emblaApi,\n (api, previousApi) => {\n previousApi?.off('select', handleSelect)\n api?.on('select', handleSelect)\n },\n { immediate: true },\n)\n\nwatch(\n () => ctx.currentIndex,\n (index) => {\n const api = emblaApi.value\n if (api && api.selectedScrollSnap() !== index) {\n api.scrollTo(index, !ctx.withSlideTransition)\n }\n },\n)\n\nfunction handlePointerDown(event: PointerEvent) {\n swipeStart.value = { x: event.clientX, y: event.clientY }\n}\n\nfunction handlePointerUp(event: PointerEvent) {\n if (!swipeStart.value || !ctx.closeOnSwipeDown || ctx.zoomed) return\n const x = event.clientX - swipeStart.value.x\n const y = event.clientY - swipeStart.value.y\n swipeStart.value = null\n if (y > 80 && y > Math.abs(x)) ctx.close()\n}\n\nonBeforeUnmount(() => emblaApi.value?.off('select', handleSelect))\n</script>\n\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slides') }\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n :aria-label=\"ctx.labels.slidesLabel\"\n >\n <div\n ref=\"emblaNode\"\n v-bind=\"ctx.getStyles('slidesViewport')\"\n @pointerdown=\"handlePointerDown\"\n @pointerup=\"handlePointerUp\"\n @pointercancel=\"swipeStart = null\"\n >\n <div v-bind=\"ctx.getStyles('slidesContainer')\"><slot /></div>\n </div>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { Collapse, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxCustomSlide, LightboxSlideData } from '../types'\ndefineOptions({ name: 'LightboxThumbnails', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst options = computed<EmblaOptionsType>(() => ({\n containScroll: 'keepSnaps',\n dragFree: true,\n direction: dir.value,\n active: ctx.withThumbnails,\n}))\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction getThumbnailSource(slide: LightboxSlideData) {\n return (\n slide.thumbSrc ??\n (slide.type === 'video' ? slide.poster : undefined) ??\n (slide.type !== 'custom' ? slide.src : undefined)\n )\n}\n\nwatch([emblaApi, () => ctx.currentIndex], ([api, index]) => api?.scrollTo(index), {\n immediate: true,\n})\n</script>\n<template>\n <Collapse\n v-if=\"ctx.withThumbnails\"\n :expanded=\"ctx.thumbnailsVisible\"\n :transition-duration=\"ctx.transitionDuration\"\n :keep-mounted=\"false\"\n v-bind=\"{ ...attrs, ...ctx.getStyles('thumbnails') }\"\n ><div ref=\"emblaNode\" v-bind=\"ctx.getStyles('thumbnailsViewport')\">\n <div v-bind=\"ctx.getStyles('thumbnailsContainer')\">\n <UnstyledButton\n v-for=\"(slide, index) in ctx.slides\"\n :key=\"index\"\n v-bind=\"ctx.getStyles('thumbnail')\"\n :data-active=\"index === ctx.currentIndex || undefined\"\n :aria-label=\"ctx.labels.thumbnailLabel(index + 1, ctx.slides.length)\"\n :aria-current=\"index === ctx.currentIndex || undefined\"\n @click=\"ctx.setIndex(index)\"\n ><component\n :is=\"() => (slide as LightboxCustomSlide).renderThumb?.()\"\n v-if=\"slide.type === 'custom' && slide.renderThumb\" /><img\n v-else-if=\"getThumbnailSource(slide)\"\n v-bind=\"ctx.getStyles('thumbnailImage')\"\n :src=\"getThumbnailSource(slide)\"\n alt=\"\"\n loading=\"lazy\"\n draggable=\"false\"\n /></UnstyledButton>\n </div></div\n ></Collapse>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { Collapse, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxCustomSlide, LightboxSlideData } from '../types'\ndefineOptions({ name: 'LightboxThumbnails', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst options = computed<EmblaOptionsType>(() => ({\n containScroll: 'keepSnaps',\n dragFree: true,\n direction: dir.value,\n active: ctx.withThumbnails,\n}))\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction getThumbnailSource(slide: LightboxSlideData) {\n return (\n slide.thumbSrc ??\n (slide.type === 'video' ? slide.poster : undefined) ??\n (slide.type !== 'custom' ? slide.src : undefined)\n )\n}\n\nwatch([emblaApi, () => ctx.currentIndex], ([api, index]) => api?.scrollTo(index), {\n immediate: true,\n})\n</script>\n<template>\n <Collapse\n v-if=\"ctx.withThumbnails\"\n :expanded=\"ctx.thumbnailsVisible\"\n :transition-duration=\"ctx.transitionDuration\"\n :keep-mounted=\"false\"\n v-bind=\"{ ...attrs, ...ctx.getStyles('thumbnails') }\"\n ><div ref=\"emblaNode\" v-bind=\"ctx.getStyles('thumbnailsViewport')\">\n <div v-bind=\"ctx.getStyles('thumbnailsContainer')\">\n <UnstyledButton\n v-for=\"(slide, index) in ctx.slides\"\n :key=\"index\"\n v-bind=\"ctx.getStyles('thumbnail')\"\n :data-active=\"index === ctx.currentIndex || undefined\"\n :aria-label=\"ctx.labels.thumbnailLabel(index + 1, ctx.slides.length)\"\n :aria-current=\"index === ctx.currentIndex || undefined\"\n @click=\"ctx.setIndex(index)\"\n ><component\n :is=\"() => (slide as LightboxCustomSlide).renderThumb?.()\"\n v-if=\"slide.type === 'custom' && slide.renderThumb\" /><img\n v-else-if=\"getThumbnailSource(slide)\"\n v-bind=\"ctx.getStyles('thumbnailImage')\"\n :src=\"getThumbnailSource(slide)\"\n alt=\"\"\n loading=\"lazy\"\n draggable=\"false\"\n /></UnstyledButton>\n </div></div\n ></Collapse>\n</template>\n","import { h } from 'vue'\nimport { DEFAULT_LABELS } from '../default-labels'\nimport type { LightboxLabels, ToolbarItem } from '../types'\n\nconst ALLOWED_DOWNLOAD_PROTOCOLS = ['http:', 'https:', 'blob:', 'data:']\nconst downloadsInProgress = new Set<string>()\n\nconst icon = (path: string) =>\n h(\n 'svg',\n { viewBox: '0 0 24 24', width: 20, height: 20, fill: 'currentColor', 'aria-hidden': 'true' },\n [h('path', { d: path })],\n )\n\nfunction parseDownloadUrl(src: string) {\n try {\n const url = new URL(src, window.location.href)\n return ALLOWED_DOWNLOAD_PROTOCOLS.includes(url.protocol) ? url : null\n } catch {\n return null\n }\n}\n\nfunction getDownloadFileName(url: URL) {\n if (url.protocol === 'data:') return 'download'\n const lastSegment = url.pathname.split('/').pop() || ''\n try {\n return decodeURIComponent(lastSegment) || 'download'\n } catch {\n return lastSegment || 'download'\n }\n}\n\nfunction openInNewTab(src: string) {\n const link = document.createElement('a')\n link.href = src\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n document.body.appendChild(link)\n link.click()\n link.remove()\n}\n\nfunction downloadFile(src: string) {\n const url = parseDownloadUrl(src)\n if (!url || downloadsInProgress.has(src)) return\n\n const isCrossOrigin =\n (url.protocol === 'http:' || url.protocol === 'https:') && url.origin !== window.location.origin\n\n if (isCrossOrigin) {\n openInNewTab(src)\n return\n }\n\n downloadsInProgress.add(src)\n fetch(src)\n .then((response) => {\n if (!response.ok) throw new Error(`Failed to download ${src}: ${response.status}`)\n return response.blob()\n })\n .then((blob) => {\n const objectUrl = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = objectUrl\n link.download = getDownloadFileName(url)\n document.body.appendChild(link)\n link.click()\n link.remove()\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 1000)\n })\n .catch(() => openInNewTab(src))\n .finally(() => downloadsInProgress.delete(src))\n}\n\nexport function createFullscreenToolbarItem(\n toggle: () => void,\n isFullscreen: boolean,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'fullscreen',\n icon: icon(\n isFullscreen\n ? 'M9 3v6H3V7h4V3h2zm6 0h2v4h4v2h-6V3zM3 15h6v6H7v-4H3v-2zm12 0h6v2h-4v4h-2v-6z'\n : 'M3 3h6v2H5v4H3V3zm12 0h6v6h-2V5h-4V3zM3 15h2v4h4v2H3v-6zm18 0v6h-6v-2h4v-4h2z',\n ),\n label: isFullscreen ? labels.exitFullscreenLabel : labels.enterFullscreenLabel,\n onClick: toggle,\n position: 'right',\n }\n}\nexport function createThumbnailsToolbarItem(\n toggle: () => void,\n visible: boolean,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'thumbnails',\n icon: icon('M3 3h8v8H3V3zm0 10h8v8H3v-8zm10-10h8v8h-8V3zm0 10h8v8h-8v-8z'),\n label: visible ? labels.hideThumbnailsLabel : labels.showThumbnailsLabel,\n onClick: toggle,\n position: 'left',\n }\n}\nexport function createDownloadToolbarItem(\n src: string,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'download',\n icon: icon('M12 16l-6-6h4V4h4v6h4l-6 6zm-8 2h16v2H4v-2z'),\n label: labels.downloadLabel,\n position: 'right',\n onClick: () => downloadFile(src),\n }\n}\nexport function createCloseToolbarItem(\n onClose: () => void,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'close',\n icon: icon(\n 'M18.3 5.7a1 1 0 0 0-1.4 0L12 10.6 7.1 5.7a1 1 0 0 0-1.4 1.4L10.6 12l-4.9 4.9a1 1 0 1 0 1.4 1.4L12 13.4l4.9 4.9a1 1 0 0 0 1.4-1.4L13.4 12l4.9-4.9a1 1 0 0 0 0-1.4z',\n ),\n label: labels.closeLabel,\n onClick: onClose,\n position: 'right',\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { ToolbarItem, ToolbarItems } from '../types'\nimport {\n createCloseToolbarItem,\n createDownloadToolbarItem,\n createFullscreenToolbarItem,\n createThumbnailsToolbarItem,\n} from './toolbar-items'\ndefineOptions({ name: 'LightboxToolbar', inheritAttrs: false })\nconst props = defineProps<{ toolbarItems?: ToolbarItems }>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst payload = computed(() => ({\n slides: ctx.slides,\n currentIndex: ctx.currentIndex,\n setIndex: ctx.setIndex,\n next: ctx.next,\n prev: ctx.prev,\n close: ctx.close,\n thumbnailsVisible: ctx.thumbnailsVisible,\n toggleThumbnails: ctx.toggleThumbnails,\n isFullscreen: ctx.isFullscreen,\n toggleFullscreen: ctx.toggleFullscreen,\n zoomed: ctx.zoomed,\n toggleZoom: ctx.toggleZoom,\n labels: ctx.labels,\n}))\nconst items = computed<ToolbarItem[]>(() => {\n if (typeof props.toolbarItems === 'function') return props.toolbarItems(payload.value)\n if (props.toolbarItems) return props.toolbarItems\n const result: ToolbarItem[] = []\n if (ctx.withThumbnails)\n result.push(\n createThumbnailsToolbarItem(ctx.toggleThumbnails, ctx.thumbnailsVisible, ctx.labels),\n )\n if (ctx.withFullscreen)\n result.push(createFullscreenToolbarItem(ctx.toggleFullscreen, ctx.isFullscreen, ctx.labels))\n const slide = ctx.slides[ctx.currentIndex]\n if (ctx.withDownload && slide && slide.type !== 'custom')\n result.push(createDownloadToolbarItem(slide.src, ctx.labels))\n result.push(createCloseToolbarItem(ctx.close, ctx.labels))\n return result\n})\nconst left = computed(() => items.value.filter((item) => item.position === 'left'))\nconst right = computed(() => items.value.filter((item) => item.position !== 'left'))\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('toolbar') }\"\n ><div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in left\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton>\n </div>\n <span v-bind=\"ctx.getStyles('counter')\" aria-hidden=\"true\">{{\n ctx.slides.length ? `${ctx.currentIndex + 1} / ${ctx.slides.length}` : ''\n }}</span>\n <div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in right\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton></div\n ></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { ToolbarItem, ToolbarItems } from '../types'\nimport {\n createCloseToolbarItem,\n createDownloadToolbarItem,\n createFullscreenToolbarItem,\n createThumbnailsToolbarItem,\n} from './toolbar-items'\ndefineOptions({ name: 'LightboxToolbar', inheritAttrs: false })\nconst props = defineProps<{ toolbarItems?: ToolbarItems }>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst payload = computed(() => ({\n slides: ctx.slides,\n currentIndex: ctx.currentIndex,\n setIndex: ctx.setIndex,\n next: ctx.next,\n prev: ctx.prev,\n close: ctx.close,\n thumbnailsVisible: ctx.thumbnailsVisible,\n toggleThumbnails: ctx.toggleThumbnails,\n isFullscreen: ctx.isFullscreen,\n toggleFullscreen: ctx.toggleFullscreen,\n zoomed: ctx.zoomed,\n toggleZoom: ctx.toggleZoom,\n labels: ctx.labels,\n}))\nconst items = computed<ToolbarItem[]>(() => {\n if (typeof props.toolbarItems === 'function') return props.toolbarItems(payload.value)\n if (props.toolbarItems) return props.toolbarItems\n const result: ToolbarItem[] = []\n if (ctx.withThumbnails)\n result.push(\n createThumbnailsToolbarItem(ctx.toggleThumbnails, ctx.thumbnailsVisible, ctx.labels),\n )\n if (ctx.withFullscreen)\n result.push(createFullscreenToolbarItem(ctx.toggleFullscreen, ctx.isFullscreen, ctx.labels))\n const slide = ctx.slides[ctx.currentIndex]\n if (ctx.withDownload && slide && slide.type !== 'custom')\n result.push(createDownloadToolbarItem(slide.src, ctx.labels))\n result.push(createCloseToolbarItem(ctx.close, ctx.labels))\n return result\n})\nconst left = computed(() => items.value.filter((item) => item.position === 'left'))\nconst right = computed(() => items.value.filter((item) => item.position !== 'left'))\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('toolbar') }\"\n ><div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in left\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton>\n </div>\n <span v-bind=\"ctx.getStyles('counter')\" aria-hidden=\"true\">{{\n ctx.slides.length ? `${ctx.currentIndex + 1} / ${ctx.slides.length}` : ''\n }}</span>\n <div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in right\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton></div\n ></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { LightboxCaption } from './LightboxCaption'\nimport { LightboxNavigation } from './LightboxNavigation'\nimport { LightboxRoot } from './LightboxRoot'\nimport { LightboxSlide } from './LightboxSlide'\nimport { LightboxSlides } from './LightboxSlides'\nimport { LightboxThumbnails } from './LightboxThumbnails'\nimport { LightboxToolbar } from './LightboxToolbar'\nimport type { LightboxSlots } from './Lightbox.props'\nimport type { LightboxLabels, LightboxSlideData, ToolbarItems } from './types'\ndefineOptions({ name: 'Lightbox', inheritAttrs: false })\ninterface RuntimeLightboxProps {\n opened: boolean\n slides: LightboxSlideData[]\n currentIndex?: number\n labels?: Partial<LightboxLabels>\n withZoom?: boolean\n withThumbnails?: boolean\n withFullscreen?: boolean\n withDownload?: boolean\n loop?: boolean\n closeOnClickOutside?: boolean\n closeOnSwipeDown?: boolean\n withKeyboardEvents?: boolean\n returnFocus?: boolean\n withInitialFocusPlaceholder?: boolean\n withinPortal?: boolean\n zIndex?: string | number\n transitionDuration?: number\n transitionProps?: Record<string, unknown>\n emblaOptions?: EmblaOptionsType\n zoomMaxScale?: number\n withSlideTransition?: boolean\n toolbarItems?: ToolbarItems\n withNavigation?: boolean\n classNames?: any\n styles?: any\n vars?: any\n unstyled?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProps>(), {\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n withSlideTransition: undefined,\n withNavigation: true,\n unstyled: undefined,\n})\nconst emit = defineEmits<{\n close: []\n 'update:opened': [opened: boolean]\n indexChange: [index: number]\n 'update:currentIndex': [index: number]\n}>()\ndefineSlots<LightboxSlots>()\nconst slots = useSlots()\nconst attrs = useAttrs()\n</script>\n<template>\n <LightboxRoot\n v-bind=\"{ ...attrs, ...props }\"\n @close=\"emit('close')\"\n @update:opened=\"emit('update:opened', $event)\"\n @index-change=\"emit('indexChange', $event)\"\n @update:current-index=\"emit('update:currentIndex', $event)\"\n ><slot\n ><LightboxToolbar :toolbar-items=\"props.toolbarItems\" /><LightboxSlides\n ><LightboxSlide\n v-for=\"(slide, index) in props.slides\"\n :key=\"index\"\n :slide=\"slide\"\n :index=\"index\"\n ><template v-if=\"slots.slide\" #default=\"payload\"\n ><slot\n name=\"slide\"\n v-bind=\"{ ...payload, index }\" /></template></LightboxSlide></LightboxSlides\n ><LightboxNavigation\n v-if=\"props.withNavigation\" /><LightboxCaption /><LightboxThumbnails /></slot\n ></LightboxRoot>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { LightboxCaption } from './LightboxCaption'\nimport { LightboxNavigation } from './LightboxNavigation'\nimport { LightboxRoot } from './LightboxRoot'\nimport { LightboxSlide } from './LightboxSlide'\nimport { LightboxSlides } from './LightboxSlides'\nimport { LightboxThumbnails } from './LightboxThumbnails'\nimport { LightboxToolbar } from './LightboxToolbar'\nimport type { LightboxSlots } from './Lightbox.props'\nimport type { LightboxLabels, LightboxSlideData, ToolbarItems } from './types'\ndefineOptions({ name: 'Lightbox', inheritAttrs: false })\ninterface RuntimeLightboxProps {\n opened: boolean\n slides: LightboxSlideData[]\n currentIndex?: number\n labels?: Partial<LightboxLabels>\n withZoom?: boolean\n withThumbnails?: boolean\n withFullscreen?: boolean\n withDownload?: boolean\n loop?: boolean\n closeOnClickOutside?: boolean\n closeOnSwipeDown?: boolean\n withKeyboardEvents?: boolean\n returnFocus?: boolean\n withInitialFocusPlaceholder?: boolean\n withinPortal?: boolean\n zIndex?: string | number\n transitionDuration?: number\n transitionProps?: Record<string, unknown>\n emblaOptions?: EmblaOptionsType\n zoomMaxScale?: number\n withSlideTransition?: boolean\n toolbarItems?: ToolbarItems\n withNavigation?: boolean\n classNames?: any\n styles?: any\n vars?: any\n unstyled?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProps>(), {\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n withSlideTransition: undefined,\n withNavigation: true,\n unstyled: undefined,\n})\nconst emit = defineEmits<{\n close: []\n 'update:opened': [opened: boolean]\n indexChange: [index: number]\n 'update:currentIndex': [index: number]\n}>()\ndefineSlots<LightboxSlots>()\nconst slots = useSlots()\nconst attrs = useAttrs()\n</script>\n<template>\n <LightboxRoot\n v-bind=\"{ ...attrs, ...props }\"\n @close=\"emit('close')\"\n @update:opened=\"emit('update:opened', $event)\"\n @index-change=\"emit('indexChange', $event)\"\n @update:current-index=\"emit('update:currentIndex', $event)\"\n ><slot\n ><LightboxToolbar :toolbar-items=\"props.toolbarItems\" /><LightboxSlides\n ><LightboxSlide\n v-for=\"(slide, index) in props.slides\"\n :key=\"index\"\n :slide=\"slide\"\n :index=\"index\"\n ><template v-if=\"slots.slide\" #default=\"payload\"\n ><slot\n name=\"slide\"\n v-bind=\"{ ...payload, index }\" /></template></LightboxSlide></LightboxSlides\n ><LightboxNavigation\n v-if=\"props.withNavigation\" /><LightboxCaption /><LightboxThumbnails /></slot\n ></LightboxRoot>\n</template>\n","import { shallowReactive } from 'vue'\nimport type { LightboxSlideData } from './types'\n\nexport interface LightboxState {\n opened: boolean\n slides: LightboxSlideData[]\n currentIndex: number\n loop: boolean\n}\n\nexport interface LightboxStore {\n state: LightboxState\n getState: () => LightboxState\n setState: (state: LightboxState) => void\n}\n\nconst clampIndex = (index: number, count: number) =>\n Math.max(0, Math.min(Number.isFinite(index) ? Math.round(index) : 0, Math.max(0, count - 1)))\n\nexport const createLightboxStore = (): LightboxStore => {\n const state = shallowReactive<LightboxState>({\n opened: false,\n slides: [],\n currentIndex: 0,\n loop: false,\n })\n return {\n state,\n getState: () => state,\n setState: (next) => Object.assign(state, next),\n }\n}\n\nexport const useLightboxStore = (store: LightboxStore) => store.state\n\nexport function updateLightboxStateAction(\n update: (state: LightboxState) => Partial<LightboxState>,\n store: LightboxStore,\n) {\n const state = store.getState()\n store.setState({ ...state, ...update(state) })\n}\n\nexport const openLightboxAction = (\n payload: { slides: LightboxSlideData[]; startIndex?: number },\n store: LightboxStore,\n) =>\n updateLightboxStateAction(\n () => ({\n opened: true,\n slides: payload.slides,\n currentIndex: clampIndex(payload.startIndex ?? 0, payload.slides.length),\n }),\n store,\n )\nexport const closeLightboxAction = (store: LightboxStore) =>\n updateLightboxStateAction(() => ({ opened: false }), store)\nexport const nextLightboxAction = (store: LightboxStore) => {\n updateLightboxStateAction((state) => {\n const next = state.currentIndex + 1\n return {\n currentIndex:\n next < state.slides.length\n ? next\n : state.loop && state.slides.length\n ? 0\n : state.currentIndex,\n }\n }, store)\n}\nexport const prevLightboxAction = (store: LightboxStore) => {\n updateLightboxStateAction((state) => {\n const prev = state.currentIndex - 1\n return {\n currentIndex:\n prev >= 0 ? prev : state.loop && state.slides.length ? state.slides.length - 1 : 0,\n }\n }, store)\n}\nexport const setLightboxIndexAction = (index: number, store: LightboxStore) => {\n updateLightboxStateAction(\n (state) => ({ currentIndex: clampIndex(index, state.slides.length) }),\n store,\n )\n}\n\nexport const lightboxActions = {\n open: openLightboxAction,\n close: closeLightboxAction,\n next: nextLightboxAction,\n prev: prevLightboxAction,\n setIndex: setLightboxIndexAction,\n updateState: updateLightboxStateAction,\n}\n\nexport function createLightbox() {\n const store = createLightboxStore()\n return [\n store,\n {\n open: (payload: { slides: LightboxSlideData[]; startIndex?: number }) =>\n openLightboxAction(payload, store),\n close: () => closeLightboxAction(store),\n next: () => nextLightboxAction(store),\n prev: () => prevLightboxAction(store),\n setIndex: (index: number) => setLightboxIndexAction(index, store),\n },\n ] as const\n}\n\nexport const [lightboxStore, lightbox] = createLightbox()\n","<script setup lang=\"ts\">\nimport { useAttrs } from 'vue'\nimport { UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCloseButton', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\n</script>\n<template>\n <UnstyledButton\n v-bind=\"{ ...attrs, ...ctx.getStyles('closeButton') }\"\n :aria-label=\"ctx.labels.closeLabel\"\n @click=\"ctx.close\"\n ><slot>×</slot></UnstyledButton\n >\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs } from 'vue'\nimport { UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCloseButton', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\n</script>\n<template>\n <UnstyledButton\n v-bind=\"{ ...attrs, ...ctx.getStyles('closeButton') }\"\n :aria-label=\"ctx.labels.closeLabel\"\n @click=\"ctx.close\"\n ><slot>×</slot></UnstyledButton\n >\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, watch } from 'vue'\nimport {\n lightboxActions,\n lightboxStore,\n useLightboxStore,\n type LightboxStore,\n} from '../lightbox.store'\nimport Lightbox from '../Lightbox.vue'\ndefineOptions({ name: 'LightboxProvider' })\ninterface RuntimeLightboxProviderProps {\n store?: LightboxStore\n loop?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProviderProps>(), {\n store: () => lightboxStore,\n loop: undefined,\n})\nconst attrs = useAttrs()\nconst state = useLightboxStore(props.store)\nwatch(\n () => props.loop,\n (loop) => props.store.setState({ ...props.store.getState(), loop: Boolean(loop) }),\n { immediate: true },\n)\n</script>\n<template>\n <Lightbox\n v-bind=\"{ ...attrs, loop: props.loop }\"\n :opened=\"state.opened\"\n :slides=\"state.slides\"\n :current-index=\"state.currentIndex\"\n @close=\"lightboxActions.close(props.store)\"\n @index-change=\"lightboxActions.setIndex($event, props.store)\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, watch } from 'vue'\nimport {\n lightboxActions,\n lightboxStore,\n useLightboxStore,\n type LightboxStore,\n} from '../lightbox.store'\nimport Lightbox from '../Lightbox.vue'\ndefineOptions({ name: 'LightboxProvider' })\ninterface RuntimeLightboxProviderProps {\n store?: LightboxStore\n loop?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProviderProps>(), {\n store: () => lightboxStore,\n loop: undefined,\n})\nconst attrs = useAttrs()\nconst state = useLightboxStore(props.store)\nwatch(\n () => props.loop,\n (loop) => props.store.setState({ ...props.store.getState(), loop: Boolean(loop) }),\n { immediate: true },\n)\n</script>\n<template>\n <Lightbox\n v-bind=\"{ ...attrs, loop: props.loop }\"\n :opened=\"state.opened\"\n :slides=\"state.slides\"\n :current-index=\"state.currentIndex\"\n @close=\"lightboxActions.close(props.store)\"\n @index-change=\"lightboxActions.setIndex($event, props.store)\"\n />\n</template>\n","import { factory } from '@mantine-vue/core'\nimport LightboxComponent from './Lightbox.vue'\nimport { lightbox } from './lightbox.store'\nimport { LightboxCaption } from './LightboxCaption'\nimport { LightboxCloseButton } from './LightboxCloseButton'\nimport { LightboxNavigation } from './LightboxNavigation'\nimport { LightboxProviderComponent } from './LightboxProvider'\nimport { LightboxRoot } from './LightboxRoot'\nimport { LightboxSlide } from './LightboxSlide'\nimport { LightboxSlides } from './LightboxSlides'\nimport { LightboxThumbnails } from './LightboxThumbnails'\nimport { LightboxToolbar } from './LightboxToolbar'\nimport type { LightboxFactory } from './Lightbox.props'\nimport classes from './Lightbox.module.css'\nexport const Lightbox = factory<LightboxFactory>(LightboxComponent, {\n classes,\n Root: LightboxRoot,\n Toolbar: LightboxToolbar,\n Slides: LightboxSlides,\n Slide: LightboxSlide,\n Thumbnails: LightboxThumbnails,\n Navigation: LightboxNavigation,\n Caption: LightboxCaption,\n CloseButton: LightboxCloseButton,\n Provider: LightboxProviderComponent,\n open: lightbox.open,\n close: lightbox.close,\n next: lightbox.next,\n prev: lightbox.prev,\n setIndex: lightbox.setIndex,\n})\nexport type {\n LightboxFactory,\n LightboxEmits,\n LightboxProps,\n LightboxSlots,\n LightboxStylesNames,\n} from './Lightbox.props'\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/lightbox.context.ts","../src/LightboxCaption/LightboxCaption.vue","../src/LightboxCaption/LightboxCaption.vue","../src/LightboxNavigation/LightboxNavigation.vue","../src/LightboxNavigation/LightboxNavigation.vue","../src/default-labels.ts","../src/hooks/use-lightbox-zoom.ts","../src/Lightbox.module.css","../src/LightboxRoot/LightboxRoot.vue","../src/LightboxRoot/LightboxRoot.vue","../src/LightboxSlide/LightboxSlide.vue","../src/LightboxSlide/LightboxSlide.vue","../src/LightboxSlides/LightboxSlides.vue","../src/LightboxSlides/LightboxSlides.vue","../src/LightboxThumbnails/LightboxThumbnails.vue","../src/LightboxThumbnails/LightboxThumbnails.vue","../src/LightboxToolbar/toolbar-items.ts","../src/LightboxToolbar/LightboxToolbar.vue","../src/LightboxToolbar/LightboxToolbar.vue","../src/Lightbox.vue","../src/Lightbox.vue","../src/lightbox.store.ts","../src/LightboxCloseButton/LightboxCloseButton.vue","../src/LightboxCloseButton/LightboxCloseButton.vue","../src/LightboxProvider/LightboxProvider.vue","../src/LightboxProvider/LightboxProvider.vue","../src/Lightbox.ts"],"sourcesContent":["import { createSafeContext } from '@mantine-vue/core'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport type { LightboxLabels, ToolbarItemsPayload } from './types'\n\nexport interface LightboxContextValue extends ToolbarItemsPayload {\n getStyles: (selector: string, options?: Record<string, any>) => Record<string, any>\n opened: boolean\n withZoom: boolean\n withThumbnails: boolean\n withFullscreen: boolean\n withDownload: boolean\n loop: boolean\n closeOnSwipeDown: boolean\n closeOnClickOutside: boolean\n withSlideTransition: boolean\n transitionDuration: number\n emblaOptions?: EmblaOptionsType\n labels: LightboxLabels\n zoomScale: number\n panZoom: (deltaX: number, deltaY: number) => boolean\n getImageZoomProps: () => Record<string, any>\n}\n\nexport const [provideLightboxContext, useLightboxContext] = createSafeContext<LightboxContextValue>(\n 'Lightbox component was not found in tree',\n)\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCaption', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst caption = computed(() => ctx.slides[ctx.currentIndex]?.caption)\n</script>\n<template>\n <Box v-if=\"caption\" v-bind=\"{ ...attrs, ...ctx.getStyles('caption') }\"\n ><component :is=\"() => caption\"\n /></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCaption', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst caption = computed(() => ctx.slides[ctx.currentIndex]?.caption)\n</script>\n<template>\n <Box v-if=\"caption\" v-bind=\"{ ...attrs, ...ctx.getStyles('caption') }\"\n ><component :is=\"() => caption\"\n /></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxNavigation', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst canPrev = computed(() => (ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex > 0))\nconst canNext = computed(() =>\n ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex < ctx.slides.length - 1,\n)\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('navigation') }\"\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canPrev || undefined\"\n :aria-disabled=\"!canPrev || undefined\"\n :aria-label=\"ctx.labels.previousSlideLabel\"\n :tabindex=\"canPrev ? 0 : -1\"\n @click=\"ctx.prev\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '9 18 15 12 9 6' : '15 18 9 12 15 6'\"\n /></svg></UnstyledButton\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canNext || undefined\"\n :aria-disabled=\"!canNext || undefined\"\n :aria-label=\"ctx.labels.nextSlideLabel\"\n :tabindex=\"canNext ? 0 : -1\"\n @click=\"ctx.next\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '15 18 9 12 15 6' : '9 18 15 12 9 6'\"\n /></svg></UnstyledButton\n ></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxNavigation', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst canPrev = computed(() => (ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex > 0))\nconst canNext = computed(() =>\n ctx.loop ? ctx.slides.length > 1 : ctx.currentIndex < ctx.slides.length - 1,\n)\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('navigation') }\"\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canPrev || undefined\"\n :aria-disabled=\"!canPrev || undefined\"\n :aria-label=\"ctx.labels.previousSlideLabel\"\n :tabindex=\"canPrev ? 0 : -1\"\n @click=\"ctx.prev\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '9 18 15 12 9 6' : '15 18 9 12 15 6'\"\n /></svg></UnstyledButton\n ><UnstyledButton\n v-bind=\"ctx.getStyles('navigationButton')\"\n :data-inactive=\"!canNext || undefined\"\n :aria-disabled=\"!canNext || undefined\"\n :aria-label=\"ctx.labels.nextSlideLabel\"\n :tabindex=\"canNext ? 0 : -1\"\n @click=\"ctx.next\"\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"36\"\n height=\"36\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline\n :points=\"dir === 'rtl' ? '15 18 9 12 15 6' : '9 18 15 12 9 6'\"\n /></svg></UnstyledButton\n ></Box>\n</template>\n","import type { LightboxLabels } from './types'\n\nexport const DEFAULT_LABELS: LightboxLabels = {\n lightboxLabel: 'Gallery',\n slideLabel: (index, total) => `Slide ${index} of ${total}`,\n slidesLabel: 'Slides',\n previousSlideLabel: 'Previous slide',\n nextSlideLabel: 'Next slide',\n thumbnailLabel: (index) => `Go to slide ${index}`,\n enterFullscreenLabel: 'Enter fullscreen',\n exitFullscreenLabel: 'Exit fullscreen',\n showThumbnailsLabel: 'Show thumbnails',\n hideThumbnailsLabel: 'Hide thumbnails',\n downloadLabel: 'Download',\n closeLabel: 'Close',\n}\n","import { computed, onBeforeUnmount, reactive, ref, watch, type CSSProperties } from 'vue'\n\nexport interface LightboxZoomState {\n scale: number\n translateX: number\n translateY: number\n isZoomed: boolean\n}\n\ninterface UseLightboxZoomInput {\n enabled: () => boolean\n maxScale: () => number\n currentIndex: () => number\n}\n\nconst INITIAL_ZOOM_STATE: LightboxZoomState = {\n scale: 1,\n translateX: 0,\n translateY: 0,\n isZoomed: false,\n}\n\nfunction clampTranslate(\n state: LightboxZoomState,\n image: HTMLImageElement | null,\n): LightboxZoomState {\n if (!image) return state\n\n const maxX = (image.offsetWidth * (state.scale - 1)) / 2\n const maxY = (image.offsetHeight * (state.scale - 1)) / 2\n\n return {\n ...state,\n translateX: Math.max(-maxX, Math.min(maxX, state.translateX)),\n translateY: Math.max(-maxY, Math.min(maxY, state.translateY)),\n }\n}\n\nexport function useLightboxZoom({ enabled, maxScale, currentIndex }: UseLightboxZoomInput) {\n const state = reactive<LightboxZoomState>({ ...INITIAL_ZOOM_STATE })\n const imageRef = ref<HTMLImageElement | null>(null)\n const isDragging = ref(false)\n const isAdjusting = ref(false)\n const didDrag = ref(false)\n const dragStart = { x: 0, y: 0 }\n const translateStart = { x: 0, y: 0 }\n const lastPinchDistance = ref<number | null>(null)\n const lastPointerType = ref('mouse')\n const lastClickPointerType = ref('mouse')\n let adjustTimeout = -1\n\n const setState = (next: LightboxZoomState) => Object.assign(state, next)\n const resetZoom = () => {\n setState(INITIAL_ZOOM_STATE)\n isDragging.value = false\n }\n const beginAdjust = () => {\n isAdjusting.value = true\n window.clearTimeout(adjustTimeout)\n adjustTimeout = window.setTimeout(() => {\n isAdjusting.value = false\n }, 120)\n }\n const toggleZoom = () => {\n if (!enabled()) return\n setState(\n state.isZoomed\n ? INITIAL_ZOOM_STATE\n : {\n scale: Math.min(2, maxScale()),\n translateX: 0,\n translateY: 0,\n isZoomed: true,\n },\n )\n }\n const zoomAtPoint = (deltaScale: number, clientX?: number, clientY?: number) => {\n const nextScale = Math.max(1, Math.min(maxScale(), state.scale + deltaScale))\n if (nextScale === 1) {\n resetZoom()\n return\n }\n\n const image = imageRef.value\n let translateX = state.translateX\n let translateY = state.translateY\n\n if (image && clientX !== undefined && clientY !== undefined) {\n const rect = image.getBoundingClientRect()\n const scaleRatio = nextScale / state.scale\n const offsetX = clientX - (rect.left + rect.width / 2) + state.translateX\n const offsetY = clientY - (rect.top + rect.height / 2) + state.translateY\n translateX = offsetX * (1 - scaleRatio) + state.translateX * scaleRatio\n translateY = offsetY * (1 - scaleRatio) + state.translateY * scaleRatio\n }\n\n setState(clampTranslate({ scale: nextScale, translateX, translateY, isZoomed: true }, image))\n }\n const panZoom = (deltaX: number, deltaY: number) => {\n if (!state.isZoomed) return false\n setState(\n clampTranslate(\n {\n ...state,\n translateX: state.translateX + deltaX,\n translateY: state.translateY + deltaY,\n },\n imageRef.value,\n ),\n )\n return true\n }\n const handleWheel = (event: WheelEvent) => {\n if (event.deltaY === 0) return\n event.preventDefault()\n beginAdjust()\n zoomAtPoint(event.deltaY > 0 ? -0.2 : 0.2, event.clientX, event.clientY)\n }\n const setImageRef = (node: unknown) => {\n imageRef.value?.removeEventListener('wheel', handleWheel)\n imageRef.value = node instanceof HTMLImageElement ? node : null\n imageRef.value?.addEventListener('wheel', handleWheel, { passive: false })\n }\n const handlePointerDown = (event: PointerEvent) => {\n lastPointerType.value = event.pointerType || 'mouse'\n if (!state.isZoomed || !enabled()) return\n\n isDragging.value = true\n didDrag.value = false\n dragStart.x = event.clientX\n dragStart.y = event.clientY\n translateStart.x = state.translateX\n translateStart.y = state.translateY\n if (typeof (event.target as HTMLElement | null)?.setPointerCapture === 'function') {\n ;(event.target as HTMLElement).setPointerCapture(event.pointerId)\n }\n }\n const handlePointerMove = (event: PointerEvent) => {\n if (!isDragging.value || !enabled()) return\n const dx = event.clientX - dragStart.x\n const dy = event.clientY - dragStart.y\n if (Math.abs(dx) > 3 || Math.abs(dy) > 3) didDrag.value = true\n setState(\n clampTranslate(\n {\n ...state,\n translateX: translateStart.x + dx,\n translateY: translateStart.y + dy,\n },\n imageRef.value,\n ),\n )\n }\n const handlePointerUp = () => {\n isDragging.value = false\n }\n const handlePointerCancel = () => {\n isDragging.value = false\n didDrag.value = false\n lastPinchDistance.value = null\n }\n const handleTouchMove = (event: TouchEvent) => {\n if (!enabled() || event.touches.length !== 2) {\n lastPinchDistance.value = null\n return\n }\n\n const [touch1, touch2] = event.touches\n const distance = Math.hypot(touch1.clientX - touch2.clientX, touch1.clientY - touch2.clientY)\n if (lastPinchDistance.value !== null) {\n beginAdjust()\n zoomAtPoint(\n (distance - lastPinchDistance.value) * 0.01,\n (touch1.clientX + touch2.clientX) / 2,\n (touch1.clientY + touch2.clientY) / 2,\n )\n }\n lastPinchDistance.value = distance\n }\n const handleTouchEnd = () => {\n lastPinchDistance.value = null\n }\n const handleClick = (event: MouseEvent) => {\n if (!enabled() || event.detail > 1) return\n if (didDrag.value) {\n didDrag.value = false\n return\n }\n\n const pointerType = lastPointerType.value\n lastPointerType.value = 'mouse'\n lastClickPointerType.value = pointerType\n if (pointerType !== 'touch') toggleZoom()\n }\n const handleDoubleClick = () => {\n if (enabled() && lastClickPointerType.value === 'touch') toggleZoom()\n }\n\n const imageStyle = computed<CSSProperties>(() => ({\n transform: `scale(${state.scale}) translate(${state.translateX / state.scale}px, ${state.translateY / state.scale}px)`,\n }))\n const publicState = computed(() => ({ scale: state.scale, isZoomed: state.isZoomed }))\n const getImageProps = () => ({\n ref: setImageRef,\n style: imageStyle.value,\n 'data-zoom-enabled': enabled() || undefined,\n 'data-zoomed': state.isZoomed || undefined,\n 'data-dragging': isDragging.value || isAdjusting.value || undefined,\n onPointerdown: handlePointerDown,\n onPointermove: handlePointerMove,\n onPointerup: handlePointerUp,\n onPointercancel: handlePointerCancel,\n onLostpointercapture: handlePointerUp,\n onClick: handleClick,\n onDblclick: handleDoubleClick,\n onTouchmove: handleTouchMove,\n onTouchend: handleTouchEnd,\n })\n\n watch([currentIndex, enabled], ([, isEnabled]) => {\n if (!isEnabled || state.isZoomed) resetZoom()\n if (!isEnabled) {\n lastPinchDistance.value = null\n didDrag.value = false\n }\n })\n\n onBeforeUnmount(() => {\n window.clearTimeout(adjustTimeout)\n imageRef.value?.removeEventListener('wheel', handleWheel)\n })\n\n return { zoomState: publicState, toggleZoom, resetZoom, panZoom, getImageProps }\n}\n",".root {\n --lightbox-transition-duration: 200ms;\n --lightbox-overlay-color: rgba(0, 0, 0, 0.9);\n --lightbox-z-index: 400;\n --lightbox-toolbar-height: 56px;\n --lightbox-thumbnails-height: 100px;\n display: contents;\n}\n.overlay {\n position: fixed;\n inset: 0;\n z-index: var(--lightbox-z-index);\n background-color: var(--lightbox-overlay-color);\n}\n.content {\n position: fixed;\n inset: 0;\n z-index: var(--lightbox-z-index);\n display: flex;\n flex-direction: column;\n color: var(--mantine-color-white);\n outline: none;\n}\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--lightbox-toolbar-height);\n padding: 0 var(--mantine-spacing-md);\n flex-shrink: 0;\n z-index: 1;\n}\n.toolbarGroup {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-xs);\n}\n.toolbarButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: var(--mantine-radius-sm);\n color: var(--mantine-color-white);\n opacity: 0.8;\n transition:\n opacity var(--lightbox-transition-duration) ease,\n background-color var(--lightbox-transition-duration) ease;\n &:hover {\n opacity: 1;\n background-color: rgba(255, 255, 255, 0.1);\n }\n}\n.counter {\n font-size: var(--mantine-font-size-sm);\n color: var(--mantine-color-white);\n opacity: 0.8;\n user-select: none;\n}\n.slides {\n flex: 1;\n position: relative;\n overflow: hidden;\n min-height: 0;\n}\n.slidesViewport {\n height: 100%;\n overflow: hidden;\n touch-action: pan-y pinch-zoom;\n}\n.slidesContainer {\n display: flex;\n height: 100%;\n}\n.slide {\n position: relative;\n flex: 0 0 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mantine-spacing-md);\n min-width: 0;\n}\n.slideImage {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n user-select: none;\n -webkit-user-drag: none;\n transition: transform var(--lightbox-transition-duration) ease;\n &[data-zoom-enabled] {\n touch-action: none;\n }\n &[data-zoom-enabled]:not([data-zoomed]) {\n cursor: zoom-in;\n }\n &[data-zoomed] {\n cursor: grab;\n &:active {\n cursor: grabbing;\n }\n }\n &[data-dragging] {\n transition: none;\n }\n}\n.slideVideo {\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n.thumbnails {\n display: block;\n padding: 0 var(--mantine-spacing-md);\n flex-shrink: 0;\n overflow: hidden;\n}\n.thumbnailsViewport {\n width: fit-content;\n max-width: 100%;\n margin-inline: auto;\n height: var(--lightbox-thumbnails-height);\n overflow: hidden;\n}\n.thumbnailsContainer {\n display: flex;\n gap: var(--mantine-spacing-xs);\n height: 100%;\n align-items: center;\n}\n.thumbnail {\n flex: 0 0 auto;\n width: 64px;\n height: 64px;\n border-radius: var(--mantine-radius-sm);\n overflow: hidden;\n opacity: 0.5;\n border: 2px solid transparent;\n cursor: pointer;\n transition:\n opacity var(--lightbox-transition-duration) ease,\n border-color var(--lightbox-transition-duration) ease;\n padding: 0;\n background: none;\n &:hover {\n opacity: 0.8;\n }\n &[data-active] {\n opacity: 1;\n border-color: var(--mantine-primary-color-filled);\n }\n}\n.thumbnailImage {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.navigation {\n position: absolute;\n top: 50%;\n display: flex;\n justify-content: space-between;\n width: 100%;\n padding: 0 var(--mantine-spacing-md);\n pointer-events: none;\n transform: translateY(-50%);\n z-index: 1;\n}\n.navigationButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n color: var(--mantine-color-white);\n pointer-events: all;\n opacity: 0.7;\n transition: opacity var(--lightbox-transition-duration) ease;\n &:hover {\n opacity: 1;\n }\n &[data-inactive] {\n opacity: 0.3;\n pointer-events: none;\n }\n}\n.caption {\n text-align: center;\n padding: var(--mantine-spacing-xs) var(--mantine-spacing-md);\n font-size: var(--mantine-font-size-sm);\n color: var(--mantine-color-white);\n opacity: 0.8;\n flex-shrink: 0;\n}\n.closeButton {\n color: var(--mantine-color-white);\n}\n","<script lang=\"ts\">\nexport const lightboxRootDefaultProps = {\n withZoom: false,\n withThumbnails: false,\n withFullscreen: false,\n withDownload: false,\n loop: false,\n closeOnClickOutside: false,\n closeOnSwipeDown: true,\n withKeyboardEvents: true,\n returnFocus: true,\n withInitialFocusPlaceholder: true,\n withinPortal: true,\n transitionDuration: 200,\n zoomMaxScale: 3,\n withSlideTransition: false,\n} as const\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport {\n Box,\n FocusTrap,\n Transition as MantineTransition,\n VisuallyHidden,\n useDirection,\n useProps,\n useStyles,\n} from '@mantine-vue/core'\nimport { DEFAULT_LABELS } from '../default-labels'\nimport { provideLightboxContext } from '../lightbox.context'\nimport type {\n LightboxRootEmits,\n LightboxRootOwnProps,\n LightboxRootSlots,\n} from './LightboxRoot.types'\nimport { useLightboxZoom } from '../hooks/use-lightbox-zoom'\nimport classes from '../Lightbox.module.css'\n\ndefineOptions({ name: 'LightboxRoot', inheritAttrs: false })\nconst rawProps = withDefaults(defineProps<LightboxRootOwnProps>(), {\n currentIndex: undefined,\n labels: undefined,\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n zIndex: undefined,\n transitionDuration: undefined,\n transitionProps: undefined,\n emblaOptions: undefined,\n zoomMaxScale: undefined,\n withSlideTransition: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n})\ndefineSlots<LightboxRootSlots>()\nconst emit = defineEmits<LightboxRootEmits>()\nconst props = useProps('LightboxRoot', lightboxRootDefaultProps, rawProps)\nconst attrs = useAttrs()\nconst contentRef = ref<HTMLElement | null>(null)\nconst internalIndex = ref(props.currentIndex ?? 0)\nconst thumbnailsVisible = ref(Boolean(props.withThumbnails))\nconst isFullscreen = ref(false)\nconst ownsFullscreen = ref(false)\nconst { dir } = useDirection()\nlet previousActive: HTMLElement | null = null\nlet previousOverflow = ''\n\nconst labels = computed(() => ({ ...DEFAULT_LABELS, ...props.labels }))\nconst currentIndex = computed(() => props.currentIndex ?? internalIndex.value)\nconst currentSlideLabel = computed(() => {\n const slide = props.slides[currentIndex.value]\n if (!slide || slide.type === 'custom') return undefined\n return slide.type === 'video' ? slide.label : slide.alt\n})\nconst zoom = useLightboxZoom({\n enabled: () => props.withZoom!,\n maxScale: () => props.zoomMaxScale!,\n currentIndex: () => currentIndex.value,\n})\nconst getStyles = useStyles({\n name: 'Lightbox',\n props,\n classes,\n classNames: props.classNames as any,\n styles: props.styles as any,\n unstyled: props.unstyled,\n vars: props.vars as any,\n})\nconst rootStyle = computed(() => ({\n '--lightbox-transition-duration': `${props.transitionDuration}ms`,\n '--lightbox-z-index': props.zIndex == null ? undefined : String(props.zIndex),\n}))\nconst contentTransition = computed(() => ({\n transition: {\n common: { transformOrigin: 'center center' },\n in: { opacity: 1, transform: 'scale(1)' },\n out: { opacity: 0, transform: 'scale(0.95)' },\n transitionProperty: 'transform, opacity',\n },\n duration: props.transitionDuration,\n timingFunction: 'ease',\n ...props.transitionProps,\n}))\nconst overlayTransition = computed(() => ({\n transition: 'fade' as const,\n duration: contentTransition.value.duration,\n exitDuration: contentTransition.value.exitDuration,\n timingFunction: contentTransition.value.timingFunction,\n enterDelay: contentTransition.value.enterDelay,\n exitDelay: contentTransition.value.exitDelay,\n keepMounted: contentTransition.value.keepMounted,\n}))\nconst setIndex = (index: number) => {\n const next = Math.max(0, Math.min(Math.round(index), Math.max(0, props.slides.length - 1)))\n if (next === currentIndex.value) return\n internalIndex.value = next\n emit('update:currentIndex', next)\n emit('indexChange', next)\n}\nconst next = () =>\n setIndex(\n currentIndex.value + 1 < props.slides.length\n ? currentIndex.value + 1\n : props.loop && props.slides.length\n ? 0\n : currentIndex.value,\n )\nconst prev = () =>\n setIndex(\n currentIndex.value > 0\n ? currentIndex.value - 1\n : props.loop && props.slides.length\n ? props.slides.length - 1\n : 0,\n )\nconst close = () => {\n emit('update:opened', false)\n emit('close')\n}\nconst toggleThumbnails = () => {\n thumbnailsVisible.value = !thumbnailsVisible.value\n}\nconst toggleFullscreen = async () => {\n if (!props.withFullscreen || typeof document === 'undefined') return\n if (document.fullscreenElement) {\n ownsFullscreen.value = false\n await document.exitFullscreen?.()\n } else {\n await contentRef.value?.requestFullscreen?.()\n ownsFullscreen.value = document.fullscreenElement === contentRef.value\n }\n isFullscreen.value = Boolean(document.fullscreenElement)\n}\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!props.opened) return\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n return\n }\n if (\n !props.withKeyboardEvents ||\n event.defaultPrevented ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n )\n return\n\n if (event.target instanceof Element) {\n if (event.target.closest('input, textarea, select, video, audio, [contenteditable]')) return\n if (\n event.target.closest('[data-lightbox-slide]') &&\n event.target.closest(\n 'button, a[href], [role=\"button\"], [role=\"link\"], [role=\"slider\"], [role=\"textbox\"], [role=\"combobox\"], [role=\"listbox\"], [role=\"menu\"], [role=\"tablist\"], [role=\"tree\"], [role=\"grid\"]',\n )\n )\n return\n }\n\n const leading = dir.value === 'rtl' ? next : prev\n const trailing = dir.value === 'rtl' ? prev : next\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n if (!zoom.panZoom(50, 0)) leading()\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n if (!zoom.panZoom(-50, 0)) trailing()\n }\n if (event.key === 'ArrowUp' && zoom.panZoom(0, 50)) event.preventDefault()\n if (event.key === 'ArrowDown' && zoom.panZoom(0, -50)) event.preventDefault()\n if (event.key.toLowerCase() === 'f' && props.withFullscreen) {\n event.preventDefault()\n toggleFullscreen()\n }\n if (event.key.toLowerCase() === 't' && props.withThumbnails) {\n event.preventDefault()\n toggleThumbnails()\n }\n if (event.key.toLowerCase() === 'z' && props.withZoom) {\n event.preventDefault()\n zoom.toggleZoom()\n }\n}\nconst handleFullscreen = () => {\n isFullscreen.value = Boolean(document.fullscreenElement)\n if (!document.fullscreenElement) ownsFullscreen.value = false\n}\n\nwatch(\n () => props.currentIndex,\n (value) => {\n if (value != null) internalIndex.value = value\n },\n)\nwatch(\n () => props.withThumbnails,\n (value) => {\n thumbnailsVisible.value = Boolean(value)\n },\n)\nwatch(\n () => props.slides.length,\n (length) => {\n if (length > 0 && currentIndex.value > length - 1) setIndex(length - 1)\n },\n)\nwatch(\n () => props.opened,\n async (opened) => {\n if (typeof document === 'undefined') return\n if (opened) {\n previousActive = document.activeElement instanceof HTMLElement ? document.activeElement : null\n previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('fullscreenchange', handleFullscreen)\n await nextTick()\n contentRef.value?.focus({ preventScroll: true })\n } else {\n zoom.resetZoom()\n thumbnailsVisible.value = Boolean(props.withThumbnails)\n if (ownsFullscreen.value && document.fullscreenElement) {\n ownsFullscreen.value = false\n document.exitFullscreen?.().catch(() => {})\n }\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n if (props.returnFocus) previousActive?.focus({ preventScroll: true })\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n if (typeof document !== 'undefined') {\n if (ownsFullscreen.value && document.fullscreenElement)\n document.exitFullscreen?.().catch(() => {})\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n }\n})\n\nprovideLightboxContext({\n getStyles,\n get labels() {\n return labels.value\n },\n get opened() {\n return props.opened\n },\n get slides() {\n return props.slides\n },\n get currentIndex() {\n return currentIndex.value\n },\n setIndex,\n next,\n prev,\n close,\n get thumbnailsVisible() {\n return thumbnailsVisible.value\n },\n toggleThumbnails,\n get isFullscreen() {\n return isFullscreen.value\n },\n toggleFullscreen,\n get zoomed() {\n return zoom.zoomState.value.isZoomed\n },\n toggleZoom: zoom.toggleZoom,\n get zoomScale() {\n return zoom.zoomState.value.scale\n },\n panZoom: zoom.panZoom,\n getImageZoomProps: zoom.getImageProps,\n get withZoom() {\n return props.withZoom!\n },\n get withThumbnails() {\n return props.withThumbnails!\n },\n get withFullscreen() {\n return props.withFullscreen!\n },\n get withDownload() {\n return props.withDownload!\n },\n get loop() {\n return props.loop!\n },\n get closeOnSwipeDown() {\n return props.closeOnSwipeDown!\n },\n get closeOnClickOutside() {\n return props.closeOnClickOutside!\n },\n get withSlideTransition() {\n return props.withSlideTransition!\n },\n get transitionDuration() {\n return props.transitionDuration!\n },\n get emblaOptions() {\n return props.emblaOptions\n },\n})\n</script>\n\n<template>\n <Teleport to=\"body\" :disabled=\"!props.withinPortal\">\n <Box v-bind=\"getStyles('root')\" :style=\"rootStyle\">\n <MantineTransition :mounted=\"props.opened\" v-bind=\"overlayTransition\">\n <template #default=\"transitionStyles\">\n <div\n v-bind=\"getStyles('overlay', { style: transitionStyles })\"\n @click=\"props.closeOnClickOutside ? close() : undefined\"\n />\n </template>\n </MantineTransition>\n <MantineTransition :mounted=\"props.opened\" v-bind=\"contentTransition\">\n <template #default=\"transitionStyles\">\n <FocusTrap :active=\"props.opened\">\n <div\n ref=\"contentRef\"\n v-bind=\"{ ...attrs, ...getStyles('content', { style: transitionStyles }) }\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"labels.lightboxLabel\"\n tabindex=\"-1\"\n @click.self=\"props.closeOnClickOutside ? close() : undefined\"\n >\n <span\n v-if=\"props.withInitialFocusPlaceholder\"\n data-autofocus\n tabindex=\"0\"\n style=\"position: fixed; width: 1px; height: 1px; overflow: hidden\"\n />\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <template v-if=\"props.slides.length\">\n {{ labels.slideLabel(currentIndex + 1, props.slides.length)\n }}<template v-if=\"currentSlideLabel\">: {{ currentSlideLabel }}</template>\n </template>\n </VisuallyHidden>\n <slot />\n </div>\n </FocusTrap>\n </template>\n </MantineTransition>\n </Box>\n </Teleport>\n</template>\n","<script lang=\"ts\">\nexport const lightboxRootDefaultProps = {\n withZoom: false,\n withThumbnails: false,\n withFullscreen: false,\n withDownload: false,\n loop: false,\n closeOnClickOutside: false,\n closeOnSwipeDown: true,\n withKeyboardEvents: true,\n returnFocus: true,\n withInitialFocusPlaceholder: true,\n withinPortal: true,\n transitionDuration: 200,\n zoomMaxScale: 3,\n withSlideTransition: false,\n} as const\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport {\n Box,\n FocusTrap,\n Transition as MantineTransition,\n VisuallyHidden,\n useDirection,\n useProps,\n useStyles,\n} from '@mantine-vue/core'\nimport { DEFAULT_LABELS } from '../default-labels'\nimport { provideLightboxContext } from '../lightbox.context'\nimport type {\n LightboxRootEmits,\n LightboxRootOwnProps,\n LightboxRootSlots,\n} from './LightboxRoot.types'\nimport { useLightboxZoom } from '../hooks/use-lightbox-zoom'\nimport classes from '../Lightbox.module.css'\n\ndefineOptions({ name: 'LightboxRoot', inheritAttrs: false })\nconst rawProps = withDefaults(defineProps<LightboxRootOwnProps>(), {\n currentIndex: undefined,\n labels: undefined,\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n zIndex: undefined,\n transitionDuration: undefined,\n transitionProps: undefined,\n emblaOptions: undefined,\n zoomMaxScale: undefined,\n withSlideTransition: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n})\ndefineSlots<LightboxRootSlots>()\nconst emit = defineEmits<LightboxRootEmits>()\nconst props = useProps('LightboxRoot', lightboxRootDefaultProps, rawProps)\nconst attrs = useAttrs()\nconst contentRef = ref<HTMLElement | null>(null)\nconst internalIndex = ref(props.currentIndex ?? 0)\nconst thumbnailsVisible = ref(Boolean(props.withThumbnails))\nconst isFullscreen = ref(false)\nconst ownsFullscreen = ref(false)\nconst { dir } = useDirection()\nlet previousActive: HTMLElement | null = null\nlet previousOverflow = ''\n\nconst labels = computed(() => ({ ...DEFAULT_LABELS, ...props.labels }))\nconst currentIndex = computed(() => props.currentIndex ?? internalIndex.value)\nconst currentSlideLabel = computed(() => {\n const slide = props.slides[currentIndex.value]\n if (!slide || slide.type === 'custom') return undefined\n return slide.type === 'video' ? slide.label : slide.alt\n})\nconst zoom = useLightboxZoom({\n enabled: () => props.withZoom!,\n maxScale: () => props.zoomMaxScale!,\n currentIndex: () => currentIndex.value,\n})\nconst getStyles = useStyles({\n name: 'Lightbox',\n props,\n classes,\n classNames: props.classNames as any,\n styles: props.styles as any,\n unstyled: props.unstyled,\n vars: props.vars as any,\n})\nconst rootStyle = computed(() => ({\n '--lightbox-transition-duration': `${props.transitionDuration}ms`,\n '--lightbox-z-index': props.zIndex == null ? undefined : String(props.zIndex),\n}))\nconst contentTransition = computed(() => ({\n transition: {\n common: { transformOrigin: 'center center' },\n in: { opacity: 1, transform: 'scale(1)' },\n out: { opacity: 0, transform: 'scale(0.95)' },\n transitionProperty: 'transform, opacity',\n },\n duration: props.transitionDuration,\n timingFunction: 'ease',\n ...props.transitionProps,\n}))\nconst overlayTransition = computed(() => ({\n transition: 'fade' as const,\n duration: contentTransition.value.duration,\n exitDuration: contentTransition.value.exitDuration,\n timingFunction: contentTransition.value.timingFunction,\n enterDelay: contentTransition.value.enterDelay,\n exitDelay: contentTransition.value.exitDelay,\n keepMounted: contentTransition.value.keepMounted,\n}))\nconst setIndex = (index: number) => {\n const next = Math.max(0, Math.min(Math.round(index), Math.max(0, props.slides.length - 1)))\n if (next === currentIndex.value) return\n internalIndex.value = next\n emit('update:currentIndex', next)\n emit('indexChange', next)\n}\nconst next = () =>\n setIndex(\n currentIndex.value + 1 < props.slides.length\n ? currentIndex.value + 1\n : props.loop && props.slides.length\n ? 0\n : currentIndex.value,\n )\nconst prev = () =>\n setIndex(\n currentIndex.value > 0\n ? currentIndex.value - 1\n : props.loop && props.slides.length\n ? props.slides.length - 1\n : 0,\n )\nconst close = () => {\n emit('update:opened', false)\n emit('close')\n}\nconst toggleThumbnails = () => {\n thumbnailsVisible.value = !thumbnailsVisible.value\n}\nconst toggleFullscreen = async () => {\n if (!props.withFullscreen || typeof document === 'undefined') return\n if (document.fullscreenElement) {\n ownsFullscreen.value = false\n await document.exitFullscreen?.()\n } else {\n await contentRef.value?.requestFullscreen?.()\n ownsFullscreen.value = document.fullscreenElement === contentRef.value\n }\n isFullscreen.value = Boolean(document.fullscreenElement)\n}\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!props.opened) return\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n return\n }\n if (\n !props.withKeyboardEvents ||\n event.defaultPrevented ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n )\n return\n\n if (event.target instanceof Element) {\n if (event.target.closest('input, textarea, select, video, audio, [contenteditable]')) return\n if (\n event.target.closest('[data-lightbox-slide]') &&\n event.target.closest(\n 'button, a[href], [role=\"button\"], [role=\"link\"], [role=\"slider\"], [role=\"textbox\"], [role=\"combobox\"], [role=\"listbox\"], [role=\"menu\"], [role=\"tablist\"], [role=\"tree\"], [role=\"grid\"]',\n )\n )\n return\n }\n\n const leading = dir.value === 'rtl' ? next : prev\n const trailing = dir.value === 'rtl' ? prev : next\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n if (!zoom.panZoom(50, 0)) leading()\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n if (!zoom.panZoom(-50, 0)) trailing()\n }\n if (event.key === 'ArrowUp' && zoom.panZoom(0, 50)) event.preventDefault()\n if (event.key === 'ArrowDown' && zoom.panZoom(0, -50)) event.preventDefault()\n if (event.key.toLowerCase() === 'f' && props.withFullscreen) {\n event.preventDefault()\n toggleFullscreen()\n }\n if (event.key.toLowerCase() === 't' && props.withThumbnails) {\n event.preventDefault()\n toggleThumbnails()\n }\n if (event.key.toLowerCase() === 'z' && props.withZoom) {\n event.preventDefault()\n zoom.toggleZoom()\n }\n}\nconst handleFullscreen = () => {\n isFullscreen.value = Boolean(document.fullscreenElement)\n if (!document.fullscreenElement) ownsFullscreen.value = false\n}\n\nwatch(\n () => props.currentIndex,\n (value) => {\n if (value != null) internalIndex.value = value\n },\n)\nwatch(\n () => props.withThumbnails,\n (value) => {\n thumbnailsVisible.value = Boolean(value)\n },\n)\nwatch(\n () => props.slides.length,\n (length) => {\n if (length > 0 && currentIndex.value > length - 1) setIndex(length - 1)\n },\n)\nwatch(\n () => props.opened,\n async (opened) => {\n if (typeof document === 'undefined') return\n if (opened) {\n previousActive = document.activeElement instanceof HTMLElement ? document.activeElement : null\n previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('fullscreenchange', handleFullscreen)\n await nextTick()\n contentRef.value?.focus({ preventScroll: true })\n } else {\n zoom.resetZoom()\n thumbnailsVisible.value = Boolean(props.withThumbnails)\n if (ownsFullscreen.value && document.fullscreenElement) {\n ownsFullscreen.value = false\n document.exitFullscreen?.().catch(() => {})\n }\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n if (props.returnFocus) previousActive?.focus({ preventScroll: true })\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n if (typeof document !== 'undefined') {\n if (ownsFullscreen.value && document.fullscreenElement)\n document.exitFullscreen?.().catch(() => {})\n document.body.style.overflow = previousOverflow\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('fullscreenchange', handleFullscreen)\n }\n})\n\nprovideLightboxContext({\n getStyles,\n get labels() {\n return labels.value\n },\n get opened() {\n return props.opened\n },\n get slides() {\n return props.slides\n },\n get currentIndex() {\n return currentIndex.value\n },\n setIndex,\n next,\n prev,\n close,\n get thumbnailsVisible() {\n return thumbnailsVisible.value\n },\n toggleThumbnails,\n get isFullscreen() {\n return isFullscreen.value\n },\n toggleFullscreen,\n get zoomed() {\n return zoom.zoomState.value.isZoomed\n },\n toggleZoom: zoom.toggleZoom,\n get zoomScale() {\n return zoom.zoomState.value.scale\n },\n panZoom: zoom.panZoom,\n getImageZoomProps: zoom.getImageProps,\n get withZoom() {\n return props.withZoom!\n },\n get withThumbnails() {\n return props.withThumbnails!\n },\n get withFullscreen() {\n return props.withFullscreen!\n },\n get withDownload() {\n return props.withDownload!\n },\n get loop() {\n return props.loop!\n },\n get closeOnSwipeDown() {\n return props.closeOnSwipeDown!\n },\n get closeOnClickOutside() {\n return props.closeOnClickOutside!\n },\n get withSlideTransition() {\n return props.withSlideTransition!\n },\n get transitionDuration() {\n return props.transitionDuration!\n },\n get emblaOptions() {\n return props.emblaOptions\n },\n})\n</script>\n\n<template>\n <Teleport to=\"body\" :disabled=\"!props.withinPortal\">\n <Box v-bind=\"getStyles('root')\" :style=\"rootStyle\">\n <MantineTransition :mounted=\"props.opened\" v-bind=\"overlayTransition\">\n <template #default=\"transitionStyles\">\n <div\n v-bind=\"getStyles('overlay', { style: transitionStyles })\"\n @click=\"props.closeOnClickOutside ? close() : undefined\"\n />\n </template>\n </MantineTransition>\n <MantineTransition :mounted=\"props.opened\" v-bind=\"contentTransition\">\n <template #default=\"transitionStyles\">\n <FocusTrap :active=\"props.opened\">\n <div\n ref=\"contentRef\"\n v-bind=\"{ ...attrs, ...getStyles('content', { style: transitionStyles }) }\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"labels.lightboxLabel\"\n tabindex=\"-1\"\n @click.self=\"props.closeOnClickOutside ? close() : undefined\"\n >\n <span\n v-if=\"props.withInitialFocusPlaceholder\"\n data-autofocus\n tabindex=\"0\"\n style=\"position: fixed; width: 1px; height: 1px; overflow: hidden\"\n />\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <template v-if=\"props.slides.length\">\n {{ labels.slideLabel(currentIndex + 1, props.slides.length)\n }}<template v-if=\"currentSlideLabel\">: {{ currentSlideLabel }}</template>\n </template>\n </VisuallyHidden>\n <slot />\n </div>\n </FocusTrap>\n </template>\n </MantineTransition>\n </Box>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, useAttrs, watch } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxCustomSlide, LightboxImageSlide, LightboxVideoSlide } from '../types'\nimport type { LightboxSlideProps, LightboxSlideSlots } from './LightboxSlide.types'\ndefineOptions({ name: 'LightboxSlide', inheritAttrs: false })\nconst props = defineProps<LightboxSlideProps>()\ndefineSlots<LightboxSlideSlots>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst active = computed(() => props.index === ctx.currentIndex)\nconst image = computed(() => props.slide as LightboxImageSlide)\nconst video = computed(() => props.slide as LightboxVideoSlide)\nconst custom = computed(() => props.slide as LightboxCustomSlide)\nconst videoRef = ref<HTMLVideoElement | null>(null)\n\nwatch(\n active,\n (isActive) => {\n if (!videoRef.value) {\n return\n }\n\n if (!isActive) {\n videoRef.value.pause()\n } else if (video.value.autoPlay) {\n videoRef.value.play().catch(() => {})\n }\n },\n { flush: 'post' },\n)\n\nfunction handleClick(event: MouseEvent) {\n if (ctx.closeOnClickOutside && !event.defaultPrevented && event.target === event.currentTarget) {\n ctx.close()\n }\n}\n</script>\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slide') }\"\n role=\"group\"\n aria-roledescription=\"slide\"\n data-lightbox-slide\n :aria-label=\"ctx.labels.slideLabel(index + 1, ctx.slides.length)\"\n :aria-hidden=\"!active || undefined\"\n :inert=\"!active || undefined\"\n @click=\"handleClick\"\n >\n <slot :slide=\"slide\" :active=\"active\">\n <component :is=\"() => custom.render({ active })\" v-if=\"slide.type === 'custom'\" />\n <video\n ref=\"videoRef\"\n v-else-if=\"slide.type === 'video'\"\n v-bind=\"ctx.getStyles('slideVideo')\"\n :src=\"video.src\"\n :poster=\"video.poster\"\n :aria-label=\"video.label\"\n :autoplay=\"video.autoPlay && active\"\n controls\n :tabindex=\"active ? 0 : -1\"\n >\n <track\n v-for=\"track in video.tracks\"\n :key=\"`${track.src}-${track.srcLang}`\"\n :src=\"track.src\"\n :kind=\"track.kind ?? 'subtitles'\"\n :srclang=\"track.srcLang\"\n :label=\"track.label\"\n :default=\"track.default\"\n />\n </video>\n <img\n v-else\n v-bind=\"{\n ...ctx.getStyles('slideImage'),\n ...(active && ctx.withZoom ? ctx.getImageZoomProps() : {}),\n }\"\n :src=\"image.src\"\n :alt=\"image.alt ?? ''\"\n :srcset=\"image.srcSet\"\n :sizes=\"image.sizes\"\n :loading=\"image.loading ?? (active ? 'eager' : 'lazy')\"\n draggable=\"false\"\n />\n </slot>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, useAttrs, watch } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxCustomSlide, LightboxImageSlide, LightboxVideoSlide } from '../types'\nimport type { LightboxSlideProps, LightboxSlideSlots } from './LightboxSlide.types'\ndefineOptions({ name: 'LightboxSlide', inheritAttrs: false })\nconst props = defineProps<LightboxSlideProps>()\ndefineSlots<LightboxSlideSlots>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst active = computed(() => props.index === ctx.currentIndex)\nconst image = computed(() => props.slide as LightboxImageSlide)\nconst video = computed(() => props.slide as LightboxVideoSlide)\nconst custom = computed(() => props.slide as LightboxCustomSlide)\nconst videoRef = ref<HTMLVideoElement | null>(null)\n\nwatch(\n active,\n (isActive) => {\n if (!videoRef.value) {\n return\n }\n\n if (!isActive) {\n videoRef.value.pause()\n } else if (video.value.autoPlay) {\n videoRef.value.play().catch(() => {})\n }\n },\n { flush: 'post' },\n)\n\nfunction handleClick(event: MouseEvent) {\n if (ctx.closeOnClickOutside && !event.defaultPrevented && event.target === event.currentTarget) {\n ctx.close()\n }\n}\n</script>\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slide') }\"\n role=\"group\"\n aria-roledescription=\"slide\"\n data-lightbox-slide\n :aria-label=\"ctx.labels.slideLabel(index + 1, ctx.slides.length)\"\n :aria-hidden=\"!active || undefined\"\n :inert=\"!active || undefined\"\n @click=\"handleClick\"\n >\n <slot :slide=\"slide\" :active=\"active\">\n <component :is=\"() => custom.render({ active })\" v-if=\"slide.type === 'custom'\" />\n <video\n ref=\"videoRef\"\n v-else-if=\"slide.type === 'video'\"\n v-bind=\"ctx.getStyles('slideVideo')\"\n :src=\"video.src\"\n :poster=\"video.poster\"\n :aria-label=\"video.label\"\n :autoplay=\"video.autoPlay && active\"\n controls\n :tabindex=\"active ? 0 : -1\"\n >\n <track\n v-for=\"track in video.tracks\"\n :key=\"`${track.src}-${track.srcLang}`\"\n :src=\"track.src\"\n :kind=\"track.kind ?? 'subtitles'\"\n :srclang=\"track.srcLang\"\n :label=\"track.label\"\n :default=\"track.default\"\n />\n </video>\n <img\n v-else\n v-bind=\"{\n ...ctx.getStyles('slideImage'),\n ...(active && ctx.withZoom ? ctx.getImageZoomProps() : {}),\n }\"\n :src=\"image.src\"\n :alt=\"image.alt ?? ''\"\n :srcset=\"image.srcSet\"\n :sizes=\"image.sizes\"\n :loading=\"image.loading ?? (active ? 'eager' : 'lazy')\"\n draggable=\"false\"\n />\n </slot>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel'\nimport { Box, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\n\ndefineOptions({ name: 'LightboxSlides', inheritAttrs: false })\n\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst swipeStart = ref<{ x: number; y: number } | null>(null)\nconst startIndex = ctx.currentIndex\n\nconst options = computed<EmblaOptionsType>(() => {\n const userWatchDrag = ctx.emblaOptions?.watchDrag\n\n return {\n align: 'center',\n containScroll: false,\n direction: dir.value,\n ...ctx.emblaOptions,\n axis: 'x',\n loop: ctx.loop,\n startIndex,\n watchDrag: (api, event) => {\n if (ctx.zoomed) return false\n return typeof userWatchDrag === 'function'\n ? userWatchDrag(api, event)\n : (userWatchDrag ?? true)\n },\n }\n})\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction handleSelect(api: EmblaCarouselType) {\n const index = api.selectedScrollSnap()\n if (index !== ctx.currentIndex) ctx.setIndex(index)\n}\n\nwatch(\n emblaApi,\n (api, previousApi) => {\n previousApi?.off('select', handleSelect)\n api?.on('select', handleSelect)\n },\n { immediate: true },\n)\n\nwatch(\n () => ctx.currentIndex,\n (index) => {\n const api = emblaApi.value\n if (api && api.selectedScrollSnap() !== index) {\n api.scrollTo(index, !ctx.withSlideTransition)\n }\n },\n)\n\nfunction handlePointerDown(event: PointerEvent) {\n swipeStart.value = { x: event.clientX, y: event.clientY }\n}\n\nfunction handlePointerUp(event: PointerEvent) {\n if (!swipeStart.value || !ctx.closeOnSwipeDown || ctx.zoomed) return\n const x = event.clientX - swipeStart.value.x\n const y = event.clientY - swipeStart.value.y\n swipeStart.value = null\n if (y > 80 && y > Math.abs(x)) ctx.close()\n}\n\nonBeforeUnmount(() => emblaApi.value?.off('select', handleSelect))\n</script>\n\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slides') }\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n :aria-label=\"ctx.labels.slidesLabel\"\n >\n <div\n ref=\"emblaNode\"\n v-bind=\"ctx.getStyles('slidesViewport')\"\n @pointerdown=\"handlePointerDown\"\n @pointerup=\"handlePointerUp\"\n @pointercancel=\"swipeStart = null\"\n >\n <div v-bind=\"ctx.getStyles('slidesContainer')\"><slot /></div>\n </div>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel'\nimport { Box, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\n\ndefineOptions({ name: 'LightboxSlides', inheritAttrs: false })\n\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst swipeStart = ref<{ x: number; y: number } | null>(null)\nconst startIndex = ctx.currentIndex\n\nconst options = computed<EmblaOptionsType>(() => {\n const userWatchDrag = ctx.emblaOptions?.watchDrag\n\n return {\n align: 'center',\n containScroll: false,\n direction: dir.value,\n ...ctx.emblaOptions,\n axis: 'x',\n loop: ctx.loop,\n startIndex,\n watchDrag: (api, event) => {\n if (ctx.zoomed) return false\n return typeof userWatchDrag === 'function'\n ? userWatchDrag(api, event)\n : (userWatchDrag ?? true)\n },\n }\n})\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction handleSelect(api: EmblaCarouselType) {\n const index = api.selectedScrollSnap()\n if (index !== ctx.currentIndex) ctx.setIndex(index)\n}\n\nwatch(\n emblaApi,\n (api, previousApi) => {\n previousApi?.off('select', handleSelect)\n api?.on('select', handleSelect)\n },\n { immediate: true },\n)\n\nwatch(\n () => ctx.currentIndex,\n (index) => {\n const api = emblaApi.value\n if (api && api.selectedScrollSnap() !== index) {\n api.scrollTo(index, !ctx.withSlideTransition)\n }\n },\n)\n\nfunction handlePointerDown(event: PointerEvent) {\n swipeStart.value = { x: event.clientX, y: event.clientY }\n}\n\nfunction handlePointerUp(event: PointerEvent) {\n if (!swipeStart.value || !ctx.closeOnSwipeDown || ctx.zoomed) return\n const x = event.clientX - swipeStart.value.x\n const y = event.clientY - swipeStart.value.y\n swipeStart.value = null\n if (y > 80 && y > Math.abs(x)) ctx.close()\n}\n\nonBeforeUnmount(() => emblaApi.value?.off('select', handleSelect))\n</script>\n\n<template>\n <Box\n v-bind=\"{ ...attrs, ...ctx.getStyles('slides') }\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n :aria-label=\"ctx.labels.slidesLabel\"\n >\n <div\n ref=\"emblaNode\"\n v-bind=\"ctx.getStyles('slidesViewport')\"\n @pointerdown=\"handlePointerDown\"\n @pointerup=\"handlePointerUp\"\n @pointercancel=\"swipeStart = null\"\n >\n <div v-bind=\"ctx.getStyles('slidesContainer')\"><slot /></div>\n </div>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { Collapse, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxSlideData } from '../types'\ndefineOptions({ name: 'LightboxThumbnails', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst options = computed<EmblaOptionsType>(() => ({\n containScroll: 'keepSnaps',\n dragFree: true,\n direction: dir.value,\n active: ctx.withThumbnails,\n}))\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction getThumbnailSource(slide: LightboxSlideData) {\n return (\n slide.thumbSrc ??\n (slide.type === 'video' ? slide.poster : undefined) ??\n (slide.type !== 'custom' ? slide.src : undefined)\n )\n}\n\nwatch([emblaApi, () => ctx.currentIndex], ([api, index]) => api?.scrollTo(index), {\n immediate: true,\n})\n</script>\n<template>\n <Collapse\n v-if=\"ctx.withThumbnails\"\n :expanded=\"ctx.thumbnailsVisible\"\n :transition-duration=\"ctx.transitionDuration\"\n :keep-mounted=\"false\"\n v-bind=\"{ ...attrs, ...ctx.getStyles('thumbnails') }\"\n ><div ref=\"emblaNode\" v-bind=\"ctx.getStyles('thumbnailsViewport')\">\n <div v-bind=\"ctx.getStyles('thumbnailsContainer')\">\n <UnstyledButton\n v-for=\"(slide, index) in ctx.slides\"\n :key=\"index\"\n v-bind=\"ctx.getStyles('thumbnail')\"\n :data-active=\"index === ctx.currentIndex || undefined\"\n :aria-label=\"ctx.labels.thumbnailLabel(index + 1, ctx.slides.length)\"\n :aria-current=\"index === ctx.currentIndex || undefined\"\n @click=\"ctx.setIndex(index)\"\n ><component\n :is=\"() => slide.renderThumb?.({ active: index === ctx.currentIndex })\"\n v-if=\"slide.renderThumb\" /><img\n v-else-if=\"getThumbnailSource(slide)\"\n v-bind=\"ctx.getStyles('thumbnailImage')\"\n :src=\"getThumbnailSource(slide)\"\n alt=\"\"\n loading=\"lazy\"\n draggable=\"false\"\n /></UnstyledButton>\n </div></div\n ></Collapse>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs, watch } from 'vue'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { Collapse, UnstyledButton, useDirection } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { LightboxSlideData } from '../types'\ndefineOptions({ name: 'LightboxThumbnails', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst { dir } = useDirection()\nconst options = computed<EmblaOptionsType>(() => ({\n containScroll: 'keepSnaps',\n dragFree: true,\n direction: dir.value,\n active: ctx.withThumbnails,\n}))\nconst plugins = computed(() => [])\nconst [emblaNode, emblaApi] = emblaCarouselVue(options, plugins)\n\nfunction getThumbnailSource(slide: LightboxSlideData) {\n return (\n slide.thumbSrc ??\n (slide.type === 'video' ? slide.poster : undefined) ??\n (slide.type !== 'custom' ? slide.src : undefined)\n )\n}\n\nwatch([emblaApi, () => ctx.currentIndex], ([api, index]) => api?.scrollTo(index), {\n immediate: true,\n})\n</script>\n<template>\n <Collapse\n v-if=\"ctx.withThumbnails\"\n :expanded=\"ctx.thumbnailsVisible\"\n :transition-duration=\"ctx.transitionDuration\"\n :keep-mounted=\"false\"\n v-bind=\"{ ...attrs, ...ctx.getStyles('thumbnails') }\"\n ><div ref=\"emblaNode\" v-bind=\"ctx.getStyles('thumbnailsViewport')\">\n <div v-bind=\"ctx.getStyles('thumbnailsContainer')\">\n <UnstyledButton\n v-for=\"(slide, index) in ctx.slides\"\n :key=\"index\"\n v-bind=\"ctx.getStyles('thumbnail')\"\n :data-active=\"index === ctx.currentIndex || undefined\"\n :aria-label=\"ctx.labels.thumbnailLabel(index + 1, ctx.slides.length)\"\n :aria-current=\"index === ctx.currentIndex || undefined\"\n @click=\"ctx.setIndex(index)\"\n ><component\n :is=\"() => slide.renderThumb?.({ active: index === ctx.currentIndex })\"\n v-if=\"slide.renderThumb\" /><img\n v-else-if=\"getThumbnailSource(slide)\"\n v-bind=\"ctx.getStyles('thumbnailImage')\"\n :src=\"getThumbnailSource(slide)\"\n alt=\"\"\n loading=\"lazy\"\n draggable=\"false\"\n /></UnstyledButton>\n </div></div\n ></Collapse>\n</template>\n","import { h } from 'vue'\nimport { DEFAULT_LABELS } from '../default-labels'\nimport type { LightboxLabels, ToolbarItem } from '../types'\n\nconst ALLOWED_DOWNLOAD_PROTOCOLS = ['http:', 'https:', 'blob:', 'data:']\nconst downloadsInProgress = new Set<string>()\n\nconst icon = (path: string) =>\n h(\n 'svg',\n { viewBox: '0 0 24 24', width: 20, height: 20, fill: 'currentColor', 'aria-hidden': 'true' },\n [h('path', { d: path })],\n )\n\nfunction parseDownloadUrl(src: string) {\n try {\n const url = new URL(src, window.location.href)\n return ALLOWED_DOWNLOAD_PROTOCOLS.includes(url.protocol) ? url : null\n } catch {\n return null\n }\n}\n\nfunction getDownloadFileName(url: URL) {\n if (url.protocol === 'data:') return 'download'\n const lastSegment = url.pathname.split('/').pop() || ''\n try {\n return decodeURIComponent(lastSegment) || 'download'\n } catch {\n return lastSegment || 'download'\n }\n}\n\nfunction openInNewTab(src: string) {\n const link = document.createElement('a')\n link.href = src\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n document.body.appendChild(link)\n link.click()\n link.remove()\n}\n\nfunction downloadFile(src: string) {\n const url = parseDownloadUrl(src)\n if (!url || downloadsInProgress.has(src)) return\n\n const isCrossOrigin =\n (url.protocol === 'http:' || url.protocol === 'https:') && url.origin !== window.location.origin\n\n if (isCrossOrigin) {\n openInNewTab(src)\n return\n }\n\n downloadsInProgress.add(src)\n fetch(src)\n .then((response) => {\n if (!response.ok) throw new Error(`Failed to download ${src}: ${response.status}`)\n return response.blob()\n })\n .then((blob) => {\n const objectUrl = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = objectUrl\n link.download = getDownloadFileName(url)\n document.body.appendChild(link)\n link.click()\n link.remove()\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 1000)\n })\n .catch(() => openInNewTab(src))\n .finally(() => downloadsInProgress.delete(src))\n}\n\nexport function createFullscreenToolbarItem(\n toggle: () => void,\n isFullscreen: boolean,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'fullscreen',\n icon: icon(\n isFullscreen\n ? 'M9 3v6H3V7h4V3h2zm6 0h2v4h4v2h-6V3zM3 15h6v6H7v-4H3v-2zm12 0h6v2h-4v4h-2v-6z'\n : 'M3 3h6v2H5v4H3V3zm12 0h6v6h-2V5h-4V3zM3 15h2v4h4v2H3v-6zm18 0v6h-6v-2h4v-4h2z',\n ),\n label: isFullscreen ? labels.exitFullscreenLabel : labels.enterFullscreenLabel,\n onClick: toggle,\n position: 'right',\n }\n}\nexport function createThumbnailsToolbarItem(\n toggle: () => void,\n visible: boolean,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'thumbnails',\n icon: icon('M3 3h8v8H3V3zm0 10h8v8H3v-8zm10-10h8v8h-8V3zm0 10h8v8h-8v-8z'),\n label: visible ? labels.hideThumbnailsLabel : labels.showThumbnailsLabel,\n onClick: toggle,\n position: 'left',\n }\n}\nexport function createDownloadToolbarItem(\n src: string,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'download',\n icon: icon('M12 16l-6-6h4V4h4v6h4l-6 6zm-8 2h16v2H4v-2z'),\n label: labels.downloadLabel,\n position: 'right',\n onClick: () => downloadFile(src),\n }\n}\nexport function createCloseToolbarItem(\n onClose: () => void,\n labels: LightboxLabels = DEFAULT_LABELS,\n): ToolbarItem {\n return {\n key: 'close',\n icon: icon(\n 'M18.3 5.7a1 1 0 0 0-1.4 0L12 10.6 7.1 5.7a1 1 0 0 0-1.4 1.4L10.6 12l-4.9 4.9a1 1 0 1 0 1.4 1.4L12 13.4l4.9 4.9a1 1 0 0 0 1.4-1.4L13.4 12l4.9-4.9a1 1 0 0 0 0-1.4z',\n ),\n label: labels.closeLabel,\n onClick: onClose,\n position: 'right',\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { ToolbarItem, ToolbarItems } from '../types'\nimport {\n createCloseToolbarItem,\n createDownloadToolbarItem,\n createFullscreenToolbarItem,\n createThumbnailsToolbarItem,\n} from './toolbar-items'\ndefineOptions({ name: 'LightboxToolbar', inheritAttrs: false })\nconst props = defineProps<{ toolbarItems?: ToolbarItems }>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst payload = computed(() => ({\n slides: ctx.slides,\n currentIndex: ctx.currentIndex,\n setIndex: ctx.setIndex,\n next: ctx.next,\n prev: ctx.prev,\n close: ctx.close,\n thumbnailsVisible: ctx.thumbnailsVisible,\n toggleThumbnails: ctx.toggleThumbnails,\n isFullscreen: ctx.isFullscreen,\n toggleFullscreen: ctx.toggleFullscreen,\n zoomed: ctx.zoomed,\n toggleZoom: ctx.toggleZoom,\n labels: ctx.labels,\n}))\nconst items = computed<ToolbarItem[]>(() => {\n if (typeof props.toolbarItems === 'function') return props.toolbarItems(payload.value)\n if (props.toolbarItems) return props.toolbarItems\n const result: ToolbarItem[] = []\n if (ctx.withThumbnails)\n result.push(\n createThumbnailsToolbarItem(ctx.toggleThumbnails, ctx.thumbnailsVisible, ctx.labels),\n )\n if (ctx.withFullscreen)\n result.push(createFullscreenToolbarItem(ctx.toggleFullscreen, ctx.isFullscreen, ctx.labels))\n const slide = ctx.slides[ctx.currentIndex]\n if (ctx.withDownload && slide && slide.type !== 'custom')\n result.push(createDownloadToolbarItem(slide.src, ctx.labels))\n result.push(createCloseToolbarItem(ctx.close, ctx.labels))\n return result\n})\nconst left = computed(() => items.value.filter((item) => item.position === 'left'))\nconst right = computed(() => items.value.filter((item) => item.position !== 'left'))\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('toolbar') }\"\n ><div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in left\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton>\n </div>\n <span v-bind=\"ctx.getStyles('counter')\" aria-hidden=\"true\">{{\n ctx.slides.length ? `${ctx.currentIndex + 1} / ${ctx.slides.length}` : ''\n }}</span>\n <div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in right\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton></div\n ></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\nimport { Box, UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\nimport type { ToolbarItem, ToolbarItems } from '../types'\nimport {\n createCloseToolbarItem,\n createDownloadToolbarItem,\n createFullscreenToolbarItem,\n createThumbnailsToolbarItem,\n} from './toolbar-items'\ndefineOptions({ name: 'LightboxToolbar', inheritAttrs: false })\nconst props = defineProps<{ toolbarItems?: ToolbarItems }>()\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\nconst payload = computed(() => ({\n slides: ctx.slides,\n currentIndex: ctx.currentIndex,\n setIndex: ctx.setIndex,\n next: ctx.next,\n prev: ctx.prev,\n close: ctx.close,\n thumbnailsVisible: ctx.thumbnailsVisible,\n toggleThumbnails: ctx.toggleThumbnails,\n isFullscreen: ctx.isFullscreen,\n toggleFullscreen: ctx.toggleFullscreen,\n zoomed: ctx.zoomed,\n toggleZoom: ctx.toggleZoom,\n labels: ctx.labels,\n}))\nconst items = computed<ToolbarItem[]>(() => {\n if (typeof props.toolbarItems === 'function') return props.toolbarItems(payload.value)\n if (props.toolbarItems) return props.toolbarItems\n const result: ToolbarItem[] = []\n if (ctx.withThumbnails)\n result.push(\n createThumbnailsToolbarItem(ctx.toggleThumbnails, ctx.thumbnailsVisible, ctx.labels),\n )\n if (ctx.withFullscreen)\n result.push(createFullscreenToolbarItem(ctx.toggleFullscreen, ctx.isFullscreen, ctx.labels))\n const slide = ctx.slides[ctx.currentIndex]\n if (ctx.withDownload && slide && slide.type !== 'custom')\n result.push(createDownloadToolbarItem(slide.src, ctx.labels))\n result.push(createCloseToolbarItem(ctx.close, ctx.labels))\n return result\n})\nconst left = computed(() => items.value.filter((item) => item.position === 'left'))\nconst right = computed(() => items.value.filter((item) => item.position !== 'left'))\n</script>\n<template>\n <Box v-bind=\"{ ...attrs, ...ctx.getStyles('toolbar') }\"\n ><div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in left\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton>\n </div>\n <span v-bind=\"ctx.getStyles('counter')\" aria-hidden=\"true\">{{\n ctx.slides.length ? `${ctx.currentIndex + 1} / ${ctx.slides.length}` : ''\n }}</span>\n <div v-bind=\"ctx.getStyles('toolbarGroup')\">\n <UnstyledButton\n v-for=\"item in right\"\n :key=\"item.key\"\n v-bind=\"ctx.getStyles('toolbarButton')\"\n :aria-label=\"item.label\"\n @click=\"item.onClick\"\n ><component :is=\"() => item.icon\"\n /></UnstyledButton></div\n ></Box>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { LightboxCaption } from './LightboxCaption'\nimport { LightboxNavigation } from './LightboxNavigation'\nimport { LightboxRoot } from './LightboxRoot'\nimport { LightboxSlide } from './LightboxSlide'\nimport { LightboxSlides } from './LightboxSlides'\nimport { LightboxThumbnails } from './LightboxThumbnails'\nimport { LightboxToolbar } from './LightboxToolbar'\nimport type { LightboxSlots } from './Lightbox.props'\nimport type { LightboxLabels, LightboxSlideData, ToolbarItems } from './types'\ndefineOptions({ name: 'Lightbox', inheritAttrs: false })\ninterface RuntimeLightboxProps {\n opened: boolean\n slides: LightboxSlideData[]\n currentIndex?: number\n labels?: Partial<LightboxLabels>\n withZoom?: boolean\n withThumbnails?: boolean\n withFullscreen?: boolean\n withDownload?: boolean\n loop?: boolean\n closeOnClickOutside?: boolean\n closeOnSwipeDown?: boolean\n withKeyboardEvents?: boolean\n returnFocus?: boolean\n withInitialFocusPlaceholder?: boolean\n withinPortal?: boolean\n zIndex?: string | number\n transitionDuration?: number\n transitionProps?: Record<string, unknown>\n emblaOptions?: EmblaOptionsType\n zoomMaxScale?: number\n withSlideTransition?: boolean\n toolbarItems?: ToolbarItems\n withNavigation?: boolean\n classNames?: any\n styles?: any\n vars?: any\n unstyled?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProps>(), {\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n withSlideTransition: undefined,\n withNavigation: true,\n unstyled: undefined,\n})\nconst emit = defineEmits<{\n close: []\n 'update:opened': [opened: boolean]\n indexChange: [index: number]\n 'update:currentIndex': [index: number]\n}>()\ndefineSlots<LightboxSlots>()\nconst slots = useSlots()\nconst attrs = useAttrs()\n</script>\n<template>\n <LightboxRoot\n v-bind=\"{ ...attrs, ...props }\"\n @close=\"emit('close')\"\n @update:opened=\"emit('update:opened', $event)\"\n @index-change=\"emit('indexChange', $event)\"\n @update:current-index=\"emit('update:currentIndex', $event)\"\n ><slot\n ><LightboxToolbar :toolbar-items=\"props.toolbarItems\" /><LightboxSlides\n ><LightboxSlide\n v-for=\"(slide, index) in props.slides\"\n :key=\"index\"\n :slide=\"slide\"\n :index=\"index\"\n ><template v-if=\"slots.slide\" #default=\"payload\"\n ><slot\n name=\"slide\"\n v-bind=\"{ ...payload, index }\" /></template></LightboxSlide></LightboxSlides\n ><LightboxNavigation\n v-if=\"props.withNavigation\" /><LightboxCaption /><LightboxThumbnails /></slot\n ></LightboxRoot>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue'\nimport type { EmblaOptionsType } from 'embla-carousel'\nimport { LightboxCaption } from './LightboxCaption'\nimport { LightboxNavigation } from './LightboxNavigation'\nimport { LightboxRoot } from './LightboxRoot'\nimport { LightboxSlide } from './LightboxSlide'\nimport { LightboxSlides } from './LightboxSlides'\nimport { LightboxThumbnails } from './LightboxThumbnails'\nimport { LightboxToolbar } from './LightboxToolbar'\nimport type { LightboxSlots } from './Lightbox.props'\nimport type { LightboxLabels, LightboxSlideData, ToolbarItems } from './types'\ndefineOptions({ name: 'Lightbox', inheritAttrs: false })\ninterface RuntimeLightboxProps {\n opened: boolean\n slides: LightboxSlideData[]\n currentIndex?: number\n labels?: Partial<LightboxLabels>\n withZoom?: boolean\n withThumbnails?: boolean\n withFullscreen?: boolean\n withDownload?: boolean\n loop?: boolean\n closeOnClickOutside?: boolean\n closeOnSwipeDown?: boolean\n withKeyboardEvents?: boolean\n returnFocus?: boolean\n withInitialFocusPlaceholder?: boolean\n withinPortal?: boolean\n zIndex?: string | number\n transitionDuration?: number\n transitionProps?: Record<string, unknown>\n emblaOptions?: EmblaOptionsType\n zoomMaxScale?: number\n withSlideTransition?: boolean\n toolbarItems?: ToolbarItems\n withNavigation?: boolean\n classNames?: any\n styles?: any\n vars?: any\n unstyled?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProps>(), {\n withZoom: undefined,\n withThumbnails: undefined,\n withFullscreen: undefined,\n withDownload: undefined,\n loop: undefined,\n closeOnClickOutside: undefined,\n closeOnSwipeDown: undefined,\n withKeyboardEvents: undefined,\n returnFocus: undefined,\n withInitialFocusPlaceholder: undefined,\n withinPortal: undefined,\n withSlideTransition: undefined,\n withNavigation: true,\n unstyled: undefined,\n})\nconst emit = defineEmits<{\n close: []\n 'update:opened': [opened: boolean]\n indexChange: [index: number]\n 'update:currentIndex': [index: number]\n}>()\ndefineSlots<LightboxSlots>()\nconst slots = useSlots()\nconst attrs = useAttrs()\n</script>\n<template>\n <LightboxRoot\n v-bind=\"{ ...attrs, ...props }\"\n @close=\"emit('close')\"\n @update:opened=\"emit('update:opened', $event)\"\n @index-change=\"emit('indexChange', $event)\"\n @update:current-index=\"emit('update:currentIndex', $event)\"\n ><slot\n ><LightboxToolbar :toolbar-items=\"props.toolbarItems\" /><LightboxSlides\n ><LightboxSlide\n v-for=\"(slide, index) in props.slides\"\n :key=\"index\"\n :slide=\"slide\"\n :index=\"index\"\n ><template v-if=\"slots.slide\" #default=\"payload\"\n ><slot\n name=\"slide\"\n v-bind=\"{ ...payload, index }\" /></template></LightboxSlide></LightboxSlides\n ><LightboxNavigation\n v-if=\"props.withNavigation\" /><LightboxCaption /><LightboxThumbnails /></slot\n ></LightboxRoot>\n</template>\n","import { shallowReactive } from 'vue'\nimport type { LightboxSlideData } from './types'\n\nexport interface LightboxState {\n opened: boolean\n slides: LightboxSlideData[]\n currentIndex: number\n loop: boolean\n}\n\nexport interface LightboxStore {\n state: LightboxState\n getState: () => LightboxState\n setState: (state: LightboxState) => void\n}\n\nconst clampIndex = (index: number, count: number) =>\n Math.max(0, Math.min(Number.isFinite(index) ? Math.round(index) : 0, Math.max(0, count - 1)))\n\nexport const createLightboxStore = (): LightboxStore => {\n const state = shallowReactive<LightboxState>({\n opened: false,\n slides: [],\n currentIndex: 0,\n loop: false,\n })\n return {\n state,\n getState: () => state,\n setState: (next) => Object.assign(state, next),\n }\n}\n\nexport const useLightboxStore = (store: LightboxStore) => store.state\n\nexport function updateLightboxStateAction(\n update: (state: LightboxState) => Partial<LightboxState>,\n store: LightboxStore,\n) {\n const state = store.getState()\n store.setState({ ...state, ...update(state) })\n}\n\nexport const openLightboxAction = (\n payload: { slides: LightboxSlideData[]; startIndex?: number },\n store: LightboxStore,\n) =>\n updateLightboxStateAction(\n () => ({\n opened: true,\n slides: payload.slides,\n currentIndex: clampIndex(payload.startIndex ?? 0, payload.slides.length),\n }),\n store,\n )\nexport const closeLightboxAction = (store: LightboxStore) =>\n updateLightboxStateAction(() => ({ opened: false }), store)\nexport const nextLightboxAction = (store: LightboxStore) => {\n updateLightboxStateAction((state) => {\n const next = state.currentIndex + 1\n return {\n currentIndex:\n next < state.slides.length\n ? next\n : state.loop && state.slides.length\n ? 0\n : state.currentIndex,\n }\n }, store)\n}\nexport const prevLightboxAction = (store: LightboxStore) => {\n updateLightboxStateAction((state) => {\n const prev = state.currentIndex - 1\n return {\n currentIndex:\n prev >= 0 ? prev : state.loop && state.slides.length ? state.slides.length - 1 : 0,\n }\n }, store)\n}\nexport const setLightboxIndexAction = (index: number, store: LightboxStore) => {\n updateLightboxStateAction(\n (state) => ({ currentIndex: clampIndex(index, state.slides.length) }),\n store,\n )\n}\n\nexport const lightboxActions = {\n open: openLightboxAction,\n close: closeLightboxAction,\n next: nextLightboxAction,\n prev: prevLightboxAction,\n setIndex: setLightboxIndexAction,\n updateState: updateLightboxStateAction,\n}\n\nexport function createLightbox() {\n const store = createLightboxStore()\n return [\n store,\n {\n open: (payload: { slides: LightboxSlideData[]; startIndex?: number }) =>\n openLightboxAction(payload, store),\n close: () => closeLightboxAction(store),\n next: () => nextLightboxAction(store),\n prev: () => prevLightboxAction(store),\n setIndex: (index: number) => setLightboxIndexAction(index, store),\n },\n ] as const\n}\n\nexport const [lightboxStore, lightbox] = createLightbox()\n","<script setup lang=\"ts\">\nimport { useAttrs } from 'vue'\nimport { UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCloseButton', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\n</script>\n<template>\n <UnstyledButton\n v-bind=\"{ ...attrs, ...ctx.getStyles('closeButton') }\"\n :aria-label=\"ctx.labels.closeLabel\"\n @click=\"ctx.close\"\n ><slot>×</slot></UnstyledButton\n >\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs } from 'vue'\nimport { UnstyledButton } from '@mantine-vue/core'\nimport { useLightboxContext } from '../lightbox.context'\ndefineOptions({ name: 'LightboxCloseButton', inheritAttrs: false })\nconst attrs = useAttrs()\nconst ctx = useLightboxContext()\n</script>\n<template>\n <UnstyledButton\n v-bind=\"{ ...attrs, ...ctx.getStyles('closeButton') }\"\n :aria-label=\"ctx.labels.closeLabel\"\n @click=\"ctx.close\"\n ><slot>×</slot></UnstyledButton\n >\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, watch } from 'vue'\nimport {\n lightboxActions,\n lightboxStore,\n useLightboxStore,\n type LightboxStore,\n} from '../lightbox.store'\nimport Lightbox from '../Lightbox.vue'\ndefineOptions({ name: 'LightboxProvider' })\ninterface RuntimeLightboxProviderProps {\n store?: LightboxStore\n loop?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProviderProps>(), {\n store: () => lightboxStore,\n loop: undefined,\n})\nconst attrs = useAttrs()\nconst state = useLightboxStore(props.store)\nwatch(\n () => props.loop,\n (loop) => props.store.setState({ ...props.store.getState(), loop: Boolean(loop) }),\n { immediate: true },\n)\n</script>\n<template>\n <Lightbox\n v-bind=\"{ ...attrs, loop: props.loop }\"\n :opened=\"state.opened\"\n :slides=\"state.slides\"\n :current-index=\"state.currentIndex\"\n @close=\"lightboxActions.close(props.store)\"\n @index-change=\"lightboxActions.setIndex($event, props.store)\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, watch } from 'vue'\nimport {\n lightboxActions,\n lightboxStore,\n useLightboxStore,\n type LightboxStore,\n} from '../lightbox.store'\nimport Lightbox from '../Lightbox.vue'\ndefineOptions({ name: 'LightboxProvider' })\ninterface RuntimeLightboxProviderProps {\n store?: LightboxStore\n loop?: boolean\n}\nconst props = withDefaults(defineProps<RuntimeLightboxProviderProps>(), {\n store: () => lightboxStore,\n loop: undefined,\n})\nconst attrs = useAttrs()\nconst state = useLightboxStore(props.store)\nwatch(\n () => props.loop,\n (loop) => props.store.setState({ ...props.store.getState(), loop: Boolean(loop) }),\n { immediate: true },\n)\n</script>\n<template>\n <Lightbox\n v-bind=\"{ ...attrs, loop: props.loop }\"\n :opened=\"state.opened\"\n :slides=\"state.slides\"\n :current-index=\"state.currentIndex\"\n @close=\"lightboxActions.close(props.store)\"\n @index-change=\"lightboxActions.setIndex($event, props.store)\"\n />\n</template>\n","import { factory } from '@mantine-vue/core'\nimport LightboxComponent from './Lightbox.vue'\nimport { lightbox } from './lightbox.store'\nimport { LightboxCaption } from './LightboxCaption'\nimport { LightboxCloseButton } from './LightboxCloseButton'\nimport { LightboxNavigation } from './LightboxNavigation'\nimport { LightboxProviderComponent } from './LightboxProvider'\nimport { LightboxRoot } from './LightboxRoot'\nimport { LightboxSlide } from './LightboxSlide'\nimport { LightboxSlides } from './LightboxSlides'\nimport { LightboxThumbnails } from './LightboxThumbnails'\nimport { LightboxToolbar } from './LightboxToolbar'\nimport type { LightboxFactory } from './Lightbox.props'\nimport classes from './Lightbox.module.css'\nexport const Lightbox = factory<LightboxFactory>(LightboxComponent, {\n classes,\n Root: LightboxRoot,\n Toolbar: LightboxToolbar,\n Slides: LightboxSlides,\n Slide: LightboxSlide,\n Thumbnails: LightboxThumbnails,\n Navigation: LightboxNavigation,\n Caption: LightboxCaption,\n CloseButton: LightboxCloseButton,\n Provider: LightboxProviderComponent,\n open: lightbox.open,\n close: lightbox.close,\n next: lightbox.next,\n prev: lightbox.prev,\n setIndex: lightbox.setIndex,\n})\nexport type {\n LightboxFactory,\n LightboxEmits,\n LightboxProps,\n LightboxSlots,\n LightboxStylesNames,\n} from './Lightbox.props'\n"],"mappings":"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"}
package/esm/index.mjs CHANGED
@@ -963,7 +963,7 @@ var LightboxThumbnails_default = /* @__PURE__ */ defineComponent({
963
963
  "aria-current": index === unref(ctx).currentIndex || void 0,
964
964
  onClick: ($event) => unref(ctx).setIndex(index)
965
965
  }), {
966
- default: withCtx(() => [slide.type === "custom" && slide.renderThumb ? (openBlock(), createBlock(resolveDynamicComponent(() => slide.renderThumb?.()), { key: 0 })) : getThumbnailSource(slide) ? (openBlock(), createElementBlock("img", mergeProps({
966
+ default: withCtx(() => [slide.renderThumb ? (openBlock(), createBlock(resolveDynamicComponent(() => slide.renderThumb?.({ active: index === unref(ctx).currentIndex })), { key: 0 })) : getThumbnailSource(slide) ? (openBlock(), createElementBlock("img", mergeProps({
967
967
  key: 1,
968
968
  ref_for: true
969
969
  }, unref(ctx).getStyles("thumbnailImage"), {