yet-another-react-lightbox 1.13.4 → 2.0.0-rc.1

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 (121) hide show
  1. package/dist/Lightbox.js +1 -1
  2. package/dist/core/components/IconButton.d.ts +1 -1
  3. package/dist/core/components/IconButton.js +3 -2
  4. package/dist/core/components/ImageSlide.js +15 -24
  5. package/dist/core/consts.d.ts +36 -0
  6. package/dist/core/consts.js +36 -0
  7. package/dist/core/contexts/Events.d.ts +5 -9
  8. package/dist/core/contexts/Events.js +23 -25
  9. package/dist/core/contexts/LightboxState.d.ts +20 -0
  10. package/dist/core/contexts/LightboxState.js +23 -0
  11. package/dist/core/contexts/Timeouts.d.ts +1 -2
  12. package/dist/core/contexts/Timeouts.js +26 -29
  13. package/dist/core/contexts/index.d.ts +1 -0
  14. package/dist/core/contexts/index.js +1 -0
  15. package/dist/core/hooks/index.d.ts +2 -1
  16. package/dist/core/hooks/index.js +2 -1
  17. package/dist/core/hooks/useEventCallback.d.ts +1 -0
  18. package/dist/core/hooks/useEventCallback.js +9 -0
  19. package/dist/core/hooks/useForkRef.d.ts +3 -0
  20. package/dist/core/hooks/useForkRef.js +15 -0
  21. package/dist/core/hooks/useMotionPreference.js +1 -2
  22. package/dist/core/hooks/useSensors.d.ts +4 -5
  23. package/dist/core/hooks/useSensors.js +9 -12
  24. package/dist/core/modules/Carousel.js +29 -29
  25. package/dist/core/modules/Controller.d.ts +3 -7
  26. package/dist/core/modules/Controller.js +144 -263
  27. package/dist/core/modules/Core.js +6 -4
  28. package/dist/core/modules/Navigation.js +16 -13
  29. package/dist/core/modules/NoScroll.js +4 -3
  30. package/dist/core/modules/Portal.js +51 -40
  31. package/dist/core/modules/Toolbar.js +6 -4
  32. package/dist/core/modules/controller/index.d.ts +8 -0
  33. package/dist/core/modules/controller/index.js +9 -0
  34. package/dist/core/modules/controller/useOffset.d.ts +2 -0
  35. package/dist/core/modules/controller/useOffset.js +10 -0
  36. package/dist/core/modules/controller/usePointerSwipe.d.ts +3 -0
  37. package/dist/core/modules/controller/usePointerSwipe.js +61 -0
  38. package/dist/core/modules/controller/usePreventSwipeNavigation.d.ts +3 -0
  39. package/dist/core/modules/controller/usePreventSwipeNavigation.js +20 -0
  40. package/dist/core/modules/controller/useWheelSwipe.d.ts +3 -0
  41. package/dist/core/modules/controller/useWheelSwipe.js +94 -0
  42. package/dist/core/utils.d.ts +12 -1
  43. package/dist/core/utils.js +14 -0
  44. package/dist/plugins/captions/Captions.d.ts +7 -0
  45. package/dist/plugins/captions/Captions.js +23 -0
  46. package/dist/plugins/captions/CaptionsContext.d.ts +8 -0
  47. package/dist/plugins/captions/CaptionsContext.js +15 -0
  48. package/dist/plugins/captions/Description.d.ts +5 -0
  49. package/dist/plugins/captions/Description.js +17 -0
  50. package/dist/plugins/captions/Title.d.ts +5 -0
  51. package/dist/plugins/captions/Title.js +9 -0
  52. package/dist/plugins/{captions.css → captions/captions.css} +0 -2
  53. package/dist/plugins/{Captions.d.ts → captions/index.d.ts} +3 -9
  54. package/dist/plugins/captions/index.js +2 -0
  55. package/dist/plugins/captions/utils.d.ts +1 -0
  56. package/dist/plugins/captions/utils.js +2 -0
  57. package/dist/plugins/fullscreen/Fullscreen.d.ts +3 -0
  58. package/dist/plugins/fullscreen/Fullscreen.js +17 -0
  59. package/dist/plugins/fullscreen/FullscreenButton.d.ts +8 -0
  60. package/dist/plugins/{Fullscreen.js → fullscreen/FullscreenButton.js} +16 -30
  61. package/dist/plugins/fullscreen/FullscreenContext.d.ts +5 -0
  62. package/dist/plugins/fullscreen/FullscreenContext.js +9 -0
  63. package/dist/plugins/{Fullscreen.d.ts → fullscreen/index.d.ts} +2 -11
  64. package/dist/plugins/fullscreen/index.js +2 -0
  65. package/dist/plugins/index.d.ts +7 -7
  66. package/dist/plugins/index.js +7 -7
  67. package/dist/plugins/inline/Inline.d.ts +3 -0
  68. package/dist/plugins/{Inline.js → inline/Inline.js} +5 -7
  69. package/dist/plugins/inline/index.d.ts +9 -0
  70. package/dist/plugins/inline/index.js +2 -0
  71. package/dist/plugins/slideshow/Slideshow.d.ts +7 -0
  72. package/dist/plugins/slideshow/Slideshow.js +20 -0
  73. package/dist/plugins/slideshow/SlideshowButton.d.ts +2 -0
  74. package/dist/plugins/{Slideshow.js → slideshow/SlideshowButton.js} +17 -44
  75. package/dist/plugins/{Slideshow.d.ts → slideshow/index.d.ts} +2 -4
  76. package/dist/plugins/slideshow/index.js +2 -0
  77. package/dist/plugins/thumbnails/Thumbnail.d.ts +21 -0
  78. package/dist/plugins/thumbnails/Thumbnail.js +45 -0
  79. package/dist/plugins/thumbnails/Thumbnails.d.ts +13 -0
  80. package/dist/plugins/thumbnails/Thumbnails.js +28 -0
  81. package/dist/plugins/thumbnails/ThumbnailsContainer.d.ts +3 -0
  82. package/dist/plugins/thumbnails/ThumbnailsContainer.js +14 -0
  83. package/dist/plugins/thumbnails/ThumbnailsTrack.d.ts +12 -0
  84. package/dist/plugins/thumbnails/ThumbnailsTrack.js +148 -0
  85. package/dist/plugins/{Thumbnails.d.ts → thumbnails/index.d.ts} +4 -16
  86. package/dist/plugins/thumbnails/index.js +2 -0
  87. package/dist/plugins/{thumbnails.css → thumbnails/thumbnails.css} +27 -37
  88. package/dist/plugins/thumbnails/utils.d.ts +2 -0
  89. package/dist/plugins/thumbnails/utils.js +4 -0
  90. package/dist/plugins/video/Video.d.ts +7 -0
  91. package/dist/plugins/video/Video.js +24 -0
  92. package/dist/plugins/video/VideoSlide.d.ts +9 -0
  93. package/dist/plugins/{Video.js → video/VideoSlide.js} +14 -39
  94. package/dist/plugins/{Video.d.ts → video/index.d.ts} +5 -13
  95. package/dist/plugins/video/index.js +2 -0
  96. package/dist/plugins/zoom/Zoom.d.ts +14 -0
  97. package/dist/plugins/zoom/Zoom.js +36 -0
  98. package/dist/plugins/zoom/ZoomButton.d.ts +7 -0
  99. package/dist/plugins/zoom/ZoomButton.js +50 -0
  100. package/dist/plugins/zoom/ZoomButtonsGroup.d.ts +5 -0
  101. package/dist/plugins/zoom/ZoomButtonsGroup.js +23 -0
  102. package/dist/plugins/zoom/ZoomContainer.d.ts +9 -0
  103. package/dist/plugins/zoom/ZoomContainer.js +303 -0
  104. package/dist/plugins/zoom/ZoomContext.d.ts +12 -0
  105. package/dist/plugins/zoom/ZoomContext.js +18 -0
  106. package/dist/plugins/zoom/ZoomWrapper.d.ts +3 -0
  107. package/dist/plugins/zoom/ZoomWrapper.js +26 -0
  108. package/dist/plugins/{Zoom.d.ts → zoom/index.d.ts} +5 -5
  109. package/dist/plugins/zoom/index.js +4 -0
  110. package/dist/props.d.ts +2 -0
  111. package/dist/props.js +31 -0
  112. package/dist/styles.css +28 -26
  113. package/dist/types.d.ts +8 -22
  114. package/dist/types.js +1 -30
  115. package/package.json +17 -17
  116. package/dist/core/hooks/useLatest.d.ts +0 -3
  117. package/dist/core/hooks/useLatest.js +0 -6
  118. package/dist/plugins/Captions.js +0 -58
  119. package/dist/plugins/Inline.d.ts +0 -15
  120. package/dist/plugins/Thumbnails.js +0 -243
  121. package/dist/plugins/Zoom.js +0 -441
