@mantine-bites/lightbox 1.0.0-beta.4 → 1.0.0-beta.6

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 (181) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/Lightbox.cjs +149 -134
  3. package/dist/cjs/Lightbox.cjs.map +1 -1
  4. package/dist/cjs/Lightbox.context.cjs.map +1 -1
  5. package/dist/cjs/Lightbox.defaults.cjs +31 -0
  6. package/dist/cjs/Lightbox.defaults.cjs.map +1 -0
  7. package/dist/cjs/Lightbox.module.css.cjs +1 -1
  8. package/dist/cjs/LightboxProvider.cjs +144 -0
  9. package/dist/cjs/LightboxProvider.cjs.map +1 -0
  10. package/dist/cjs/LightboxSlide.cjs.map +1 -1
  11. package/dist/cjs/LightboxVariables.cjs +52 -0
  12. package/dist/cjs/LightboxVariables.cjs.map +1 -0
  13. package/dist/cjs/components/EnterFullscreen.cjs +30 -0
  14. package/dist/cjs/components/EnterFullscreen.cjs.map +1 -0
  15. package/dist/cjs/components/ExitFullscreen.cjs +30 -0
  16. package/dist/cjs/components/ExitFullscreen.cjs.map +1 -0
  17. package/dist/cjs/components/LightboxCarousel.cjs +22 -0
  18. package/dist/cjs/components/LightboxCarousel.cjs.map +1 -0
  19. package/dist/cjs/components/LightboxControls.cjs +86 -0
  20. package/dist/cjs/components/LightboxControls.cjs.map +1 -0
  21. package/dist/cjs/components/LightboxSlides.cjs +88 -0
  22. package/dist/cjs/components/LightboxSlides.cjs.map +1 -0
  23. package/dist/cjs/components/LightboxThumbnails.cjs +29 -0
  24. package/dist/cjs/components/LightboxThumbnails.cjs.map +1 -0
  25. package/dist/cjs/components/LightboxToolbar.cjs +65 -0
  26. package/dist/cjs/components/LightboxToolbar.cjs.map +1 -0
  27. package/dist/cjs/components/QuestionMark.cjs +2 -1
  28. package/dist/cjs/components/QuestionMark.cjs.map +1 -1
  29. package/dist/cjs/components/ZoomIn.cjs +30 -0
  30. package/dist/cjs/components/ZoomIn.cjs.map +1 -0
  31. package/dist/cjs/components/ZoomOut.cjs +29 -0
  32. package/dist/cjs/components/ZoomOut.cjs.map +1 -0
  33. package/dist/cjs/get-chevron-rotation.cjs +12 -0
  34. package/dist/cjs/get-chevron-rotation.cjs.map +1 -0
  35. package/dist/cjs/hooks/useCarouselOptions.cjs +30 -0
  36. package/dist/cjs/hooks/useCarouselOptions.cjs.map +1 -0
  37. package/dist/cjs/hooks/useFullscreen.cjs +39 -0
  38. package/dist/cjs/hooks/useFullscreen.cjs.map +1 -0
  39. package/dist/cjs/hooks/useKeyboardNavigation.cjs +29 -0
  40. package/dist/cjs/hooks/useKeyboardNavigation.cjs.map +1 -0
  41. package/dist/cjs/hooks/useLightbox.cjs +95 -109
  42. package/dist/cjs/hooks/useLightbox.cjs.map +1 -1
  43. package/dist/cjs/hooks/useSlideInteractions.cjs +94 -0
  44. package/dist/cjs/hooks/useSlideInteractions.cjs.map +1 -0
  45. package/dist/cjs/hooks/useZoom.cjs +226 -0
  46. package/dist/cjs/hooks/useZoom.cjs.map +1 -0
  47. package/dist/cjs/utils/fullscreen.cjs +41 -0
  48. package/dist/cjs/utils/fullscreen.cjs.map +1 -0
  49. package/dist/cjs/utils/getChevronRotation.cjs +12 -0
  50. package/dist/cjs/utils/getChevronRotation.cjs.map +1 -0
  51. package/dist/cjs/utils/zoom.cjs +118 -0
  52. package/dist/cjs/utils/zoom.cjs.map +1 -0
  53. package/dist/esm/Lightbox.context.mjs.map +1 -1
  54. package/dist/esm/Lightbox.defaults.mjs +29 -0
  55. package/dist/esm/Lightbox.defaults.mjs.map +1 -0
  56. package/dist/esm/Lightbox.mjs +150 -135
  57. package/dist/esm/Lightbox.mjs.map +1 -1
  58. package/dist/esm/Lightbox.module.css.mjs +1 -1
  59. package/dist/esm/LightboxProvider.mjs +141 -0
  60. package/dist/esm/LightboxProvider.mjs.map +1 -0
  61. package/dist/esm/LightboxSlide.mjs.map +1 -1
  62. package/dist/esm/LightboxVariables.mjs +50 -0
  63. package/dist/esm/LightboxVariables.mjs.map +1 -0
  64. package/dist/esm/components/EnterFullscreen.mjs +28 -0
  65. package/dist/esm/components/EnterFullscreen.mjs.map +1 -0
  66. package/dist/esm/components/ExitFullscreen.mjs +28 -0
  67. package/dist/esm/components/ExitFullscreen.mjs.map +1 -0
  68. package/dist/esm/components/LightboxCarousel.mjs +20 -0
  69. package/dist/esm/components/LightboxCarousel.mjs.map +1 -0
  70. package/dist/esm/components/LightboxControls.mjs +84 -0
  71. package/dist/esm/components/LightboxControls.mjs.map +1 -0
  72. package/dist/esm/components/LightboxSlides.mjs +86 -0
  73. package/dist/esm/components/LightboxSlides.mjs.map +1 -0
  74. package/dist/esm/components/LightboxThumbnails.mjs +27 -0
  75. package/dist/esm/components/LightboxThumbnails.mjs.map +1 -0
  76. package/dist/esm/components/LightboxToolbar.mjs +63 -0
  77. package/dist/esm/components/LightboxToolbar.mjs.map +1 -0
  78. package/dist/esm/components/QuestionMark.mjs +2 -1
  79. package/dist/esm/components/QuestionMark.mjs.map +1 -1
  80. package/dist/esm/components/ZoomIn.mjs +28 -0
  81. package/dist/esm/components/ZoomIn.mjs.map +1 -0
  82. package/dist/esm/components/ZoomOut.mjs +27 -0
  83. package/dist/esm/components/ZoomOut.mjs.map +1 -0
  84. package/dist/esm/get-chevron-rotation.mjs +10 -0
  85. package/dist/esm/get-chevron-rotation.mjs.map +1 -0
  86. package/dist/esm/hooks/useCarouselOptions.mjs +28 -0
  87. package/dist/esm/hooks/useCarouselOptions.mjs.map +1 -0
  88. package/dist/esm/hooks/useFullscreen.mjs +37 -0
  89. package/dist/esm/hooks/useFullscreen.mjs.map +1 -0
  90. package/dist/esm/hooks/useKeyboardNavigation.mjs +27 -0
  91. package/dist/esm/hooks/useKeyboardNavigation.mjs.map +1 -0
  92. package/dist/esm/hooks/useLightbox.mjs +96 -110
  93. package/dist/esm/hooks/useLightbox.mjs.map +1 -1
  94. package/dist/esm/hooks/useSlideInteractions.mjs +92 -0
  95. package/dist/esm/hooks/useSlideInteractions.mjs.map +1 -0
  96. package/dist/esm/hooks/useZoom.mjs +224 -0
  97. package/dist/esm/hooks/useZoom.mjs.map +1 -0
  98. package/dist/esm/utils/fullscreen.mjs +36 -0
  99. package/dist/esm/utils/fullscreen.mjs.map +1 -0
  100. package/dist/esm/utils/getChevronRotation.mjs +10 -0
  101. package/dist/esm/utils/getChevronRotation.mjs.map +1 -0
  102. package/dist/esm/utils/zoom.mjs +102 -0
  103. package/dist/esm/utils/zoom.mjs.map +1 -0
  104. package/dist/styles.css +1 -1
  105. package/dist/styles.layer.css +1 -1
  106. package/dist/types/Lightbox.context.d.ts +24 -0
  107. package/dist/types/Lightbox.context.d.ts.map +1 -1
  108. package/dist/types/Lightbox.d.ts +83 -13
  109. package/dist/types/Lightbox.d.ts.map +1 -1
  110. package/dist/types/Lightbox.defaults.d.ts +26 -0
  111. package/dist/types/Lightbox.defaults.d.ts.map +1 -0
  112. package/dist/types/LightboxProvider.d.ts +50 -0
  113. package/dist/types/LightboxProvider.d.ts.map +1 -0
  114. package/dist/types/LightboxSlide.d.ts +1 -1
  115. package/dist/types/LightboxSlide.d.ts.map +1 -1
  116. package/dist/types/LightboxVariables.d.ts +9 -0
  117. package/dist/types/LightboxVariables.d.ts.map +1 -0
  118. package/dist/types/components/EnterFullscreen.d.ts +3 -0
  119. package/dist/types/components/EnterFullscreen.d.ts.map +1 -0
  120. package/dist/types/components/ExitFullscreen.d.ts +3 -0
  121. package/dist/types/components/ExitFullscreen.d.ts.map +1 -0
  122. package/dist/types/components/LightboxCarousel.d.ts +4 -0
  123. package/dist/types/components/LightboxCarousel.d.ts.map +1 -0
  124. package/dist/types/components/LightboxControls.d.ts +2 -0
  125. package/dist/types/components/LightboxControls.d.ts.map +1 -0
  126. package/dist/types/components/LightboxSlides.d.ts +2 -0
  127. package/dist/types/components/LightboxSlides.d.ts.map +1 -0
  128. package/dist/types/components/LightboxThumbnails.d.ts +2 -0
  129. package/dist/types/components/LightboxThumbnails.d.ts.map +1 -0
  130. package/dist/types/components/LightboxToolbar.d.ts +2 -0
  131. package/dist/types/components/LightboxToolbar.d.ts.map +1 -0
  132. package/dist/types/components/QuestionMark.d.ts +2 -1
  133. package/dist/types/components/QuestionMark.d.ts.map +1 -1
  134. package/dist/types/components/ZoomIn.d.ts +3 -0
  135. package/dist/types/components/ZoomIn.d.ts.map +1 -0
  136. package/dist/types/components/ZoomOut.d.ts +3 -0
  137. package/dist/types/components/ZoomOut.d.ts.map +1 -0
  138. package/dist/types/get-chevron-rotation.d.ts +8 -0
  139. package/dist/types/get-chevron-rotation.d.ts.map +1 -0
  140. package/dist/types/hooks/useCarouselOptions.d.ts +20 -0
  141. package/dist/types/hooks/useCarouselOptions.d.ts.map +1 -0
  142. package/dist/types/hooks/useFullscreen.d.ts +11 -0
  143. package/dist/types/hooks/useFullscreen.d.ts.map +1 -0
  144. package/dist/types/hooks/useKeyboardNavigation.d.ts +10 -0
  145. package/dist/types/hooks/useKeyboardNavigation.d.ts.map +1 -0
  146. package/dist/types/hooks/useLightbox.d.ts +36 -21
  147. package/dist/types/hooks/useLightbox.d.ts.map +1 -1
  148. package/dist/types/hooks/useSlideInteractions.d.ts +26 -0
  149. package/dist/types/hooks/useSlideInteractions.d.ts.map +1 -0
  150. package/dist/types/hooks/useZoom.d.ts +30 -0
  151. package/dist/types/hooks/useZoom.d.ts.map +1 -0
  152. package/dist/types/index.d.mts +1 -1
  153. package/dist/types/index.d.ts +1 -1
  154. package/dist/types/index.d.ts.map +1 -1
  155. package/dist/types/utils/fullscreen.d.ts +21 -0
  156. package/dist/types/utils/fullscreen.d.ts.map +1 -0
  157. package/dist/types/utils/getChevronRotation.d.ts +8 -0
  158. package/dist/types/utils/getChevronRotation.d.ts.map +1 -0
  159. package/dist/types/utils/zoom.d.ts +119 -0
  160. package/dist/types/utils/zoom.d.ts.map +1 -0
  161. package/dist/types/utils/zoom.test.d.ts +2 -0
  162. package/dist/types/utils/zoom.test.d.ts.map +1 -0
  163. package/package.json +1 -1
  164. package/dist/cjs/components/ChevronLeft.cjs +0 -24
  165. package/dist/cjs/components/ChevronLeft.cjs.map +0 -1
  166. package/dist/cjs/components/ChevronRight.cjs +0 -24
  167. package/dist/cjs/components/ChevronRight.cjs.map +0 -1
  168. package/dist/cjs/hooks/useLightboxSlide.cjs +0 -21
  169. package/dist/cjs/hooks/useLightboxSlide.cjs.map +0 -1
  170. package/dist/esm/components/ChevronLeft.mjs +0 -22
  171. package/dist/esm/components/ChevronLeft.mjs.map +0 -1
  172. package/dist/esm/components/ChevronRight.mjs +0 -22
  173. package/dist/esm/components/ChevronRight.mjs.map +0 -1
  174. package/dist/esm/hooks/useLightboxSlide.mjs +0 -19
  175. package/dist/esm/hooks/useLightboxSlide.mjs.map +0 -1
  176. package/dist/types/components/ChevronLeft.d.ts +0 -2
  177. package/dist/types/components/ChevronLeft.d.ts.map +0 -1
  178. package/dist/types/components/ChevronRight.d.ts +0 -2
  179. package/dist/types/components/ChevronRight.d.ts.map +0 -1
  180. package/dist/types/hooks/useLightboxSlide.d.ts +0 -357
  181. package/dist/types/hooks/useLightboxSlide.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoom.mjs","sources":["../../../src/utils/zoom.ts"],"sourcesContent":["/** Pixel offset representing a translation applied to a zoomed image. */\nexport interface ZoomOffset {\n\t/** Horizontal translation in pixels. */\n\tx: number;\n\t/** Vertical translation in pixels. */\n\ty: number;\n}\n\n/** Default zoom scale applied when zooming in on an image. */\nexport const DEFAULT_ZOOM_SCALE = 2;\n\n/** Minimum pointer movement in pixels before a gesture is considered a drag. */\nexport const POINTER_MOVE_THRESHOLD = 2;\n\n/** Zero-offset value representing no translation on a zoomed image. */\nexport const ZERO_ZOOM_OFFSET: ZoomOffset = { x: 0, y: 0 };\n\n/** Tracks the state of a pointer used to detect outside-content close gestures. */\nexport interface OutsideClosePointerState {\n\t/** Identifier of the tracked pointer. */\n\tpointerId: number;\n\t/** Horizontal position where the pointer was initially pressed. */\n\tstartX: number;\n\t/** Vertical position where the pointer was initially pressed. */\n\tstartY: number;\n\t/** Whether the pointer press originated outside the slide content area. */\n\tstartedOutsideContent: boolean;\n\t/** Whether the pointer has moved beyond the drag threshold since pressing. */\n\tmoved: boolean;\n}\n\ninterface CreateOutsideClosePointerStateInput {\n\tpointerId: number;\n\tclientX: number;\n\tclientY: number;\n\tstartedOutsideContent: boolean;\n}\n\ninterface PointerMoveInput {\n\tstartX: number;\n\tstartY: number;\n\tendX: number;\n\tendY: number;\n\tthreshold?: number;\n}\n\ninterface ClampZoomOffsetInput {\n\tcontainerWidth: number;\n\tcontainerHeight: number;\n\timageWidth: number;\n\timageHeight: number;\n\tzoomScale: number;\n\tnextX: number;\n\tnextY: number;\n}\n\n/**\n * Clamps a proposed zoom pan offset so the image cannot be panned beyond its\n * edges relative to the container at the given zoom scale.\n */\nexport const clampZoomOffset = ({\n\tcontainerWidth,\n\tcontainerHeight,\n\timageWidth,\n\timageHeight,\n\tzoomScale,\n\tnextX,\n\tnextY,\n}: ClampZoomOffsetInput): ZoomOffset => {\n\tconst scaledWidth = imageWidth * zoomScale;\n\tconst scaledHeight = imageHeight * zoomScale;\n\tconst maxX = Math.max(0, (scaledWidth - containerWidth) / 2);\n\tconst maxY = Math.max(0, (scaledHeight - containerHeight) / 2);\n\n\treturn {\n\t\tx: Math.min(Math.max(nextX, -maxX), maxX),\n\t\ty: Math.min(Math.max(nextY, -maxY), maxY),\n\t};\n};\n\n/**\n * Returns a CSS `transform` string that applies the zoom pan offset and scale.\n * When not zoomed, returns identity values regardless of the stored offset.\n */\nexport const getZoomTransform = ({\n\tisZoomed,\n\toffset,\n\tscale,\n}: {\n\tisZoomed: boolean;\n\toffset: ZoomOffset;\n\tscale: number;\n}) =>\n\t`translate(${isZoomed ? offset.x : 0}px, ${isZoomed ? offset.y : 0}px) scale(${\n\t\tisZoomed ? scale : 1\n\t})`;\n\n/**\n * Returns `true` if the event target is an element (or descendant) matching\n * the given CSS selector.\n */\nexport const isEventTargetWithinSelector = (\n\ttarget: EventTarget | null,\n\tselector: string,\n) => target instanceof HTMLElement && Boolean(target.closest(selector));\n\n/** Returns `true` if the event target is or is inside an `<img>` element. */\nexport const isImageTarget = (target: EventTarget | null) =>\n\tisEventTargetWithinSelector(target, \"img\");\n\n/**\n * Returns `value` if it is a finite number, otherwise returns `fallback`.\n * Useful for sanitising pointer coordinates that may be `NaN` or `Infinity`.\n */\nexport const getPointerCoordinate = (value: number, fallback: number) =>\n\tNumber.isFinite(value) ? value : fallback;\n\n/**\n * Returns `true` if the pointer has moved more than `threshold` pixels in\n * either axis between the start and end positions.\n */\nexport const hasPointerMoved = ({\n\tstartX,\n\tstartY,\n\tendX,\n\tendY,\n\tthreshold = POINTER_MOVE_THRESHOLD,\n}: PointerMoveInput) =>\n\tMath.abs(endX - startX) > threshold || Math.abs(endY - startY) > threshold;\n\n/** Creates the initial tracking state for an outside-close pointer gesture. */\nexport const createOutsideClosePointerState = ({\n\tpointerId,\n\tclientX,\n\tclientY,\n\tstartedOutsideContent,\n}: CreateOutsideClosePointerStateInput): OutsideClosePointerState => ({\n\tpointerId,\n\tstartX: getPointerCoordinate(clientX, 0),\n\tstartY: getPointerCoordinate(clientY, 0),\n\tstartedOutsideContent,\n\tmoved: false,\n});\n\n/**\n * Returns an updated copy of the pointer state after a pointer move event.\n * Sets `moved` to `true` once the pointer has exceeded the drag threshold.\n */\nexport const updateOutsideClosePointerState = (\n\tstate: OutsideClosePointerState,\n\t{ clientX, clientY }: { clientX: number; clientY: number },\n): OutsideClosePointerState => {\n\tconst endX = getPointerCoordinate(clientX, state.startX);\n\tconst endY = getPointerCoordinate(clientY, state.startY);\n\n\tif (\n\t\t!state.moved &&\n\t\thasPointerMoved({\n\t\t\tstartX: state.startX,\n\t\t\tstartY: state.startY,\n\t\t\tendX,\n\t\t\tendY,\n\t\t})\n\t) {\n\t\treturn { ...state, moved: true };\n\t}\n\n\treturn state;\n};\n\n/**\n * Returns `true` if the pointer gesture should trigger the lightbox to close.\n * The lightbox closes when the press started outside the content and the\n * pointer did not drag.\n */\nexport const shouldCloseFromOutsidePointerState = (\n\tstate: OutsideClosePointerState,\n) => state.startedOutsideContent && !state.moved;\n\nconst RESOLUTION_EPSILON = 1.01;\n\nconst getImageMeasurements = (image: HTMLImageElement) => {\n\tconst rect = image.getBoundingClientRect();\n\treturn {\n\t\tnaturalWidth: image.naturalWidth,\n\t\tnaturalHeight: image.naturalHeight,\n\t\trenderedWidth: rect.width,\n\t\trenderedHeight: rect.height,\n\t};\n};\n\n/**\n * Returns the maximum zoom scale at which the image would still be rendered at\n * its native resolution (1:1 pixel ratio). Falls back to `DEFAULT_ZOOM_SCALE`\n * when image dimensions are unavailable.\n */\nexport const getImageMaxZoomScale = (image: HTMLImageElement) => {\n\tconst { naturalWidth, naturalHeight, renderedWidth, renderedHeight } =\n\t\tgetImageMeasurements(image);\n\n\tif (!naturalWidth || !naturalHeight || !renderedWidth || !renderedHeight) {\n\t\treturn DEFAULT_ZOOM_SCALE;\n\t}\n\n\tconst widthRatio = naturalWidth / renderedWidth;\n\tconst heightRatio = naturalHeight / renderedHeight;\n\n\treturn Math.min(widthRatio, heightRatio);\n};\n\n/**\n * Calculates the zoom scale that should be applied when the user triggers a\n * zoom action. Prefers a scale that fills the container viewport; falls back to\n * the native-resolution scale or `DEFAULT_ZOOM_SCALE` when the image is small.\n * The returned value is always at least `1` and at most the max zoom scale.\n */\nexport const getTargetZoomScale = ({\n\timage,\n\tcontainerWidth,\n\tcontainerHeight,\n}: {\n\timage: HTMLImageElement;\n\tcontainerWidth: number;\n\tcontainerHeight: number;\n}) => {\n\tconst { renderedWidth, renderedHeight } = getImageMeasurements(image);\n\tconst fillWidthScale =\n\t\trenderedWidth > 0 ? containerWidth / renderedWidth : DEFAULT_ZOOM_SCALE;\n\tconst fillHeightScale =\n\t\trenderedHeight > 0 ? containerHeight / renderedHeight : DEFAULT_ZOOM_SCALE;\n\tconst fillViewportScale = Math.max(fillWidthScale, fillHeightScale);\n\tconst maxZoomScale = getImageMaxZoomScale(image);\n\tconst fallbackStepScale = Math.min(maxZoomScale, DEFAULT_ZOOM_SCALE);\n\tconst targetScale =\n\t\tfillViewportScale > 1 ? fillViewportScale : fallbackStepScale;\n\n\treturn Math.max(1, Math.min(maxZoomScale, targetScale));\n};\n\n/**\n * Returns `true` if the image has sufficient resolution to be meaningfully\n * zoomed (i.e. its max zoom scale exceeds the resolution epsilon threshold).\n */\nexport const canZoomImageElement = (image: HTMLImageElement) => {\n\treturn getImageMaxZoomScale(image) > RESOLUTION_EPSILON;\n};\n"],"names":[],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- .me_4f1afa9a{color:var(--mantine-color-white);display:flex;flex-direction:column;height:100dvh;position:relative;width:100dvw}.me_f5ce649a{flex:1;min-height:0;overflow:hidden}.me_9450faf9{align-items:center;display:flex;height:100%;justify-content:center;line-height:1}.me_9450faf9 img{height:auto;max-height:100%;max-width:100%;object-fit:contain;width:auto}.me_fe5b16c3{right:var(--mantine-spacing-md)}.me_7b66e144,.me_fe5b16c3{position:absolute;top:var(--mantine-spacing-md);z-index:1}.me_7b66e144{color:var(--lightbox-color);font-weight:500;left:var(--mantine-spacing-md);user-select:none}.me_411d1cbf{display:flex;gap:var(--mantine-spacing-xs);justify-content:center;overflow-x:auto;padding:var(--mantine-spacing-md)}.me_a9abc686{border:2px solid transparent;border-radius:var(--mantine-radius-sm);cursor:pointer;flex-shrink:0;font-size:0;height:76px;line-height:1;opacity:.5;overflow:hidden;position:relative;transition:opacity .15s ease,border-color .15s ease;width:94px}.me_a9abc686[data-active]{border-color:var(--mantine-primary-color-filled);opacity:1}.me_a9abc686 img{height:100%;max-height:100%;max-width:100%;object-fit:cover;width:100%}.me_ff615a9f{align-items:center;background-color:var(--mantine-color-dark-4);color:var(--mantine-color-dark-1);display:flex;height:100%;justify-content:center;position:relative;width:100%}
