@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.
Files changed (48) hide show
  1. package/README.md +14 -0
  2. package/cjs/index.cjs +1482 -0
  3. package/cjs/index.cjs.map +1 -0
  4. package/esm/index.mjs +1431 -0
  5. package/esm/index.mjs.map +1 -0
  6. package/lib/Lightbox.d.ts +35 -0
  7. package/lib/Lightbox.props.d.ts +57 -0
  8. package/lib/Lightbox.vue.d.ts +52 -0
  9. package/lib/LightboxCaption/LightboxCaption.d.ts +5 -0
  10. package/lib/LightboxCaption/LightboxCaption.vue.d.ts +3 -0
  11. package/lib/LightboxCaption/index.d.ts +1 -0
  12. package/lib/LightboxCloseButton/LightboxCloseButton.d.ts +9 -0
  13. package/lib/LightboxCloseButton/LightboxCloseButton.vue.d.ts +13 -0
  14. package/lib/LightboxCloseButton/index.d.ts +1 -0
  15. package/lib/LightboxNavigation/LightboxNavigation.d.ts +5 -0
  16. package/lib/LightboxNavigation/LightboxNavigation.vue.d.ts +3 -0
  17. package/lib/LightboxNavigation/index.d.ts +1 -0
  18. package/lib/LightboxProvider/LightboxProvider.d.ts +7 -0
  19. package/lib/LightboxProvider/LightboxProvider.vue.d.ts +8 -0
  20. package/lib/LightboxProvider/index.d.ts +1 -0
  21. package/lib/LightboxRoot/LightboxRoot.d.ts +4 -0
  22. package/lib/LightboxRoot/LightboxRoot.types.d.ts +73 -0
  23. package/lib/LightboxRoot/LightboxRoot.vue.d.ts +35 -0
  24. package/lib/LightboxRoot/index.d.ts +1 -0
  25. package/lib/LightboxSlide/LightboxSlide.d.ts +3 -0
  26. package/lib/LightboxSlide/LightboxSlide.types.d.ts +16 -0
  27. package/lib/LightboxSlide/LightboxSlide.vue.d.ts +11 -0
  28. package/lib/LightboxSlide/index.d.ts +1 -0
  29. package/lib/LightboxSlides/LightboxSlides.d.ts +9 -0
  30. package/lib/LightboxSlides/LightboxSlides.vue.d.ts +13 -0
  31. package/lib/LightboxSlides/index.d.ts +1 -0
  32. package/lib/LightboxThumbnails/LightboxThumbnails.d.ts +5 -0
  33. package/lib/LightboxThumbnails/LightboxThumbnails.vue.d.ts +3 -0
  34. package/lib/LightboxThumbnails/index.d.ts +1 -0
  35. package/lib/LightboxToolbar/LightboxToolbar.d.ts +9 -0
  36. package/lib/LightboxToolbar/LightboxToolbar.vue.d.ts +7 -0
  37. package/lib/LightboxToolbar/index.d.ts +1 -0
  38. package/lib/LightboxToolbar/toolbar-items.d.ts +5 -0
  39. package/lib/default-labels.d.ts +2 -0
  40. package/lib/hooks/use-lightbox-zoom.d.ts +38 -0
  41. package/lib/index.d.mts +13 -0
  42. package/lib/index.d.ts +13 -0
  43. package/lib/lightbox.context.d.ts +21 -0
  44. package/lib/lightbox.store.d.ts +54 -0
  45. package/lib/types.d.ts +75 -0
  46. package/package.json +50 -0
  47. package/styles.css +201 -0
  48. package/styles.layer.css +203 -0