@@ -1,20 +1,12 @@
1
1
  import * as React from "react";
2
- import { clsx, createIcon, createModule, cssClass, IconButton, label, makeUseContext, useLatest, } from "../core/index.js";
3
- const FullscreenContext = React.createContext(null);
4
- const useFullscreen = makeUseContext("useFullscreen", "FullscreenContext", FullscreenContext);
5
- export const FullscreenContainer = ({ children }) => {
6
- const containerRef = React.useRef(null);
7
- const context = React.useMemo(() => ({ containerRef }), []);
8
- return (React.createElement("div", { ref: containerRef, className: clsx(cssClass("fullscreen"), cssClass("fullsize")) },
9
- React.createElement(FullscreenContext.Provider, { value: context }, children)));
10
- };
2
+ import { createIcon, IconButton, label, useEventCallback } from "../../core/index.js";
3
+ import { useFullscreen } from "./FullscreenContext.js";
11
4
  const EnterFullscreenIcon = createIcon("EnterFullscreen", React.createElement("path", { d: "M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z" }));
12
5
  const ExitFullscreenIcon = createIcon("ExitFullscreen", React.createElement("path", { d: "M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z" }));
13
6
  export const FullscreenButton = ({ auto, labels, render }) => {
14
7
  const [mounted, setMounted] = React.useState(false);
15
8
  const [fullscreen, setFullscreen] = React.useState(false);
16
- const latestAuto = useLatest(auto);
17
- const { containerRef } = useFullscreen();
9
+ const containerRef = useFullscreen();
18
10
  const isFullscreenEnabled = () => {
19
11
  var _a, _b, _c, _d;
20
12
  return (_d = (_c = (_b = (_a = document.fullscreenEnabled) !== null && _a !== void 0 ? _a : document.webkitFullscreenEnabled) !== null && _b !== void 0 ? _b : document.mozFullScreenEnabled) !== null && _c !== void 0 ? _c : document.msFullscreenEnabled) !== null && _d !== void 0 ? _d : false;
@@ -80,7 +72,10 @@ export const FullscreenButton = ({ auto, labels, render }) => {
80
72
  setFullscreen(false);
81
73
  }
82
74
  }, [containerRef, getFullscreenElement]);
