@mantine-vue/lightbox 3.3.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/README.md +14 -0
- package/cjs/index.cjs +1482 -0
- package/cjs/index.cjs.map +1 -0
- package/esm/index.mjs +1431 -0
- package/esm/index.mjs.map +1 -0
- package/lib/Lightbox.d.ts +35 -0
- package/lib/Lightbox.props.d.ts +57 -0
- package/lib/Lightbox.vue.d.ts +52 -0
- package/lib/LightboxCaption/LightboxCaption.d.ts +5 -0
- package/lib/LightboxCaption/LightboxCaption.vue.d.ts +3 -0
- package/lib/LightboxCaption/index.d.ts +1 -0
- package/lib/LightboxCloseButton/LightboxCloseButton.d.ts +9 -0
- package/lib/LightboxCloseButton/LightboxCloseButton.vue.d.ts +13 -0
- package/lib/LightboxCloseButton/index.d.ts +1 -0
- package/lib/LightboxNavigation/LightboxNavigation.d.ts +5 -0
- package/lib/LightboxNavigation/LightboxNavigation.vue.d.ts +3 -0
- package/lib/LightboxNavigation/index.d.ts +1 -0
- package/lib/LightboxProvider/LightboxProvider.d.ts +7 -0
- package/lib/LightboxProvider/LightboxProvider.vue.d.ts +8 -0
- package/lib/LightboxProvider/index.d.ts +1 -0
- package/lib/LightboxRoot/LightboxRoot.d.ts +4 -0
- package/lib/LightboxRoot/LightboxRoot.types.d.ts +73 -0
- package/lib/LightboxRoot/LightboxRoot.vue.d.ts +35 -0
- package/lib/LightboxRoot/index.d.ts +1 -0
- package/lib/LightboxSlide/LightboxSlide.d.ts +3 -0
- package/lib/LightboxSlide/LightboxSlide.types.d.ts +16 -0
- package/lib/LightboxSlide/LightboxSlide.vue.d.ts +11 -0
- package/lib/LightboxSlide/index.d.ts +1 -0
- package/lib/LightboxSlides/LightboxSlides.d.ts +9 -0
- package/lib/LightboxSlides/LightboxSlides.vue.d.ts +13 -0
- package/lib/LightboxSlides/index.d.ts +1 -0
- package/lib/LightboxThumbnails/LightboxThumbnails.d.ts +5 -0
- package/lib/LightboxThumbnails/LightboxThumbnails.vue.d.ts +3 -0
- package/lib/LightboxThumbnails/index.d.ts +1 -0
- package/lib/LightboxToolbar/LightboxToolbar.d.ts +9 -0
- package/lib/LightboxToolbar/LightboxToolbar.vue.d.ts +7 -0
- package/lib/LightboxToolbar/index.d.ts +1 -0
- package/lib/LightboxToolbar/toolbar-items.d.ts +5 -0
- package/lib/default-labels.d.ts +2 -0
- package/lib/hooks/use-lightbox-zoom.d.ts +38 -0
- package/lib/index.d.mts +13 -0
- package/lib/index.d.ts +13 -0
- package/lib/lightbox.context.d.ts +21 -0
- package/lib/lightbox.store.d.ts +54 -0
- package/lib/types.d.ts +75 -0
- package/package.json +50 -0
- package/styles.css +201 -0
- package/styles.layer.css +203 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","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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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { lightbox } from './lightbox.store';
|
|
2
|
+
import { LightboxCaption } from './LightboxCaption';
|
|
3
|
+
import { LightboxCloseButton } from './LightboxCloseButton';
|
|
4
|
+
import { LightboxNavigation } from './LightboxNavigation';
|
|
5
|
+
import { LightboxProviderComponent } from './LightboxProvider';
|
|
6
|
+
import { LightboxRoot } from './LightboxRoot';
|
|
7
|
+
import { LightboxSlide } from './LightboxSlide';
|
|
8
|
+
import { LightboxSlides } from './LightboxSlides';
|
|
9
|
+
import { LightboxThumbnails } from './LightboxThumbnails';
|
|
10
|
+
import { LightboxToolbar } from './LightboxToolbar';
|
|
11
|
+
export declare const Lightbox: import("@mantine-vue/core").MantineComponent<{
|
|
12
|
+
props: import("./Lightbox.props").LightboxProps;
|
|
13
|
+
slots: import("./Lightbox.props").LightboxSlots;
|
|
14
|
+
emits: import("./Lightbox.props").LightboxEmits;
|
|
15
|
+
ref: HTMLDivElement;
|
|
16
|
+
element: "div";
|
|
17
|
+
stylesNames: import("./Lightbox.props").LightboxStylesNames;
|
|
18
|
+
staticComponents: {
|
|
19
|
+
Root: typeof LightboxRoot;
|
|
20
|
+
Toolbar: typeof LightboxToolbar;
|
|
21
|
+
Slides: typeof LightboxSlides;
|
|
22
|
+
Slide: typeof LightboxSlide;
|
|
23
|
+
Thumbnails: typeof LightboxThumbnails;
|
|
24
|
+
Navigation: typeof LightboxNavigation;
|
|
25
|
+
Caption: typeof LightboxCaption;
|
|
26
|
+
CloseButton: typeof LightboxCloseButton;
|
|
27
|
+
Provider: typeof LightboxProviderComponent;
|
|
28
|
+
open: typeof lightbox.open;
|
|
29
|
+
close: typeof lightbox.close;
|
|
30
|
+
next: typeof lightbox.next;
|
|
31
|
+
prev: typeof lightbox.prev;
|
|
32
|
+
setIndex: typeof lightbox.setIndex;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
export type { LightboxFactory, LightboxEmits, LightboxProps, LightboxSlots, LightboxStylesNames, } from './Lightbox.props';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { VNodeChild } from 'vue';
|
|
2
|
+
import type { Factory } from '@mantine-vue/core';
|
|
3
|
+
import type { ToolbarItems, LightboxSlideData } from './types';
|
|
4
|
+
import type { lightbox } from './lightbox.store';
|
|
5
|
+
import type { LightboxCaption } from './LightboxCaption';
|
|
6
|
+
import type { LightboxCloseButton } from './LightboxCloseButton';
|
|
7
|
+
import type { LightboxNavigation } from './LightboxNavigation';
|
|
8
|
+
import type { LightboxProviderComponent } from './LightboxProvider';
|
|
9
|
+
import type { LightboxRootProps, LightboxRootStylesNames } from './LightboxRoot';
|
|
10
|
+
import type { LightboxRoot } from './LightboxRoot';
|
|
11
|
+
import type { LightboxSlide } from './LightboxSlide';
|
|
12
|
+
import type { LightboxSlides } from './LightboxSlides';
|
|
13
|
+
import type { LightboxThumbnails } from './LightboxThumbnails';
|
|
14
|
+
import type { LightboxToolbar } from './LightboxToolbar';
|
|
15
|
+
export type LightboxStylesNames = LightboxRootStylesNames;
|
|
16
|
+
export interface LightboxProps extends LightboxRootProps {
|
|
17
|
+
toolbarItems?: ToolbarItems;
|
|
18
|
+
withNavigation?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface LightboxSlots {
|
|
21
|
+
default?: () => VNodeChild;
|
|
22
|
+
slide?: (props: {
|
|
23
|
+
slide: LightboxSlideData;
|
|
24
|
+
index: number;
|
|
25
|
+
active: boolean;
|
|
26
|
+
}) => VNodeChild;
|
|
27
|
+
}
|
|
28
|
+
export interface LightboxEmits {
|
|
29
|
+
close: [];
|
|
30
|
+
'update:opened': [opened: boolean];
|
|
31
|
+
indexChange: [index: number];
|
|
32
|
+
'update:currentIndex': [index: number];
|
|
33
|
+
}
|
|
34
|
+
export type LightboxFactory = Factory<{
|
|
35
|
+
props: LightboxProps;
|
|
36
|
+
slots: LightboxSlots;
|
|
37
|
+
emits: LightboxEmits;
|
|
38
|
+
ref: HTMLDivElement;
|
|
39
|
+
element: 'div';
|
|
40
|
+
stylesNames: LightboxStylesNames;
|
|
41
|
+
staticComponents: {
|
|
42
|
+
Root: typeof LightboxRoot;
|
|
43
|
+
Toolbar: typeof LightboxToolbar;
|
|
44
|
+
Slides: typeof LightboxSlides;
|
|
45
|
+
Slide: typeof LightboxSlide;
|
|
46
|
+
Thumbnails: typeof LightboxThumbnails;
|
|
47
|
+
Navigation: typeof LightboxNavigation;
|
|
48
|
+
Caption: typeof LightboxCaption;
|
|
49
|
+
CloseButton: typeof LightboxCloseButton;
|
|
50
|
+
Provider: typeof LightboxProviderComponent;
|
|
51
|
+
open: typeof lightbox.open;
|
|
52
|
+
close: typeof lightbox.close;
|
|
53
|
+
next: typeof lightbox.next;
|
|
54
|
+
prev: typeof lightbox.prev;
|
|
55
|
+
setIndex: typeof lightbox.setIndex;
|
|
56
|
+
};
|
|
57
|
+
}>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { EmblaOptionsType } from 'embla-carousel';
|
|
2
|
+
import type { LightboxSlots } from './Lightbox.props';
|
|
3
|
+
import type { LightboxLabels, LightboxSlideData, ToolbarItems } from './types';
|
|
4
|
+
interface RuntimeLightboxProps {
|
|
5
|
+
opened: boolean;
|
|
6
|
+
slides: LightboxSlideData[];
|
|
7
|
+
currentIndex?: number;
|
|
8
|
+
labels?: Partial<LightboxLabels>;
|
|
9
|
+
withZoom?: boolean;
|
|
10
|
+
withThumbnails?: boolean;
|
|
11
|
+
withFullscreen?: boolean;
|
|
12
|
+
withDownload?: boolean;
|
|
13
|
+
loop?: boolean;
|
|
14
|
+
closeOnClickOutside?: boolean;
|
|
15
|
+
closeOnSwipeDown?: boolean;
|
|
16
|
+
withKeyboardEvents?: boolean;
|
|
17
|
+
returnFocus?: boolean;
|
|
18
|
+
withInitialFocusPlaceholder?: boolean;
|
|
19
|
+
withinPortal?: boolean;
|
|
20
|
+
zIndex?: string | number;
|
|
21
|
+
transitionDuration?: number;
|
|
22
|
+
transitionProps?: Record<string, unknown>;
|
|
23
|
+
emblaOptions?: EmblaOptionsType;
|
|
24
|
+
zoomMaxScale?: number;
|
|
25
|
+
withSlideTransition?: boolean;
|
|
26
|
+
toolbarItems?: ToolbarItems;
|
|
27
|
+
withNavigation?: boolean;
|
|
28
|
+
classNames?: any;
|
|
29
|
+
styles?: any;
|
|
30
|
+
vars?: any;
|
|
31
|
+
unstyled?: boolean;
|
|
32
|
+
}
|
|
33
|
+
type __VLS_Slots = LightboxSlots;
|
|
34
|
+
declare const __VLS_base: import("vue").DefineComponent<RuntimeLightboxProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
35
|
+
close: () => any;
|
|
36
|
+
"update:opened": (opened: boolean) => any;
|
|
37
|
+
indexChange: (index: number) => any;
|
|
38
|
+
"update:currentIndex": (index: number) => any;
|
|
39
|
+
}, string, import("vue").PublicProps, Readonly<RuntimeLightboxProps> & Readonly<{
|
|
40
|
+
onClose?: (() => any) | undefined;
|
|
41
|
+
"onUpdate:opened"?: ((opened: boolean) => any) | undefined;
|
|
42
|
+
onIndexChange?: ((index: number) => any) | undefined;
|
|
43
|
+
"onUpdate:currentIndex"?: ((index: number) => any) | undefined;
|
|
44
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
45
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
46
|
+
declare const _default: typeof __VLS_export;
|
|
47
|
+
export default _default;
|
|
48
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
49
|
+
new (): {
|
|
50
|
+
$slots: S;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LightboxCaption';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VNodeChild } from 'vue';
|
|
2
|
+
import type { BoxProps } from '@mantine-vue/core';
|
|
3
|
+
import LightboxCloseButton from './LightboxCloseButton.vue';
|
|
4
|
+
export { LightboxCloseButton };
|
|
5
|
+
export type LightboxCloseButtonStylesNames = 'closeButton';
|
|
6
|
+
export type LightboxCloseButtonProps = BoxProps;
|
|
7
|
+
export interface LightboxCloseButtonSlots {
|
|
8
|
+
default?: () => VNodeChild;
|
|
9
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare var __VLS_10: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
default?: (props: typeof __VLS_10) => any;
|
|
4
|
+
};
|
|
5
|
+
declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
6
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
8
|
+
export default _default;
|
|
9
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
10
|
+
new (): {
|
|
11
|
+
$slots: S;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LightboxCloseButton';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BoxProps } from '@mantine-vue/core';
|
|
2
|
+
import LightboxNavigation from './LightboxNavigation.vue';
|
|
3
|
+
export { LightboxNavigation };
|
|
4
|
+
export type LightboxNavigationStylesNames = 'navigation' | 'navigationButton';
|
|
5
|
+
export type LightboxNavigationProps = BoxProps;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LightboxNavigation';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LightboxProps } from '../Lightbox.props';
|
|
2
|
+
import type { LightboxStore } from '../lightbox.store';
|
|
3
|
+
import LightboxProviderComponent from './LightboxProvider.vue';
|
|
4
|
+
export { LightboxProviderComponent };
|
|
5
|
+
export interface LightboxProviderProps extends Omit<LightboxProps, 'opened' | 'slides' | 'currentIndex'> {
|
|
6
|
+
store?: LightboxStore;
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type LightboxStore } from '../lightbox.store';
|
|
2
|
+
interface RuntimeLightboxProviderProps {
|
|
3
|
+
store?: LightboxStore;
|
|
4
|
+
loop?: boolean;
|
|
5
|
+
}
|
|
6
|
+
declare const __VLS_export: import("vue").DefineComponent<RuntimeLightboxProviderProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<RuntimeLightboxProviderProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
8
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LightboxProvider';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import LightboxRoot from './LightboxRoot.vue';
|
|
2
|
+
export { LightboxRoot };
|
|
3
|
+
export { lightboxRootDefaultProps } from './LightboxRoot.vue';
|
|
4
|
+
export type { LightboxCssVariables, LightboxRootEmits, LightboxRootFactory, LightboxRootOwnProps, LightboxRootProps, LightboxRootSlots, LightboxRootStylesNames, } from './LightboxRoot.types';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { VNodeChild } from 'vue';
|
|
2
|
+
import type { EmblaOptionsType } from 'embla-carousel';
|
|
3
|
+
import type { BoxProps, Factory, TransitionOverride } from '@mantine-vue/core';
|
|
4
|
+
import type { StylesApiProps } from '@mantine-vue/core/styles-api';
|
|
5
|
+
import type { LightboxLabels, LightboxSlideData } from '../types';
|
|
6
|
+
export type LightboxRootStylesNames = 'root' | 'overlay' | 'content' | 'toolbar' | 'toolbarGroup' | 'toolbarButton' | 'counter' | 'slides' | 'slidesViewport' | 'slidesContainer' | 'slide' | 'slideImage' | 'slideVideo' | 'thumbnails' | 'thumbnailsViewport' | 'thumbnailsContainer' | 'thumbnail' | 'thumbnailImage' | 'navigation' | 'navigationButton' | 'caption' | 'closeButton';
|
|
7
|
+
export type LightboxCssVariables = {
|
|
8
|
+
root: '--lightbox-transition-duration' | '--lightbox-overlay-color' | '--lightbox-z-index' | '--lightbox-toolbar-height' | '--lightbox-thumbnails-height';
|
|
9
|
+
};
|
|
10
|
+
export interface LightboxRootOwnProps extends StylesApiProps<LightboxRootFactory> {
|
|
11
|
+
/** Determines whether the lightbox is opened */
|
|
12
|
+
opened: boolean;
|
|
13
|
+
/** Array of slide data objects */
|
|
14
|
+
slides: LightboxSlideData[];
|
|
15
|
+
/** Controlled current slide index */
|
|
16
|
+
currentIndex?: number;
|
|
17
|
+
/** Labels used for accessibility and localization */
|
|
18
|
+
labels?: Partial<LightboxLabels>;
|
|
19
|
+
/** Enables image zoom on click, wheel and pinch @default false */
|
|
20
|
+
withZoom?: boolean;
|
|
21
|
+
/** Shows the bottom thumbnail strip @default false */
|
|
22
|
+
withThumbnails?: boolean;
|
|
23
|
+
/** Adds the fullscreen toggle to the toolbar @default false */
|
|
24
|
+
withFullscreen?: boolean;
|
|
25
|
+
/** Adds the download button to the toolbar @default false */
|
|
26
|
+
withDownload?: boolean;
|
|
27
|
+
/** Enables infinite loop navigation @default false */
|
|
28
|
+
loop?: boolean;
|
|
29
|
+
/** Closes the lightbox when the empty space around slide content is clicked @default false */
|
|
30
|
+
closeOnClickOutside?: boolean;
|
|
31
|
+
/** Closes the lightbox when swiping down on mobile @default true */
|
|
32
|
+
closeOnSwipeDown?: boolean;
|
|
33
|
+
/** Enables keyboard shortcuts; Escape always closes the lightbox @default true */
|
|
34
|
+
withKeyboardEvents?: boolean;
|
|
35
|
+
/** Determines whether focus is returned to the last active element after close @default true */
|
|
36
|
+
returnFocus?: boolean;
|
|
37
|
+
/** Adds an initial hidden focus target for pointer-opened lightboxes @default true */
|
|
38
|
+
withInitialFocusPlaceholder?: boolean;
|
|
39
|
+
/** Determines whether the lightbox is rendered inside a portal @default true */
|
|
40
|
+
withinPortal?: boolean;
|
|
41
|
+
/** Z-index of the overlay and content @default 400 */
|
|
42
|
+
zIndex?: string | number;
|
|
43
|
+
/** Transition duration in milliseconds @default 200 */
|
|
44
|
+
transitionDuration?: number;
|
|
45
|
+
/** Props passed to the content transition */
|
|
46
|
+
transitionProps?: TransitionOverride;
|
|
47
|
+
/** Additional Embla carousel options; loop and startIndex are controlled by root props */
|
|
48
|
+
emblaOptions?: EmblaOptionsType;
|
|
49
|
+
/** Maximum image zoom scale @default 3 */
|
|
50
|
+
zoomMaxScale?: number;
|
|
51
|
+
/** Enables animated programmatic slide transitions @default false */
|
|
52
|
+
withSlideTransition?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface LightboxRootProps extends Omit<BoxProps, keyof LightboxRootOwnProps>, LightboxRootOwnProps {
|
|
55
|
+
}
|
|
56
|
+
export interface LightboxRootEmits {
|
|
57
|
+
close: [];
|
|
58
|
+
'update:opened': [opened: boolean];
|
|
59
|
+
indexChange: [index: number];
|
|
60
|
+
'update:currentIndex': [index: number];
|
|
61
|
+
}
|
|
62
|
+
export interface LightboxRootSlots {
|
|
63
|
+
default?: () => VNodeChild;
|
|
64
|
+
}
|
|
65
|
+
export type LightboxRootFactory = Factory<{
|
|
66
|
+
props: LightboxRootProps;
|
|
67
|
+
slots: LightboxRootSlots;
|
|
68
|
+
emits: LightboxRootEmits;
|
|
69
|
+
ref: HTMLDivElement;
|
|
70
|
+
element: 'div';
|
|
71
|
+
stylesNames: LightboxRootStylesNames;
|
|
72
|
+
vars: LightboxCssVariables;
|
|
73
|
+
}>;
|