1
+ .me_4f1afa9a{color:var(--mantine-color-white);display:flex;flex-direction:column;height:100dvh;inset:0;position:fixed;width:100dvw}.me_143cf98,.me_4f1afa9a{z-index:var(--lightbox-z-index)}.me_f5ce649a{flex:1;min-height:0;overflow:hidden}.me_9450faf9{align-items:center;height:100%;line-height:1}.me_411d1cbf,.me_9450faf9{display:flex;justify-content:center}.me_411d1cbf{gap:var(--mantine-spacing-xs);overflow-x:auto;padding:var(--mantine-spacing-md)}.me_a9abc686{border:2px solid transparent;border-radius:var(--mantine-radius-sm);cursor:pointer;flex-shrink:0;font-size:0;height:76px;line-height:1;opacity:.5;overflow:hidden;position:relative;transition:opacity .15s ease,border-color .15s ease;width:94px}.me_a9abc686[data-active]{border-color:var(--mantine-primary-color-filled);opacity:1}.me_a9abc686 img{height:100%;max-height:100%;max-width:100%;object-fit:cover;width:100%}.me_ff615a9f{background-color:var(--mantine-color-dark-4);color:var(--mantine-color-dark-1);position:relative}.me_dfd5db36,.me_ff615a9f{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.me_dfd5db36{line-height:1;overflow:hidden}.me_dfd5db36 img{cursor:zoom-in;height:auto;max-height:100%;max-width:100%;object-fit:contain;width:auto}.me_dfd5db36[data-zoomed] img{cursor:zoom-out}.me_dfd5db36[data-can-zoom=false] img{cursor:default}.me_2ed9ec6e{align-items:center;display:flex;height:100%;justify-content:center;min-height:0;transform-origin:center;transition:transform .15s ease;width:100%;will-change:transform}.me_dfd5db36[data-dragging] .me_2ed9ec6e{transition:none}.me_fe5b16c3{right:var(--mantine-spacing-md)}.me_7b66e144,.me_fe5b16c3{position:absolute;top:var(--mantine-spacing-md);z-index:1}.me_7b66e144{color:var(--mantine-color-white);font-weight:500;left:var(--mantine-spacing-md);user-select:none}
@@ -1 +1 @@
1
- @layer mantine {.me_4f1afa9a{color:var(--mantine-color-white);display:flex;flex-direction:column;height:100dvh;position:relative;width:100dvw}.me_f5ce649a{flex:1;min-height:0;overflow:hidden}.me_9450faf9{align-items:center;display:flex;height:100%;justify-content:center;line-height:1}.me_9450faf9 img{height:auto;max-height:100%;max-width:100%;object-fit:contain;width:auto}.me_fe5b16c3{right:var(--mantine-spacing-md)}.me_7b66e144,.me_fe5b16c3{position:absolute;top:var(--mantine-spacing-md);z-index:1}.me_7b66e144{color:var(--lightbox-color);font-weight:500;left:var(--mantine-spacing-md);user-select:none}.me_411d1cbf{display:flex;gap:var(--mantine-spacing-xs);justify-content:center;overflow-x:auto;padding:var(--mantine-spacing-md)}.me_a9abc686{border:2px solid transparent;border-radius:var(--mantine-radius-sm);cursor:pointer;flex-shrink:0;font-size:0;height:76px;line-height:1;opacity:.5;overflow:hidden;position:relative;transition:opacity .15s ease,border-color .15s ease;width:94px}.me_a9abc686[data-active]{border-color:var(--mantine-primary-color-filled);opacity:1}.me_a9abc686 img{height:100%;max-height:100%;max-width:100%;object-fit:cover;width:100%}.me_ff615a9f{align-items:center;background-color:var(--mantine-color-dark-4);color:var(--mantine-color-dark-1);display:flex;height:100%;justify-content:center;position:relative;width:100%}}
1
+ @layer mantine {.me_4f1afa9a{color:var(--mantine-color-white);display:flex;flex-direction:column;height:100dvh;inset:0;position:fixed;width:100dvw}.me_143cf98,.me_4f1afa9a{z-index:var(--lightbox-z-index)}.me_f5ce649a{flex:1;min-height:0;overflow:hidden}.me_9450faf9{align-items:center;height:100%;line-height:1}.me_411d1cbf,.me_9450faf9{display:flex;justify-content:center}.me_411d1cbf{gap:var(--mantine-spacing-xs);overflow-x:auto;padding:var(--mantine-spacing-md)}.me_a9abc686{border:2px solid transparent;border-radius:var(--mantine-radius-sm);cursor:pointer;flex-shrink:0;font-size:0;height:76px;line-height:1;opacity:.5;overflow:hidden;position:relative;transition:opacity .15s ease,border-color .15s ease;width:94px}.me_a9abc686[data-active]{border-color:var(--mantine-primary-color-filled);opacity:1}.me_a9abc686 img{height:100%;max-height:100%;max-width:100%;object-fit:cover;width:100%}.me_ff615a9f{background-color:var(--mantine-color-dark-4);color:var(--mantine-color-dark-1);position:relative}.me_dfd5db36,.me_ff615a9f{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.me_dfd5db36{line-height:1;overflow:hidden}.me_dfd5db36 img{cursor:zoom-in;height:auto;max-height:100%;max-width:100%;object-fit:contain;width:auto}.me_dfd5db36[data-zoomed] img{cursor:zoom-out}.me_dfd5db36[data-can-zoom=false] img{cursor:default}.me_2ed9ec6e{align-items:center;display:flex;height:100%;justify-content:center;min-height:0;transform-origin:center;transition:transform .15s ease;width:100%;will-change:transform}.me_dfd5db36[data-dragging] .me_2ed9ec6e{transition:none}.me_fe5b16c3{right:var(--mantine-spacing-md)}.me_7b66e144,.me_fe5b16c3{position:absolute;top:var(--mantine-spacing-md);z-index:1}.me_7b66e144{color:var(--mantine-color-white);font-weight:500;left:var(--mantine-spacing-md);user-select:none}}
@@ -1,7 +1,31 @@
1
1
  import { type GetStylesApi } from "@mantine/core";
2
+ import type { ReactElement, PointerEvent as ReactPointerEvent, RefObject } from "react";
2
3
  import type { LightboxFactory } from "./Lightbox.js";
4
+ import type { LightboxSlideProps } from "./LightboxSlide.js";
5
+ import type { ZoomOffset } from "./utils/zoom.js";
3
6
  export interface LightboxContext {
4
7
  getStyles: GetStylesApi<LightboxFactory>;
8
+ slides: ReactElement<Pick<LightboxSlideProps, "children" | "thumbnail">>[];
9
+ currentIndex: number;
10
+ withFullscreen: boolean | undefined;
11
+ withZoom: boolean | undefined;
12
+ isFullscreen: boolean;
13
+ canUseFullscreen: boolean;
14
+ onToggleFullscreen: () => void;
15
+ onToggleZoom: () => void;
16
+ isZoomed: boolean;
17
+ isDraggingZoom: boolean;
18
+ canZoomCurrent: boolean;
19
+ zoomOffset: ZoomOffset;
20
+ zoomScale: number;
21
+ activeZoomContainerRef: RefObject<HTMLDivElement | null>;
22
+ updateCanZoomAvailability: () => void;
23
+ handleZoomPointerDown: (event: ReactPointerEvent<HTMLDivElement>) => void;
24
+ handleZoomPointerMove: (event: ReactPointerEvent<HTMLDivElement>) => void;
25
+ handleZoomPointerEnd: (event: ReactPointerEvent<HTMLDivElement>) => void;
26
+ onClose: () => void;
27
+ handleOutsideClick: () => void;
28
+ onThumbnailClick: (index: number) => void;
5
29
  }
6
30
  export declare const LightboxProvider: ({ children, value }: {
7
31
  value: LightboxContext;
@@ -1 +1 @@
1
- {"version":3,"file":"Lightbox.context.d.ts","sourceRoot":"","sources":["../../src/Lightbox.context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;CACzC;AAED,eAAO,MAAO,gBAAgB;;;+CAAE,kBAAkB,uBAGhD,CAAC"}
1
+ {"version":3,"file":"Lightbox.context.d.ts","sourceRoot":"","sources":["../../src/Lightbox.context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EACX,YAAY,EACZ,YAAY,IAAI,iBAAiB,EACjC,SAAS,EACT,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IAEzC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC;IAC3E,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAE9B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,IAAI,CAAC;IAEzB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzD,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,qBAAqB,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC1E,qBAAqB,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC1E,oBAAoB,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAEzE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,eAAO,MAAO,gBAAgB;;;+CAAE,kBAAkB,uBAGhD,CAAC"}
@@ -1,29 +1,98 @@
1
1
  import { type CarouselProps } from "@mantine/carousel";
2
- import { type BoxProps, type ElementProps, type Factory, type ModalProps, type StylesApiProps } from "@mantine/core";
2
+ import { type BoxProps, type ElementProps, type Factory, type OverlayProps, type PortalProps, type StylesApiProps, type TransitionProps } from "@mantine/core";
3
3
  import { LightboxSlide } from "./LightboxSlide.js";
4
- export type LightboxStylesNames = "root" | "slides" | "slide" | "toolbar" | "closeButton" | "counter" | "thumbnails" | "thumbnailButton" | "thumbnailPlaceholder";
5
- export type LightboxCarouselOptions = Omit<CarouselProps, "withKeyboardEvents">;
6
- export type LightboxModalOptions = Omit<ModalProps, "fullScreen" | "title" | "withCloseButton" | "opened" | "onClose">;
7
- export interface LightboxProps extends BoxProps, StylesApiProps<LightboxFactory>, ElementProps<"div", "onChange"> {
8
- /** Controls lightbox visibility */
4
+ export type LightboxCssVariables = {
5
+ root: "--lightbox-z-index";
6
+ overlay: "--lightbox-z-index" | "--overlay-z-index";
7
+ };
8
+ export type LightboxStylesNames = "root" | "overlay" | "slides" | "slide" | "zoomContainer" | "zoomContent" | "toolbar" | "fullscreenButton" | "zoomButton" | "closeButton" | "counter" | "thumbnails" | "thumbnailButton" | "thumbnailPlaceholder";
9
+ export type LightboxCarouselOptions = Omit<CarouselProps, "withKeyboardEvents" | "withIndicators">;
10
+ export interface LightboxProps extends BoxProps, StylesApiProps<LightboxFactory>, ElementProps<"div"> {
11
+ /**
12
+ * Controls whether the lightbox is visible.
13
+ */
9
14
  opened: boolean;
10
- /** Called when lightbox should close */
15
+ /**
16
+ * Callback invoked when the lightbox requests to close.
17
+ */
11
18
  onClose: () => void;
12
- /** Determines whether thumbnail images should be displayed, `true` by default */
19
+ /**
20
+ * Keeps the lightbox mounted in the DOM when it is not visible.
21
+ * @default false
22
+ */
23
+ keepMounted?: boolean;
24
+ /**
25
+ * Closes the lightbox when a pointer interaction occurs outside its content area.
26
+ * @default true
27
+ */
28
+ closeOnClickOutside?: boolean;
29
+ /**
30
+ * Constrains keyboard focus to elements within the lightbox while it is open.
31
+ * @default true
32
+ */
33
+ trapFocus?: boolean;
34
+ /**
35
+ * Restores focus to the previously focused element after the lightbox closes.
36
+ * @default true
37
+ */
38
+ returnFocus?: boolean;
39
+ /**
40
+ * Prevents background document scrolling while the lightbox is open.
41
+ * @default true
42
+ */
43
+ lockScroll?: boolean;
44
+ /**
45
+ * Renders thumbnail previews for navigating between slides.
46
+ * @default true
47
+ */
13
48
  withThumbnails?: boolean;
14
- /** Determines whether the slide counter should be displayed, `true` by default */
49
+ /**
50
+ * Displays the current slide index and total slide count.
51
+ * @default true
52
+ */
15
53
  withCounter?: boolean;
16
- /** Custom counter format function, `"1 / 3"` by default */
54
+ /**
55
+ * Shows a control that toggles fullscreen mode for the lightbox.
56
+ * @default true
57
+ */
58
+ withFullscreen?: boolean;
59
+ /**
60
+ * Shows a control that toggles zoom functionality for the active slide.
61
+ * @default true
62
+ */
63
+ withZoom?: boolean;
64
+ /**
65
+ * Formats the slide counter output based on the current index and total count.
66
+ * @default (index, total) => `${index + 1} / ${total}`
67
+ */
17
68
  counterFormatter?: (index: number, total: number) => string;
18
- /** Props passed to the underlying `Carousel` component */
69
+ /**
70
+ * Configuration options forwarded to the underlying Carousel instance.
71
+ */
19
72
  carouselOptions?: LightboxCarouselOptions;
20
- /** Props passed to the underlying `Modal` component */
21
- modalOptions?: LightboxModalOptions;
73
+ /**
74
+ * Props forwarded to the Overlay component that renders the backdrop.
75
+ */
76
+ overlayProps?: OverlayProps;
77
+ /**
78
+ * Transition configuration applied to the lightbox content container.
79
+ */
80
+ transitionProps?: Omit<TransitionProps, "mounted" | "keepMounted" | "children">;
81
+ /**
82
+ * Renders the lightbox inside a React Portal instead of the current DOM hierarchy.
83
+ * @default true
84
+ */
85
+ withinPortal?: boolean;
86
+ /**
87
+ * Props forwarded to the Portal component when portal rendering is enabled.
88
+ */
89
+ portalProps?: Omit<PortalProps, "withinPortal" | "children">;
22
90
  }
23
91
  export type LightboxFactory = Factory<{
24
92
  props: LightboxProps;
25
93
  ref: HTMLDivElement;
26
94
  stylesNames: LightboxStylesNames;
95
+ vars: LightboxCssVariables;
27
96
  staticComponents: {
28
97
  Slide: typeof LightboxSlide;
29
98
  };
@@ -32,6 +101,7 @@ export declare const Lightbox: import("@mantine/core").MantineComponent<{
32
101
  props: LightboxProps;
33
102
  ref: HTMLDivElement;
34
103
  stylesNames: LightboxStylesNames;
104
+ vars: LightboxCssVariables;
35
105
  staticComponents: {
36
106
  Slide: typeof LightboxSlide;
37
107
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Lightbox.d.ts","sourceRoot":"","sources":["../../src/Lightbox.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAGN,KAAK,QAAQ,EAEb,KAAK,YAAY,EACjB,KAAK,OAAO,EAGZ,KAAK,UAAU,EACf,KAAK,cAAc,EAKnB,MAAM,eAAe,CAAC;AAavB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,mBAAmB,GAC5B,MAAM,GACN,QAAQ,GACR,OAAO,GACP,SAAS,GACT,aAAa,GACb,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,sBAAsB,CAAC;AAE1B,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACtC,UAAU,EACV,YAAY,GAAG,OAAO,GAAG,iBAAiB,GAAG,QAAQ,GAAG,SAAS,CACjE,CAAC;AAEF,MAAM,WAAW,aAChB,SAAQ,QAAQ,EACf,cAAc,CAAC,eAAe,CAAC,EAC/B,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC;IAChC,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;IAEhB,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,iFAAiF;IACjF,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAE5D,0DAA0D;IAC1D,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAE1C,uDAAuD;IACvD,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC;IACrC,KAAK,EAAE,aAAa,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,WAAW,EAAE,mBAAmB,CAAC;IACjC,gBAAgB,EAAE;QACjB,KAAK,EAAE,OAAO,aAAa,CAAC;KAC5B,CAAC;CACF,CAAC,CAAC;AAUH,eAAO,MAAM,QAAQ;WAhBb,aAAa;SACf,cAAc;iBACN,mBAAmB;sBACd;QACjB,KAAK,EAAE,OAAO,aAAa,CAAC;KAC5B;EA0MA,CAAC"}
1
+ {"version":3,"file":"Lightbox.d.ts","sourceRoot":"","sources":["../../src/Lightbox.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAEN,KAAK,QAAQ,EAEb,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,cAAc,EAGnB,KAAK,eAAe,EAGpB,MAAM,eAAe,CAAC;AAQvB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B,MAAM,GACN,SAAS,GACT,QAAQ,GACR,OAAO,GACP,eAAe,GACf,aAAa,GACb,SAAS,GACT,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,sBAAsB,CAAC;AAE1B,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACzC,aAAa,EACb,oBAAoB,GAAG,gBAAgB,CACvC,CAAC;AAEF,MAAM,WAAW,aAChB,SAAQ,QAAQ,EACf,cAAc,CAAC,eAAe,CAAC,EAC/B,YAAY,CAAC,KAAK,CAAC;IACpB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAE5D;;OAEG;IACH,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAE1C;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;OAEG;IACH,eAAe,CAAC,EAAE,IAAI,CACrB,eAAe,EACf,SAAS,GAAG,aAAa,GAAG,UAAU,CACtC,CAAC;IAEF;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC;CAC7D;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC;IACrC,KAAK,EAAE,aAAa,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,gBAAgB,EAAE;QACjB,KAAK,EAAE,OAAO,aAAa,CAAC;KAC5B,CAAC;CACF,CAAC,CAAC;AAoBH,eAAO,MAAM,QAAQ;WA3Bb,aAAa;SACf,cAAc;iBACN,mBAAmB;UAC1B,oBAAoB;sBACR;QACjB,KAAK,EAAE,OAAO,aAAa,CAAC;KAC5B;EA+LA,CAAC"}
@@ -0,0 +1,26 @@
1
+ export declare const LIGHTBOX_DEFAULT_PROPS: {
2
+ readonly closeOnClickOutside: true;
3
+ readonly withThumbnails: true;
4
+ readonly withCounter: true;
5
+ readonly withFullscreen: true;
6
+ readonly withZoom: true;
7
+ readonly keepMounted: false;
8
+ readonly trapFocus: true;
9
+ readonly lockScroll: true;
10
+ readonly returnFocus: true;
11
+ readonly withinPortal: true;
12
+ readonly carouselOptions: {
13
+ readonly controlSize: 36;
14
+ };
15
+ readonly overlayProps: {
16
+ readonly fixed: true;
17
+ readonly backgroundOpacity: 0.9;
18
+ readonly color: "#18181B";
19
+ readonly zIndex: 200;
20
+ };
21
+ readonly transitionProps: {
22
+ readonly transition: "fade";
23
+ readonly duration: 250;
24
+ };
25
+ };
26
+ //# sourceMappingURL=Lightbox.defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lightbox.defaults.d.ts","sourceRoot":"","sources":["../../src/Lightbox.defaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { type GetStylesApi } from "@mantine/core";
2
+ import type { EmblaCarouselType, EmblaOptionsType, EmblaPluginType } from "embla-carousel";
3
+ import type { LightboxFactory } from "./Lightbox.js";
4
+ export interface LightboxContext {
5
+ getStyles: GetStylesApi<LightboxFactory>;
6
+ orientation: "horizontal" | "vertical";
7
+ /** Embla ref callback — attach to the viewport element */
8
+ emblaRef: (node: HTMLElement | null) => void;
9
+ /** Carousel scroll state */
10
+ canScrollPrev: boolean;
11
+ canScrollNext: boolean;
12
+ /** Composed scroll actions (embla scroll + user callbacks) */
13
+ scrollPrev: () => void;
14
+ scrollNext: () => void;
15
+ /** Keyboard event handler for arrow key navigation */
16
+ handleKeydown: (event: React.KeyboardEvent<HTMLDivElement>) => void;
17
+ /** Whether next/previous controls are displayed */
18
+ withControls: boolean;
19
+ /** Props forwarded to control buttons */
20
+ nextControlProps?: React.ComponentPropsWithoutRef<"button">;
21
+ previousControlProps?: React.ComponentPropsWithoutRef<"button">;
22
+ /** Custom icons for control buttons */
23
+ nextControlIcon?: React.ReactNode;
24
+ previousControlIcon?: React.ReactNode;
25
+ /** Class name for responsive CSS variable scoping */
26
+ responsiveClassName: string;
27
+ }
28
+ declare const useLightboxContext: () => LightboxContext;
29
+ export { useLightboxContext };
30
+ interface LightboxProviderProps {
31
+ children: React.ReactNode;
32
+ orientation: "horizontal" | "vertical";
33
+ withControls: boolean;
34
+ withKeyboardEvents: boolean;
35
+ initialSlide: number | undefined;
36
+ emblaOptions: EmblaOptionsType | undefined;
37
+ plugins: EmblaPluginType[] | undefined;
38
+ getEmblaApi: ((embla: EmblaCarouselType) => void) | undefined;
39
+ onSlideChange: ((index: number) => void) | undefined;
40
+ onPreviousSlide: (() => void) | undefined;
41
+ onNextSlide: (() => void) | undefined;
42
+ nextControlProps: React.ComponentPropsWithoutRef<"button"> | undefined;
43
+ previousControlProps: React.ComponentPropsWithoutRef<"button"> | undefined;
44
+ nextControlIcon: React.ReactNode;
45
+ previousControlIcon: React.ReactNode;
46
+ responsiveClassName: string;
47
+ getStyles: LightboxContext["getStyles"];
48
+ }
49
+ export declare function LightboxProvider({ children, orientation, withControls, withKeyboardEvents, initialSlide, emblaOptions, plugins, getEmblaApi, onSlideChange, onPreviousSlide, onNextSlide, nextControlProps, previousControlProps, nextControlIcon, previousControlIcon, responsiveClassName, getStyles, }: LightboxProviderProps): import("react/jsx-runtime").JSX.Element;
50
+ //# sourceMappingURL=LightboxProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxProvider.d.ts","sourceRoot":"","sources":["../../src/LightboxProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,YAAY,EAEjB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EACX,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IACzC,WAAW,EAAE,YAAY,GAAG,UAAU,CAAC;IAEvC,0DAA0D;IAC1D,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAE7C,4BAA4B;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IAEvB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,sDAAsD;IACtD,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAEpE,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IAEtB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC5D,oBAAoB,CAAC,EAAE,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEhE,uCAAuC;IACvC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,mBAAmB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEtC,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,QAAA,MAAwB,kBAAkB,uBAGxC,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAY9B,UAAU,qBAAqB;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,EAAE,YAAY,GAAG,UAAU,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9D,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACrD,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1C,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACtC,gBAAgB,EAAE,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IACvE,oBAAoB,EAAE,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC3E,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;CACxC;AAED,wBAAgB,gBAAgB,CAAC,EAChC,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,WAAW,EACX,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,GACT,EAAE,qBAAqB,2CA4HvB"}
@@ -2,7 +2,7 @@ import { type BoxProps, type CompoundStylesApiProps, type ElementProps, type Fac
2
2
  import type { ReactNode } from "react";
3
3
  export type LightboxSlideStylesNames = "slide";
4
4
  export interface LightboxSlideProps extends BoxProps, CompoundStylesApiProps<LightboxSlideFactory>, ElementProps<"div"> {
5
- /** Thumbnail content for this slide, shows a placeholder if omitted */
5
+ /** Content rendered as the slide thumbnail in the lightbox navigation, or a default placeholder if omitted. */
6
6
  thumbnail?: ReactNode;
7
7
  }
8
8
  export type LightboxSlideFactory = Factory<{
@@ -1 +1 @@
1
- {"version":3,"file":"LightboxSlide.d.ts","sourceRoot":"","sources":["../../src/LightboxSlide.tsx"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,OAAO,EAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,kBAChB,SAAQ,QAAQ,EACf,sBAAsB,CAAC,oBAAoB,CAAC,EAC5C,YAAY,CAAC,KAAK,CAAC;IACpB,uEAAuE;IACvE,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IAC1C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC;IACpB,WAAW,EAAE,wBAAwB,CAAC;IACtC,QAAQ,EAAE,IAAI,CAAC;CACf,CAAC,CAAC;AAEH,eAAO,MAAM,aAAa;WANlB,kBAAkB;SACpB,cAAc;iBACN,wBAAwB;cAC3B,IAAI;EAgBb,CAAC"}
1
+ {"version":3,"file":"LightboxSlide.d.ts","sourceRoot":"","sources":["../../src/LightboxSlide.tsx"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,OAAO,EAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,kBAChB,SAAQ,QAAQ,EACf,sBAAsB,CAAC,oBAAoB,CAAC,EAC5C,YAAY,CAAC,KAAK,CAAC;IACpB,+GAA+G;IAC/G,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IAC1C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC;IACpB,WAAW,EAAE,wBAAwB,CAAC;IACtC,QAAQ,EAAE,IAAI,CAAC;CACf,CAAC,CAAC;AAEH,eAAO,MAAM,aAAa;WANlB,kBAAkB;SACpB,cAAc;iBACN,wBAAwB;cAC3B,IAAI;EAgBb,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { LightboxProps } from "./Lightbox.js";
2
+ interface LightboxVariablesProps {
3
+ slideGap: LightboxProps["slideGap"];
4
+ slideSize: LightboxProps["slideSize"];
5
+ selector: string;
6
+ }
7
+ export declare function LightboxVariables({ slideGap, slideSize, selector, }: LightboxVariablesProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=LightboxVariables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxVariables.d.ts","sourceRoot":"","sources":["../../src/LightboxVariables.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,UAAU,sBAAsB;IAC/B,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,QAAQ,GACR,EAAE,sBAAsB,2CAqDxB"}
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from "react";
2
+ export declare const EnterFullscreen: (props: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=EnterFullscreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnterFullscreen.d.ts","sourceRoot":"","sources":["../../../src/components/EnterFullscreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,eAAO,MAAM,eAAe,GAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,4CAmB7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from "react";
2
+ export declare const ExitFullscreen: (props: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=ExitFullscreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExitFullscreen.d.ts","sourceRoot":"","sources":["../../../src/components/ExitFullscreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,eAAO,MAAM,cAAc,GAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,4CAmB5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function LightboxCarousel({ children }: {
2
+ children: React.ReactNode;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=LightboxCarousel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxCarousel.d.ts","sourceRoot":"","sources":["../../../src/components/LightboxCarousel.tsx"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAe3E"}
@@ -0,0 +1,2 @@
1
+ export declare function LightboxControls(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=LightboxControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxControls.d.ts","sourceRoot":"","sources":["../../../src/components/LightboxControls.tsx"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,4CA6E/B"}
@@ -0,0 +1,2 @@
1
+ export declare function LightboxSlides(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=LightboxSlides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxSlides.d.ts","sourceRoot":"","sources":["../../../src/components/LightboxSlides.tsx"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,4CA6E7B"}
@@ -0,0 +1,2 @@
1
+ export declare function LightboxThumbnails(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=LightboxThumbnails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxThumbnails.d.ts","sourceRoot":"","sources":["../../../src/components/LightboxThumbnails.tsx"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,4CA4BjC"}
@@ -0,0 +1,2 @@
1
+ export declare function LightboxToolbar(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=LightboxToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxToolbar.d.ts","sourceRoot":"","sources":["../../../src/components/LightboxToolbar.tsx"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,4CAqD9B"}
@@ -1,2 +1,3 @@
1
- export declare const QuestionMark: () => import("react/jsx-runtime").JSX.Element;
1
+ import type { SVGProps } from "react";
2
+ export declare const QuestionMark: (props: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
2
3
  //# sourceMappingURL=QuestionMark.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuestionMark.d.ts","sourceRoot":"","sources":["../../../src/components/QuestionMark.tsx"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,+CAgBxB,CAAC"}
1
+ {"version":3,"file":"QuestionMark.d.ts","sourceRoot":"","sources":["../../../src/components/QuestionMark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,eAAO,MAAM,YAAY,GAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,4CAiB1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from "react";
2
+ export declare const ZoomIn: (props: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=ZoomIn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZoomIn.d.ts","sourceRoot":"","sources":["../../../src/components/ZoomIn.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,eAAO,MAAM,MAAM,GAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,4CAmBpD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from "react";
2
+ export declare const ZoomOut: (props: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=ZoomOut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZoomOut.d.ts","sourceRoot":"","sources":["../../../src/components/ZoomOut.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,eAAO,MAAM,OAAO,GAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,4CAkBrD,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface Options {
2
+ dir: 'rtl' | 'ltr';
3
+ orientation: 'horizontal' | 'vertical' | undefined;
4
+ direction: 'next' | 'previous';
5
+ }
6
+ export declare function getChevronRotation({ dir, orientation, direction }: Options): number;
7
+ export {};
8
+ //# sourceMappingURL=get-chevron-rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-chevron-rotation.d.ts","sourceRoot":"","sources":["../../src/get-chevron-rotation.ts"],"names":[],"mappings":"AAAA,UAAU,OAAO;IACf,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;IACnB,WAAW,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;IACnD,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC;CAChC;AAED,wBAAgB,kBAAkB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,OAAO,UAM1E"}
@@ -0,0 +1,20 @@
1
+ import type { RefObject } from "react";
2
+ import type { LightboxCarouselOptions } from "../Lightbox.js";
3
+ interface UseCarouselOptionsInput {
4
+ carouselOptions: LightboxCarouselOptions | undefined;
5
+ isZoomedRef: RefObject<boolean>;
6
+ }
7
+ export type UseCarouselOptionsOutput = LightboxCarouselOptions & {
8
+ emblaOptions: NonNullable<LightboxCarouselOptions["emblaOptions"]>;
9
+ };
10
+ /**
11
+ * Merges consumer-supplied carousel options with lightbox-internal overrides.
12
+ *
13
+ * Injects a `watchDrag` guard that disables Embla's drag when the lightbox is
14
+ * zoomed. Uses `isZoomedRef` (not `isZoomed` state) so that the returned
15
+ * options object stays stable across zoom state changes, preventing Embla from
16
+ * being re-initialised on every zoom toggle.
17
+ */
18
+ export declare function useCarouselOptions(props: UseCarouselOptionsInput): UseCarouselOptionsOutput;
19
+ export {};
20
+ //# sourceMappingURL=useCarouselOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCarouselOptions.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCarouselOptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,UAAU,uBAAuB;IAChC,eAAe,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACrD,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,GAAG;IAChE,YAAY,EAAE,WAAW,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC,CAAC;CACnE,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,uBAAuB,GAC5B,wBAAwB,CA4B1B"}
@@ -0,0 +1,11 @@
1
+ interface UseFullscreenInput {
2
+ opened: boolean;
3
+ }
4
+ interface UseFullscreenOutput {
5
+ isFullscreen: boolean;
6
+ canUseFullscreen: boolean;
7
+ toggleFullscreen: () => void;
8
+ }
9
+ export declare function useFullscreen(props: UseFullscreenInput): UseFullscreenOutput;
10
+ export {};
11
+ //# sourceMappingURL=useFullscreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFullscreen.d.ts","sourceRoot":"","sources":["../../../src/hooks/useFullscreen.ts"],"names":[],"mappings":"AAQA,UAAU,kBAAkB;IAC3B,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,mBAAmB;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAsC5E"}
@@ -0,0 +1,10 @@
1
+ import type { EmblaCarouselType } from "embla-carousel";
2
+ import type { RefObject } from "react";
3
+ interface UseKeyboardNavigationInput {
4
+ opened: boolean;
5
+ emblaRef: RefObject<EmblaCarouselType | null>;
6
+ onClose: () => void;
7
+ }
8
+ export declare function useKeyboardNavigation(props: UseKeyboardNavigationInput): void;
9
+ export {};
10
+ //# sourceMappingURL=useKeyboardNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboardNavigation.d.ts","sourceRoot":"","sources":["../../../src/hooks/useKeyboardNavigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,0BAA0B;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,IAAI,CAwB7E"}
@@ -1,30 +1,45 @@
1
- import { type GetStylesApi } from "@mantine/core";
2
1
  import type { EmblaCarouselType } from "embla-carousel";
3
- import { type ReactElement, type ReactNode } from "react";
4
- import type { LightboxFactory, LightboxProps } from "../Lightbox.js";
5
- export interface UseLightboxReturn {
6
- getStyles: GetStylesApi<LightboxFactory>;
2
+ import { type ForwardedRef, type ReactElement, type ReactNode, type PointerEvent as ReactPointerEvent, type RefObject } from "react";
3
+ import type { LightboxCarouselOptions } from "../Lightbox.js";
4
+ import type { LightboxSlideProps } from "../LightboxSlide.js";
5
+ import type { ZoomOffset } from "../utils/zoom.js";
6
+ import { type UseCarouselOptionsOutput } from "./useCarouselOptions.js";
7
+ interface UseLightboxInput {
8
+ ref: ForwardedRef<HTMLDivElement>;
7
9
  opened: boolean;
8
10
  onClose: () => void;
9
- initialSlide: number | undefined;
10
- loop: boolean | undefined;
11
- withControls: boolean | undefined;
12
- withThumbnails: boolean | undefined;
13
- withCounter: boolean | undefined;
14
- previousControlIcon: ReactNode;
15
- nextControlIcon: ReactNode;
11
+ closeOnClickOutside: boolean | undefined;
12
+ trapFocus: boolean | undefined;
13
+ returnFocus: boolean | undefined;
16
14
  children: ReactNode;
17
- others: Record<string, unknown>;
18
- slides: ReactElement[];
15
+ carouselOptions: LightboxCarouselOptions | undefined;
16
+ counterFormatter: ((index: number, total: number) => string) | undefined;
17
+ }
18
+ interface UseLightboxOutput {
19
+ mergedRef: (node: HTMLDivElement | null) => void;
20
+ slides: ReactElement<Pick<LightboxSlideProps, "children" | "thumbnail">>[];
19
21
  currentIndex: number;
20
- canScrollPrev: boolean;
21
- canScrollNext: boolean;
22
22
  counterText: string;
23
- scrollPrev: () => void;
24
- scrollNext: () => void;
25
- scrollTo: (index: number) => void;
26
- getEmblaApi: (api: EmblaCarouselType) => void;
23
+ isFullscreen: boolean;
24
+ canUseFullscreen: boolean;
25
+ toggleFullscreen: () => void;
26
+ isZoomed: boolean;
27
+ isDraggingZoom: boolean;
28
+ zoomOffset: ZoomOffset;
29
+ zoomScale: number;
30
+ canZoomCurrent: boolean;
31
+ activeZoomContainerRef: RefObject<HTMLDivElement | null>;
32
+ toggleZoom: () => void;
33
+ updateCanZoomAvailability: () => void;
34
+ handleZoomPointerDown: (event: ReactPointerEvent<HTMLDivElement>) => void;
35
+ handleZoomPointerMove: (event: ReactPointerEvent<HTMLDivElement>) => void;
36
+ handleZoomPointerEnd: (event: ReactPointerEvent<HTMLDivElement>) => void;
37
+ handleEmblaApi: (embla: EmblaCarouselType) => void;
27
38
  handleSlideChange: (index: number) => void;
39
+ handleThumbnailClick: (index: number) => void;
40
+ handleOutsideClick: () => void;
41
+ mergedCarouselOptions: UseCarouselOptionsOutput;
28
42
  }
29
- export declare function useLightbox(_props: LightboxProps): UseLightboxReturn;
43
+ export declare function useLightbox(props: UseLightboxInput): UseLightboxOutput;
44
+ export {};
30
45
  //# sourceMappingURL=useLightbox.d.ts.map