83
- React.useEffect(() => setMounted(true), []);
75
+ React.useEffect(() => {
76
+ setMounted(true);
77
+ return () => setMounted(false);
78
+ }, []);
84
79
  React.useEffect(() => {
85
80
  const events = ["fullscreenchange", "webkitfullscreenchange", "mozfullscreenchange", "MSFullscreenChange"];
86
81
  events.forEach((event) => {
@@ -92,27 +87,18 @@ export const FullscreenButton = ({ auto, labels, render }) => {
92
87
  });
93
88
  };
94
89
  }, [fullscreenChangeListener]);
95
- React.useEffect(() => () => exitFullscreen(), [exitFullscreen]);
96
- React.useEffect(() => {
97
- if (latestAuto.current) {
90
+ const handleAutoFullscreen = useEventCallback(() => {
91
+ if (auto) {
98
92
  requestFullscreen();
99
93
  }
100
- }, [latestAuto, requestFullscreen]);
94
+ });
95
+ React.useEffect(() => {
96
+ handleAutoFullscreen();
97
+ return () => {
98
+ exitFullscreen();
99
+ };
100
+ }, [handleAutoFullscreen, exitFullscreen]);
101
101
  if (!mounted || !isFullscreenEnabled())
102
102
  return null;
103
103
  return render.buttonFullscreen ? (React.createElement(React.Fragment, null, render.buttonFullscreen({ fullscreen, toggleFullscreen }))) : (React.createElement(IconButton, { label: fullscreen ? label(labels, "Exit Fullscreen") : label(labels, "Enter Fullscreen"), icon: fullscreen ? ExitFullscreenIcon : EnterFullscreenIcon, renderIcon: fullscreen ? render.iconExitFullscreen : render.iconEnterFullscreen, onClick: toggleFullscreen }));
104
104
  };
