@mantine/lightbox 9.5.2

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 (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/cjs/Lightbox.cjs +56 -0
  4. package/cjs/Lightbox.cjs.map +1 -0
  5. package/cjs/Lightbox.module.cjs +30 -0
  6. package/cjs/Lightbox.module.cjs.map +1 -0
  7. package/cjs/LightboxCaption/LightboxCaption.cjs +30 -0
  8. package/cjs/LightboxCaption/LightboxCaption.cjs.map +1 -0
  9. package/cjs/LightboxCloseButton/LightboxCloseButton.cjs +32 -0
  10. package/cjs/LightboxCloseButton/LightboxCloseButton.cjs.map +1 -0
  11. package/cjs/LightboxNavigation/LightboxNavigation.cjs +105 -0
  12. package/cjs/LightboxNavigation/LightboxNavigation.cjs.map +1 -0
  13. package/cjs/LightboxProvider/LightboxProvider.cjs +29 -0
  14. package/cjs/LightboxProvider/LightboxProvider.cjs.map +1 -0
  15. package/cjs/LightboxRoot/LightboxRoot.cjs +407 -0
  16. package/cjs/LightboxRoot/LightboxRoot.cjs.map +1 -0
  17. package/cjs/LightboxSlide/ImageSlide.cjs +27 -0
  18. package/cjs/LightboxSlide/ImageSlide.cjs.map +1 -0
  19. package/cjs/LightboxSlide/LightboxSlide.cjs +55 -0
  20. package/cjs/LightboxSlide/LightboxSlide.cjs.map +1 -0
  21. package/cjs/LightboxSlide/VideoSlide.cjs +42 -0
  22. package/cjs/LightboxSlide/VideoSlide.cjs.map +1 -0
  23. package/cjs/LightboxSlides/LightboxSlides.cjs +56 -0
  24. package/cjs/LightboxSlides/LightboxSlides.cjs.map +1 -0
  25. package/cjs/LightboxThumbnails/LightboxThumbnails.cjs +74 -0
  26. package/cjs/LightboxThumbnails/LightboxThumbnails.cjs.map +1 -0
  27. package/cjs/LightboxToolbar/LightboxToolbar.cjs +80 -0
  28. package/cjs/LightboxToolbar/LightboxToolbar.cjs.map +1 -0
  29. package/cjs/LightboxToolbar/toolbar-items.cjs +156 -0
  30. package/cjs/LightboxToolbar/toolbar-items.cjs.map +1 -0
  31. package/cjs/_virtual/_rolldown/runtime.cjs +24 -0
  32. package/cjs/default-labels.cjs +20 -0
  33. package/cjs/default-labels.cjs.map +1 -0
  34. package/cjs/hooks/use-lightbox-keyboard.cjs +107 -0
  35. package/cjs/hooks/use-lightbox-keyboard.cjs.map +1 -0
  36. package/cjs/hooks/use-lightbox-lock-scroll.cjs +30 -0
  37. package/cjs/hooks/use-lightbox-lock-scroll.cjs.map +1 -0
  38. package/cjs/hooks/use-lightbox-swipe-close.cjs +38 -0
  39. package/cjs/hooks/use-lightbox-swipe-close.cjs.map +1 -0
  40. package/cjs/hooks/use-lightbox-zoom.cjs +257 -0
  41. package/cjs/hooks/use-lightbox-zoom.cjs.map +1 -0
  42. package/cjs/index.cjs +34 -0
  43. package/cjs/lightbox.context.cjs +8 -0
  44. package/cjs/lightbox.context.cjs.map +1 -0
  45. package/cjs/lightbox.store.cjs +90 -0
  46. package/cjs/lightbox.store.cjs.map +1 -0
  47. package/esm/Lightbox.mjs +56 -0
  48. package/esm/Lightbox.mjs.map +1 -0
  49. package/esm/Lightbox.module.mjs +30 -0
  50. package/esm/Lightbox.module.mjs.map +1 -0
  51. package/esm/LightboxCaption/LightboxCaption.mjs +30 -0
  52. package/esm/LightboxCaption/LightboxCaption.mjs.map +1 -0
  53. package/esm/LightboxCloseButton/LightboxCloseButton.mjs +32 -0
  54. package/esm/LightboxCloseButton/LightboxCloseButton.mjs.map +1 -0
  55. package/esm/LightboxNavigation/LightboxNavigation.mjs +105 -0
  56. package/esm/LightboxNavigation/LightboxNavigation.mjs.map +1 -0
  57. package/esm/LightboxProvider/LightboxProvider.mjs +29 -0
  58. package/esm/LightboxProvider/LightboxProvider.mjs.map +1 -0
  59. package/esm/LightboxRoot/LightboxRoot.mjs +404 -0
  60. package/esm/LightboxRoot/LightboxRoot.mjs.map +1 -0
  61. package/esm/LightboxSlide/ImageSlide.mjs +27 -0
  62. package/esm/LightboxSlide/ImageSlide.mjs.map +1 -0
  63. package/esm/LightboxSlide/LightboxSlide.mjs +55 -0
  64. package/esm/LightboxSlide/LightboxSlide.mjs.map +1 -0
  65. package/esm/LightboxSlide/VideoSlide.mjs +42 -0
  66. package/esm/LightboxSlide/VideoSlide.mjs.map +1 -0
  67. package/esm/LightboxSlides/LightboxSlides.mjs +56 -0
  68. package/esm/LightboxSlides/LightboxSlides.mjs.map +1 -0
  69. package/esm/LightboxThumbnails/LightboxThumbnails.mjs +72 -0
  70. package/esm/LightboxThumbnails/LightboxThumbnails.mjs.map +1 -0
  71. package/esm/LightboxToolbar/LightboxToolbar.mjs +80 -0
  72. package/esm/LightboxToolbar/LightboxToolbar.mjs.map +1 -0
  73. package/esm/LightboxToolbar/toolbar-items.mjs +153 -0
  74. package/esm/LightboxToolbar/toolbar-items.mjs.map +1 -0
  75. package/esm/default-labels.mjs +20 -0
  76. package/esm/default-labels.mjs.map +1 -0
  77. package/esm/hooks/use-lightbox-keyboard.mjs +107 -0
  78. package/esm/hooks/use-lightbox-keyboard.mjs.map +1 -0
  79. package/esm/hooks/use-lightbox-lock-scroll.mjs +30 -0
  80. package/esm/hooks/use-lightbox-lock-scroll.mjs.map +1 -0
  81. package/esm/hooks/use-lightbox-swipe-close.mjs +38 -0
  82. package/esm/hooks/use-lightbox-swipe-close.mjs.map +1 -0
  83. package/esm/hooks/use-lightbox-zoom.mjs +257 -0
  84. package/esm/hooks/use-lightbox-zoom.mjs.map +1 -0
  85. package/esm/index.mjs +14 -0
  86. package/esm/lightbox.context.mjs +8 -0
  87. package/esm/lightbox.context.mjs.map +1 -0
  88. package/esm/lightbox.store.mjs +79 -0
  89. package/esm/lightbox.store.mjs.map +1 -0
  90. package/lib/Lightbox.d.ts +63 -0
  91. package/lib/LightboxCaption/LightboxCaption.d.ts +18 -0
  92. package/lib/LightboxCloseButton/LightboxCloseButton.d.ts +16 -0
  93. package/lib/LightboxNavigation/LightboxNavigation.d.ts +16 -0
  94. package/lib/LightboxProvider/LightboxProvider.d.ts +19 -0
  95. package/lib/LightboxRoot/LightboxRoot.d.ts +88 -0
  96. package/lib/LightboxSlide/ImageSlide.d.ts +12 -0
  97. package/lib/LightboxSlide/LightboxSlide.d.ts +25 -0
  98. package/lib/LightboxSlide/VideoSlide.d.ts +12 -0
  99. package/lib/LightboxSlides/LightboxSlides.d.ts +20 -0
  100. package/lib/LightboxThumbnails/LightboxThumbnails.d.ts +16 -0
  101. package/lib/LightboxToolbar/LightboxToolbar.d.ts +19 -0
  102. package/lib/LightboxToolbar/toolbar-items.d.ts +5 -0
  103. package/lib/default-labels.d.ts +2 -0
  104. package/lib/hooks/use-lightbox-keyboard.d.ts +15 -0
  105. package/lib/hooks/use-lightbox-lock-scroll.d.ts +7 -0
  106. package/lib/hooks/use-lightbox-swipe-close.d.ts +10 -0
  107. package/lib/hooks/use-lightbox-zoom.d.ts +33 -0
  108. package/lib/index.d.mts +67 -0
  109. package/lib/index.d.ts +67 -0
  110. package/lib/lightbox.context.d.ts +36 -0
  111. package/lib/lightbox.store.d.ts +66 -0
  112. package/lib/lightbox.types.d.ts +131 -0
  113. package/lib/test-utils.d.ts +7 -0
  114. package/package.json +63 -0
  115. package/styles.css +262 -0
  116. package/styles.layer.css +263 -0
@@ -0,0 +1,66 @@
1
+ import { MantineStore } from '@mantine/store';
2
+ import type { LightboxSlideData } from './lightbox.types';
3
+ export interface LightboxState {
4
+ /** Controls whether the lightbox is opened */
5
+ opened: boolean;
6
+ /** Array of slide data objects */
7
+ slides: LightboxSlideData[];
8
+ /** Index of the current slide */
9
+ currentIndex: number;
10
+ /** Determines whether `next` and `prev` actions wrap around, synced from the `loop` prop of `Lightbox.Provider` */
11
+ loop: boolean;
12
+ }
13
+ export type LightboxStore = MantineStore<LightboxState>;
14
+ /** Creates a new lightbox store, use to run multiple independent lightboxes */
15
+ export declare const createLightboxStore: () => MantineStore<LightboxState>;
16
+ /** Subscribes to the given lightbox store and returns its current state */
17
+ export declare const useLightboxStore: (store: LightboxStore) => LightboxState;
18
+ export declare function updateLightboxStateAction(update: (state: LightboxState) => Partial<LightboxState>, store: LightboxStore): void;
19
+ export declare function openLightboxAction(payload: {
20
+ slides: LightboxSlideData[];
21
+ startIndex?: number;
22
+ }, store: LightboxStore): void;
23
+ export declare function closeLightboxAction(store: LightboxStore): void;
24
+ export declare function nextLightboxAction(store: LightboxStore): void;
25
+ export declare function prevLightboxAction(store: LightboxStore): void;
26
+ export declare function setLightboxIndexAction(index: number, store: LightboxStore): void;
27
+ export declare const lightboxActions: {
28
+ open: typeof openLightboxAction;
29
+ close: typeof closeLightboxAction;
30
+ next: typeof nextLightboxAction;
31
+ prev: typeof prevLightboxAction;
32
+ setIndex: typeof setLightboxIndexAction;
33
+ updateState: typeof updateLightboxStateAction;
34
+ };
35
+ /** Creates an isolated store and a set of actions bound to it, use to run multiple independent lightboxes */
36
+ export declare function createLightbox(): readonly [MantineStore<LightboxState>, {
37
+ /** Opens the lightbox with the given slides, optionally at the given index */
38
+ open: (payload: {
39
+ slides: LightboxSlideData[];
40
+ startIndex?: number;
41
+ }) => void;
42
+ /** Closes the lightbox */
43
+ close: () => void;
44
+ /** Navigates to the next slide */
45
+ next: () => void;
46
+ /** Navigates to the previous slide */
47
+ prev: () => void;
48
+ /** Sets the current slide index, the value is clamped to the slides range */
49
+ setIndex: (index: number) => void;
50
+ }];
51
+ /** Default lightbox store (`lightboxStore`) and actions bound to it (`lightbox`), used by `Lightbox.Provider` and static `Lightbox.open/close/next/prev/setIndex` methods */
52
+ export declare const lightboxStore: MantineStore<LightboxState>, lightbox: {
53
+ /** Opens the lightbox with the given slides, optionally at the given index */
54
+ open: (payload: {
55
+ slides: LightboxSlideData[];
56
+ startIndex?: number;
57
+ }) => void;
58
+ /** Closes the lightbox */
59
+ close: () => void;
60
+ /** Navigates to the next slide */
61
+ next: () => void;
62
+ /** Navigates to the previous slide */
63
+ prev: () => void;
64
+ /** Sets the current slide index, the value is clamped to the slides range */
65
+ setIndex: (index: number) => void;
66
+ };
@@ -0,0 +1,131 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface LightboxImageSlide {
3
+ /** Slide type, `'image'` by default */
4
+ type?: 'image';
5
+ /** Image URL */
6
+ src: string;
7
+ /** Image alt text for accessibility */
8
+ alt?: string;
9
+ /** Custom thumbnail URL, if not set `src` is used */
10
+ thumbSrc?: string;
11
+ /** Caption displayed below the slide */
12
+ caption?: ReactNode;
13
+ /** Image `srcset` attribute for responsive images */
14
+ srcSet?: string;
15
+ /** Image `sizes` attribute for responsive images */
16
+ sizes?: string;
17
+ /** Image `loading` attribute, `'eager'` for the active slide and `'lazy'` for all other slides by default */
18
+ loading?: 'eager' | 'lazy';
19
+ }
20
+ export interface LightboxVideoSlideTrack {
21
+ /** WebVTT track source URL */
22
+ src: string;
23
+ /** Track kind, `'subtitles'` by default */
24
+ kind?: string;
25
+ /** Track language code, for example `'en'` */
26
+ srcLang?: string;
27
+ /** Track label displayed in the video player captions menu */
28
+ label?: string;
29
+ /** Whether the track should be enabled by default */
30
+ default?: boolean;
31
+ }
32
+ export interface LightboxVideoSlide {
33
+ /** Slide type, must be `'video'` */
34
+ type: 'video';
35
+ /** Video source URL */
36
+ src: string;
37
+ /** Video accessible label, announced by screen readers */
38
+ label?: string;
39
+ /** Custom thumbnail URL */
40
+ thumbSrc?: string;
41
+ /** Caption displayed below the slide */
42
+ caption?: ReactNode;
43
+ /** Whether the video should auto-play when the slide becomes active */
44
+ autoPlay?: boolean;
45
+ /** Video poster image URL */
46
+ poster?: string;
47
+ /** Subtitle/caption tracks rendered as `<track>` elements */
48
+ tracks?: LightboxVideoSlideTrack[];
49
+ }
50
+ export interface LightboxCustomSlide {
51
+ /** Slide type, must be `'custom'` */
52
+ type: 'custom';
53
+ /** Render function for custom slide content, receives `{ active }` prop */
54
+ render: (props: {
55
+ active: boolean;
56
+ }) => ReactNode;
57
+ /** Render function for custom thumbnail content */
58
+ renderThumb?: () => ReactNode;
59
+ /** Custom thumbnail URL, used if `renderThumb` is not set */
60
+ thumbSrc?: string;
61
+ /** Caption displayed below the slide */
62
+ caption?: ReactNode;
63
+ }
64
+ export type LightboxSlideData = LightboxImageSlide | LightboxVideoSlide | LightboxCustomSlide;
65
+ export interface LightboxLabels {
66
+ /** Accessible label of the lightbox dialog */
67
+ lightboxLabel: string;
68
+ /** Accessible label of a slide, called with 1-based slide index and total number of slides */
69
+ slideLabel: (index: number, total: number) => string;
70
+ /** Accessible label of the slides carousel region */
71
+ slidesLabel: string;
72
+ /** Accessible label of the previous slide button */
73
+ previousSlideLabel: string;
74
+ /** Accessible label of the next slide button */
75
+ nextSlideLabel: string;
76
+ /** Accessible label of a thumbnail, called with 1-based slide index and total number of slides */
77
+ thumbnailLabel: (index: number, total: number) => string;
78
+ /** Label of the fullscreen toolbar button when the document is not in fullscreen mode */
79
+ enterFullscreenLabel: string;
80
+ /** Label of the fullscreen toolbar button when the document is in fullscreen mode */
81
+ exitFullscreenLabel: string;
82
+ /** Label of the thumbnails toolbar button when the thumbnails strip is hidden */
83
+ showThumbnailsLabel: string;
84
+ /** Label of the thumbnails toolbar button when the thumbnails strip is visible */
85
+ hideThumbnailsLabel: string;
86
+ /** Label of the download toolbar button */
87
+ downloadLabel: string;
88
+ /** Label of the close toolbar button */
89
+ closeLabel: string;
90
+ }
91
+ export interface ToolbarItem {
92
+ /** Unique key for the toolbar item */
93
+ key: string;
94
+ /** Icon element displayed in the button */
95
+ icon: ReactNode;
96
+ /** Accessible label for the button */
97
+ label: string;
98
+ /** Called when the button is clicked */
99
+ onClick: () => void;
100
+ /** Position in the toolbar, `'right'` by default */
101
+ position?: 'left' | 'right';
102
+ }
103
+ export interface ToolbarItemsPayload {
104
+ /** Array of slide data objects */
105
+ slides: LightboxSlideData[];
106
+ /** Index of the currently displayed slide */
107
+ currentIndex: number;
108
+ /** Sets the current slide index */
109
+ setIndex: (index: number) => void;
110
+ /** Navigates to the next slide */
111
+ next: () => void;
112
+ /** Navigates to the previous slide */
113
+ prev: () => void;
114
+ /** Closes the lightbox */
115
+ close: () => void;
116
+ /** Determines whether the thumbnails strip is currently visible */
117
+ thumbnailsVisible: boolean;
118
+ /** Toggles thumbnails strip visibility */
119
+ toggleThumbnails: () => void;
120
+ /** Determines whether the document is currently displayed in fullscreen mode */
121
+ isFullscreen: boolean;
122
+ /** Toggles fullscreen mode */
123
+ toggleFullscreen: () => void;
124
+ /** Determines whether the current image is zoomed in */
125
+ zoomed: boolean;
126
+ /** Toggles zoom of the current image */
127
+ toggleZoom: () => void;
128
+ /** Labels of the lightbox, `labels` prop merged with the default labels */
129
+ labels: LightboxLabels;
130
+ }
131
+ export type ToolbarItems = ToolbarItem[] | ((payload: ToolbarItemsPayload) => ToolbarItem[]);
@@ -0,0 +1,7 @@
1
+ import type { LightboxSlideData } from './lightbox.types';
2
+ import { LightboxRootProps } from './LightboxRoot/LightboxRoot';
3
+ export declare const testSlides: LightboxSlideData[];
4
+ export declare const defaultRootProps: LightboxRootProps;
5
+ export declare function LightboxWrapper({ children, ...props }: Partial<LightboxRootProps> & {
6
+ children: React.ReactNode;
7
+ }): import("react").JSX.Element;
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@mantine/lightbox",
3
+ "version": "9.5.2",
4
+ "description": "Full-screen media lightbox with carousel navigation",
5
+ "homepage": "https://mantine.dev/",
6
+ "license": "MIT",
7
+ "author": "Vitaly Rtishchev <rtivital@gmail.com>",
8
+ "keywords": [
9
+ "carousel",
10
+ "components",
11
+ "frontend",
12
+ "gallery",
13
+ "library",
14
+ "lightbox",
15
+ "react",
16
+ "ui",
17
+ "ui-kit",
18
+ "viewer"
19
+ ],
20
+ "sideEffects": [
21
+ "*.css"
22
+ ],
23
+ "main": "./cjs/index.cjs",
24
+ "module": "./esm/index.mjs",
25
+ "types": "./lib/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "import": {
29
+ "types": "./lib/index.d.mts",
30
+ "default": "./esm/index.mjs"
31
+ },
32
+ "require": {
33
+ "types": "./lib/index.d.ts",
34
+ "default": "./cjs/index.cjs"
35
+ }
36
+ },
37
+ "./styles.css": "./styles.css",
38
+ "./styles.layer.css": "./styles.layer.css"
39
+ },
40
+ "repository": {
41
+ "url": "https://github.com/mantinedev/mantine.git",
42
+ "type": "git",
43
+ "directory": "packages/@mantine/lightbox"
44
+ },
45
+ "peerDependencies": {
46
+ "@mantine/core": "9.5.2",
47
+ "@mantine/hooks": "9.5.2",
48
+ "embla-carousel": ">=8.0.0",
49
+ "embla-carousel-react": ">=8.0.0",
50
+ "react": "^19.2.0",
51
+ "react-dom": "^19.2.0"
52
+ },
53
+ "dependencies": {
54
+ "@mantine/store": "9.5.2"
55
+ },
56
+ "devDependencies": {
57
+ "@mantine-tests/core": "workspace:*",
58
+ "@mantine/core": "workspace:*",
59
+ "@mantine/hooks": "workspace:*",
60
+ "react": "19.2.8",
61
+ "react-dom": "19.2.8"
62
+ }
63
+ }
package/styles.css ADDED
@@ -0,0 +1,262 @@
1
+ .m_4f1afa9a {
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
+
8
+ display: contents;
9
+ }
10
+
11
+ .m_143cf98 {
12
+ position: fixed;
13
+ inset: 0;
14
+ z-index: var(--lightbox-z-index);
15
+ background-color: var(--lightbox-overlay-color);
16
+ }
17
+
18
+ .m_7b06bfc1 {
19
+ position: fixed;
20
+ inset: 0;
21
+ z-index: var(--lightbox-z-index);
22
+ display: flex;
23
+ flex-direction: column;
24
+ color: var(--mantine-color-white);
25
+ outline: none;
26
+ }
27
+
28
+ .m_fe5b16c3 {
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: space-between;
32
+ height: var(--lightbox-toolbar-height);
33
+ padding: 0 var(--mantine-spacing-md);
34
+ flex-shrink: 0;
35
+ z-index: 1;
36
+ }
37
+
38
+ .m_9e01b17c {
39
+ display: flex;
40
+ align-items: center;
41
+ gap: var(--mantine-spacing-xs);
42
+ }
43
+
44
+ .m_19d8cbd5 {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ width: calc(2.5rem * var(--mantine-scale));
49
+ height: calc(2.5rem * var(--mantine-scale));
50
+ border-radius: var(--mantine-radius-sm);
51
+ color: var(--mantine-color-white);
52
+ opacity: 0.8;
53
+ transition:
54
+ opacity var(--lightbox-transition-duration) ease,
55
+ background-color var(--lightbox-transition-duration) ease;
56
+ }
57
+
58
+ @media (hover: hover) {
59
+
60
+ .m_19d8cbd5:hover {
61
+ opacity: 1;
62
+ background-color: rgba(255, 255, 255, 0.1);
63
+ }
64
+ }
65
+
66
+ @media (hover: none) {
67
+
68
+ .m_19d8cbd5:active {
69
+ opacity: 1;
70
+ background-color: rgba(255, 255, 255, 0.1);
71
+ }
72
+ }
73
+
74
+ .m_7b66e144 {
75
+ font-size: var(--mantine-font-size-sm);
76
+ color: var(--mantine-color-white);
77
+ opacity: 0.8;
78
+ user-select: none;
79
+ }
80
+
81
+ .m_f5ce649a {
82
+ flex: 1;
83
+ position: relative;
84
+ overflow: hidden;
85
+ min-height: 0;
86
+ }
87
+
88
+ .m_7f838760 {
89
+ height: 100%;
90
+ overflow: hidden;
91
+ }
92
+
93
+ .m_b5439507 {
94
+ display: flex;
95
+ height: 100%;
96
+ }
97
+
98
+ .m_9450faf9 {
99
+ position: relative;
100
+ flex: 0 0 100%;
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: center;
104
+ padding: var(--mantine-spacing-md);
105
+ min-width: 0;
106
+ }
107
+
108
+ .m_e659b1e2 {
109
+ max-width: 100%;
110
+ max-height: 100%;
111
+ object-fit: contain;
112
+ user-select: none;
113
+ -webkit-user-drag: none;
114
+ transition: transform var(--lightbox-transition-duration) ease;
115
+ }
116
+
117
+ .m_e659b1e2[data-zoom-enabled] {
118
+ touch-action: none;
119
+ }
120
+
121
+ .m_e659b1e2[data-zoomed] {
122
+ cursor: grab;
123
+ }
124
+
125
+ .m_e659b1e2[data-zoomed]:active {
126
+ cursor: grabbing;
127
+ }
128
+
129
+ .m_e659b1e2[data-dragging] {
130
+ transition: none;
131
+ }
132
+
133
+ .m_e659b1e2[data-zoom-enabled]:not([data-zoomed]) {
134
+ cursor: zoom-in;
135
+ }
136
+
137
+ .m_e70f1d02 {
138
+ width: 100%;
139
+ height: 100%;
140
+ max-width: 100%;
141
+ max-height: 100%;
142
+ object-fit: contain;
143
+ }
144
+
145
+ .m_411d1cbf {
146
+ display: block;
147
+ padding: 0 var(--mantine-spacing-md);
148
+ flex-shrink: 0;
149
+ overflow: hidden;
150
+ }
151
+
152
+ .m_3a7e4a85 {
153
+ width: fit-content;
154
+ max-width: 100%;
155
+ margin-inline: auto;
156
+ height: var(--lightbox-thumbnails-height);
157
+ overflow: hidden;
158
+ }
159
+
160
+ .m_59a13682 {
161
+ display: flex;
162
+ gap: var(--mantine-spacing-xs);
163
+ height: 100%;
164
+ align-items: center;
165
+ }
166
+
167
+ .m_3be82a34 {
168
+ flex: 0 0 auto;
169
+ width: calc(4rem * var(--mantine-scale));
170
+ height: calc(4rem * var(--mantine-scale));
171
+ border-radius: var(--mantine-radius-sm);
172
+ overflow: hidden;
173
+ opacity: 0.5;
174
+ border: calc(0.125rem * var(--mantine-scale)) solid transparent;
175
+ cursor: pointer;
176
+ transition:
177
+ opacity var(--lightbox-transition-duration) ease,
178
+ border-color var(--lightbox-transition-duration) ease;
179
+ padding: 0;
180
+ background: none;
181
+ }
182
+
183
+ @media (hover: hover) {
184
+
185
+ .m_3be82a34:hover {
186
+ opacity: 0.8;
187
+ }
188
+ }
189
+
190
+ @media (hover: none) {
191
+
192
+ .m_3be82a34:active {
193
+ opacity: 0.8;
194
+ }
195
+ }
196
+
197
+ .m_3be82a34[data-active] {
198
+ opacity: 1;
199
+ border-color: var(--mantine-primary-color-filled);
200
+ }
201
+
202
+ .m_fd95cf87 {
203
+ width: 100%;
204
+ height: 100%;
205
+ object-fit: cover;
206
+ }
207
+
208
+ .m_15a759cc {
209
+ position: absolute;
210
+ top: 50%;
211
+ display: flex;
212
+ justify-content: space-between;
213
+ width: 100%;
214
+ padding: 0 var(--mantine-spacing-md);
215
+ pointer-events: none;
216
+ transform: translateY(-50%);
217
+ z-index: 1;
218
+ }
219
+
220
+ .m_a5bee41e {
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ width: calc(3rem * var(--mantine-scale));
225
+ height: calc(3rem * var(--mantine-scale));
226
+ color: var(--mantine-color-white);
227
+ pointer-events: all;
228
+ opacity: 0.7;
229
+ transition: opacity var(--lightbox-transition-duration) ease;
230
+ }
231
+
232
+ @media (hover: hover) {
233
+
234
+ .m_a5bee41e:hover {
235
+ opacity: 1;
236
+ }
237
+ }
238
+
239
+ @media (hover: none) {
240
+
241
+ .m_a5bee41e:active {
242
+ opacity: 1;
243
+ }
244
+ }
245
+
246
+ .m_a5bee41e[data-inactive] {
247
+ opacity: 0.3;
248
+ pointer-events: none;
249
+ }
250
+
251
+ .m_633f252e {
252
+ text-align: center;
253
+ padding: var(--mantine-spacing-xs) var(--mantine-spacing-md);
254
+ font-size: var(--mantine-font-size-sm);
255
+ color: var(--mantine-color-white);
256
+ opacity: 0.8;
257
+ flex-shrink: 0;
258
+ }
259
+
260
+ .m_1ae53e92 {
261
+ color: var(--mantine-color-white);
262
+ }