@zipkito/gallery 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @zipkito/gallery might be problematic. Click here for more details.

package/dist/index.mjs ADDED
@@ -0,0 +1,860 @@
1
+ // src/MDXGallery/MDXGallery.tsx
2
+ import * as runtime from "react/jsx-runtime";
3
+ import { compile, run } from "@mdx-js/mdx";
4
+ import { getSlotSx, Overlay } from "@zipkito/shared";
5
+ import { Container as MuiContainer } from "@mui/material";
6
+ import { memo, useEffect, useMemo, useState } from "react";
7
+
8
+ // src/MDXGallery/MDXGallery.styled.ts
9
+ import { styled } from "@mui/material/styles";
10
+ import { Typography } from "@mui/material";
11
+ var MDXGalleryRoot = styled("div", {
12
+ name: "MDXGallery",
13
+ slot: "Root"
14
+ })(({ theme }) => ({
15
+ height: "100%",
16
+ display: "flex",
17
+ flexDirection: "column",
18
+ alignItems: "center",
19
+ padding: "24px",
20
+ background: "radial-gradient(circle at top, rgba(255, 255, 255, 0.08), transparent 45%)",
21
+ scrollbarGutter: "stable",
22
+ scrollbarColor: `${theme.palette.primary.main} rgba(255, 255, 255, 0.3)`,
23
+ scrollbarWidth: "thin",
24
+ position: "relative",
25
+ overflowX: "hidden",
26
+ overflowY: "auto"
27
+ }));
28
+ var MDXGalleryLoadingMessage = styled(Typography, {
29
+ name: "MDXGallery",
30
+ slot: "LoadingMessage"
31
+ })(() => ({
32
+ textAlign: "center",
33
+ padding: "40px",
34
+ color: "#666"
35
+ }));
36
+ var MDXGalleryErrorMessage = styled(Typography, {
37
+ name: "MDXGallery",
38
+ slot: "ErrorMessage"
39
+ })(() => ({
40
+ textAlign: "center",
41
+ padding: "40px",
42
+ color: "#d32f2f"
43
+ }));
44
+
45
+ // src/MDXGallery/MDXGallery.tsx
46
+ import { jsx, jsxs } from "react/jsx-runtime";
47
+ var MDXGallery = memo((props) => {
48
+ const { gallery, mdxContext, actions, slots = {}, slotProps = {}, overlayProps = {}, sx } = props;
49
+ const [Content, setContent] = useState(null);
50
+ const [status, setStatus] = useState("idle");
51
+ const [error, setError] = useState(null);
52
+ useEffect(() => {
53
+ if (!gallery.visible || !gallery.file) {
54
+ setStatus("idle");
55
+ setContent(null);
56
+ setError(null);
57
+ return;
58
+ }
59
+ let cancelled = false;
60
+ const load = async () => {
61
+ try {
62
+ setStatus("loading");
63
+ setError(null);
64
+ const source = await mdxContext.loadSource(gallery.file);
65
+ const compiled = await compile(source, {
66
+ outputFormat: "function-body",
67
+ providerImportSource: "@mdx-js/react"
68
+ });
69
+ const evaluated = await run(String(compiled), {
70
+ ...runtime,
71
+ useMDXComponents: () => mdxContext.components ?? {}
72
+ });
73
+ if (!cancelled && typeof evaluated.default === "function") {
74
+ setContent(() => evaluated.default);
75
+ setStatus("ready");
76
+ }
77
+ } catch (err) {
78
+ if (!cancelled) {
79
+ setError(err instanceof Error ? err.message : "Failed to load MDX");
80
+ setStatus("error");
81
+ }
82
+ }
83
+ };
84
+ load();
85
+ return () => {
86
+ cancelled = true;
87
+ };
88
+ }, [gallery.file, gallery.visible, mdxContext]);
89
+ if (!gallery.visible) return null;
90
+ const Root = slots.root ?? MDXGalleryRoot;
91
+ const Container = slots.container ?? MuiContainer;
92
+ const LoadingMessage = slots.loadingMessage ?? MDXGalleryLoadingMessage;
93
+ const ErrorMessage = slots.errorMessage ?? MDXGalleryErrorMessage;
94
+ const rootProps = useMemo(
95
+ () => ({
96
+ ...slotProps.root,
97
+ sx: getSlotSx("root", sx)
98
+ }),
99
+ [slotProps.root, sx]
100
+ );
101
+ const containerProps = useMemo(
102
+ () => ({
103
+ ...slotProps.container,
104
+ sx: getSlotSx("container", sx)
105
+ }),
106
+ [slotProps.container, sx]
107
+ );
108
+ const loadingMessageProps = useMemo(
109
+ () => ({
110
+ ...slotProps.loadingMessage,
111
+ sx: getSlotSx("loadingMessage", sx)
112
+ }),
113
+ [slotProps.loadingMessage, sx]
114
+ );
115
+ const errorMessageProps = useMemo(
116
+ () => ({
117
+ ...slotProps.errorMessage,
118
+ sx: getSlotSx("errorMessage", sx)
119
+ }),
120
+ [slotProps.errorMessage, sx]
121
+ );
122
+ return /* @__PURE__ */ jsxs(Overlay, { visible: gallery.visible, ...overlayProps, children: [
123
+ /* @__PURE__ */ jsx(Root, { ...rootProps, children: /* @__PURE__ */ jsxs(Container, { maxWidth: "xl", ...containerProps, children: [
124
+ status === "loading" && /* @__PURE__ */ jsx(LoadingMessage, { variant: "subh2", ...loadingMessageProps, children: "Loading content..." }),
125
+ status === "error" && /* @__PURE__ */ jsxs(ErrorMessage, { variant: "subh2", ...errorMessageProps, children: [
126
+ "Error loading content: ",
127
+ error
128
+ ] }),
129
+ status === "ready" && Content && /* @__PURE__ */ jsx(Content, {})
130
+ ] }) }),
131
+ actions
132
+ ] });
133
+ });
134
+ MDXGallery.displayName = "MDXGallery";
135
+
136
+ // src/SlideGallery/SlideGallery.tsx
137
+ import { memo as memo4, useMemo as useMemo4 } from "react";
138
+ import { getSlotSx as getSlotSx4, Overlay as Overlay2 } from "@zipkito/shared";
139
+
140
+ // src/ImageSlider/ImageSlider.tsx
141
+ import { Box } from "@mui/material";
142
+ import { ExternalLink } from "lucide-react";
143
+ import { getSlotSx as getSlotSx3 } from "@zipkito/shared";
144
+ import { useState as useState2, useRef, useCallback, useMemo as useMemo3, useEffect as useEffect2 } from "react";
145
+
146
+ // src/ImageSlider/ImageSlider.styled.ts
147
+ import { styled as styled2 } from "@mui/material/styles";
148
+ var ImageSliderRoot = styled2("div", {
149
+ name: "ImageSlider",
150
+ slot: "Root"
151
+ })(() => ({
152
+ width: "100%",
153
+ height: "100%",
154
+ maxWidth: "100%",
155
+ maxHeight: "100%",
156
+ display: "flex",
157
+ flexDirection: "column",
158
+ flex: 1,
159
+ minHeight: 0,
160
+ position: "relative",
161
+ overflow: "hidden",
162
+ boxSizing: "border-box"
163
+ }));
164
+ var ImageSliderSliderWrapper = styled2("div", {
165
+ name: "ImageSlider",
166
+ slot: "SliderWrapper"
167
+ })(() => ({
168
+ flex: "1 1 auto",
169
+ minHeight: 0,
170
+ minWidth: 0,
171
+ display: "flex",
172
+ position: "relative",
173
+ overflow: "hidden",
174
+ width: "100%",
175
+ height: "100%",
176
+ maxWidth: "100%",
177
+ maxHeight: "100%",
178
+ boxSizing: "border-box",
179
+ "@media (max-width: 768px)": {
180
+ minHeight: 0,
181
+ minWidth: 0
182
+ }
183
+ }));
184
+ var ImageSliderSlidesWrapper = styled2("div", {
185
+ name: "ImageSlider",
186
+ slot: "SlidesWrapper"
187
+ })(({ $currentSlide, $transitionDuration }) => ({
188
+ display: "flex",
189
+ width: "100%",
190
+ height: "100%",
191
+ maxHeight: "100%",
192
+ transform: `translateX(-${$currentSlide * 100}%)`,
193
+ transition: `transform ${$transitionDuration}ms cubic-bezier(0.4, 0, 0.2, 1)`,
194
+ willChange: "transform",
195
+ position: "relative"
196
+ }));
197
+ var ImageSliderSlideItem = styled2("div", {
198
+ name: "ImageSlider",
199
+ slot: "SlideItem"
200
+ })(({ $isActive }) => ({
201
+ minWidth: "100%",
202
+ width: "100%",
203
+ height: "100%",
204
+ maxHeight: "100%",
205
+ display: "flex",
206
+ alignItems: "center",
207
+ justifyContent: "center",
208
+ flexShrink: 0,
209
+ opacity: $isActive ? 1 : 0.7,
210
+ transition: "opacity 0.3s",
211
+ padding: "0",
212
+ overflow: "hidden",
213
+ position: "relative",
214
+ boxSizing: "border-box",
215
+ "@media (max-width: 768px)": {
216
+ padding: "0"
217
+ }
218
+ }));
219
+ var ImageSliderSlideContent = styled2("div", {
220
+ name: "ImageSlider",
221
+ slot: "SlideContent"
222
+ })(() => ({
223
+ width: "100%",
224
+ height: "100%",
225
+ maxWidth: "100%",
226
+ maxHeight: "100%",
227
+ display: "flex",
228
+ flexDirection: "column",
229
+ alignItems: "center",
230
+ justifyContent: "center",
231
+ gap: "16px",
232
+ boxSizing: "border-box",
233
+ overflowY: "auto",
234
+ overflowX: "hidden",
235
+ position: "relative",
236
+ "&::-webkit-scrollbar": {
237
+ width: "6px"
238
+ },
239
+ "&::-webkit-scrollbar-track": {
240
+ background: "transparent"
241
+ },
242
+ "&::-webkit-scrollbar-thumb": {
243
+ background: "rgba(255, 255, 255, 0.3)",
244
+ borderRadius: "3px",
245
+ "&:hover": {
246
+ background: "rgba(255, 255, 255, 0.5)"
247
+ }
248
+ }
249
+ }));
250
+ var ImageSliderImageWrapper = styled2("div", {
251
+ name: "ImageSlider",
252
+ slot: "ImageWrapper"
253
+ })(() => ({
254
+ flex: "1 1 auto",
255
+ minHeight: "0",
256
+ minWidth: "0",
257
+ display: "flex",
258
+ alignItems: "center",
259
+ justifyContent: "center",
260
+ width: "100%",
261
+ maxWidth: "100%",
262
+ maxHeight: "100%",
263
+ overflow: "hidden",
264
+ position: "relative"
265
+ }));
266
+ var ImageSliderSlideImage = styled2("img", {
267
+ name: "ImageSlider",
268
+ slot: "SlideImage"
269
+ })(() => ({
270
+ maxWidth: "100%",
271
+ maxHeight: "100%",
272
+ width: "100%",
273
+ height: "100%",
274
+ objectFit: "contain",
275
+ userSelect: "none",
276
+ pointerEvents: "none",
277
+ display: "block",
278
+ position: "relative",
279
+ "@media (max-width: 768px)": {
280
+ maxWidth: "95%",
281
+ maxHeight: "95%"
282
+ },
283
+ "@media (max-width: 480px)": {
284
+ maxWidth: "90%",
285
+ maxHeight: "90%"
286
+ },
287
+ "@media (orientation: landscape) and (max-height: 600px)": {
288
+ maxHeight: "85%"
289
+ }
290
+ }));
291
+ var ImageSliderTextWrapper = styled2("div", {
292
+ name: "ImageSlider",
293
+ slot: "TextWrapper"
294
+ })(() => ({
295
+ display: "flex",
296
+ flexDirection: "column",
297
+ alignItems: "center",
298
+ justifyContent: "flex-start",
299
+ width: "100%",
300
+ maxWidth: "800px",
301
+ flexShrink: 0,
302
+ gap: "8px",
303
+ padding: "0 16px",
304
+ boxSizing: "border-box",
305
+ minWidth: "0",
306
+ "@media (max-width: 768px)": {
307
+ maxWidth: "100%",
308
+ padding: "0 8px",
309
+ gap: "6px"
310
+ },
311
+ "@media (max-width: 480px)": {
312
+ padding: "0 4px",
313
+ gap: "4px"
314
+ },
315
+ "@media (orientation: landscape) and (max-height: 600px)": {
316
+ gap: "4px",
317
+ padding: "0 8px"
318
+ }
319
+ }));
320
+ var ImageSliderSlideTitle = styled2("h3", {
321
+ name: "ImageSlider",
322
+ slot: "SlideTitle"
323
+ })(() => ({
324
+ fontWeight: 700,
325
+ fontSize: "clamp(20px, 4vw, 32px)",
326
+ lineHeight: "1.4",
327
+ textAlign: "center",
328
+ letterSpacing: "0.01em",
329
+ color: "#ffffff",
330
+ margin: 0,
331
+ wordWrap: "break-word",
332
+ overflowWrap: "break-word",
333
+ "@media (max-width: 768px)": {
334
+ fontSize: "clamp(18px, 4.5vw, 24px)"
335
+ },
336
+ "@media (max-width: 480px)": {
337
+ fontSize: "clamp(16px, 5vw, 20px)"
338
+ },
339
+ "@media (orientation: landscape) and (max-height: 600px)": {
340
+ fontSize: "clamp(16px, 3vw, 22px)"
341
+ }
342
+ }));
343
+ var ImageSliderSlideDescription = styled2("p", {
344
+ name: "ImageSlider",
345
+ slot: "SlideDescription"
346
+ })(() => ({
347
+ fontWeight: 400,
348
+ fontSize: "clamp(14px, 2.5vw, 16px)",
349
+ lineHeight: "1.6",
350
+ textAlign: "center",
351
+ color: "#ffffff",
352
+ maxWidth: "100%",
353
+ margin: 0,
354
+ wordWrap: "break-word",
355
+ overflowWrap: "break-word",
356
+ "@media (max-width: 768px)": {
357
+ fontSize: "clamp(13px, 3vw, 15px)",
358
+ lineHeight: "1.5"
359
+ },
360
+ "@media (max-width: 480px)": {
361
+ fontSize: "clamp(12px, 3.5vw, 14px)"
362
+ },
363
+ "@media (orientation: landscape) and (max-height: 600px)": {
364
+ fontSize: "clamp(12px, 2vw, 14px)",
365
+ lineHeight: "1.4"
366
+ }
367
+ }));
368
+ var ImageSliderSlideEmbed = styled2("embed", {
369
+ name: "ImageSlider",
370
+ slot: "SlideEmbed"
371
+ })(() => ({
372
+ width: "100%",
373
+ height: "100%",
374
+ display: "block",
375
+ margin: "0 auto",
376
+ borderRadius: "10px",
377
+ "@media (max-width: 640px), (max-width: 900px) and (orientation: landscape)": {
378
+ display: "none"
379
+ }
380
+ }));
381
+ var ImageSliderSlideLink = styled2("a", {
382
+ name: "ImageSlider",
383
+ slot: "SlideLink"
384
+ })(() => ({
385
+ display: "none",
386
+ backgroundColor: "#00263E",
387
+ border: `2px solid #00263E`,
388
+ color: "#ffffff",
389
+ padding: "8px 16px",
390
+ borderRadius: "8px",
391
+ columnGap: "12px",
392
+ flexFlow: "row nowrap",
393
+ alignItems: "center",
394
+ fontWeight: 400,
395
+ fontSize: "clamp(14px, 2.5vw, 16px)",
396
+ lineHeight: "1.6",
397
+ "@media (max-width: 640px), (max-width: 900px) and (orientation: landscape)": {
398
+ display: "flex"
399
+ },
400
+ "& path": {
401
+ stroke: "#ffffff"
402
+ }
403
+ }));
404
+
405
+ // src/ImageSlider/components/ImageSliderControls/ImageSliderControls.tsx
406
+ import { memo as memo3, useMemo as useMemo2 } from "react";
407
+ import { getSlotSx as getSlotSx2 } from "@zipkito/shared";
408
+ import { ArrowLeftIcon, ArrowRightIcon } from "lucide-react";
409
+
410
+ // src/ImageSlider/components/ImageSliderControls/ImageSliderControls.styled.ts
411
+ import { styled as styled3 } from "@mui/material/styles";
412
+ var ImageSliderControlsRoot = styled3("div", {
413
+ name: "ImageSliderControls",
414
+ slot: "Root"
415
+ })(() => ({
416
+ width: "100%",
417
+ height: "55px",
418
+ display: "flex",
419
+ alignItems: "center",
420
+ justifyContent: "center",
421
+ gap: "16px",
422
+ marginTop: "16px",
423
+ flexShrink: 0,
424
+ padding: "0 8px",
425
+ "@media (max-width: 768px)": {
426
+ gap: "12px",
427
+ marginTop: "12px"
428
+ },
429
+ "@media (max-width: 480px)": {
430
+ gap: "8px",
431
+ marginTop: "8px"
432
+ }
433
+ }));
434
+ var ImageSliderControlsDotsWrapper = styled3("div", {
435
+ name: "ImageSliderControls",
436
+ slot: "DotsWrapper"
437
+ })(() => ({
438
+ display: "flex",
439
+ alignItems: "center",
440
+ justifyContent: "center",
441
+ gap: "10px"
442
+ }));
443
+ var ImageSliderControlsDot = styled3("div", {
444
+ name: "ImageSliderControls",
445
+ slot: "Dot"
446
+ })(({ $active }) => ({
447
+ width: $active ? "12px" : "8px",
448
+ height: $active ? "12px" : "8px",
449
+ background: $active ? "#fff" : "#5b5b5b",
450
+ borderRadius: "50%",
451
+ cursor: "pointer",
452
+ transition: "0.2s",
453
+ outline: "none",
454
+ "&:focus": { boxShadow: "0 0 0 2px #fff" }
455
+ }));
456
+
457
+ // src/ImageSlider/components/ArrowButton/ArrowButton.tsx
458
+ import { IconButton } from "@mui/material";
459
+ import { memo as memo2 } from "react";
460
+ import { jsx as jsx2 } from "react/jsx-runtime";
461
+ var ArrowButton = memo2(({ children, ...props }) => /* @__PURE__ */ jsx2(IconButton, { ...props, color: "default", children }));
462
+ ArrowButton.displayName = "ArrowButton";
463
+
464
+ // src/ImageSlider/components/ImageSliderControls/ImageSliderControls.tsx
465
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
466
+ var ImageSliderControls = memo3((props) => {
467
+ const {
468
+ showArrows,
469
+ showDots,
470
+ memoizedSlides,
471
+ currentSlide,
472
+ canGoPrev,
473
+ canGoNext,
474
+ prev,
475
+ next,
476
+ goToSlide,
477
+ slots = {},
478
+ slotProps = {},
479
+ sx
480
+ } = props;
481
+ const Root = slots.root ?? ImageSliderControlsRoot;
482
+ const DotsWrapper = slots.dotsWrapper ?? ImageSliderControlsDotsWrapper;
483
+ const Dot = slots.dot ?? ImageSliderControlsDot;
484
+ const LeftArrow = slots.leftArrow;
485
+ const RightArrow = slots.rightArrow;
486
+ const rootProps = useMemo2(
487
+ () => ({
488
+ ...slotProps.root,
489
+ sx: getSlotSx2("root", sx)
490
+ }),
491
+ [slotProps.root, sx]
492
+ );
493
+ const dotsWrapperProps = useMemo2(
494
+ () => ({
495
+ ...slotProps.dotsWrapper,
496
+ sx: getSlotSx2("dotsWrapper", sx)
497
+ }),
498
+ [slotProps.dotsWrapper, sx]
499
+ );
500
+ const dotProps = useMemo2(
501
+ () => ({
502
+ ...slotProps.dot,
503
+ sx: getSlotSx2("dot", sx)
504
+ }),
505
+ [slotProps.dot, sx]
506
+ );
507
+ const leftArrowProps = useMemo2(
508
+ () => ({
509
+ ...slotProps.leftArrow,
510
+ sx: getSlotSx2("leftArrow", sx)
511
+ }),
512
+ [slotProps.leftArrow, sx]
513
+ );
514
+ const rightArrowProps = useMemo2(
515
+ () => ({
516
+ ...slotProps.rightArrow,
517
+ sx: getSlotSx2("rightArrow", sx)
518
+ }),
519
+ [slotProps.rightArrow, sx]
520
+ );
521
+ return /* @__PURE__ */ jsxs2(Root, { ...rootProps, children: [
522
+ showArrows && LeftArrow ? /* @__PURE__ */ jsx3(LeftArrow, { disabled: !canGoPrev, onClick: prev, ...leftArrowProps }) : /* @__PURE__ */ jsx3(ArrowButton, { disabled: !canGoPrev, onClick: prev, ...leftArrowProps, children: /* @__PURE__ */ jsx3(ArrowLeftIcon, { size: 24 }) }),
523
+ showDots && /* @__PURE__ */ jsx3(DotsWrapper, { ...dotsWrapperProps, children: memoizedSlides.map((_, i) => /* @__PURE__ */ jsx3(
524
+ Dot,
525
+ {
526
+ $active: i === currentSlide,
527
+ onClick: () => goToSlide(i),
528
+ role: "button",
529
+ onKeyDown: (e) => e.key === "Enter" || e.key === " " && goToSlide(i),
530
+ ...dotProps
531
+ },
532
+ i
533
+ )) }),
534
+ showArrows && RightArrow ? /* @__PURE__ */ jsx3(RightArrow, { disabled: !canGoNext, onClick: next, ...rightArrowProps }) : /* @__PURE__ */ jsx3(ArrowButton, { disabled: !canGoNext, onClick: next, ...rightArrowProps, children: /* @__PURE__ */ jsx3(ArrowRightIcon, { size: 24 }) })
535
+ ] });
536
+ });
537
+ ImageSliderControls.displayName = "ImageSliderControls";
538
+
539
+ // src/ImageSlider/ImageSlider.tsx
540
+ import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
541
+ import { createElement } from "react";
542
+ var ImageSlider = (props) => {
543
+ const {
544
+ loop = false,
545
+ showDots = true,
546
+ showArrows = true,
547
+ slides,
548
+ className,
549
+ transitionDuration = 500,
550
+ onSlideChange,
551
+ slots = {},
552
+ slotProps = {},
553
+ controlsProps = {},
554
+ sx
555
+ } = props;
556
+ const isTransitioningRef = useRef(false);
557
+ const slidesWrapperRef = useRef(null);
558
+ const [, forceUpdate] = useState2(0);
559
+ const [currentSlide, setCurrentSlide] = useState2(0);
560
+ const slidesCount = slides.length;
561
+ const canGoNext = loop || currentSlide < slidesCount - 1;
562
+ const canGoPrev = loop || currentSlide > 0;
563
+ const goToSlide = useCallback(
564
+ (index) => {
565
+ if (isTransitioningRef.current || index === currentSlide || slidesCount === 0) return;
566
+ let newIndex = index;
567
+ if (loop) {
568
+ if (index < 0) newIndex = slidesCount - 1;
569
+ if (index >= slidesCount) newIndex = 0;
570
+ }
571
+ if (newIndex < 0 || newIndex >= slidesCount) return;
572
+ isTransitioningRef.current = true;
573
+ setCurrentSlide(newIndex);
574
+ onSlideChange?.(newIndex);
575
+ setTimeout(() => {
576
+ isTransitioningRef.current = false;
577
+ }, transitionDuration);
578
+ },
579
+ [currentSlide, slidesCount, transitionDuration, onSlideChange, loop]
580
+ );
581
+ const next = useCallback(() => goToSlide(currentSlide + 1), [currentSlide, goToSlide]);
582
+ const prev = useCallback(() => goToSlide(currentSlide - 1), [currentSlide, goToSlide]);
583
+ useEffect2(() => {
584
+ const handleResize = () => forceUpdate((prev2) => prev2 + 1);
585
+ window.addEventListener("resize", handleResize);
586
+ return () => window.removeEventListener("resize", handleResize);
587
+ }, []);
588
+ useEffect2(() => {
589
+ const onKey = (e) => {
590
+ if (e.key === "ArrowLeft") prev();
591
+ if (e.key === "ArrowRight") next();
592
+ };
593
+ window.addEventListener("keydown", onKey);
594
+ return () => window.removeEventListener("keydown", onKey);
595
+ }, [prev, next]);
596
+ useEffect2(() => {
597
+ const wrapper = slidesWrapperRef.current;
598
+ if (!wrapper) return;
599
+ let startX = null;
600
+ const onTouchStart = (e) => {
601
+ startX = e.touches[0].clientX;
602
+ };
603
+ const onTouchEnd = (e) => {
604
+ if (startX === null) return;
605
+ const deltaX = e.changedTouches[0].clientX - startX;
606
+ if (Math.abs(deltaX) > 50) {
607
+ if (deltaX > 0) prev();
608
+ else next();
609
+ }
610
+ startX = null;
611
+ };
612
+ wrapper.addEventListener("touchstart", onTouchStart);
613
+ wrapper.addEventListener("touchend", onTouchEnd);
614
+ return () => {
615
+ wrapper.removeEventListener("touchstart", onTouchStart);
616
+ wrapper.removeEventListener("touchend", onTouchEnd);
617
+ };
618
+ }, [prev, next]);
619
+ const memoizedSlides = useMemo3(() => slides, [slides]);
620
+ if (slidesCount === 0) return null;
621
+ const Root = slots.root ?? ImageSliderRoot;
622
+ const SliderWrapper = slots.sliderWrapper ?? ImageSliderSliderWrapper;
623
+ const SlidesWrapper = slots.slidesWrapper ?? ImageSliderSlidesWrapper;
624
+ const SlideItem = slots.slideItem ?? ImageSliderSlideItem;
625
+ const SlideContent = slots.slideContent ?? ImageSliderSlideContent;
626
+ const ImageWrapper = slots.imageWrapper ?? ImageSliderImageWrapper;
627
+ const SlideImage = slots.slideImage ?? ImageSliderSlideImage;
628
+ const TextWrapper = slots.textWrapper ?? ImageSliderTextWrapper;
629
+ const SlideTitle = slots.slideTitle ?? ImageSliderSlideTitle;
630
+ const SlideDescription = slots.slideDescription ?? ImageSliderSlideDescription;
631
+ const SlideEmbed = slots.slideEmbed ?? ImageSliderSlideEmbed;
632
+ const SlideLink = slots.slideLink ?? ImageSliderSlideLink;
633
+ const EmptyControls = slots.emptyControls ?? (({ height, mt }) => /* @__PURE__ */ jsx4(Box, { height, mt }));
634
+ const rootProps = useMemo3(
635
+ () => ({
636
+ ...slotProps.root,
637
+ sx: getSlotSx3("root", sx)
638
+ }),
639
+ [slotProps.root, sx]
640
+ );
641
+ const sliderWrapperProps = useMemo3(
642
+ () => ({
643
+ ...slotProps.sliderWrapper,
644
+ sx: getSlotSx3("sliderWrapper", sx)
645
+ }),
646
+ [slotProps.sliderWrapper, sx]
647
+ );
648
+ const slidesWrapperProps = useMemo3(
649
+ () => ({
650
+ ...slotProps.slidesWrapper,
651
+ sx: getSlotSx3("slidesWrapper", sx)
652
+ }),
653
+ [slotProps.slidesWrapper, sx]
654
+ );
655
+ const slideItemProps = useMemo3(
656
+ () => ({
657
+ ...slotProps.slideItem,
658
+ sx: getSlotSx3("slideItem", sx)
659
+ }),
660
+ [slotProps.slideItem, sx]
661
+ );
662
+ const slideContentProps = useMemo3(
663
+ () => ({
664
+ ...slotProps.slideContent,
665
+ sx: getSlotSx3("slideContent", sx)
666
+ }),
667
+ [slotProps.slideContent, sx]
668
+ );
669
+ const imageWrapperProps = useMemo3(
670
+ () => ({
671
+ ...slotProps.imageWrapper,
672
+ sx: getSlotSx3("imageWrapper", sx)
673
+ }),
674
+ [slotProps.imageWrapper, sx]
675
+ );
676
+ const slideImageProps = useMemo3(
677
+ () => ({
678
+ ...slotProps.slideImage,
679
+ sx: getSlotSx3("slideImage", sx)
680
+ }),
681
+ [slotProps.slideImage, sx]
682
+ );
683
+ const textWrapperProps = useMemo3(
684
+ () => ({
685
+ ...slotProps.textWrapper,
686
+ sx: getSlotSx3("textWrapper", sx)
687
+ }),
688
+ [slotProps.textWrapper, sx]
689
+ );
690
+ const slideTitleProps = useMemo3(
691
+ () => ({
692
+ ...slotProps.slideTitle,
693
+ sx: getSlotSx3("slideTitle", sx)
694
+ }),
695
+ [slotProps.slideTitle, sx]
696
+ );
697
+ const slideDescriptionProps = useMemo3(
698
+ () => ({
699
+ ...slotProps.slideDescription,
700
+ sx: getSlotSx3("slideDescription", sx)
701
+ }),
702
+ [slotProps.slideDescription, sx]
703
+ );
704
+ const slideEmbedProps = useMemo3(
705
+ () => ({
706
+ ...slotProps.slideEmbed,
707
+ sx: getSlotSx3("slideEmbed", sx)
708
+ }),
709
+ [slotProps.slideEmbed, sx]
710
+ );
711
+ const slideLinkProps = useMemo3(
712
+ () => ({
713
+ ...slotProps.slideLink,
714
+ sx: getSlotSx3("slideLink", sx)
715
+ }),
716
+ [slotProps.slideLink, sx]
717
+ );
718
+ const emptyControlsProps = useMemo3(
719
+ () => ({
720
+ ...slotProps.emptyControls,
721
+ sx: getSlotSx3("emptyControls", sx)
722
+ }),
723
+ [slotProps.emptyControls, sx]
724
+ );
725
+ return /* @__PURE__ */ jsxs3(Root, { className, ...rootProps, children: [
726
+ /* @__PURE__ */ jsx4(SliderWrapper, { ...sliderWrapperProps, children: /* @__PURE__ */ jsx4(
727
+ SlidesWrapper,
728
+ {
729
+ ...slidesWrapperProps,
730
+ ref: slidesWrapperRef,
731
+ $currentSlide: currentSlide,
732
+ $transitionDuration: transitionDuration,
733
+ children: memoizedSlides.map((slide, idx) => /* @__PURE__ */ createElement(SlideItem, { ...slideItemProps, key: idx, $isActive: idx === currentSlide }, /* @__PURE__ */ jsx4(SlideContent, { ...slideContentProps, children: slide.type !== "PDF" ? /* @__PURE__ */ jsxs3(Fragment, { children: [
734
+ /* @__PURE__ */ jsx4(ImageWrapper, { ...imageWrapperProps, children: /* @__PURE__ */ jsx4(
735
+ SlideImage,
736
+ {
737
+ src: slide.image,
738
+ alt: slide.alt,
739
+ loading: idx === 0 ? "eager" : "lazy",
740
+ draggable: false,
741
+ tabIndex: idx === currentSlide ? 0 : -1,
742
+ ...slideImageProps
743
+ }
744
+ ) }),
745
+ (slide.title || slide.description) && /* @__PURE__ */ jsxs3(TextWrapper, { ...textWrapperProps, children: [
746
+ slide.title && /* @__PURE__ */ jsx4(SlideTitle, { ...slideTitleProps, children: slide.title }),
747
+ slide.description && /* @__PURE__ */ jsx4(SlideDescription, { ...slideDescriptionProps, children: slide.description })
748
+ ] })
749
+ ] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
750
+ /* @__PURE__ */ jsx4(SlideEmbed, { src: slide.file, ...slideEmbedProps }),
751
+ /* @__PURE__ */ jsxs3(SlideLink, { href: slide.file, target: "_blank", rel: "noopener noreferrer", ...slideLinkProps, children: [
752
+ /* @__PURE__ */ jsx4(ExternalLink, { size: 24, color: "#ffffff" }),
753
+ /* @__PURE__ */ jsx4("p", { children: "Open file in the new tab" })
754
+ ] })
755
+ ] }) })))
756
+ }
757
+ ) }),
758
+ slidesCount > 1 ? /* @__PURE__ */ jsx4(
759
+ ImageSliderControls,
760
+ {
761
+ showArrows,
762
+ showDots,
763
+ memoizedSlides,
764
+ currentSlide,
765
+ goToSlide,
766
+ canGoPrev,
767
+ canGoNext,
768
+ prev,
769
+ next,
770
+ ...controlsProps
771
+ }
772
+ ) : /* @__PURE__ */ jsx4(EmptyControls, { height: 55, mt: 2, ...emptyControlsProps })
773
+ ] });
774
+ };
775
+ ImageSlider.displayName = "ImageSlider";
776
+
777
+ // src/SlideGallery/SlideGallery.styled.ts
778
+ import { styled as styled4 } from "@mui/material/styles";
779
+ var SlideGalleryRoot = styled4("div", {
780
+ name: "SlideGallery",
781
+ slot: "Root"
782
+ })(() => ({
783
+ flex: 1,
784
+ minHeight: 0,
785
+ display: "flex",
786
+ width: "100%",
787
+ padding: "16px",
788
+ borderRadius: "16px"
789
+ }));
790
+
791
+ // src/SlideGallery/SlideGallery.tsx
792
+ import { jsx as jsx5 } from "react/jsx-runtime";
793
+ var SlideGallery = memo4((props) => {
794
+ const { gallery, slots = {}, slotProps = {}, imageSliderProps, controlsProps, overlayProps, sx } = props;
795
+ const slides = useMemo4(
796
+ () => gallery.slides.map((slide, idx) => ({
797
+ ...slide,
798
+ alt: slide.title ?? `Slide ${idx + 1}`
799
+ })),
800
+ [gallery.slides]
801
+ );
802
+ if (!gallery.visible || slides.length === 0) return null;
803
+ const Root = slots.root ?? SlideGalleryRoot;
804
+ const rootProps = useMemo4(
805
+ () => ({
806
+ ...slotProps.root,
807
+ sx: getSlotSx4("root", sx)
808
+ }),
809
+ [slotProps.root, sx]
810
+ );
811
+ return /* @__PURE__ */ jsx5(Overlay2, { visible: gallery.visible, ...overlayProps, children: /* @__PURE__ */ jsx5(Root, { ...rootProps, children: /* @__PURE__ */ jsx5(ImageSlider, { slides, ...imageSliderProps, controlsProps }) }) });
812
+ });
813
+ SlideGallery.displayName = "SlideGallery";
814
+
815
+ // src/IframeGallery/IframeGallery.tsx
816
+ import { memo as memo5, useMemo as useMemo5 } from "react";
817
+ import { Overlay as Overlay3 } from "@zipkito/shared";
818
+
819
+ // src/IframeGallery/IframeGallery.styled.ts
820
+ import { styled as styled5 } from "@mui/material/styles";
821
+ var IframeGalleryFrame = styled5("iframe", {
822
+ name: "IframeGallery",
823
+ slot: "Frame"
824
+ })(() => ({
825
+ border: 0,
826
+ width: "100%",
827
+ height: "100%",
828
+ display: "block",
829
+ background: "transparent",
830
+ borderRadius: 16,
831
+ boxShadow: "0 12px 30px rgba(0, 0, 0, 0.25)"
832
+ }));
833
+
834
+ // src/IframeGallery/IframeGallery.tsx
835
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
836
+ var IframeGallery = memo5((props) => {
837
+ const { gallery, actions, slots = {}, slotProps = {}, overlayProps = {}, sx } = props;
838
+ const src = useMemo5(() => gallery?.path, [gallery?.path]);
839
+ if (!gallery.visible || !src) return null;
840
+ const Frame = slots.frame ?? IframeGalleryFrame;
841
+ return /* @__PURE__ */ jsxs4(Overlay3, { visible: gallery.visible, ...overlayProps, children: [
842
+ /* @__PURE__ */ jsx6(Frame, { src, sx, loading: "lazy", ...slotProps.frame }),
843
+ actions
844
+ ] });
845
+ });
846
+ IframeGallery.displayName = "IframeGallery";
847
+
848
+ // src/types/galleries.ts
849
+ var GALLERY_TYPE = {
850
+ Slide: "slide",
851
+ MDX: "mdx",
852
+ Iframe: "iframe"
853
+ };
854
+ export {
855
+ GALLERY_TYPE,
856
+ IframeGallery,
857
+ MDXGallery,
858
+ SlideGallery
859
+ };
860
+ //# sourceMappingURL=index.mjs.map