105
- export const Fullscreen = ({ augment, contains, addParent }) => {
106
- augment(({ toolbar: { buttons, ...restToolbar }, ...restProps }) => ({
107
- toolbar: {
108
- buttons: [
109
- React.createElement(FullscreenButton, { key: "fullscreen", auto: Boolean(restProps.fullscreen), labels: restProps.labels, render: restProps.render }),
110
- ...buttons,
111
- ],
112
- ...restToolbar,
113
- },
114
- ...restProps,
115
- }));
116
- addParent(contains("thumbnails") ? "thumbnails" : "controller", createModule("fullscreen", FullscreenContainer));
117
- };
118
- export default Fullscreen;
@@ -0,0 +1,5 @@
1
+ import * as React from "react";
2
+ declare type FullscreenContextType = React.RefObject<HTMLDivElement>;
3
+ export declare const useFullscreen: () => FullscreenContextType;
4
+ export declare const FullscreenContextProvider: React.FC<React.PropsWithChildren>;
5
+ export {};
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ import { CLASS_FULLSIZE, clsx, cssClass, makeUseContext, PLUGIN_FULLSCREEN } from "../../core/index.js";
3
+ const FullscreenContext = React.createContext(null);
4
+ export const useFullscreen = makeUseContext("useFullscreen", "FullscreenContext", FullscreenContext);
5
+ export const FullscreenContextProvider = ({ children }) => {
6
+ const containerRef = React.useRef(null);
7
+ return (React.createElement("div", { ref: containerRef, className: clsx(cssClass(PLUGIN_FULLSCREEN), cssClass(CLASS_FULLSIZE)) },
8
+ React.createElement(FullscreenContext.Provider, { value: containerRef }, children)));
9
+ };
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
- import { Component, LightboxProps, Plugin } from "../types.js";
3
- declare module "../types.js" {
2
+ import { Fullscreen } from "./Fullscreen.js";
3
+ declare module "../../types" {
4
4
  interface LightboxProps {
5
5
  /** if `true`, enter fullscreen mode automatically when the lightbox opens */
6
6
  fullscreen?: boolean;
@@ -35,13 +35,4 @@ declare global {
35
35
  msRequestFullscreen?: () => void;
36
36
  }
37
37
  }
38
- export declare const FullscreenContainer: Component;
39
- /** Fullscreen button props */
40
- export declare type FullscreenButtonProps = Pick<LightboxProps, "labels" | "render"> & {
41
- auto: boolean;
42
- };
43
- /** Fullscreen button */
44
- export declare const FullscreenButton: React.FC<FullscreenButtonProps>;
45
- /** Fullscreen plugin */
46
- export declare const Fullscreen: Plugin;
47
38
  export default Fullscreen;
@@ -0,0 +1,2 @@
1
+ import { Fullscreen } from "./Fullscreen.js";
2
+ export default Fullscreen;
@@ -1,7 +1,7 @@
1
- export * from "./Captions.js";
2
- export * from "./Fullscreen.js";
3
- export * from "./Inline.js";
4
- export * from "./Slideshow.js";
5
- export * from "./Thumbnails.js";
6
- export * from "./Video.js";
7
- export * from "./Zoom.js";
1
+ export { default as Captions } from "./captions/index.js";
2
+ export { default as Fullscreen } from "./fullscreen/index.js";
3
+ export { default as Inline } from "./inline/index.js";
4
+ export { default as Slideshow } from "./slideshow/index.js";
5
+ export { default as Thumbnails } from "./thumbnails/index.js";
6
+ export { default as Video } from "./video/index.js";
7
+ export { default as Zoom } from "./zoom/index.js";
@@ -1,7 +1,7 @@
1
- export * from "./Captions.js";
2
- export * from "./Fullscreen.js";
3
- export * from "./Inline.js";
4
- export * from "./Slideshow.js";
5
- export * from "./Thumbnails.js";
6
- export * from "./Video.js";
7
- export * from "./Zoom.js";
1
+ export { default as Captions } from "./captions/index.js";
2
+ export { default as Fullscreen } from "./fullscreen/index.js";
3
+ export { default as Inline } from "./inline/index.js";
4
+ export { default as Slideshow } from "./slideshow/index.js";
5
+ export { default as Thumbnails } from "./thumbnails/index.js";
6
+ export { default as Video } from "./video/index.js";
7
+ export { default as Zoom } from "./zoom/index.js";
@@ -0,0 +1,3 @@
1
+ import { Plugin } from "../../types.js";
2
+ /** Inline plugin */
3
+ export declare const Inline: Plugin;
@@ -1,13 +1,12 @@
1
1
  import * as React from "react";
2
- import { clsx, createModule, cssClass } from "../core/index.js";
3
- export const InlineContainer = ({ inline: { className, ...rest } = {}, children }) => (React.createElement("div", { className: clsx(cssClass("root"), className), ...rest }, children));
4
- export const InlineModule = createModule("inline", InlineContainer);
2
+ import { ACTION_CLOSE, clsx, createModule, cssClass, MODULE_NO_SCROLL, MODULE_PORTAL, PLUGIN_INLINE, } from "../../core/index.js";
3
+ const InlineContainer = ({ inline: { className, ...rest } = {}, children }) => (React.createElement("div", { className: clsx(cssClass("root"), className), ...rest }, children));
5
4
  export const Inline = ({ augment, replace, remove }) => {
6
5
  augment(({ toolbar: { buttons, ...restToolbar }, open, close, controller: { focus, aria, touchAction, ...restController }, className, ...restProps }) => ({
7
6
  open: true,
8
7
  close: () => { },
9
8
  toolbar: {
10
- buttons: buttons.filter((button) => button !== "close"),
9
+ buttons: buttons.filter((button) => button !== ACTION_CLOSE),
11
10
  ...restToolbar,
12
11
  },
13
12
  inline: { style: { width: "100%", height: "100%" }, className },
@@ -15,7 +14,6 @@ export const Inline = ({ augment, replace, remove }) => {
15
14
  className,
16
15
  ...restProps,
17
16
  }));
18
- remove("no-scroll");
19
- replace("portal", InlineModule);
17
+ remove(MODULE_NO_SCROLL);
18
+ replace(MODULE_PORTAL, createModule(PLUGIN_INLINE, InlineContainer));
20
19
  };
21
- export default Inline;
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ import { Inline } from "./Inline.js";
3
+ declare module "../../types" {
4
+ interface LightboxProps {
5
+ /** HTML div element attributes to be passed to the Inline plugin container */
6
+ inline?: React.HTMLAttributes<HTMLDivElement>;
7
+ }
8
+ }
9
+ export default Inline;
@@ -0,0 +1,2 @@
1
+ import { Inline } from "./Inline.js";
2
+ export default Inline;
@@ -0,0 +1,7 @@
1
+ import { Plugin } from "../../types.js";
2
+ export declare const defaultSlideshowProps: {
3
+ autoplay: boolean;
4
+ delay: number;
5
+ };
6
+ /** Slideshow plugin */
7
+ export declare const Slideshow: Plugin;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SlideshowButton } from "./SlideshowButton.js";
3
+ import { PLUGIN_SLIDESHOW } from "../../core/index.js";
4
+ export const defaultSlideshowProps = {
5
+ autoplay: false,
6
+ delay: 3000,
7
+ };
8
+ export const Slideshow = ({ augment }) => {
9
+ augment(({ slideshow: originalSlideshow, toolbar: { buttons, ...restToolbar }, ...restProps }) => ({
10
+ toolbar: {
11
+ buttons: [React.createElement(SlideshowButton, { key: PLUGIN_SLIDESHOW }), ...buttons],
12
+ ...restToolbar,
13
+ },
14
+ slideshow: {
15
+ ...defaultSlideshowProps,
16
+ ...originalSlideshow,
17
+ },
18
+ ...restProps,
19
+ }));
20
+ };
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export declare const SlideshowButton: React.FC;
@@ -1,55 +1,43 @@
1
1
  import * as React from "react";
2
- import { ACTIVE_SLIDE_COMPLETE, ACTIVE_SLIDE_ERROR, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, cleanup, createIcon, IconButton, label, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_LOADING, SLIDE_STATUS_PLAYING, useController, useEvents, useLatest, useTimeouts, } from "../core/index.js";
3
- const defaultSlideshowProps = {
4
- autoplay: false,
5
- delay: 3000,
6
- };
2
+ import { ACTION_NEXT, ACTIVE_SLIDE_COMPLETE, ACTIVE_SLIDE_ERROR, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, cleanup, createIcon, IconButton, label, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_LOADING, SLIDE_STATUS_PLAYING, useController, useEventCallback, useEvents, useLightboxState, useTimeouts, } from "../../core/index.js";
3
+ import { defaultSlideshowProps } from "./Slideshow.js";
7
4
  const PlayIcon = createIcon("Play", React.createElement("path", { d: "M8 5v14l11-7z" }));
8
5
  const PauseIcon = createIcon("Pause", React.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }));
