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