@rovela-ai/sdk 0.3.21 → 0.3.22
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/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +14 -5
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/VariantManager.d.ts +1 -0
- package/dist/admin/components/VariantManager.d.ts.map +1 -1
- package/dist/admin/components/VariantManager.js +58 -3
- package/dist/admin/components/VariantManager.js.map +1 -1
- package/dist/admin/types.d.ts +5 -0
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/core/db/queries.d.ts +22 -16
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/schema.d.ts +39 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +2 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/media/api/presign.d.ts.map +1 -1
- package/dist/media/api/presign.js +5 -3
- package/dist/media/api/presign.js.map +1 -1
- package/dist/media/components/ImageGalleryUpload.d.ts +6 -3
- package/dist/media/components/ImageGalleryUpload.d.ts.map +1 -1
- package/dist/media/components/ImageGalleryUpload.js +97 -57
- package/dist/media/components/ImageGalleryUpload.js.map +1 -1
- package/dist/media/config.d.ts +27 -1
- package/dist/media/config.d.ts.map +1 -1
- package/dist/media/config.js +48 -1
- package/dist/media/config.js.map +1 -1
- package/dist/media/index.d.ts +2 -2
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +2 -2
- package/dist/media/index.js.map +1 -1
- package/dist/media/types.d.ts +48 -6
- package/dist/media/types.d.ts.map +1 -1
- package/dist/media/types.js +44 -1
- package/dist/media/types.js.map +1 -1
- package/dist/products/components/ProductDetails.d.ts.map +1 -1
- package/dist/products/components/ProductDetails.js +20 -9
- package/dist/products/components/ProductDetails.js.map +1 -1
- package/dist/products/components/ProductGallery.d.ts +24 -19
- package/dist/products/components/ProductGallery.d.ts.map +1 -1
- package/dist/products/components/ProductGallery.js +48 -31
- package/dist/products/components/ProductGallery.js.map +1 -1
- package/package.json +1 -1
package/dist/media/types.js
CHANGED
|
@@ -5,13 +5,56 @@
|
|
|
5
5
|
* Supports product images, category covers, and variant swatches.
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
|
-
* Default upload configuration
|
|
8
|
+
* Default upload configuration (image-only).
|
|
9
|
+
*
|
|
10
|
+
* Used by single-image surfaces (logos, category covers, variant swatches)
|
|
11
|
+
* where accepting video would break downstream rendering. DO NOT widen this
|
|
12
|
+
* to include video MIMEs — use `DEFAULT_MEDIA_UPLOAD_CONFIG` for surfaces
|
|
13
|
+
* that legitimately accept both kinds.
|
|
9
14
|
*/
|
|
10
15
|
export const DEFAULT_UPLOAD_CONFIG = {
|
|
11
16
|
maxSizeBytes: 10 * 1024 * 1024, // 10MB
|
|
12
17
|
allowedTypes: ['image/jpeg', 'image/png', 'image/webp', 'image/gif'],
|
|
13
18
|
maxFiles: 10,
|
|
14
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* Allowed video MIME types across the platform.
|
|
22
|
+
* MP4 (H.264) is the universal baseline; WebM and QuickTime/MOV are accepted
|
|
23
|
+
* because browsers + iOS export them natively. Other formats are rejected.
|
|
24
|
+
*/
|
|
25
|
+
export const VIDEO_MIME_TYPES = ['video/mp4', 'video/webm', 'video/quicktime'];
|
|
26
|
+
/**
|
|
27
|
+
* Default media upload configuration (images + videos).
|
|
28
|
+
*
|
|
29
|
+
* Used by product galleries and any surface where merchants legitimately
|
|
30
|
+
* upload either kind. 100MB cap is the platform-wide ceiling.
|
|
31
|
+
*/
|
|
32
|
+
export const DEFAULT_MEDIA_UPLOAD_CONFIG = {
|
|
33
|
+
maxSizeBytes: 100 * 1024 * 1024, // 100MB
|
|
34
|
+
allowedTypes: [
|
|
35
|
+
'image/jpeg',
|
|
36
|
+
'image/png',
|
|
37
|
+
'image/webp',
|
|
38
|
+
'image/gif',
|
|
39
|
+
...VIDEO_MIME_TYPES,
|
|
40
|
+
],
|
|
41
|
+
maxFiles: 10,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Detect whether a URL points at a video asset by file extension.
|
|
45
|
+
* Used by gallery components to decide between `<img>` and `<video>` rendering.
|
|
46
|
+
*/
|
|
47
|
+
export function isVideoUrl(url) {
|
|
48
|
+
// Strip query string + fragment so e.g. signed URLs still match
|
|
49
|
+
const path = url.split('?')[0].split('#')[0].toLowerCase();
|
|
50
|
+
return path.endsWith('.mp4') || path.endsWith('.webm') || path.endsWith('.mov');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Detect whether a MIME type is a video.
|
|
54
|
+
*/
|
|
55
|
+
export function isVideoMime(mime) {
|
|
56
|
+
return mime.startsWith('video/');
|
|
57
|
+
}
|
|
15
58
|
/**
|
|
16
59
|
* Validate a file against upload constraints
|
|
17
60
|
*/
|
package/dist/media/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoCH
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductDetails.d.ts","sourceRoot":"","sources":["../../../src/products/components/ProductDetails.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIpE,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAQ/D,MAAM,WAAW,mBAAmB;IAClC,mBAAmB;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAA;IAC3B,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0BAA0B;IAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1F,sBAAsB;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACvF,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,SAAS,CAAA;IAC5B,oCAAoC;IACpC,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wBAAwB;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAa,EACb,SAAS,EACT,QAAQ,EACR,MAAM,EACN,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,UAAkB,EAClB,YAAmB,EACnB,WAAgB,EAChB,SAAiB,EACjB,aAAa,EACb,eAAwB,EACxB,QAAQ,GACT,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ProductDetails.d.ts","sourceRoot":"","sources":["../../../src/products/components/ProductDetails.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIpE,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAQ/D,MAAM,WAAW,mBAAmB;IAClC,mBAAmB;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAA;IAC3B,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0BAA0B;IAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1F,sBAAsB;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACvF,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,SAAS,CAAA;IAC5B,oCAAoC;IACpC,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wBAAwB;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAa,EACb,SAAS,EACT,QAAQ,EACR,MAAM,EACN,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,UAAkB,EAClB,YAAmB,EACnB,WAAgB,EAChB,SAAiB,EACjB,aAAa,EACb,eAAwB,EACxB,QAAQ,GACT,EAAE,mBAAmB,2CA4QrB"}
|
|
@@ -74,15 +74,26 @@ export function ProductDetails({ product, variants = [], className, currency, lo
|
|
|
74
74
|
}, [selectedVariant, variants]);
|
|
75
75
|
const isOutOfStock = currentStock === 0;
|
|
76
76
|
const isLowStock = currentStock > 0 && currentStock <= 5;
|
|
77
|
-
// Compute gallery
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
// Compute gallery: variant image + variant video first (if either is set),
|
|
78
|
+
// then product images, then product videos. Filter out duplicates so a
|
|
79
|
+
// variant image that also lives in `product.images` only appears once.
|
|
80
|
+
const galleryMedia = useMemo(() => {
|
|
81
|
+
const variantUrls = [
|
|
82
|
+
selectedVariant?.image,
|
|
83
|
+
selectedVariant?.video,
|
|
84
|
+
].filter((u) => !!u);
|
|
85
|
+
const productImages = product.images ?? [];
|
|
86
|
+
const productVideos = product.videos ?? [];
|
|
87
|
+
if (variantUrls.length === 0) {
|
|
88
|
+
return [...productImages, ...productVideos];
|
|
83
89
|
}
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
const variantSet = new Set(variantUrls);
|
|
91
|
+
return [
|
|
92
|
+
...variantUrls,
|
|
93
|
+
...productImages.filter((u) => !variantSet.has(u)),
|
|
94
|
+
...productVideos.filter((u) => !variantSet.has(u)),
|
|
95
|
+
];
|
|
96
|
+
}, [product.images, product.videos, selectedVariant]);
|
|
86
97
|
// Generate a key to reset gallery when variant changes
|
|
87
98
|
const galleryKey = useMemo(() => {
|
|
88
99
|
return selectedVariant?.id || 'no-variant';
|
|
@@ -108,7 +119,7 @@ export function ProductDetails({ product, variants = [], className, currency, lo
|
|
|
108
119
|
const containerClasses = cn('grid gap-8', galleryPosition === 'left'
|
|
109
120
|
? 'lg:grid-cols-2'
|
|
110
121
|
: 'grid-cols-1', className);
|
|
111
|
-
return (_jsxs("div", { className: containerClasses, children: [_jsx("div", { className: galleryPosition === 'top' ? 'order-first' : '', children: _jsx(ProductGallery, {
|
|
122
|
+
return (_jsxs("div", { className: containerClasses, children: [_jsx("div", { className: galleryPosition === 'top' ? 'order-first' : '', children: _jsx(ProductGallery, { media: galleryMedia, alt: product.name }, galleryKey) }), _jsxs("div", { className: "flex flex-col", children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight text-foreground sm:text-3xl", children: product.name }), _jsxs("div", { className: "mt-3 flex items-baseline gap-3", children: [_jsx("span", { className: "text-2xl font-semibold text-foreground", children: formatPrice(currentPrice, { currency: resolvedCurrency, locale: resolvedLocale }) }), comparePrice && comparePrice > currentPrice && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-lg text-muted-foreground line-through", children: formatPrice(comparePrice, { currency: resolvedCurrency, locale: resolvedLocale }) }), discountPercent && (_jsxs("span", { className: "rounded-full bg-destructive px-2 py-0.5 text-sm font-medium text-destructive-foreground", children: ["Save ", discountPercent, "%"] }))] }))] }), showStock && currentStock >= 0 && (_jsx("div", { className: "mt-3", children: isOutOfStock ? (_jsx("span", { className: "text-sm font-medium text-destructive", children: "Out of Stock" })) : isLowStock ? (_jsxs("span", { className: "text-sm font-medium text-warning", children: ["Only ", currentStock, " left in stock"] })) : (_jsxs("span", { className: "text-sm text-muted-foreground", children: ["In Stock (", currentStock, " available)"] })) })), _jsxs("div", { className: "mt-6", children: [_jsx("h2", { className: "sr-only", children: "Description" }), _jsx("p", { className: "text-base text-muted-foreground", children: product.description })] }), children, requiresVariant && (_jsx("div", { className: "mt-6", children: _jsx(VariantSelector, { variants: variants, selected: selectedVariant, onSelect: setSelectedVariant, labels: variantLabels, disableOutOfStock: true }) })), showQuantity && (_jsxs("div", { className: "mt-6", children: [_jsx("label", { className: "mb-2 block text-sm font-medium text-foreground", children: "Quantity" }), _jsxs("div", { className: "flex w-32 items-center rounded-md border border-border", children: [_jsx("button", { type: "button", onClick: () => handleQuantityChange(quantity - 1), disabled: quantity <= 1, className: "flex h-10 w-10 items-center justify-center text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50", children: _jsx(Minus, { className: "h-4 w-4" }) }), _jsx("input", { type: "number", value: quantity, onChange: (e) => {
|
|
112
123
|
const val = e.target.value;
|
|
113
124
|
if (val === '')
|
|
114
125
|
return; // Allow empty during typing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductDetails.js","sourceRoot":"","sources":["../../../src/products/components/ProductDetails.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ProductDetails.js","sourceRoot":"","sources":["../../../src/products/components/ProductDetails.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAA6B,MAAM,OAAO,CAAA;AACpE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAyCjD,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,GAAG,EAAE,EACb,SAAS,EACT,QAAQ,EACR,MAAM,EACN,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,UAAU,GAAG,KAAK,EAClB,YAAY,GAAG,IAAI,EACnB,WAAW,GAAG,EAAE,EAChB,SAAS,GAAG,KAAK,EACjB,aAAa,EACb,eAAe,GAAG,MAAM,EACxB,QAAQ,GACY;IACpB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAA;IACnF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAE3C,sDAAsD;IACtD,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAA;IAChD,MAAM,gBAAgB,GAAG,QAAQ,IAAI,aAAa,EAAE,QAAQ,IAAI,KAAK,CAAA;IACrE,MAAM,cAAc,GAAG,MAAM,IAAI,aAAa,EAAE,MAAM,IAAI,OAAO,CAAA;IAEjE,0BAA0B;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,eAAe,EAAE,KAAK,EAAE,CAAC;YAC3B,OAAO,OAAO,eAAe,CAAC,KAAK,KAAK,QAAQ;gBAC9C,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC;gBACnC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAA;QAC3B,CAAC;QACD,OAAO,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;YACtC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;YAC3B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAA;IACnB,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;QACvC,CAAC,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;YACxC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC;YAClC,CAAC,CAAC,OAAO,CAAC,YAAY;QACxB,CAAC,CAAC,IAAI,CAAA;IAER,qBAAqB;IACrB,MAAM,eAAe,GACnB,YAAY,IAAI,YAAY,GAAG,YAAY;QACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC;QAClE,CAAC,CAAC,IAAI,CAAA;IAEV,kBAAkB;IAClB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,eAAe,CAAC,SAAS,CAAA;QAClC,CAAC;QACD,oEAAoE;QACpE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,CAAC,CAAC,CAAA,CAAC,qCAAqC;IACjD,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE/B,MAAM,YAAY,GAAG,YAAY,KAAK,CAAC,CAAA;IACvC,MAAM,UAAU,GAAG,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,CAAC,CAAA;IAExD,2EAA2E;IAC3E,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,YAAY,GAAG,OAAO,CAAW,GAAG,EAAE;QAC1C,MAAM,WAAW,GAAG;YAClB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEjC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAA;QAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAA;QAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAA;QAC7C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;QACvC,OAAO;YACL,GAAG,WAAW;YACd,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACnD,CAAA;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAA;IAErD,uDAAuD;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,eAAe,EAAE,EAAE,IAAI,YAAY,CAAA;IAC5C,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAA;IAErB,yCAAyC;IACzC,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IAClE,MAAM,YAAY,GAAG,CAAC,eAAe,IAAI,eAAe,KAAK,IAAI,CAAA;IAEjE,WAAW;IACX,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,YAAY,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAA;QACnD,CAAC;IACH,CAAC,CAAA;IAED,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAA;QAChD,CAAC;IACH,CAAC,CAAA;IAED,MAAM,oBAAoB,GAAG,CAAC,WAAmB,EAAE,EAAE;QACnD,MAAM,GAAG,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;QAChF,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACtD,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,EAAE,CACzB,YAAY,EACZ,eAAe,KAAK,MAAM;QACxB,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,aAAa,EACjB,SAAS,CACV,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,gBAAgB,aAE9B,cAAK,SAAS,EAAE,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAC5D,KAAC,cAAc,IAAkB,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,IAAlD,UAAU,CAA4C,GACvE,EAGN,eAAK,SAAS,EAAC,eAAe,aAE5B,aAAI,SAAS,EAAC,+DAA+D,YAC1E,OAAO,CAAC,IAAI,GACV,EAGL,eAAK,SAAS,EAAC,gCAAgC,aAC7C,eAAM,SAAS,EAAC,wCAAwC,YACrD,WAAW,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,GAC7E,EACN,YAAY,IAAI,YAAY,GAAG,YAAY,IAAI,CAC9C,8BACE,eAAM,SAAS,EAAC,4CAA4C,YACzD,WAAW,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,GAC7E,EACN,eAAe,IAAI,CAClB,gBAAM,SAAS,EAAC,yFAAyF,sBACjG,eAAe,SAChB,CACR,IACA,CACJ,IACG,EAGL,SAAS,IAAI,YAAY,IAAI,CAAC,IAAI,CACjC,cAAK,SAAS,EAAC,MAAM,YAClB,YAAY,CAAC,CAAC,CAAC,CACd,eAAM,SAAS,EAAC,sCAAsC,6BAE/C,CACR,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACf,gBAAM,SAAS,EAAC,kCAAkC,sBAC1C,YAAY,sBACb,CACR,CAAC,CAAC,CAAC,CACF,gBAAM,SAAS,EAAC,+BAA+B,2BAClC,YAAY,mBAClB,CACR,GACG,CACP,EAGD,eAAK,SAAS,EAAC,MAAM,aACnB,aAAI,SAAS,EAAC,SAAS,4BAAiB,EACxC,YAAG,SAAS,EAAC,iCAAiC,YAC3C,OAAO,CAAC,WAAW,GAClB,IACA,EAGL,QAAQ,EAGR,eAAe,IAAI,CAClB,cAAK,SAAS,EAAC,MAAM,YACnB,KAAC,eAAe,IACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,EACrB,iBAAiB,SACjB,GACE,CACP,EAGA,YAAY,IAAI,CACf,eAAK,SAAS,EAAC,MAAM,aACnB,gBAAO,SAAS,EAAC,gDAAgD,yBAEzD,EACR,eAAK,SAAS,EAAC,wDAAwD,aACrE,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,QAAQ,GAAG,CAAC,CAAC,EACjD,QAAQ,EAAE,QAAQ,IAAI,CAAC,EACvB,SAAS,EAAC,0JAA0J,YAEpK,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,GAAG,GACtB,EACT,gBACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4CACd,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;4CAC1B,IAAI,GAAG,KAAK,EAAE;gDAAE,OAAM,CAAE,4BAA4B;4CACpD,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;wCAC1C,CAAC,EACD,SAAS,EAAC,iMAAiM,EAC3M,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,GACzE,EACF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,QAAQ,GAAG,CAAC,CAAC,EACjD,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,EAC/E,SAAS,EAAC,0JAA0J,YAEpK,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,GACrB,IACL,IACF,CACP,EAGD,eAAK,SAAS,EAAC,sCAAsC,aACnD,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,YAAY,IAAI,YAAY,EACvC,SAAS,EAAE,EAAE,CACX,qEAAqE,EACrE,YAAY,IAAI,CAAC,YAAY;oCAC3B,CAAC,CAAC,wDAAwD;oCAC1D,CAAC,CAAC,mDAAmD,CACxD,YAEA,YAAY;oCACX,CAAC,CAAC,cAAc;oCAChB,CAAC,CAAC,CAAC,YAAY;wCACb,CAAC,CAAC,gBAAgB;wCAClB,CAAC,CAAC,gBAAgB,IAAI,aAAa,GAChC,EAER,UAAU,IAAI,CACb,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,YAAY,IAAI,YAAY,EACvC,SAAS,EAAE,EAAE,CACX,4EAA4E,EAC5E,YAAY,IAAI,CAAC,YAAY;oCAC3B,CAAC,CAAC,4EAA4E;oCAC9E,CAAC,CAAC,uDAAuD,CAC5D,YAEA,aAAa,IAAI,SAAS,GACpB,CACV,IACG,EAGL,eAAe,IAAI,CAAC,eAAe,IAAI,CACtC,YAAG,SAAS,EAAC,oCAAoC,yDAE7C,CACL,IACG,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1,37 +1,42 @@
|
|
|
1
1
|
export interface ProductGalleryProps {
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Image URLs (back-compat: prop used to be the only source). Either this,
|
|
4
|
+
* `videos`, or `media` (combined) is required.
|
|
5
|
+
*/
|
|
6
|
+
images?: string[];
|
|
7
|
+
/** Video URLs (MP4 / WebM / MOV). Order is preserved. */
|
|
8
|
+
videos?: string[];
|
|
9
|
+
/**
|
|
10
|
+
* Pre-mixed media URLs in display order. If provided, takes precedence over
|
|
11
|
+
* `images` + `videos` (which are still appended for back-compat callers
|
|
12
|
+
* that pass both).
|
|
13
|
+
*/
|
|
14
|
+
media?: string[];
|
|
15
|
+
/** Alt text for images / aria label for videos */
|
|
5
16
|
alt: string;
|
|
6
17
|
/** Custom className */
|
|
7
18
|
className?: string;
|
|
8
19
|
/** Thumbnail position */
|
|
9
20
|
thumbnailPosition?: 'bottom' | 'left';
|
|
10
|
-
/** Main
|
|
21
|
+
/** Main media aspect ratio */
|
|
11
22
|
aspectRatio?: 'square' | 'portrait' | 'landscape';
|
|
12
|
-
/** Enable zoom on click */
|
|
23
|
+
/** Enable zoom on click (image only — videos always show controls instead) */
|
|
13
24
|
enableZoom?: boolean;
|
|
14
25
|
/** Show navigation arrows */
|
|
15
26
|
showArrows?: boolean;
|
|
16
27
|
}
|
|
17
28
|
/**
|
|
18
|
-
* ProductGallery component
|
|
29
|
+
* ProductGallery component — images and videos in a unified strip.
|
|
19
30
|
*
|
|
20
31
|
* @example
|
|
21
32
|
* ```tsx
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* alt={product.name}
|
|
29
|
-
* thumbnailPosition="left"
|
|
30
|
-
* aspectRatio="square"
|
|
31
|
-
* />
|
|
32
|
-
* )
|
|
33
|
-
* }
|
|
33
|
+
* <ProductGallery
|
|
34
|
+
* images={product.images}
|
|
35
|
+
* videos={product.videos}
|
|
36
|
+
* alt={product.name}
|
|
37
|
+
* thumbnailPosition="left"
|
|
38
|
+
* />
|
|
34
39
|
* ```
|
|
35
40
|
*/
|
|
36
|
-
export declare function ProductGallery({ images, alt, className, thumbnailPosition, aspectRatio, enableZoom, showArrows, }: ProductGalleryProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
export declare function ProductGallery({ images, videos, media, alt, className, thumbnailPosition, aspectRatio, enableZoom, showArrows, }: ProductGalleryProps): import("react/jsx-runtime").JSX.Element;
|
|
37
42
|
//# sourceMappingURL=ProductGallery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductGallery.d.ts","sourceRoot":"","sources":["../../../src/products/components/ProductGallery.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProductGallery.d.ts","sourceRoot":"","sources":["../../../src/products/components/ProductGallery.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAA;IACX,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACrC,8BAA8B;IAC9B,WAAW,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAA;IACjD,8EAA8E;IAC9E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,KAAK,EACL,GAAG,EACH,SAAS,EACT,iBAA4B,EAC5B,WAAsB,EACtB,UAAkB,EAClB,UAAiB,GAClB,EAAE,mBAAmB,2CA0OrB"}
|
|
@@ -3,35 +3,44 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
3
3
|
/**
|
|
4
4
|
* @rovela/sdk/products/components/ProductGallery
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Media gallery for product pages. Renders images and videos in a unified
|
|
7
|
+
* gallery — image URLs render as `<Image>`, video URLs (`.mp4`/`.webm`/`.mov`)
|
|
8
|
+
* render as `<video>`. Detection is purely URL-extension based; the gallery
|
|
9
|
+
* doesn't care which array a URL lives in.
|
|
10
|
+
*
|
|
11
|
+
* Two ways to pass media in:
|
|
12
|
+
* 1. `images` prop alone (back-compat) — works exactly like before.
|
|
13
|
+
* 2. `images` + `videos` (or pre-mixed `media`) — gallery shows them in order.
|
|
7
14
|
*/
|
|
8
|
-
import { useState, useCallback } from 'react';
|
|
15
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
9
16
|
import Image from 'next/image';
|
|
10
|
-
import { ImageIcon, ChevronLeft, ChevronRight, X } from 'lucide-react';
|
|
17
|
+
import { ImageIcon, ChevronLeft, ChevronRight, X, Play } from 'lucide-react';
|
|
11
18
|
import { cn } from '../../core/utils';
|
|
19
|
+
import { isVideoUrl } from '../../media';
|
|
12
20
|
// =============================================================================
|
|
13
21
|
// Component
|
|
14
22
|
// =============================================================================
|
|
15
23
|
/**
|
|
16
|
-
* ProductGallery component
|
|
24
|
+
* ProductGallery component — images and videos in a unified strip.
|
|
17
25
|
*
|
|
18
26
|
* @example
|
|
19
27
|
* ```tsx
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* alt={product.name}
|
|
27
|
-
* thumbnailPosition="left"
|
|
28
|
-
* aspectRatio="square"
|
|
29
|
-
* />
|
|
30
|
-
* )
|
|
31
|
-
* }
|
|
28
|
+
* <ProductGallery
|
|
29
|
+
* images={product.images}
|
|
30
|
+
* videos={product.videos}
|
|
31
|
+
* alt={product.name}
|
|
32
|
+
* thumbnailPosition="left"
|
|
33
|
+
* />
|
|
32
34
|
* ```
|
|
33
35
|
*/
|
|
34
|
-
export function ProductGallery({ images, alt, className, thumbnailPosition = 'bottom', aspectRatio = 'square', enableZoom = false, showArrows = true, }) {
|
|
36
|
+
export function ProductGallery({ images, videos, media, alt, className, thumbnailPosition = 'bottom', aspectRatio = 'square', enableZoom = false, showArrows = true, }) {
|
|
37
|
+
// Combine into a single ordered list. `media` wins; otherwise images
|
|
38
|
+
// come first then videos (matches the visual hierarchy merchants expect).
|
|
39
|
+
const items = useMemo(() => {
|
|
40
|
+
if (media && media.length > 0)
|
|
41
|
+
return media;
|
|
42
|
+
return [...(images ?? []), ...(videos ?? [])];
|
|
43
|
+
}, [images, videos, media]);
|
|
35
44
|
const [activeIndex, setActiveIndex] = useState(0);
|
|
36
45
|
const [isZoomed, setIsZoomed] = useState(false);
|
|
37
46
|
const aspectClasses = {
|
|
@@ -39,37 +48,45 @@ export function ProductGallery({ images, alt, className, thumbnailPosition = 'bo
|
|
|
39
48
|
portrait: 'aspect-[3/4]',
|
|
40
49
|
landscape: 'aspect-[4/3]',
|
|
41
50
|
};
|
|
42
|
-
// Handle keyboard navigation
|
|
43
51
|
const handleKeyDown = useCallback((e) => {
|
|
44
52
|
if (e.key === 'ArrowLeft') {
|
|
45
|
-
setActiveIndex((prev) => (prev > 0 ? prev - 1 :
|
|
53
|
+
setActiveIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));
|
|
46
54
|
}
|
|
47
55
|
else if (e.key === 'ArrowRight') {
|
|
48
|
-
setActiveIndex((prev) => (prev <
|
|
56
|
+
setActiveIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));
|
|
49
57
|
}
|
|
50
|
-
}, [
|
|
58
|
+
}, [items.length]);
|
|
51
59
|
const goToPrevious = useCallback(() => {
|
|
52
|
-
setActiveIndex((prev) => (prev > 0 ? prev - 1 :
|
|
53
|
-
}, [
|
|
60
|
+
setActiveIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));
|
|
61
|
+
}, [items.length]);
|
|
54
62
|
const goToNext = useCallback(() => {
|
|
55
|
-
setActiveIndex((prev) => (prev <
|
|
56
|
-
}, [
|
|
63
|
+
setActiveIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));
|
|
64
|
+
}, [items.length]);
|
|
57
65
|
const handleThumbnailClick = useCallback((index) => {
|
|
58
66
|
setActiveIndex(index);
|
|
59
67
|
}, []);
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
// Zoom only applies to images. Clicking on a video tile does nothing —
|
|
69
|
+
// the inline `controls` UI takes over playback.
|
|
70
|
+
const handleMainImageClick = useCallback((currentIsVideo) => {
|
|
71
|
+
if (enableZoom && !currentIsVideo) {
|
|
62
72
|
setIsZoomed(!isZoomed);
|
|
63
73
|
}
|
|
64
74
|
}, [enableZoom, isZoomed]);
|
|
65
75
|
// Empty state
|
|
66
|
-
if (!
|
|
76
|
+
if (!items || items.length === 0) {
|
|
67
77
|
return (_jsx("div", { className: cn('relative overflow-hidden rounded-lg bg-muted', aspectClasses[aspectRatio], className), children: _jsx("div", { className: "absolute inset-0 flex items-center justify-center text-muted-foreground", children: _jsx(ImageIcon, { className: "h-16 w-16", strokeWidth: 1 }) }) }));
|
|
68
78
|
}
|
|
69
79
|
const containerClasses = cn('flex gap-4', thumbnailPosition === 'left' ? 'flex-row' : 'flex-col', className);
|
|
70
80
|
const thumbnailContainerClasses = cn('flex gap-2', thumbnailPosition === 'left' ? 'flex-col' : 'flex-row', thumbnailPosition === 'left' ? 'order-first w-20' : 'order-last');
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
81
|
+
const activeUrl = items[activeIndex];
|
|
82
|
+
const activeIsVideo = isVideoUrl(activeUrl);
|
|
83
|
+
return (_jsxs("div", { className: containerClasses, onKeyDown: handleKeyDown, tabIndex: 0, children: [_jsxs("div", { className: "relative flex-1", children: [_jsx("div", { className: cn('relative overflow-hidden rounded-lg bg-muted', aspectClasses[aspectRatio], enableZoom && !activeIsVideo && 'cursor-zoom-in'), onClick: () => handleMainImageClick(activeIsVideo), children: activeIsVideo ? (_jsx("video", { src: activeUrl, controls: true, preload: "metadata", playsInline: true, "aria-label": `${alt} - Video ${activeIndex + 1}`, className: "absolute inset-0 h-full w-full object-cover" }, activeUrl)) : (_jsx(Image, { src: activeUrl, alt: `${alt} - Image ${activeIndex + 1}`, fill: true, sizes: "(max-width: 768px) 100vw, 50vw", className: cn('object-cover transition-transform duration-300', isZoomed && 'scale-150 cursor-zoom-out'), priority: activeIndex === 0 })) }), showArrows && items.length > 1 && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: goToPrevious, className: "absolute left-2 top-1/2 -translate-y-1/2 rounded-full bg-background/80 p-2 shadow-sm transition-colors hover:bg-background", "aria-label": "Previous media", children: _jsx(ChevronLeft, { className: "h-5 w-5" }) }), _jsx("button", { type: "button", onClick: goToNext, className: "absolute right-2 top-1/2 -translate-y-1/2 rounded-full bg-background/80 p-2 shadow-sm transition-colors hover:bg-background", "aria-label": "Next media", children: _jsx(ChevronRight, { className: "h-5 w-5" }) })] })), items.length > 1 && (_jsxs("div", { className: "absolute bottom-2 right-2 rounded-full bg-background/80 px-2 py-1 text-xs font-medium", children: [activeIndex + 1, " / ", items.length] }))] }), items.length > 1 && (_jsx("div", { className: thumbnailContainerClasses, children: items.map((url, index) => {
|
|
84
|
+
const tileIsVideo = isVideoUrl(url);
|
|
85
|
+
return (_jsx("button", { type: "button", onClick: () => handleThumbnailClick(index), className: cn('relative aspect-square overflow-hidden rounded-md transition-all', thumbnailPosition === 'left' ? 'w-full' : 'w-16 sm:w-20', activeIndex === index
|
|
86
|
+
? 'ring-2 ring-primary ring-offset-2'
|
|
87
|
+
: 'opacity-70 hover:opacity-100'), "aria-label": tileIsVideo
|
|
88
|
+
? `View video ${index + 1}`
|
|
89
|
+
: `View image ${index + 1}`, "aria-current": activeIndex === index ? 'true' : 'false', children: tileIsVideo ? (_jsxs(_Fragment, { children: [_jsx("video", { src: url, preload: "metadata", muted: true, playsInline: true, className: "absolute inset-0 h-full w-full object-cover" }), _jsx("span", { className: "pointer-events-none absolute inset-0 flex items-center justify-center bg-black/20", "aria-hidden": "true", children: _jsx(Play, { className: "h-5 w-5 fill-white text-white drop-shadow" }) })] })) : (_jsx(Image, { src: url, alt: `${alt} thumbnail ${index + 1}`, fill: true, sizes: "80px", className: "object-cover" })) }, url));
|
|
90
|
+
}) })), isZoomed && enableZoom && !activeIsVideo && (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/80", onClick: () => setIsZoomed(false), children: [_jsx("button", { className: "absolute right-4 top-4 rounded-full bg-white/10 p-2 text-white transition-colors hover:bg-white/20", onClick: () => setIsZoomed(false), "aria-label": "Close zoom", children: _jsx(X, { className: "h-6 w-6" }) }), _jsx("div", { className: "relative h-[90vh] w-[90vw]", children: _jsx(Image, { src: activeUrl, alt: `${alt} - Zoomed`, fill: true, sizes: "90vw", className: "object-contain" }) })] }))] }));
|
|
74
91
|
}
|
|
75
92
|
//# sourceMappingURL=ProductGallery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductGallery.js","sourceRoot":"","sources":["../../../src/products/components/ProductGallery.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"ProductGallery.js","sourceRoot":"","sources":["../../../src/products/components/ProductGallery.tsx"],"names":[],"mappings":"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"}
|