9
- const SlideshowButton = () => {
10
- const { currentIndex, latestProps } = useController();
6
+ export const SlideshowButton = () => {
7
+ const { state: { currentIndex }, } = useLightboxState();
8
+ const { getLightboxProps } = useController();
11
9
  const { setTimeout, clearTimeout } = useTimeouts();
12
10
  const { publish, subscribe } = useEvents();
13
- const slideshow = {
14
- ...defaultSlideshowProps,
15
- ...latestProps.current.slideshow,
16
- };
11
+ const { slideshow: slideshowProps, carousel: { finite }, slides, render, labels, } = getLightboxProps();
12
+ const slidesCount = slides.length;
13
+ const slideshow = { ...defaultSlideshowProps, ...slideshowProps };
17
14
  const [playing, setPlaying] = React.useState(slideshow.autoplay);
18
15
  const scheduler = React.useRef();
19
- const refs = useLatest({
20
- playing,
21
- delay: slideshow.delay,
22
- currentIndex,
23
- finite: latestProps.current.carousel.finite,
24
- slidesCount: latestProps.current.slides.length,
25
- });
26
16
  const slideStatus = React.useRef();
27
17
  const cancelScheduler = React.useCallback(() => {
28
18
  clearTimeout(scheduler.current);
29
19
  scheduler.current = undefined;
30
20
  }, [clearTimeout]);
31
- const reachedLastSlide = React.useCallback(() => refs.current.finite && refs.current.currentIndex === refs.current.slidesCount - 1, [refs]);
32
- const scheduleNextSlide = React.useCallback(() => {
21
+ const reachedLastSlide = useEventCallback(() => finite && currentIndex === slidesCount - 1);
22
+ const scheduleNextSlide = useEventCallback(() => {
33
23
  cancelScheduler();
34
- if (!refs.current.playing ||
24
+ if (!playing ||
35
25
  reachedLastSlide() ||
36
26
  slideStatus.current === SLIDE_STATUS_LOADING ||
37
27
  slideStatus.current === SLIDE_STATUS_PLAYING) {
38
28
  return;
39
29
  }
40
30
  scheduler.current = setTimeout(() => {
41
- if (refs.current.playing) {
31
+ if (playing) {
42
32
  slideStatus.current = undefined;
43
- publish("next");
33
+ publish(ACTION_NEXT);
44
34
  }
45
- }, refs.current.delay);
46
- }, [publish, setTimeout, cancelScheduler, refs, reachedLastSlide]);
35
+ }, slideshow.delay);
36
+ });
47
37
  const togglePlaying = React.useCallback(() => {
48
38
  setPlaying((prev) => !prev);
49
39
  }, []);
50
- React.useEffect(() => {
51
- scheduleNextSlide();
52
- }, [currentIndex, playing, scheduleNextSlide]);
40
+ React.useEffect(scheduleNextSlide, [currentIndex, playing, scheduleNextSlide]);
53
41
  React.useEffect(() => {
54
42
  if (playing && reachedLastSlide()) {
55
43
  setPlaying(false);
@@ -67,22 +55,7 @@ const SlideshowButton = () => {
67
55
  }), subscribe(ACTIVE_SLIDE_COMPLETE, () => {
68
56
  slideStatus.current = SLIDE_STATUS_COMPLETE;
69
57
  scheduleNextSlide();
70
- })), [subscribe, cancelScheduler, scheduleNextSlide]);
71
- const { render, labels } = latestProps.current;
58
+ }), cancelScheduler), [subscribe, cancelScheduler, scheduleNextSlide]);
72
59
  const disabled = reachedLastSlide();