@@ -0,0 +1,35 @@
1
+ import type { LightboxRootOwnProps, LightboxRootSlots } from './LightboxRoot.types';
2
+ export declare const lightboxRootDefaultProps: {
3
+ readonly withZoom: false;
4
+ readonly withThumbnails: false;
5
+ readonly withFullscreen: false;
6
+ readonly withDownload: false;
7
+ readonly loop: false;
8
+ readonly closeOnClickOutside: false;
9
+ readonly closeOnSwipeDown: true;
10
+ readonly withKeyboardEvents: true;
11
+ readonly returnFocus: true;
12
+ readonly withInitialFocusPlaceholder: true;
13
+ readonly withinPortal: true;
14
+ readonly transitionDuration: 200;
15
+ readonly zoomMaxScale: 3;
16
+ readonly withSlideTransition: false;
17
+ };
18
+ declare const _default: typeof __VLS_export;
19
+ export default _default;
20
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<LightboxRootOwnProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
21
+ close: () => any;
22
+ "update:opened": (opened: boolean) => any;
23
+ indexChange: (index: number) => any;
24
+ "update:currentIndex": (index: number) => any;
25
+ }, string, import("vue").PublicProps, Readonly<LightboxRootOwnProps> & Readonly<{
26
+ onClose?: (() => any) | undefined;
27
+ "onUpdate:opened"?: ((opened: boolean) => any) | undefined;
28
+ onIndexChange?: ((index: number) => any) | undefined;
29
+ "onUpdate:currentIndex"?: ((index: number) => any) | undefined;
30
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, LightboxRootSlots>;
31
+ type __VLS_WithSlots<T, S> = T & {
32
+ new (): {
33
+ $slots: S;
34
+ };
35
+ };
@@ -0,0 +1 @@
1
+ export * from './LightboxRoot';
@@ -0,0 +1,3 @@
1
+ import LightboxSlide from './LightboxSlide.vue';
2
+ export { LightboxSlide };
3
+ export type { LightboxSlideProps, LightboxSlideSlots, LightboxSlideStylesNames, } from './LightboxSlide.types';
@@ -0,0 +1,16 @@
1
+ import type { VNodeChild } from 'vue';
2
+ import type { BoxProps } from '@mantine-vue/core';
3
+ import type { LightboxSlideData } from '../types';
4
+ export type LightboxSlideStylesNames = 'slide' | 'slideImage' | 'slideVideo';
5
+ export interface LightboxSlideProps extends /* @vue-ignore */ BoxProps {
6
+ /** Slide data rendered by the component */
7
+ slide: LightboxSlideData;
8
+ /** Zero-based slide index */
9
+ index: number;
10
+ }
11
+ export interface LightboxSlideSlots {
12
+ default?: (props: {
13
+ slide: LightboxSlideData;
14
+ active: boolean;
15
+ }) => VNodeChild;
16
+ }
@@ -0,0 +1,11 @@
1
+ import type { LightboxSlideProps, LightboxSlideSlots } from './LightboxSlide.types';
2
+ type __VLS_Slots = LightboxSlideSlots;
3
+ declare const __VLS_base: import("vue").DefineComponent<LightboxSlideProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<LightboxSlideProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
4
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
7
+ type __VLS_WithSlots<T, S> = T & {
8
+ new (): {
9
+ $slots: S;
10
+ };
11
+ };
@@ -0,0 +1 @@
1
+ export * from './LightboxSlide';
@@ -0,0 +1,9 @@
1
+ import type { VNodeChild } from 'vue';
2
+ import type { BoxProps } from '@mantine-vue/core';
3
+ import LightboxSlides from './LightboxSlides.vue';
4
+ export { LightboxSlides };
5
+ export type LightboxSlidesStylesNames = 'slides' | 'slidesViewport' | 'slidesContainer';
6
+ export type LightboxSlidesProps = BoxProps;
7
+ export interface LightboxSlidesSlots {
8
+ default?: () => VNodeChild;
9
+ }
@@ -0,0 +1,13 @@
1
+ declare var __VLS_8: {};
2
+ type __VLS_Slots = {} & {
3
+ default?: (props: typeof __VLS_8) => 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 './LightboxSlides';
@@ -0,0 +1,5 @@
1
+ import type { BoxProps } from '@mantine-vue/core';
2
+ import LightboxThumbnails from './LightboxThumbnails.vue';
3
+ export { LightboxThumbnails };
4
+ export type LightboxThumbnailsStylesNames = 'thumbnails' | 'thumbnailsViewport' | 'thumbnailsContainer' | 'thumbnail' | 'thumbnailImage';
5
+ export type LightboxThumbnailsProps = 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 './LightboxThumbnails';
@@ -0,0 +1,9 @@
1
+ import type { BoxProps } from '@mantine-vue/core';
2
+ import type { ToolbarItems } from '../types';
3
+ import LightboxToolbar from './LightboxToolbar.vue';
4
+ export { LightboxToolbar };
5
+ export * from './toolbar-items';
6
+ export type LightboxToolbarStylesNames = 'toolbar' | 'toolbarGroup' | 'toolbarButton' | 'counter';
7
+ export interface LightboxToolbarProps extends BoxProps {
8
+ toolbarItems?: ToolbarItems;
9
+ }
@@ -0,0 +1,7 @@
1
+ import type { ToolbarItems } from '../types';
2
+ type __VLS_Props = {
3
+ toolbarItems?: ToolbarItems;
4
+ };
5
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const _default: typeof __VLS_export;
7
+ export default _default;
@@ -0,0 +1 @@
1
+ export * from './LightboxToolbar';
@@ -0,0 +1,5 @@
1
+ import type { LightboxLabels, ToolbarItem } from '../types';
2
+ export declare function createFullscreenToolbarItem(toggle: () => void, isFullscreen: boolean, labels?: LightboxLabels): ToolbarItem;
3
+ export declare function createThumbnailsToolbarItem(toggle: () => void, visible: boolean, labels?: LightboxLabels): ToolbarItem;
4
+ export declare function createDownloadToolbarItem(src: string, labels?: LightboxLabels): ToolbarItem;
5
+ export declare function createCloseToolbarItem(onClose: () => void, labels?: LightboxLabels): ToolbarItem;
@@ -0,0 +1,2 @@
1
+ import type { LightboxLabels } from './types';
2
+ export declare const DEFAULT_LABELS: LightboxLabels;
@@ -0,0 +1,38 @@
1
+ import { type CSSProperties } from 'vue';
2
+ export interface LightboxZoomState {
3
+ scale: number;
4
+ translateX: number;
5
+ translateY: number;
6
+ isZoomed: boolean;
7
+ }
8
+ interface UseLightboxZoomInput {
9
+ enabled: () => boolean;
10
+ maxScale: () => number;
11
+ currentIndex: () => number;
12
+ }
13
+ export declare function useLightboxZoom({ enabled, maxScale, currentIndex }: UseLightboxZoomInput): {
14
+ zoomState: import("vue").ComputedRef<{
15
+ scale: number;
16
+ isZoomed: boolean;
17
+ }>;
18
+ toggleZoom: () => void;
19
+ resetZoom: () => void;
20
+ panZoom: (deltaX: number, deltaY: number) => boolean;
21
+ getImageProps: () => {
22
+ ref: (node: unknown) => void;
23
+ style: CSSProperties;
24
+ 'data-zoom-enabled': true | undefined;
25
+ 'data-zoomed': true | undefined;
26
+ 'data-dragging': true | undefined;
27
+ onPointerdown: (event: PointerEvent) => void;
28
+ onPointermove: (event: PointerEvent) => void;
29
+ onPointerup: () => void;
30
+ onPointercancel: () => void;
31
+ onLostpointercapture: () => void;
32
+ onClick: (event: MouseEvent) => void;
33
+ onDblclick: () => void;
34
+ onTouchmove: (event: TouchEvent) => void;
35
+ onTouchend: () => void;
36
+ };
37
+ };
38
+ export {};
@@ -0,0 +1,13 @@
1
+ export * from './Lightbox';
2
+ export * from './LightboxRoot';
3
+ export * from './LightboxToolbar';
4
+ export * from './LightboxSlides';
5
+ export * from './LightboxSlide';
6
+ export * from './LightboxThumbnails';
7
+ export * from './LightboxNavigation';
8
+ export * from './LightboxCaption';
9
+ export * from './LightboxCloseButton';
10
+ export * from './LightboxProvider';
11
+ export * from './lightbox.store';
12
+ export * from './types';
13
+ export { DEFAULT_LABELS } from './default-labels';
package/lib/index.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ export * from './Lightbox';
2
+ export * from './LightboxRoot';
3
+ export * from './LightboxToolbar';
4
+ export * from './LightboxSlides';
5
+ export * from './LightboxSlide';
6
+ export * from './LightboxThumbnails';
7
+ export * from './LightboxNavigation';
8
+ export * from './LightboxCaption';
9
+ export * from './LightboxCloseButton';
10
+ export * from './LightboxProvider';
11
+ export * from './lightbox.store';
12
+ export * from './types';
13
+ export { DEFAULT_LABELS } from './default-labels';
@@ -0,0 +1,21 @@
1
+ import type { EmblaOptionsType } from 'embla-carousel';
2
+ import type { LightboxLabels, ToolbarItemsPayload } from './types';
3
+ export interface LightboxContextValue extends ToolbarItemsPayload {
4
+ getStyles: (selector: string, options?: Record<string, any>) => Record<string, any>;
5
+ opened: boolean;
6
+ withZoom: boolean;
7
+ withThumbnails: boolean;
8
+ withFullscreen: boolean;
9
+ withDownload: boolean;
10
+ loop: boolean;
11
+ closeOnSwipeDown: boolean;
12
+ closeOnClickOutside: boolean;
13
+ withSlideTransition: boolean;
14
+ transitionDuration: number;
15
+ emblaOptions?: EmblaOptionsType;
16
+ labels: LightboxLabels;
17
+ zoomScale: number;
18
+ panZoom: (deltaX: number, deltaY: number) => boolean;
19
+ getImageZoomProps: () => Record<string, any>;
20
+ }
21
+ export declare const provideLightboxContext: (value: LightboxContextValue) => void, useLightboxContext: () => LightboxContextValue;
@@ -0,0 +1,54 @@
1
+ import type { LightboxSlideData } from './types';
2
+ export interface LightboxState {
3
+ opened: boolean;
4
+ slides: LightboxSlideData[];
5
+ currentIndex: number;
6
+ loop: boolean;
7
+ }
8
+ export interface LightboxStore {
9
+ state: LightboxState;
10
+ getState: () => LightboxState;
11
+ setState: (state: LightboxState) => void;
12
+ }
13
+ export declare const createLightboxStore: () => LightboxStore;
14
+ export declare const useLightboxStore: (store: LightboxStore) => LightboxState;
15
+ export declare function updateLightboxStateAction(update: (state: LightboxState) => Partial<LightboxState>, store: LightboxStore): void;
16
+ export declare const openLightboxAction: (payload: {
17
+ slides: LightboxSlideData[];
18
+ startIndex?: number;
19
+ }, store: LightboxStore) => void;
20
+ export declare const closeLightboxAction: (store: LightboxStore) => void;
21
+ export declare const nextLightboxAction: (store: LightboxStore) => void;
22
+ export declare const prevLightboxAction: (store: LightboxStore) => void;
23
+ export declare const setLightboxIndexAction: (index: number, store: LightboxStore) => void;
24
+ export declare const lightboxActions: {
25
+ open: (payload: {
26
+ slides: LightboxSlideData[];
27
+ startIndex?: number;
28
+ }, store: LightboxStore) => void;
29
+ close: (store: LightboxStore) => void;
30
+ next: (store: LightboxStore) => void;
31
+ prev: (store: LightboxStore) => void;
32
+ setIndex: (index: number, store: LightboxStore) => void;
33
+ updateState: typeof updateLightboxStateAction;
34
+ };
35
+ export declare function createLightbox(): readonly [LightboxStore, {
36
+ readonly open: (payload: {
37
+ slides: LightboxSlideData[];
38
+ startIndex?: number;
39
+ }) => void;
40
+ readonly close: () => void;
41
+ readonly next: () => void;
42
+ readonly prev: () => void;
43
+ readonly setIndex: (index: number) => void;
44
+ }];
45
+ export declare const lightboxStore: LightboxStore, lightbox: {
46
+ readonly open: (payload: {
47
+ slides: LightboxSlideData[];
48
+ startIndex?: number;
49
+ }) => void;
50
+ readonly close: () => void;
51
+ readonly next: () => void;
52
+ readonly prev: () => void;
53
+ readonly setIndex: (index: number) => void;
54
+ };
package/lib/types.d.ts ADDED
@@ -0,0 +1,75 @@
1
+ import type { Component, VNodeChild } from 'vue';
2
+ export interface LightboxImageSlide {
3
+ type?: 'image';
4
+ src: string;
5
+ alt?: string;
6
+ thumbSrc?: string;
7
+ caption?: VNodeChild;
8
+ srcSet?: string;
9
+ sizes?: string;
10
+ loading?: 'eager' | 'lazy';
11
+ }
12
+ export interface LightboxVideoSlideTrack {
13
+ src: string;
14
+ kind?: string;
15
+ srcLang?: string;
16
+ label?: string;
17
+ default?: boolean;
18
+ }
19
+ export interface LightboxVideoSlide {
20
+ type: 'video';
21
+ src: string;
22
+ label?: string;
23
+ thumbSrc?: string;
24
+ caption?: VNodeChild;
25
+ autoPlay?: boolean;
26
+ poster?: string;
27
+ tracks?: LightboxVideoSlideTrack[];
28
+ }
29
+ export interface LightboxCustomSlide {
30
+ type: 'custom';
31
+ render: (props: {
32
+ active: boolean;
33
+ }) => VNodeChild;
34
+ renderThumb?: () => VNodeChild;
35
+ thumbSrc?: string;
36
+ caption?: VNodeChild;
37
+ }
38
+ export type LightboxSlideData = LightboxImageSlide | LightboxVideoSlide | LightboxCustomSlide;
39
+ export interface LightboxLabels {
40
+ lightboxLabel: string;
41
+ slideLabel: (index: number, total: number) => string;
42
+ slidesLabel: string;
43
+ previousSlideLabel: string;
44
+ nextSlideLabel: string;
45
+ thumbnailLabel: (index: number, total: number) => string;
46
+ enterFullscreenLabel: string;
47
+ exitFullscreenLabel: string;
48
+ showThumbnailsLabel: string;
49
+ hideThumbnailsLabel: string;
50
+ downloadLabel: string;
51
+ closeLabel: string;
52
+ }
53
+ export interface ToolbarItem {
54
+ key: string;
55
+ icon: VNodeChild | Component;
56
+ label: string;
57
+ onClick: () => void;
58
+ position?: 'left' | 'right';
59
+ }
60
+ export interface ToolbarItemsPayload {
61
+ slides: LightboxSlideData[];
62
+ currentIndex: number;
63
+ setIndex: (index: number) => void;
64
+ next: () => void;
65
+ prev: () => void;
66
+ close: () => void;
67
+ thumbnailsVisible: boolean;
68
+ toggleThumbnails: () => void;
69
+ isFullscreen: boolean;
70
+ toggleFullscreen: () => void;
71
+ zoomed: boolean;
72
+ toggleZoom: () => void;
73
+ labels: LightboxLabels;
74
+ }
75
+ export type ToolbarItems = ToolbarItem[] | ((payload: ToolbarItemsPayload) => ToolbarItem[]);
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@mantine-vue/lightbox",
3
+ "version": "3.3.0",
4
+ "description": "Full-screen media lightbox with carousel navigation for Vue",
5
+ "license": "MIT",
6
+ "files": [
7
+ "cjs",
8
+ "esm",
9
+ "lib",
10
+ "styles.css",
11
+ "styles.layer.css",
12
+ "styles"
13
+ ],
14
+ "sideEffects": [
15
+ "*.css"
16
+ ],
17
+ "main": "./cjs/index.cjs",
18
+ "module": "./esm/index.mjs",
19
+ "types": "./lib/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "import": {
23
+ "types": "./lib/index.d.mts",
24
+ "default": "./esm/index.mjs"
25
+ },
26
+ "require": {
27
+ "types": "./lib/index.d.ts",
28
+ "default": "./cjs/index.cjs"
29
+ }
30
+ },
31
+ "./styles.css": "./styles.css",
32
+ "./styles.layer.css": "./styles.layer.css"
33
+ },
34
+ "devDependencies": {
35
+ "@mantine-vue/core": "workspace:*",
36
+ "@mantine-vue/hooks": "workspace:*",
37
+ "@vue/compiler-dom": "^3.5.0",
38
+ "@vue/test-utils": "^2.4.6",
39
+ "embla-carousel": "^8.6.0",
40
+ "embla-carousel-vue": "^8.6.0",
41
+ "vue": "^3.5.0"
42
+ },
43
+ "peerDependencies": {
44
+ "@mantine-vue/core": "3.3.0",
45
+ "@mantine-vue/hooks": "3.3.0",
46
+ "embla-carousel": ">=8.0.0",
47
+ "embla-carousel-vue": ">=8.0.0",
48
+ "vue": "^3.5.0"
49
+ }
50
+ }
package/styles.css ADDED
@@ -0,0 +1,201 @@
1
+ ._root_13vd4_1 {
2
+ --lightbox-transition-duration: 200ms;
3
+ --lightbox-overlay-color: rgba(0, 0, 0, 0.9);
4
+ --lightbox-z-index: 400;
5
+ --lightbox-toolbar-height: calc(3.5rem * var(--mantine-scale));
6
+ --lightbox-thumbnails-height: calc(6.25rem * var(--mantine-scale));
7
+ display: contents;
8
+ }
9
+ ._overlay_13vd4_9 {
10
+ position: fixed;
11
+ inset: 0;
12
+ z-index: var(--lightbox-z-index);
13
+ background-color: var(--lightbox-overlay-color);
14
+ }
15
+ ._content_13vd4_15 {
16
+ position: fixed;
17
+ inset: 0;
18
+ z-index: var(--lightbox-z-index);
19
+ display: flex;
20
+ flex-direction: column;
21
+ color: var(--mantine-color-white);
22
+ outline: none;
23
+ }
24
+ ._toolbar_13vd4_24 {
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: space-between;
28
+ height: var(--lightbox-toolbar-height);
29
+ padding: 0 var(--mantine-spacing-md);
30
+ flex-shrink: 0;
31
+ z-index: 1;
32
+ }
33
+ ._toolbarGroup_13vd4_33 {
34
+ display: flex;
35
+ align-items: center;
36
+ gap: var(--mantine-spacing-xs);
37
+ }
38
+ ._toolbarButton_13vd4_38 {
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ width: calc(2.5rem * var(--mantine-scale));
43
+ height: calc(2.5rem * var(--mantine-scale));
44
+ border-radius: var(--mantine-radius-sm);
45
+ color: var(--mantine-color-white);
46
+ opacity: 0.8;
47
+ transition:
48
+ opacity var(--lightbox-transition-duration) ease,
49
+ background-color var(--lightbox-transition-duration) ease;
50
+ }
51
+ ._toolbarButton_13vd4_38:hover {
52
+ opacity: 1;
53
+ background-color: rgba(255, 255, 255, 0.1);
54
+ }
55
+ ._counter_13vd4_55 {
56
+ font-size: var(--mantine-font-size-sm);
57
+ color: var(--mantine-color-white);
58
+ opacity: 0.8;
59
+ user-select: none;
60
+ }
61
+ ._slides_13vd4_61 {
62
+ flex: 1;
63
+ position: relative;
64
+ overflow: hidden;
65
+ min-height: 0;
66
+ }
67
+ ._slidesViewport_13vd4_67 {
68
+ height: 100%;
69
+ overflow: hidden;
70
+ touch-action: pan-y pinch-zoom;
71
+ }
72
+ ._slidesContainer_13vd4_72 {
73
+ display: flex;
74
+ height: 100%;
75
+ }
76
+ ._slide_13vd4_61 {
77
+ position: relative;
78
+ flex: 0 0 100%;
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ padding: var(--mantine-spacing-md);
83
+ min-width: 0;
84
+ }
85
+ ._slideImage_13vd4_85 {
86
+ max-width: 100%;
87
+ max-height: 100%;
88
+ object-fit: contain;
89
+ user-select: none;
90
+ -webkit-user-drag: none;
91
+ transition: transform var(--lightbox-transition-duration) ease;
92
+ }
93
+ ._slideImage_13vd4_85[data-zoom-enabled] {
94
+ touch-action: none;
95
+ }
96
+ ._slideImage_13vd4_85[data-zoom-enabled]:not([data-zoomed]) {
97
+ cursor: zoom-in;
98
+ }
99
+ ._slideImage_13vd4_85[data-zoomed] {
100
+ cursor: grab;
101
+ }
102
+ ._slideImage_13vd4_85[data-zoomed]:active {
103
+ cursor: grabbing;
104
+ }
105
+ ._slideImage_13vd4_85[data-dragging] {
106
+ transition: none;
107
+ }
108
+ ._slideVideo_13vd4_108 {
109
+ width: 100%;
110
+ height: 100%;
111
+ max-width: 100%;
112
+ max-height: 100%;
113
+ object-fit: contain;
114
+ }
115
+ ._thumbnails_13vd4_115 {
116
+ display: block;
117
+ padding: 0 var(--mantine-spacing-md);
118
+ flex-shrink: 0;
119
+ overflow: hidden;
120
+ }
121
+ ._thumbnailsViewport_13vd4_121 {
122
+ width: fit-content;
123
+ max-width: 100%;
124
+ margin-inline: auto;
125
+ height: var(--lightbox-thumbnails-height);
126
+ overflow: hidden;
127
+ }
128
+ ._thumbnailsContainer_13vd4_128 {
129
+ display: flex;
130
+ gap: var(--mantine-spacing-xs);
131
+ height: 100%;
132
+ align-items: center;
133
+ }
134
+ ._thumbnail_13vd4_115 {
135
+ flex: 0 0 auto;
136
+ width: calc(4rem * var(--mantine-scale));
137
+ height: calc(4rem * var(--mantine-scale));
138
+ border-radius: var(--mantine-radius-sm);
139
+ overflow: hidden;
140
+ opacity: 0.5;
141
+ border: calc(0.125rem * var(--mantine-scale)) solid transparent;
142
+ cursor: pointer;
143
+ transition:
144
+ opacity var(--lightbox-transition-duration) ease,
145
+ border-color var(--lightbox-transition-duration) ease;
146
+ padding: 0;
147
+ background: none;
148
+ }
149
+ ._thumbnail_13vd4_115:hover {
150
+ opacity: 0.8;
151
+ }
152
+ ._thumbnail_13vd4_115[data-active] {
153
+ opacity: 1;
154
+ border-color: var(--mantine-primary-color-filled);
155
+ }
156
+ ._thumbnailImage_13vd4_156 {
157
+ width: 100%;
158
+ height: 100%;
159
+ object-fit: cover;
160
+ }
161
+ ._navigation_13vd4_161 {
162
+ position: absolute;
163
+ top: 50%;
164
+ display: flex;
165
+ justify-content: space-between;
166
+ width: 100%;
167
+ padding: 0 var(--mantine-spacing-md);
168
+ pointer-events: none;
169
+ transform: translateY(-50%);
170
+ z-index: 1;
171
+ }
172
+ ._navigationButton_13vd4_172 {
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ width: calc(3rem * var(--mantine-scale));
177
+ height: calc(3rem * var(--mantine-scale));
178
+ color: var(--mantine-color-white);
179
+ pointer-events: all;
180
+ opacity: 0.7;
181
+ transition: opacity var(--lightbox-transition-duration) ease;
182
+ }
183
+ ._navigationButton_13vd4_172:hover {
184
+ opacity: 1;
185
+ }
186
+ ._navigationButton_13vd4_172[data-inactive] {
187
+ opacity: 0.3;
188
+ pointer-events: none;
189
+ }
190
+ ._caption_13vd4_190 {
191
+ text-align: center;
192
+ padding: var(--mantine-spacing-xs) var(--mantine-spacing-md);
193
+ font-size: var(--mantine-font-size-sm);
194
+ color: var(--mantine-color-white);
195
+ opacity: 0.8;
196
+ flex-shrink: 0;
197
+ }
198
+ ._closeButton_13vd4_198 {
199
+ color: var(--mantine-color-white);
200
+ }
201
+ /*$vite$:1*/