73
60
  return render.buttonSlideshow ? (React.createElement(React.Fragment, null, render.buttonSlideshow({ playing, togglePlaying, disabled }))) : (React.createElement(IconButton, { label: playing ? label(labels, "Pause") : label(labels, "Play"), icon: playing ? PauseIcon : PlayIcon, renderIcon: playing ? render.iconSlideshowPause : render.iconSlideshowPlay, onClick: togglePlaying, disabled: disabled, "aria-disabled": disabled }));
74
61
  };
75
- export const Slideshow = ({ augment }) => {
76
- augment(({ slideshow: originalSlideshow, toolbar: { buttons, ...restToolbar }, ...restProps }) => ({
77
- toolbar: {
78
- buttons: [React.createElement(SlideshowButton, { key: "slideshow" }), ...buttons],
79
- ...restToolbar,
80
- },
81
- slideshow: {
82
- ...defaultSlideshowProps,
83
- ...originalSlideshow,
84
- },
85
- ...restProps,
86
- }));
87
- };
88
- export default Slideshow;
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
- import { Plugin } from "../types.js";
3
- declare module "../types.js" {
2
+ import { Slideshow } from "./Slideshow.js";
3
+ declare module "../../types" {
4
4
  interface LightboxProps {
5
5
  /** Slideshow plugin settings */
6
6
  slideshow?: {
@@ -26,6 +26,4 @@ declare module "../types.js" {
26
26
  }) => React.ReactNode;
27
27
  }
28
28
  }
29
- /** Slideshow plugin */
30
- export declare const Slideshow: Plugin;
31
29
  export default Slideshow;
@@ -0,0 +1,2 @@
1
+ import { Slideshow } from "./Slideshow.js";
2
+ export default Slideshow;
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ import { ImageFit, LightboxProps, Slide } from "../../types.js";
3
+ import { ContainerRect } from "../../core/index.js";
4
+ declare type FadeSettings = {
5
+ duration: number;
6
+ delay: number;
7
+ };
8
+ declare type ThumbnailProps = {
9
+ rect: ContainerRect;
10
+ slide: Slide | null;
11
+ onClick: () => void;
12
+ active: boolean;
13
+ fadeIn?: FadeSettings;
14
+ fadeOut?: FadeSettings;
15
+ placeholder: boolean;
16
+ render: LightboxProps["render"];
17
+ imageFit: ImageFit;
18
+ style?: React.CSSProperties;
19
+ };
20
+ export declare const Thumbnail: React.FC<ThumbnailProps>;
21
+ export {};
@@ -0,0 +1,45 @@
1
+ import * as React from "react";
2
+ import { CLASS_FLEX_CENTER, CLASS_FULLSIZE, clsx, createIcon, cssClass, cssVar, ELEMENT_ICON, ImageSlide, isImageSlide, makeComposePrefix, } from "../../core/index.js";
3
+ import { cssPrefix, cssThumbnailPrefix } from "./utils.js";
4
+ const VideoThumbnailIcon = createIcon("VideoThumbnail", React.createElement("path", { d: "M10 16.5l6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z" }));
5
+ const UnknownThumbnailIcon = createIcon("UnknownThumbnail", React.createElement("path", { d: "M23 18V6c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zM8.5 12.5l2.5 3.01L14.5 11l4.5 6H5l3.5-4.5z" }));
6
+ const renderThumbnail = ({ slide, render, rect, imageFit }) => {
7
+ var _a;
8
+ const customThumbnail = (_a = render.thumbnail) === null || _a === void 0 ? void 0 : _a.call(render, { slide, render, rect, imageFit });
9
+ if (customThumbnail) {
10
+ return customThumbnail;
11
+ }
12
+ const thumbnailIconClass = cssClass(cssThumbnailPrefix(ELEMENT_ICON));
13
+ if (!isImageSlide(slide)) {
14
+ if (slide.type === "video") {
15
+ return (React.createElement(React.Fragment, null,
16
+ "poster" in slide && (React.createElement("img", { alt: "", src: slide.poster, className: clsx(cssClass(CLASS_FULLSIZE), cssClass(cssPrefix("contain_image"))) })),
17
+ React.createElement(VideoThumbnailIcon, { className: thumbnailIconClass })));
18
+ }
19
+ }
20
+ else {
21
+ return React.createElement(ImageSlide, { slide: slide, render: render, rect: rect, imageFit: imageFit });
22
+ }
23
+ return React.createElement(UnknownThumbnailIcon, { className: thumbnailIconClass });
24
+ };
25
+ const activePrefix = makeComposePrefix("active");
26
+ const fadeInPrefix = makeComposePrefix("fadein");
27
+ const fadeOutPrefix = makeComposePrefix("fadeout");
28
+ const placeholderPrefix = makeComposePrefix("placeholder");
29
+ const DELAY = "delay";
30
+ const DURATION = "duration";
31
+ export const Thumbnail = ({ rect, slide, onClick, active, fadeIn, fadeOut, placeholder, render, imageFit, style, }) => (React.createElement("button", { type: "button", className: clsx(cssClass(CLASS_FLEX_CENTER), cssClass(cssThumbnailPrefix()), active && cssClass(cssThumbnailPrefix(activePrefix())), fadeIn && cssClass(cssThumbnailPrefix(fadeInPrefix())), fadeOut && cssClass(cssThumbnailPrefix(fadeOutPrefix())), placeholder && cssClass(cssThumbnailPrefix(placeholderPrefix()))), style: {
32
+ ...(fadeIn
33
+ ? {
34
+ [cssVar(cssThumbnailPrefix(fadeInPrefix(DURATION)))]: `${fadeIn.duration}ms`,
35
+ [cssVar(cssThumbnailPrefix(fadeInPrefix(DELAY)))]: `${fadeIn.delay}ms`,
36
+ }
37
+ : null),
38
+ ...(fadeOut
39
+ ? {
40
+ [cssVar(cssThumbnailPrefix(fadeOutPrefix(DURATION)))]: `${fadeOut.duration}ms`,
41
+ [cssVar(cssThumbnailPrefix(fadeOutPrefix(DELAY)))]: `${fadeOut.delay}ms`,
42
+ }
43
+ : null),
44
+ ...style,
45
+ }, onClick: onClick }, slide && renderThumbnail({ slide, render, rect, imageFit })));
@@ -0,0 +1,13 @@
1
+ import { Plugin } from "../../types.js";
2
+ export declare const defaultThumbnailsProps: {
3
+ position: "bottom";
4
+ width: number;
5
+ height: number;
6
+ border: number;
7
+ borderRadius: number;
8
+ padding: number;
9
+ gap: number;
10
+ imageFit: "contain";
11
+ };
12
+ /** Thumbnails plugin */
13
+ export declare const Thumbnails: Plugin;
@@ -0,0 +1,28 @@
1
+ import { createModule, MODULE_CONTROLLER, PLUGIN_FULLSCREEN, PLUGIN_THUMBNAILS } from "../../core/index.js";
2
+ import { ThumbnailsComponent } from "./ThumbnailsContainer.js";
3
+ export const defaultThumbnailsProps = {
4
+ position: "bottom",
5
+ width: 120,
6
+ height: 80,
7
+ border: 1,
8
+ borderRadius: 4,
9
+ padding: 4,
10
+ gap: 16,
11
+ imageFit: "contain",
12
+ };
13
+ export const Thumbnails = ({ augment, contains, append, addParent }) => {
14
+ augment(({ thumbnails, ...restProps }) => ({
15
+ thumbnails: {
16
+ ...defaultThumbnailsProps,
17
+ ...thumbnails,
18
+ },
19
+ ...restProps,
20
+ }));
21
+ const module = createModule(PLUGIN_THUMBNAILS, ThumbnailsComponent);
22
+ if (contains(PLUGIN_FULLSCREEN)) {
23
+ append(PLUGIN_FULLSCREEN, module);
24
+ }
25
+ else {
26
+ addParent(MODULE_CONTROLLER, module);
27
+ }
28
+ };
@@ -0,0 +1,3 @@
1
+ import { Component } from "../../types.js";
2
+ /** Thumbnails plugin component */
3
+ export declare const ThumbnailsComponent: Component;
@@ -0,0 +1,14 @@
1
+ import * as React from "react";
2
+ import { clsx, cssClass } from "../../core/index.js";
3
+ import { cssPrefix } from "./utils.js";
4
+ import { ThumbnailsTrack } from "./ThumbnailsTrack.js";
5
+ import { defaultThumbnailsProps } from "./Thumbnails.js";
6
+ export const ThumbnailsComponent = ({ thumbnails: thumbnailsProps, slides, index, carousel, animation, render, styles, children, }) => {
7
+ const thumbnails = { ...defaultThumbnailsProps, ...thumbnailsProps };
8
+ const ref = React.useRef(null);
9
+ const track = (React.createElement(ThumbnailsTrack, { container: ref, slides: slides, thumbnails: thumbnails, carousel: carousel, animation: animation, render: render, startingIndex: index, thumbnailRect: { width: thumbnails.width, height: thumbnails.height }, styles: styles }));
10
+ return (React.createElement("div", { ref: ref, className: clsx(cssClass(cssPrefix()), cssClass(cssPrefix(`${thumbnails.position}`))) },
11
+ (thumbnails.position === "start" || thumbnails.position === "top") && track,
12
+ React.createElement("div", { className: cssClass(cssPrefix("wrapper")) }, children),
13
+ (thumbnails.position === "end" || thumbnails.position === "bottom") && track));
14
+ };
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ import { ContainerRect } from "../../core/index.js";
3
+ import { DeepNonNullable, LightboxProps } from "../../types.js";
4
+ declare type ThumbnailsInternal = DeepNonNullable<LightboxProps["thumbnails"]>;
5
+ declare type ThumbnailsTrackProps = Pick<LightboxProps, "slides" | "carousel" | "animation" | "render" | "styles"> & {
6
+ container: React.RefObject<HTMLDivElement>;
7
+ thumbnails: ThumbnailsInternal;
8
+ startingIndex: number;
9
+ thumbnailRect: ContainerRect;
10
+ };
11
+ export declare const ThumbnailsTrack: React.FC<ThumbnailsTrackProps>;
12
+ export {};