@wewear/virtual-try-on 1.3.6 → 1.4.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.
- package/dist/components/alert-overlay.d.ts +2 -0
- package/dist/components/dom-alert.d.ts +2 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.esm.js +134 -30
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +134 -30
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,11 @@ export interface VirtualTryOnConfig {
|
|
|
6
6
|
buttonPosition: "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
|
7
7
|
}
|
|
8
8
|
export interface VirtualTryOnResult {
|
|
9
|
-
imageUrl: string;
|
|
9
|
+
imageUrl: string | null;
|
|
10
|
+
error?: {
|
|
11
|
+
message: string;
|
|
12
|
+
type: 'error' | 'warning';
|
|
13
|
+
};
|
|
10
14
|
}
|
|
11
15
|
export interface VirtualTryOnAPIRequest {
|
|
12
16
|
ww_access_token: string;
|
package/dist/index.esm.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
async function callVirtualTryOnApi(baseUrl, ww_access_token, ww_user_id, ww_product_image, ww_image) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return null;
|
|
2
|
+
const formData = new FormData();
|
|
3
|
+
formData.append("ww_user_id", ww_user_id);
|
|
4
|
+
formData.append("ww_product_image", ww_product_image);
|
|
5
|
+
formData.append("ww_image", ww_image, "captured-image.jpg");
|
|
6
|
+
formData.append("ww_access_token", ww_access_token);
|
|
7
|
+
const response = await fetch(`${baseUrl}/api/virtual-try-on`, {
|
|
8
|
+
method: "POST",
|
|
9
|
+
body: formData,
|
|
10
|
+
});
|
|
11
|
+
if (!response.ok) {
|
|
12
|
+
console.error("[WeWear VTO] API request failed:", response.status, response.statusText);
|
|
13
|
+
if (response.status === 500) {
|
|
14
|
+
return { "imageUrl": null, "error": { message: `Service unavailable. Please try again later.`, type: 'error' } };
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
catch (error) {
|
|
21
|
-
console.error("[WeWear VTO] API call failed:", error);
|
|
22
|
-
return null;
|
|
16
|
+
else if (response.status === 503) {
|
|
17
|
+
return { "imageUrl": null, "error": { message: `Service overloaded. Please try again later.`, type: 'warning' } };
|
|
18
|
+
}
|
|
19
|
+
return { "imageUrl": null, "error": { message: `${response.statusText}`, type: 'warning' } };
|
|
23
20
|
}
|
|
21
|
+
const result = await response.json();
|
|
22
|
+
console.log("[WeWear VTO] API response:", result);
|
|
23
|
+
return result;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/** CSS class names for consistent styling */
|
|
@@ -304,6 +304,26 @@ function showCameraModal(callbacks) {
|
|
|
304
304
|
// Create canvas for capturing
|
|
305
305
|
const canvas = document.createElement("canvas");
|
|
306
306
|
canvas.style.display = "none";
|
|
307
|
+
// Create face overlay
|
|
308
|
+
const faceOverlay = document.createElement("div");
|
|
309
|
+
faceOverlay.style.cssText = `
|
|
310
|
+
position: absolute;
|
|
311
|
+
top: 0;
|
|
312
|
+
left: 0;
|
|
313
|
+
width: 100%;
|
|
314
|
+
height: 100%;
|
|
315
|
+
pointer-events: none;
|
|
316
|
+
display: flex;
|
|
317
|
+
align-items: center;
|
|
318
|
+
justify-content: center;
|
|
319
|
+
z-index: 2;
|
|
320
|
+
`;
|
|
321
|
+
// SVG face outline (simple oval)
|
|
322
|
+
faceOverlay.innerHTML = `
|
|
323
|
+
<svg width="380" height="520" viewBox="0 0 380 520" fill="none" xmlns="http://www.w3.org/2000/svg" style="opacity:0.7;">
|
|
324
|
+
<ellipse cx="190" cy="240" rx="160" ry="220" stroke="rgba(0, 0, 0, 0.7)" stroke-width="6" fill="none" />
|
|
325
|
+
</svg>
|
|
326
|
+
`;
|
|
307
327
|
// Create capture button
|
|
308
328
|
const captureButton = document.createElement("button");
|
|
309
329
|
captureButton.innerHTML = "";
|
|
@@ -318,7 +338,7 @@ function showCameraModal(callbacks) {
|
|
|
318
338
|
background-color: rgba(0, 0, 0, 0.7);
|
|
319
339
|
border-radius: 50%;
|
|
320
340
|
cursor: pointer;
|
|
321
|
-
display:
|
|
341
|
+
display: flex;
|
|
322
342
|
align-items: center;
|
|
323
343
|
justify-content: center;
|
|
324
344
|
transition: all 0.2s ease;
|
|
@@ -364,11 +384,25 @@ function showCameraModal(callbacks) {
|
|
|
364
384
|
};
|
|
365
385
|
// Assemble the camera modal
|
|
366
386
|
cameraContainer.appendChild(video);
|
|
387
|
+
cameraContainer.appendChild(faceOverlay);
|
|
367
388
|
cameraContainer.appendChild(canvas);
|
|
368
389
|
cameraContainer.appendChild(captureButton);
|
|
369
390
|
cameraContainer.appendChild(closeButton);
|
|
370
|
-
cameraContainer.appendChild(loadingIndicator);
|
|
371
391
|
modal.appendChild(cameraContainer);
|
|
392
|
+
// Add instruction text outside the camera box
|
|
393
|
+
const instructionText = document.createElement("div");
|
|
394
|
+
instructionText.style.cssText = `
|
|
395
|
+
width: 100%;
|
|
396
|
+
max-width: 500px;
|
|
397
|
+
margin: 18px auto 0 auto;
|
|
398
|
+
text-align: center;
|
|
399
|
+
color: #fff;
|
|
400
|
+
font-size: 18px;
|
|
401
|
+
font-weight: bold;
|
|
402
|
+
text-shadow: 0 2px 8px #000;
|
|
403
|
+
`;
|
|
404
|
+
instructionText.innerText = "Please align your face inside the outline for better results.";
|
|
405
|
+
modal.appendChild(instructionText);
|
|
372
406
|
document.body.appendChild(modal);
|
|
373
407
|
console.log("[WeWear VTO] Camera modal added to DOM");
|
|
374
408
|
// Start camera
|
|
@@ -601,6 +635,74 @@ function showReviewModal(imageBlob, callbacks) {
|
|
|
601
635
|
console.log("[WeWear VTO] Review modal added to DOM");
|
|
602
636
|
}
|
|
603
637
|
|
|
638
|
+
function showAlert(container, message, type) {
|
|
639
|
+
var _a;
|
|
640
|
+
removeAlert(container); // Remove any existing alert
|
|
641
|
+
const alertDiv = document.createElement('div');
|
|
642
|
+
alertDiv.className = `ww-alert ww-alert-${type}`;
|
|
643
|
+
alertDiv.setAttribute('role', type === 'error' ? 'alert' : 'status');
|
|
644
|
+
alertDiv.setAttribute('aria-live', 'assertive');
|
|
645
|
+
alertDiv.style.cssText = `
|
|
646
|
+
position: absolute;
|
|
647
|
+
top: 16px;
|
|
648
|
+
left: 50%;
|
|
649
|
+
transform: translateX(-50%) translateY(-10px);
|
|
650
|
+
background: ${type === 'error' ? '#FEE2E2' : '#FEF9C3'};
|
|
651
|
+
color: ${type === 'error' ? '#B91C1C' : '#92400E'};
|
|
652
|
+
border: 1px solid ${type === 'error' ? '#F87171' : '#FBBF24'};
|
|
653
|
+
border-radius: 8px;
|
|
654
|
+
padding: 12px 16px;
|
|
655
|
+
z-index: 9999;
|
|
656
|
+
font-size: 15px;
|
|
657
|
+
font-weight: 500;
|
|
658
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
|
659
|
+
display: flex;
|
|
660
|
+
align-items: center;
|
|
661
|
+
min-width: 220px;
|
|
662
|
+
max-width: 90%;
|
|
663
|
+
opacity: 0;
|
|
664
|
+
transition: opacity 0.3s ease, transform 0.3s ease;
|
|
665
|
+
`;
|
|
666
|
+
alertDiv.innerHTML = `
|
|
667
|
+
<span style="flex: 1; line-height: 1.4;">${message}</span>
|
|
668
|
+
<button type="button" aria-label="Close alert"
|
|
669
|
+
style="
|
|
670
|
+
background: none;
|
|
671
|
+
border: none;
|
|
672
|
+
font-size: 20px;
|
|
673
|
+
color: inherit;
|
|
674
|
+
cursor: pointer;
|
|
675
|
+
margin-left: 12px;
|
|
676
|
+
padding: 0;
|
|
677
|
+
line-height: 1;
|
|
678
|
+
">
|
|
679
|
+
×
|
|
680
|
+
</button>
|
|
681
|
+
`;
|
|
682
|
+
// Close on button click
|
|
683
|
+
(_a = alertDiv.querySelector('button')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => {
|
|
684
|
+
fadeOutAndRemove(alertDiv);
|
|
685
|
+
});
|
|
686
|
+
container.appendChild(alertDiv);
|
|
687
|
+
// Animate in
|
|
688
|
+
requestAnimationFrame(() => {
|
|
689
|
+
alertDiv.style.opacity = '1';
|
|
690
|
+
alertDiv.style.transform = 'translateX(-50%) translateY(0)';
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
function fadeOutAndRemove(element) {
|
|
694
|
+
element.style.opacity = '0';
|
|
695
|
+
element.style.transform = 'translateX(-50%) translateY(-10px)';
|
|
696
|
+
setTimeout(() => {
|
|
697
|
+
element.remove();
|
|
698
|
+
}, 300);
|
|
699
|
+
}
|
|
700
|
+
function removeAlert(container) {
|
|
701
|
+
const alert = container.querySelector('.ww-alert');
|
|
702
|
+
if (alert)
|
|
703
|
+
fadeOutAndRemove(alert);
|
|
704
|
+
}
|
|
705
|
+
|
|
604
706
|
class VirtualTryOnWidget {
|
|
605
707
|
constructor(config) {
|
|
606
708
|
this.virtualTryOnImageUrl = null;
|
|
@@ -774,6 +876,9 @@ class VirtualTryOnWidget {
|
|
|
774
876
|
if (result === null || result === void 0 ? void 0 : result.imageUrl) {
|
|
775
877
|
this.replaceProductImage(result.imageUrl);
|
|
776
878
|
}
|
|
879
|
+
else if (result === null || result === void 0 ? void 0 : result.error) {
|
|
880
|
+
showAlert(container, result.error.message, result.error.type);
|
|
881
|
+
}
|
|
777
882
|
}
|
|
778
883
|
catch (error) {
|
|
779
884
|
console.error("[WeWear VTO] Error processing accepted image:", error);
|
|
@@ -809,12 +914,11 @@ class VirtualTryOnWidget {
|
|
|
809
914
|
this.updateButtonContainer(container);
|
|
810
915
|
}
|
|
811
916
|
}
|
|
812
|
-
else {
|
|
813
|
-
console.error("[WeWear VTO] Invalid API response on refresh:", result);
|
|
814
|
-
// Remove loading on error
|
|
917
|
+
else if (result === null || result === void 0 ? void 0 : result.error) {
|
|
815
918
|
const container = document.querySelector(this.config.gallerySelector);
|
|
816
919
|
if (container instanceof HTMLElement) {
|
|
817
920
|
removeProductLoading(container);
|
|
921
|
+
showAlert(container, result.error.message, result.error.type);
|
|
818
922
|
}
|
|
819
923
|
}
|
|
820
924
|
}
|
|
@@ -928,11 +1032,11 @@ class VirtualTryOnWidget {
|
|
|
928
1032
|
else if (originalRectHeight && originalRectHeight !== '0') {
|
|
929
1033
|
heightStyle = `${originalRectHeight}px`;
|
|
930
1034
|
}
|
|
931
|
-
image.style.cssText = `
|
|
932
|
-
width: ${widthStyle};
|
|
933
|
-
height: ${heightStyle};
|
|
934
|
-
object-fit: cover;
|
|
935
|
-
border-radius: 8px;
|
|
1035
|
+
image.style.cssText = `
|
|
1036
|
+
width: ${widthStyle};
|
|
1037
|
+
height: ${heightStyle};
|
|
1038
|
+
object-fit: cover;
|
|
1039
|
+
border-radius: 8px;
|
|
936
1040
|
`;
|
|
937
1041
|
container.appendChild(image);
|
|
938
1042
|
// Re-add buttons
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/api.ts","../src/constants.ts","../src/camera.ts","../src/utils.ts","../src/components/button.ts","../src/components/camera-modal.ts","../src/components/loading-overlay.ts","../src/components/review-modal.ts","../src/widget.ts","../src/installer.ts"],"sourcesContent":["import type { VirtualTryOnResult } from \"./index.js\";\r\n\r\nexport async function callVirtualTryOnApi(\r\n baseUrl: string,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ww_image: Blob,\r\n): Promise<VirtualTryOnResult | null> {\r\n try {\r\n const formData = new FormData();\r\n formData.append(\"ww_user_id\", ww_user_id);\r\n formData.append(\"ww_product_image\", ww_product_image);\r\n formData.append(\"ww_image\", ww_image, \"captured-image.jpg\");\r\n formData.append(\"ww_access_token\", ww_access_token);\r\n\r\n const response = await fetch(`${baseUrl}/api/virtual-try-on`, {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n if (!response.ok) {\r\n console.error(\r\n \"[WeWear VTO] API request failed:\",\r\n response.status,\r\n response.statusText,\r\n );\r\n return null;\r\n }\r\n\r\n const result = await response.json();\r\n console.log(\"[WeWear VTO] API response:\", result);\r\n return result;\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] API call failed:\", error);\r\n return null;\r\n }\r\n}\r\n","/** CSS class names for consistent styling */\nexport const CSS_CLASSES = {\n BUTTON_CONTAINER: \"wewear-vto-button-container\",\n BUTTON: \"wewear-vto-button\",\n MODAL: \"wewear-vto-modal\",\n} as const;\n\n/** Z-index values for proper layering */\nexport const Z_INDEX = {\n BUTTON: 10,\n MODAL: 99999,\n} as const;\n\n/** Camera constraints for optimal capture */\nexport const CAMERA_CONSTRAINTS = {\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n facingMode: \"user\", // Front-facing camera\n },\n audio: false,\n} as const;\n\n/** Image capture settings */\nexport const IMAGE_SETTINGS = {\n FORMAT: \"image/jpeg\",\n QUALITY: 0.8,\n} as const;\n","import { CAMERA_CONSTRAINTS, IMAGE_SETTINGS } from \"./constants.js\";\n\nexport async function startCamera(\n video: HTMLVideoElement,\n loadingIndicator: HTMLElement,\n captureButton: HTMLButtonElement,\n): Promise<void> {\n console.log(\"[WeWear VTO] Starting camera...\");\n\n try {\n console.log(\"[WeWear VTO] Requesting camera access...\");\n const stream =\n await navigator.mediaDevices.getUserMedia(CAMERA_CONSTRAINTS);\n video.srcObject = stream;\n\n video.onloadedmetadata = () => {\n console.log(\"[WeWear VTO] Camera stream loaded successfully\");\n loadingIndicator.style.display = \"none\";\n captureButton.style.display = \"flex\";\n };\n } catch (error) {\n console.error(\"[WeWear VTO] Camera access error:\", error);\n loadingIndicator.innerHTML =\n \"Camera access denied. Please allow camera permissions.\";\n }\n}\n\nexport function stopCamera(video: HTMLVideoElement): void {\n const stream = video.srcObject as MediaStream;\n if (stream) {\n const tracks = stream.getTracks();\n tracks.forEach((track) => {\n track.stop();\n });\n video.srcObject = null;\n }\n}\n\nexport async function captureImageFromVideo(\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n): Promise<Blob> {\n // Set canvas dimensions to match video\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n // Draw video frame to canvas\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Could not get canvas context\");\n }\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n // Convert canvas to blob\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n IMAGE_SETTINGS.FORMAT,\n IMAGE_SETTINGS.QUALITY,\n );\n });\n}\n","export function getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n\n if (parts.length === 2) {\n const part = parts.pop();\n return part ? part.split(\";\").shift()?.trim() || null : null;\n }\n\n return null;\n}\n\nexport function getPositionStyles(position: string): string {\n switch (position) {\n case \"bottom-left\":\n return \"left: 20px; bottom: 20px;\";\n case \"top-right\":\n return \"right: 20px; top: 20px;\";\n case \"top-left\":\n return \"left: 20px; top: 20px;\";\n default:\n return \"right: 20px; bottom: 20px;\";\n }\n}\n\nexport function removeElements(selector: string): void {\n const elements = document.querySelectorAll(selector);\n elements.forEach((element) => {\n element.remove();\n });\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { getPositionStyles } from \"../utils.js\";\n\nexport function createButtonContainer(\n buttonPosition: string,\n hasVirtualTryOn: boolean = false,\n onCameraClick: () => void,\n onRefreshClick?: () => void,\n onToggleClick?: () => void,\n isShowingVirtualTryOn: boolean = false,\n): HTMLElement {\n const container = document.createElement(\"div\");\n container.className = `${CSS_CLASSES.BUTTON_CONTAINER} ww-button-group`;\n\n const positionStyles = getPositionStyles(buttonPosition);\n container.style.cssText = `\n position: absolute;\n ${positionStyles}\n display: flex;\n border-radius: 9999px;\n background: white;\n padding: 4px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: ${Z_INDEX.BUTTON};\n `;\n\n // Camera button\n const cameraButton = document.createElement(\"button\");\n cameraButton.type = \"button\";\n cameraButton.className = `${CSS_CLASSES.BUTTON} ww-camera-btn`;\n cameraButton.setAttribute(\"aria-label\", \"Virtual Try-On\");\n cameraButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n cameraButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-camera\">\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\"></path>\n <circle cx=\"12\" cy=\"13\" r=\"3\"></circle>\n </svg>\n `;\n\n cameraButton.onclick = onCameraClick;\n container.appendChild(cameraButton);\n\n // Add refresh and toggle buttons if we have a virtual try-on\n if (hasVirtualTryOn) {\n // Refresh button - calls API again\n if (onRefreshClick) {\n const refreshButton = document.createElement(\"button\");\n refreshButton.type = \"button\";\n refreshButton.className = \"ww-refresh-btn\";\n refreshButton.setAttribute(\"aria-label\", \"Refresh virtual try-on\");\n refreshButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n refreshButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-refresh-ccw\">\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\n <path d=\"M3 3v5h5\"></path>\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\"></path>\n <path d=\"M16 16h5v5\"></path>\n </svg>\n `;\n\n refreshButton.onclick = onRefreshClick;\n container.appendChild(refreshButton);\n }\n\n // Toggle button (scan-face) - switches between original and virtual try-on\n if (onToggleClick) {\n const toggleButton = document.createElement(\"button\");\n toggleButton.type = \"button\";\n toggleButton.className = \"ww-toggle-btn\";\n toggleButton.setAttribute(\n \"aria-label\",\n isShowingVirtualTryOn ? \"Show Original Image\" : \"Show Virtual Try-On\",\n );\n toggleButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: ${isShowingVirtualTryOn ? \"rgba(0, 0, 0)\" : \"none\"};\n color: ${isShowingVirtualTryOn ? \"white\" : \"currentColor\"};\n `;\n\n toggleButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-scan-face\">\n <path d=\"M3 7V5a2 2 0 0 1 2-2h2\"></path>\n <path d=\"M17 3h2a2 2 0 0 1 2 2v2\"></path>\n <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\"></path>\n <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\"></path>\n <path d=\"M8 14s1.5 2 4 2 4-2 4-2\"></path>\n <path d=\"M9 9h.01\"></path>\n <path d=\"M15 9h.01\"></path>\n </svg>\n `;\n\n toggleButton.onclick = onToggleClick;\n container.appendChild(toggleButton);\n }\n }\n\n return container;\n}\n\nexport function createButton(\n buttonPosition: string,\n onClick: () => void,\n disabled: boolean = false,\n): HTMLElement {\n const container = createButtonContainer(buttonPosition, false, onClick);\n const cameraButton = container.querySelector('.ww-camera-btn') as HTMLButtonElement;\n if (cameraButton) {\n cameraButton.disabled = disabled;\n if (disabled) {\n cameraButton.style.opacity = '0.5';\n cameraButton.style.cursor = 'not-allowed';\n cameraButton.title = 'Find your ideal size first';\n }\n }\n return container;\n}\n","import { startCamera, stopCamera } from \"../camera.js\";\nimport { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface CameraModalCallbacks {\n onCapture: (\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n ) => Promise<void>;\n}\n\nexport function showCameraModal(callbacks: CameraModalCallbacks): void {\n console.log(\"[WeWear VTO] Opening camera modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n `;\n\n // Create camera container\n const cameraContainer = document.createElement(\"div\");\n cameraContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 70vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create video element\n const video = document.createElement(\"video\");\n video.autoplay = true;\n video.playsInline = true;\n video.muted = true;\n video.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create canvas for capturing\n const canvas = document.createElement(\"canvas\");\n canvas.style.display = \"none\";\n\n // Create capture button\n const captureButton = document.createElement(\"button\");\n captureButton.innerHTML = \"\";\n captureButton.style.cssText = `\n position: absolute;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n width: 60px;\n height: 60px;\n border: 3px solid white;\n background-color: rgba(0, 0, 0, 0.7);\n border-radius: 50%;\n cursor: pointer;\n display: none;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create loading indicator\n const loadingIndicator = document.createElement(\"div\");\n loadingIndicator.innerHTML = \"Initializing camera...\";\n loadingIndicator.style.cssText = `\n color: white;\n font-size: 16px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n stopCamera(video);\n modal.remove();\n };\n\n captureButton.onclick = async () => {\n await callbacks.onCapture(video, canvas);\n };\n\n // Assemble the camera modal\n cameraContainer.appendChild(video);\n cameraContainer.appendChild(canvas);\n cameraContainer.appendChild(captureButton);\n cameraContainer.appendChild(closeButton);\n cameraContainer.appendChild(loadingIndicator);\n modal.appendChild(cameraContainer);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Camera modal added to DOM\");\n\n // Start camera\n startCamera(video, loadingIndicator, captureButton);\n}\n","import { Z_INDEX } from \"../constants.js\";\n\n/**\n * Creates a loading overlay that can be shown in different containers\n */\nexport function createLoadingOverlay(\n text: string = \"Processing...\",\n): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"ww-loading-overlay\";\n overlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.8);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL + 1};\n border-radius: inherit;\n `;\n\n // Add CSS animation to the document if not already added\n if (!document.getElementById(\"ww-loading-animation\")) {\n const style = document.createElement(\"style\");\n style.id = \"ww-loading-animation\";\n style.textContent = `\n @keyframes ww-pulse {\n 0%, 100% { opacity: 0.7; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n .ww-loading-overlay .ww-logo {\n animation: ww-pulse 2s ease-in-out infinite;\n }\n `;\n document.head.appendChild(style);\n }\n\n overlay.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; gap: 24px; color: white;\">\n <svg class=\"ww-logo\" width=\"80\" height=\"50\" viewBox=\"0 0 214 135\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_3624_12755)\">\n <path d=\"M102.906 74.8679C102.906 77.9717 101.574 80.7453 98.9104 83.1887C96.6871 85.1918 93.9025 86.6997 90.5566 87.7123C87.695 88.5708 84.6462 89 81.4104 89C73.8821 89 68.0047 87.0189 63.7783 83.0566C59.5519 87.0189 53.6855 89 46.1792 89C42.9434 89 39.9057 88.5708 37.066 87.7123C33.7201 86.6997 30.9245 85.1918 28.6792 83.1887C26.0157 80.7453 24.684 77.9717 24.684 74.8679V41.6509H32.3774V74.8679C32.3774 76.2547 33.489 77.5645 35.7123 78.7972C37.3632 79.7217 39.0692 80.3711 40.8302 80.7453C42.5252 81.1195 44.3082 81.3066 46.1792 81.3066C48.0063 81.3066 49.7673 81.1195 51.4623 80.7453C53.2453 80.3711 54.9623 79.7217 56.6132 78.7972C58.8585 77.5645 59.9811 76.2547 59.9811 74.8679V41.6509H67.6085V74.8679C67.6085 76.2547 68.7311 77.5645 70.9764 78.7972C72.6274 79.7217 74.3443 80.3711 76.1274 80.7453C77.8223 81.1195 79.5833 81.3066 81.4104 81.3066C83.2814 81.3066 85.0755 81.1195 86.7925 80.7453C88.5314 80.3711 90.2264 79.7217 91.8774 78.7972C94.1006 77.5645 95.2123 76.2547 95.2123 74.8679V41.6509H102.906V74.8679ZM189.283 74.8679C189.283 77.9717 187.951 80.7453 185.288 83.1887C183.064 85.1918 180.28 86.6997 176.934 87.7123C174.072 88.5708 171.024 89 167.788 89C160.259 89 154.382 87.0189 150.156 83.0566C145.929 87.0189 140.063 89 132.557 89C129.321 89 126.283 88.5708 123.443 87.7123C120.097 86.6997 117.302 85.1918 115.057 83.1887C112.393 80.7453 111.061 77.9717 111.061 74.8679V41.6509H118.755V74.8679C118.755 76.2547 119.866 77.5645 122.09 78.7972C123.741 79.7217 125.447 80.3711 127.208 80.7453C128.903 81.1195 130.686 81.3066 132.557 81.3066C134.384 81.3066 136.145 81.1195 137.84 80.7453C139.623 80.3711 141.34 79.7217 142.991 78.7972C145.236 77.5645 146.358 76.2547 146.358 74.8679V41.6509H153.986V74.8679C153.986 76.2547 155.108 77.5645 157.354 78.7972C159.005 79.7217 160.722 80.3711 162.505 80.7453C164.2 81.1195 165.961 81.3066 167.788 81.3066C169.659 81.3066 171.453 81.1195 173.17 80.7453C174.909 80.3711 176.604 79.7217 178.255 78.7972C180.478 77.5645 181.59 76.2547 181.59 74.8679V41.6509H189.283V74.8679Z\" fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_3624_12755\">\n <rect width=\"214\" height=\"135\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n <div style=\"font-size: 16px; font-weight: 500; text-align: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\">${text}</div>\n </div>\n `;\n\n return overlay;\n}\n\n/**\n * Shows a loading overlay in a modal container\n */\nexport function showModalLoading(container: HTMLElement): void {\n // Remove any existing loading overlays\n removeModalLoading();\n\n // Show loading in the product area\n showProductLoading(container);\n}\n\n/**\n * Removes loading overlay from modal\n */\nexport function removeModalLoading(): void {\n const existingOverlay = document.body.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n\n/**\n * Shows a loading overlay in the product gallery container\n */\nexport function showProductLoading(\n container: HTMLElement,\n text: string = \"Generating virtual try-on...\",\n): void {\n // Remove any existing loading overlays\n removeProductLoading(container);\n\n // Make container relative if it's not already positioned\n const computedStyle = window.getComputedStyle(container);\n if (computedStyle.position === \"static\") {\n container.style.position = \"relative\";\n }\n\n const loadingOverlay = createLoadingOverlay(text);\n container.appendChild(loadingOverlay);\n}\n\n/**\n * Removes loading overlay from product container\n */\nexport function removeProductLoading(container: HTMLElement): void {\n const existingOverlay = container.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface ReviewModalCallbacks {\n onRetake: () => void;\n onAccept: (imageBlob: Blob) => Promise<void>;\n}\n\nexport function showReviewModal(\n imageBlob: Blob,\n callbacks: ReviewModalCallbacks\n): void {\n console.log(\"[WeWear VTO] Opening review modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create image URL for preview\n const imageUrl = URL.createObjectURL(imageBlob);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n gap: 20px;\n `;\n\n // Create review container\n const reviewContainer = document.createElement(\"div\");\n reviewContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 63vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create image element\n const image = document.createElement(\"img\");\n image.src = imageUrl;\n image.alt = \"Review your photo\";\n image.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create button container\n const buttonContainer = document.createElement(\"div\");\n buttonContainer.style.cssText = `\n display: flex;\n gap: 15px;\n width: 100%;\n max-width: 500px;\n `;\n\n // Create retake button\n const retakeButton = document.createElement(\"button\");\n retakeButton.textContent = \"Retake\";\n retakeButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(255, 255, 255, 0.9);\n color: black;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Create use photo button\n const usePhotoButton = document.createElement(\"button\");\n usePhotoButton.textContent = \"Use Photo\";\n usePhotoButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n };\n\n retakeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n callbacks.onRetake();\n };\n\n usePhotoButton.onclick = async () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n await callbacks.onAccept(imageBlob);\n };\n\n // Assemble the review modal\n buttonContainer.appendChild(retakeButton);\n buttonContainer.appendChild(usePhotoButton);\n reviewContainer.appendChild(image);\n reviewContainer.appendChild(closeButton);\n modal.appendChild(reviewContainer);\n modal.appendChild(buttonContainer);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Review modal added to DOM\");\n}\n","import { callVirtualTryOnApi } from \"./api.js\";\nimport { captureImageFromVideo, stopCamera } from \"./camera.js\";\nimport {\n type CameraModalCallbacks,\n createButton,\n createButtonContainer,\n type ReviewModalCallbacks,\n removeModalLoading,\n removeProductLoading,\n showCameraModal,\n showModalLoading,\n showProductLoading,\n showReviewModal,\n} from \"./components/index.js\";\nimport { CSS_CLASSES } from \"./constants.js\";\nimport type { VirtualTryOnConfig } from \"./index.js\";\nimport { getCookie, removeElements } from \"./utils.js\";\n\nexport class VirtualTryOnWidget {\n private readonly config: Required<VirtualTryOnConfig>;\n private virtualTryOnImageUrl: string | null = null;\n private isShowingVirtualTryOn: boolean = false;\n private lastApiParams: {\n imageBlob: Blob;\n ww_access_token: string;\n ww_user_id: string;\n ww_product_image: string;\n } | null = null;\n private cookieCheckInterval: number | null = null;\n private cameraButton: HTMLButtonElement | null = null;\n\n constructor(config: VirtualTryOnConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n productPageSelector: config.productPageSelector,\n gallerySelector: config.gallerySelector,\n productImageSelector: config.productImageSelector,\n buttonPosition: config.buttonPosition,\n };\n }\n\n /**\n * Initializes the virtual try-on widget on the current page\n * @returns Promise that resolves when initialization is complete\n */\n public async init(): Promise<void> {\n try {\n // Check if we're on a product page\n if (!window.location.pathname.includes(this.config.productPageSelector)) {\n return;\n }\n\n // Find the gallery container\n const container = document.querySelector(this.config.gallerySelector);\n if (!container || !(container instanceof HTMLElement)) {\n console.warn(\n \"[WeWear VTO] Gallery container not found:\",\n this.config.gallerySelector,\n );\n return;\n }\n\n // Ensure container has relative positioning for button placement\n if (getComputedStyle(container).position === \"static\") {\n container.style.position = \"relative\";\n }\n\n // Check required cookies\n const ww_access_token = getCookie(\"ww_access_token\");\n const ww_user_id = getCookie(\"ww_user_id\");\n const cookiesPresent = !!ww_access_token && !!ww_user_id;\n\n // Create and add the virtual try-on button\n const button = createButton(this.config.buttonPosition, async () => {\n if (this.cameraButton && !this.cameraButton.disabled) {\n await this.handleTryOnClick();\n }\n }, !cookiesPresent);\n\n // Store reference to camera button for dynamic enable/disable\n this.cameraButton = button.querySelector('.ww-camera-btn');\n container.appendChild(button);\n console.log(\"[WeWear VTO] Widget initialized successfully\");\n\n // Periodically check cookies and update button state\n this.cookieCheckInterval = window.setInterval(() => {\n const accessToken = getCookie(\"ww_access_token\");\n const userId = getCookie(\"ww_user_id\");\n const present = !!accessToken && !!userId;\n if (this.cameraButton) {\n if (present && this.cameraButton.disabled) {\n this.cameraButton.disabled = false;\n this.cameraButton.style.opacity = '1';\n this.cameraButton.style.cursor = 'pointer';\n this.cameraButton.title = '';\n } else if (!present && !this.cameraButton.disabled) {\n this.cameraButton.disabled = true;\n this.cameraButton.style.opacity = '0.5';\n this.cameraButton.style.cursor = 'not-allowed';\n this.cameraButton.title = 'Required cookies missing';\n }\n }\n }, 2000); // check every 2 seconds\n } catch (error) {\n console.error(\"[WeWear VTO] Initialization failed:\", error);\n }\n }\n\n /**\n * Handles virtual try-on button click\n * @private\n */\n private async handleTryOnClick(): Promise<void> {\n console.log(\"[WeWear VTO] Button clicked, starting try-on process...\");\n\n try {\n // Get required data\n const ww_access_token = getCookie(\"ww_access_token\");\n const ww_user_id = getCookie(\"ww_user_id\");\n const productImageElement = document.querySelector(this.config.productImageSelector) as HTMLImageElement;\n const ww_product_image = productImageElement?.src || productImageElement?.getAttribute('data-src') || '';\n\n console.log(\"[WeWear VTO] Retrieved data:\", {\n ww_user_id,\n ww_product_image,\n ww_access_token,\n });\n\n // Validate required data\n if (!ww_user_id) {\n console.warn(\"[WeWear VTO] Missing required cookie: ww_user_id\");\n return;\n }\n\n if (!ww_product_image) {\n console.warn(\n \"[WeWear VTO] Product image not found:\",\n this.config.productImageSelector,\n );\n return;\n }\n\n if (!ww_access_token) {\n console.warn(\"[WeWear VTO] Missing required cookie: ww_access_token\");\n return;\n }\n\n // Show camera capture modal\n this.showCameraModalWithCallbacks(\n ww_access_token,\n ww_user_id,\n ww_product_image,\n );\n } catch (error) {\n console.error(\"[WeWear VTO] Try-on request failed:\", error);\n }\n }\n\n /**\n * Shows camera modal with appropriate callbacks\n * @private\n */\n private showCameraModalWithCallbacks(\n ww_access_token: string,\n ww_user_id: string,\n ww_product_image: string,\n ): void {\n const callbacks: CameraModalCallbacks = {\n onCapture: async (video: HTMLVideoElement, canvas: HTMLCanvasElement) => {\n try {\n // Capture image from video\n const imageBlob = await captureImageFromVideo(video, canvas);\n\n // Stop camera and show review modal\n stopCamera(video);\n\n // Show review modal instead of immediately processing\n this.showReviewModalWithCallbacks(\n imageBlob,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n );\n } catch (error) {\n console.error(\"[WeWear VTO] Image capture error:\", error);\n }\n },\n };\n\n showCameraModal(callbacks);\n }\n\n /**\n * Shows review modal with appropriate callbacks\n * @private\n */\n private showReviewModalWithCallbacks(\n imageBlob: Blob,\n ww_access_token: string,\n ww_user_id: string,\n ww_product_image: string,\n ): void {\n const callbacks: ReviewModalCallbacks = {\n onRetake: () => {\n // Reopen camera modal\n this.showCameraModalWithCallbacks(\n ww_access_token,\n ww_user_id,\n ww_product_image,\n );\n },\n onAccept: async (acceptedImageBlob: Blob) => {\n await this.processAcceptedImage(\n acceptedImageBlob,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n document.querySelector(this.config.gallerySelector) as HTMLElement\n );\n },\n };\n\n showReviewModal(imageBlob, callbacks);\n }\n\n /**\n * Processes the accepted image by calling the API\n * @private\n */\n private async processAcceptedImage(\n imageBlob: Blob,\n ww_access_token: string,\n ww_user_id: string,\n ww_product_image: string,\n container: HTMLElement\n ): Promise<void> {\n try {\n console.log(\"[WeWear VTO] Processing accepted image...\");\n\n // Show loading in the review modal first\n showModalLoading(container);\n\n // Store the API parameters for potential refresh\n this.lastApiParams = {\n imageBlob,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n };\n\n // Call the API with the accepted image\n const result = await callVirtualTryOnApi(\n this.config.baseUrl,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n imageBlob,\n );\n\n // Remove modal loading and close modal\n removeModalLoading();\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n if (result?.imageUrl) {\n this.replaceProductImage(result.imageUrl);\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error processing accepted image:\", error);\n // Remove loading on error\n removeModalLoading();\n }\n }\n\n /**\n * Recalls the virtual try-on API with the same parameters\n * @private\n */\n private async refreshVirtualTryOn(): Promise<void> {\n if (!this.lastApiParams) {\n console.warn(\n \"[WeWear VTO] No previous API parameters available for refresh\",\n );\n return;\n }\n\n try {\n console.log(\n \"[WeWear VTO] Refreshing virtual try-on with previous parameters...\",\n );\n\n // Show loading in the product area\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n showProductLoading(container, \"Generating new virtual try-on...\");\n }\n\n // Call the API with the stored parameters\n const result = await callVirtualTryOnApi(\n this.config.baseUrl,\n this.lastApiParams.ww_access_token,\n this.lastApiParams.ww_user_id,\n this.lastApiParams.ww_product_image,\n this.lastApiParams.imageBlob,\n );\n\n if (result?.imageUrl) {\n this.virtualTryOnImageUrl = result.imageUrl;\n\n // Find the gallery container and update the image\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n removeProductLoading(container);\n this.showVirtualTryOnImage(container);\n this.updateButtonContainer(container);\n }\n } else {\n console.error(\"[WeWear VTO] Invalid API response on refresh:\", result);\n // Remove loading on error\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n removeProductLoading(container);\n }\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error refreshing virtual try-on:\", error);\n // Remove loading on error\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n removeProductLoading(container);\n }\n }\n }\n\n /**\n * Replaces the product image in the gallery with the virtual try-on result\n * @private\n */\n private replaceProductImage(imageUrl: string): void {\n try {\n // Store the virtual try-on image URL\n this.virtualTryOnImageUrl = imageUrl;\n\n // Find the gallery container\n const container = document.querySelector(this.config.gallerySelector);\n if (!container || !(container instanceof HTMLElement)) {\n console.warn(\n \"[WeWear VTO] Gallery container not found for image replacement:\",\n this.config.gallerySelector,\n );\n return;\n }\n\n // Store the original content if not already stored\n if (!container.hasAttribute(\"data-ww-original-content\")) {\n container.setAttribute(\"data-ww-original-content\", container.innerHTML);\n }\n\n // Capture original image dimensions before replacement to prevent layout shift\n const originalImg = container.querySelector('img');\n if (originalImg && !container.hasAttribute(\"data-ww-original-dimensions\")) {\n const computedStyle = window.getComputedStyle(originalImg);\n const rect = originalImg.getBoundingClientRect();\n container.setAttribute(\"data-ww-original-width\", computedStyle.width);\n container.setAttribute(\"data-ww-original-height\", computedStyle.height);\n container.setAttribute(\"data-ww-original-rect-width\", rect.width.toString());\n container.setAttribute(\"data-ww-original-rect-height\", rect.height.toString());\n container.setAttribute(\"data-ww-original-dimensions\", \"true\");\n }\n\n // Show the virtual try-on image initially\n this.showVirtualTryOnImage(container);\n\n // Replace the button container with the new multi-button version\n this.updateButtonContainer(container);\n\n console.log(\n \"[WeWear VTO] Product image replaced with virtual try-on result\",\n );\n } catch (error) {\n console.error(\"[WeWear VTO] Error replacing product image:\", error);\n }\n }\n\n /**\n * Updates the button container to show all available buttons\n * @private\n */\n private updateButtonContainer(container: HTMLElement): void {\n // Remove existing button containers\n const existingButtons = container.querySelectorAll(\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\n );\n existingButtons.forEach((btn) => {\n btn.remove();\n });\n\n // Create new button container with all buttons\n const buttonContainer = createButtonContainer(\n this.config.buttonPosition,\n this.virtualTryOnImageUrl !== null,\n async () => {\n await this.handleTryOnClick();\n },\n async () => {\n await this.refreshVirtualTryOn();\n },\n () => {\n if (this.isShowingVirtualTryOn) {\n this.showOriginalImage(container);\n } else {\n this.showVirtualTryOnImage(container);\n }\n this.updateButtonContainer(container);\n },\n this.isShowingVirtualTryOn,\n );\n\n container.appendChild(buttonContainer);\n }\n\n /**\n * Shows the virtual try-on image in the container\n * @private\n */\n private showVirtualTryOnImage(container: HTMLElement): void {\n if (!this.virtualTryOnImageUrl) {\n console.warn(\"[WeWear VTO] No virtual try-on image URL available\");\n return;\n }\n\n // Clear existing content except buttons\n const existingButtons = container.querySelectorAll(\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\n );\n container.innerHTML = \"\";\n\n // Get stored original dimensions to prevent layout shift\n const originalWidth = container.getAttribute(\"data-ww-original-width\") || '';\n const originalHeight = container.getAttribute(\"data-ww-original-height\") || '';\n const originalRectWidth = container.getAttribute(\"data-ww-original-rect-width\") || '';\n const originalRectHeight = container.getAttribute(\"data-ww-original-rect-height\") || '';\n\n const image = document.createElement(\"img\");\n image.src = this.virtualTryOnImageUrl;\n image.alt = \"Virtual Try-On Result\";\n\n // Use original dimensions to prevent layout shift\n let widthStyle = '100%';\n let heightStyle = '100%';\n\n // Prefer computed style dimensions, fallback to bounding rect, then container fill\n if (originalWidth && originalWidth !== 'auto' && originalWidth !== '0px') {\n widthStyle = originalWidth;\n } else if (originalRectWidth && originalRectWidth !== '0') {\n widthStyle = `${originalRectWidth}px`;\n }\n\n if (originalHeight && originalHeight !== 'auto' && originalHeight !== '0px') {\n heightStyle = originalHeight;\n } else if (originalRectHeight && originalRectHeight !== '0') {\n heightStyle = `${originalRectHeight}px`;\n }\n\n image.style.cssText = `\n width: ${widthStyle};\n height: ${heightStyle};\n object-fit: cover;\n border-radius: 8px;\n `;\n\n container.appendChild(image);\n\n // Re-add buttons\n existingButtons.forEach((btn) => {\n container.appendChild(btn);\n });\n\n this.isShowingVirtualTryOn = true;\n }\n\n /**\n * Shows the original product image in the container\n * @private\n */\n private showOriginalImage(container: HTMLElement): void {\n const originalContent = container.getAttribute(\"data-ww-original-content\");\n if (originalContent) {\n // Store existing buttons\n const existingButtons = container.querySelectorAll(\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\n );\n\n // Restore original content\n container.innerHTML = originalContent;\n\n // Re-add buttons\n existingButtons.forEach((btn) => {\n container.appendChild(btn);\n });\n }\n\n this.isShowingVirtualTryOn = false;\n }\n\n /**\n * Destroys the widget and cleans up resources\n */\n public destroy(): void {\n try {\n // Remove all buttons\n removeElements(`.${CSS_CLASSES.BUTTON_CONTAINER}`);\n\n // Remove all modals\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Clear interval\n if (this.cookieCheckInterval !== null) {\n clearInterval(this.cookieCheckInterval);\n this.cookieCheckInterval = null;\n }\n this.cameraButton = null;\n\n // Reset state\n this.virtualTryOnImageUrl = null;\n this.isShowingVirtualTryOn = false;\n this.lastApiParams = null;\n\n console.log(\"[WeWear VTO] Widget destroyed successfully\");\n } catch (error) {\n console.error(\"[WeWear VTO] Error during widget destruction:\", error);\n }\n }\n}\n","import type { VirtualTryOnConfig } from \"./index.js\";\nimport { VirtualTryOnWidget } from \"./widget.js\";\n\nlet widgetInstance: VirtualTryOnWidget | null = null;\n\nexport function initVirtualTryOn(config?: VirtualTryOnConfig): void {\n try {\n // Clean up any existing instance\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n }\n\n // Early return if config is missing\n if (!config) {\n console.log(\"[WeWear VTO] Missing configuration. Widget not initialized.\");\n return;\n }\n\n // Create and initialize new instance\n widgetInstance = new VirtualTryOnWidget(config);\n\n // Initialize immediately if DOM is ready, otherwise wait for it\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => {\n widgetInstance?.init().catch((error) => {\n console.error(\n \"[WeWear VTO] Failed to initialize after DOM ready:\",\n error,\n );\n });\n });\n } else {\n widgetInstance.init().catch((error) => {\n console.error(\"[WeWear VTO] Failed to initialize:\", error);\n });\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Initialization error:\", error);\n }\n}\n\nexport function destroyVirtualTryOn(): void {\n try {\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n console.log(\"[WeWear VTO] Widget instance destroyed\");\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error destroying widget:\", error);\n }\n}\n\nexport function getWidgetInstance(): VirtualTryOnWidget | null {\n return widgetInstance;\n}\n\nif (typeof window !== \"undefined\") {\n initVirtualTryOn();\n}\n"],"names":[],"mappings":"AAEO,eAAe,mBAAmB,CACrC,OAAe,EACf,eAAuB,EACvB,UAAkB,EAClB,gBAAwB,EACxB,QAAc,EAAA;AAEd,IAAA,IAAI;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC;AACzC,QAAA,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;QACrD,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,oBAAoB,CAAC;AAC3D,QAAA,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAA,EAAG,OAAO,qBAAqB,EAAE;AAC1D,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,QAAQ;AACjB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CACT,kCAAkC,EAClC,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,CACtB;AACD,YAAA,OAAO,IAAI;QACf;AAEA,QAAA,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AACpC,QAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC;AACjD,QAAA,OAAO,MAAM;IACjB;IAAE,OAAO,KAAK,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC;AACrD,QAAA,OAAO,IAAI;IACf;AACJ;;ACrCA;AACO,MAAM,WAAW,GAAG;AACvB,IAAA,gBAAgB,EAAE,6BAA6B;AAC/C,IAAA,MAAM,EAAE,mBAAmB;AAC3B,IAAA,KAAK,EAAE,kBAAkB;CACnB;AAEV;AACO,MAAM,OAAO,GAAG;AACnB,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,KAAK,EAAE,KAAK;CACN;AAEV;AACO,MAAM,kBAAkB,GAAG;AAC9B,IAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AACtB,QAAA,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;QACtB,UAAU,EAAE,MAAM;AACrB,KAAA;AACD,IAAA,KAAK,EAAE,KAAK;CACN;AAEV;AACO,MAAM,cAAc,GAAG;AAC1B,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,OAAO,EAAE,GAAG;CACN;;ACzBH,eAAe,WAAW,CAC7B,KAAuB,EACvB,gBAA6B,EAC7B,aAAgC,EAAA;AAEhC,IAAA,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;AAE9C,IAAA,IAAI;AACA,QAAA,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC;QACvD,MAAM,MAAM,GACR,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,kBAAkB,CAAC;AACjE,QAAA,KAAK,CAAC,SAAS,GAAG,MAAM;AAExB,QAAA,KAAK,CAAC,gBAAgB,GAAG,MAAK;AAC1B,YAAA,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC;AAC7D,YAAA,gBAAgB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AACvC,YAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AACxC,QAAA,CAAC;IACL;IAAE,OAAO,KAAK,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC;AACzD,QAAA,gBAAgB,CAAC,SAAS;AACtB,YAAA,wDAAwD;IAChE;AACJ;AAEM,SAAU,UAAU,CAAC,KAAuB,EAAA;AAC9C,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAwB;IAC7C,IAAI,MAAM,EAAE;AACR,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE;AACjC,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YACrB,KAAK,CAAC,IAAI,EAAE;AAChB,QAAA,CAAC,CAAC;AACF,QAAA,KAAK,CAAC,SAAS,GAAG,IAAI;IAC1B;AACJ;AAEO,eAAe,qBAAqB,CACvC,KAAuB,EACvB,MAAyB,EAAA;;AAGzB,IAAA,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU;AAC/B,IAAA,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW;;IAGjC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE;AACN,QAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;IACnD;AAEA,IAAA,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;;IAGvD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;AACzC,QAAA,MAAM,CAAC,MAAM,CACT,CAAC,IAAI,KAAI;YACL,IAAI,IAAI,EAAE;gBACN,OAAO,CAAC,IAAI,CAAC;YACjB;iBAAO;AACH,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC1D;QACJ,CAAC,EACD,cAAc,CAAC,MAAM,EACrB,cAAc,CAAC,OAAO,CACzB;AACL,IAAA,CAAC,CAAC;AACN;;ACpEM,SAAU,SAAS,CAAC,IAAY,EAAA;;IAClC,IAAI,OAAO,QAAQ,KAAK,WAAW;AAAE,QAAA,OAAO,IAAI;AAEhD,IAAA,MAAM,KAAK,GAAG,CAAA,EAAA,EAAK,QAAQ,CAAC,MAAM,EAAE;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG,CAAC;AAEvC,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE;QACxB,OAAO,IAAI,GAAG,CAAA,MAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,EAAE,KAAI,IAAI,GAAG,IAAI;IAChE;AAEA,IAAA,OAAO,IAAI;AACf;AAEM,SAAU,iBAAiB,CAAC,QAAgB,EAAA;IAC9C,QAAQ,QAAQ;AACZ,QAAA,KAAK,aAAa;AACd,YAAA,OAAO,2BAA2B;AACtC,QAAA,KAAK,WAAW;AACZ,YAAA,OAAO,yBAAyB;AACpC,QAAA,KAAK,UAAU;AACX,YAAA,OAAO,wBAAwB;AACnC,QAAA;AACI,YAAA,OAAO,4BAA4B;;AAE/C;AAEM,SAAU,cAAc,CAAC,QAAgB,EAAA;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACpD,IAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;QACzB,OAAO,CAAC,MAAM,EAAE;AACpB,IAAA,CAAC,CAAC;AACN;;AC7BM,SAAU,qBAAqB,CACjC,cAAsB,EACtB,eAAA,GAA2B,KAAK,EAChC,aAAyB,EACzB,cAA2B,EAC3B,aAA0B,EAC1B,wBAAiC,KAAK,EAAA;IAEtC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,SAAS,CAAC,SAAS,GAAG,CAAA,EAAG,WAAW,CAAC,gBAAgB,kBAAkB;AAEvE,IAAA,MAAM,cAAc,GAAG,iBAAiB,CAAC,cAAc,CAAC;AACxD,IAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG;;MAExB,cAAc;;;;;;AAML,aAAA,EAAA,OAAO,CAAC,MAAM,CAAA;GAC1B;;IAGC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACrD,IAAA,YAAY,CAAC,IAAI,GAAG,QAAQ;IAC5B,YAAY,CAAC,SAAS,GAAG,CAAA,EAAG,WAAW,CAAC,MAAM,gBAAgB;AAC9D,IAAA,YAAY,CAAC,YAAY,CAAC,YAAY,EAAE,gBAAgB,CAAC;AACzD,IAAA,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;GAY9B;IAEC,YAAY,CAAC,SAAS,GAAG;;;;;GAK1B;AAEC,IAAA,YAAY,CAAC,OAAO,GAAG,aAAa;AACpC,IAAA,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC;;IAGnC,IAAI,eAAe,EAAE;;QAEjB,IAAI,cAAc,EAAE;YAChB,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACtD,YAAA,aAAa,CAAC,IAAI,GAAG,QAAQ;AAC7B,YAAA,aAAa,CAAC,SAAS,GAAG,gBAAgB;AAC1C,YAAA,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,wBAAwB,CAAC;AAClE,YAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;OAYnC;YAEK,aAAa,CAAC,SAAS,GAAG;;;;;;;OAO/B;AAEK,YAAA,aAAa,CAAC,OAAO,GAAG,cAAc;AACtC,YAAA,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC;QACxC;;QAGA,IAAI,aAAa,EAAE;YACf,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACrD,YAAA,YAAY,CAAC,IAAI,GAAG,QAAQ;AAC5B,YAAA,YAAY,CAAC,SAAS,GAAG,eAAe;AACxC,YAAA,YAAY,CAAC,YAAY,CACrB,YAAY,EACZ,qBAAqB,GAAG,qBAAqB,GAAG,qBAAqB,CACxE;AACD,YAAA,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;AAUnB,oBAAA,EAAA,qBAAqB,GAAG,eAAe,GAAG,MAAM,CAAA;AACrD,eAAA,EAAA,qBAAqB,GAAG,OAAO,GAAG,cAAc,CAAA;OAC1D;YAEK,YAAY,CAAC,SAAS,GAAG;;;;;;;;;;OAU9B;AAEK,YAAA,YAAY,CAAC,OAAO,GAAG,aAAa;AACpC,YAAA,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC;QACvC;IACJ;AAEA,IAAA,OAAO,SAAS;AACpB;AAEM,SAAU,YAAY,CACxB,cAAsB,EACtB,OAAmB,EACnB,WAAoB,KAAK,EAAA;IAEzB,MAAM,SAAS,GAAG,qBAAqB,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC;IACvE,MAAM,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,gBAAgB,CAAsB;IACnF,IAAI,YAAY,EAAE;AACd,QAAA,YAAY,CAAC,QAAQ,GAAG,QAAQ;QAChC,IAAI,QAAQ,EAAE;AACV,YAAA,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;AAClC,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa;AACzC,YAAA,YAAY,CAAC,KAAK,GAAG,4BAA4B;QACrD;IACJ;AACA,IAAA,OAAO,SAAS;AACpB;;AC1IM,SAAU,eAAe,CAAC,SAA+B,EAAA;AAC3D,IAAA,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;;AAGnD,IAAA,cAAc,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,KAAK,CAAA,CAAE,CAAC;;IAGvC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,IAAA,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK;AACnC,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;AAWX,aAAA,EAAA,OAAO,CAAC,KAAK,CAAA;;;GAGzB;;IAGC,MAAM,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACrD,IAAA,eAAe,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;GAYjC;;IAGC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,IAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,IAAA,KAAK,CAAC,WAAW,GAAG,IAAI;AACxB,IAAA,KAAK,CAAC,KAAK,GAAG,IAAI;AAClB,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;GAKvB;;IAGC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,IAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;;IAG7B,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACtD,IAAA,aAAa,CAAC,SAAS,GAAG,EAAE;AAC5B,IAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;;;;GAe/B;;IAGC,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACpD,IAAA,WAAW,CAAC,SAAS,GAAG,GAAG;AAC3B,IAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;;;;;GAgB7B;;IAGC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACtD,IAAA,gBAAgB,CAAC,SAAS,GAAG,wBAAwB;AACrD,IAAA,gBAAgB,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;GAOlC;;AAGC,IAAA,WAAW,CAAC,OAAO,GAAG,MAAK;QACvB,UAAU,CAAC,KAAK,CAAC;QACjB,KAAK,CAAC,MAAM,EAAE;AAClB,IAAA,CAAC;AAED,IAAA,aAAa,CAAC,OAAO,GAAG,YAAW;QAC/B,MAAM,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;AAC5C,IAAA,CAAC;;AAGD,IAAA,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC;AAClC,IAAA,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC;AACnC,IAAA,eAAe,CAAC,WAAW,CAAC,aAAa,CAAC;AAC1C,IAAA,eAAe,CAAC,WAAW,CAAC,WAAW,CAAC;AACxC,IAAA,eAAe,CAAC,WAAW,CAAC,gBAAgB,CAAC;AAC7C,IAAA,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC;AAElC,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAChC,IAAA,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC;;AAGrD,IAAA,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,CAAC;AACvD;;AC9IA;;AAEG;AACG,SAAU,oBAAoB,CAChC,IAAA,GAAe,eAAe,EAAA;IAE9B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,oBAAoB;AACxC,IAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;eAWb,OAAO,CAAC,KAAK,GAAG,CAAC,CAAA;;GAE7B;;IAGC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAC,EAAE;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,EAAE,GAAG,sBAAsB;QACjC,KAAK,CAAC,WAAW,GAAG;;;;;;;;OAQrB;AACC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACpC;IAEA,OAAO,CAAC,SAAS,GAAG;;;;;;;;;;;;4JAYoI,IAAI,CAAA;;GAE7J;AAEC,IAAA,OAAO,OAAO;AAClB;AAEA;;AAEG;AACG,SAAU,gBAAgB,CAAC,SAAsB,EAAA;;AAEnD,IAAA,kBAAkB,EAAE;;IAGpB,kBAAkB,CAAC,SAAS,CAAC;AACjC;AAEA;;AAEG;SACa,kBAAkB,GAAA;IAC9B,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC;IAC1E,IAAI,eAAe,EAAE;QACjB,eAAe,CAAC,MAAM,EAAE;IAC5B;AACJ;AAEA;;AAEG;SACa,kBAAkB,CAC9B,SAAsB,EACtB,OAAe,8BAA8B,EAAA;;IAG7C,oBAAoB,CAAC,SAAS,CAAC;;IAG/B,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;AACxD,IAAA,IAAI,aAAa,CAAC,QAAQ,KAAK,QAAQ,EAAE;AACrC,QAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;IACzC;AAEA,IAAA,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC;AACjD,IAAA,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC;AACzC;AAEA;;AAEG;AACG,SAAU,oBAAoB,CAAC,SAAsB,EAAA;IACvD,MAAM,eAAe,GAAG,SAAS,CAAC,aAAa,CAAC,qBAAqB,CAAC;IACtE,IAAI,eAAe,EAAE;QACjB,eAAe,CAAC,MAAM,EAAE;IAC5B;AACJ;;ACrGM,SAAU,eAAe,CAC3B,SAAe,EACf,SAA+B,EAAA;AAE/B,IAAA,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;;AAGnD,IAAA,cAAc,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,KAAK,CAAA,CAAE,CAAC;;IAGvC,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC;;IAG/C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,IAAA,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK;AACnC,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;AAWX,aAAA,EAAA,OAAO,CAAC,KAAK,CAAA;;;;GAIzB;;IAGC,MAAM,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACrD,IAAA,eAAe,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;GAYjC;;IAGC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,IAAA,KAAK,CAAC,GAAG,GAAG,QAAQ;AACpB,IAAA,KAAK,CAAC,GAAG,GAAG,mBAAmB;AAC/B,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;GAKvB;;IAGC,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACpD,IAAA,WAAW,CAAC,SAAS,GAAG,GAAG;AAC3B,IAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;;;;;GAgB7B;;IAGC,MAAM,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACrD,IAAA,eAAe,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;GAKjC;;IAGC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACrD,IAAA,YAAY,CAAC,WAAW,GAAG,QAAQ;AACnC,IAAA,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;GAU9B;;IAGC,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACvD,IAAA,cAAc,CAAC,WAAW,GAAG,WAAW;AACxC,IAAA,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;GAUhC;;AAGC,IAAA,WAAW,CAAC,OAAO,GAAG,MAAK;AACvB,QAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9B,KAAK,CAAC,MAAM,EAAE;AAClB,IAAA,CAAC;AAED,IAAA,YAAY,CAAC,OAAO,GAAG,MAAK;AACxB,QAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9B,KAAK,CAAC,MAAM,EAAE;QACd,SAAS,CAAC,QAAQ,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,cAAc,CAAC,OAAO,GAAG,YAAW;AAChC,QAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9B,KAAK,CAAC,MAAM,EAAE;AACd,QAAA,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AACvC,IAAA,CAAC;;AAGD,IAAA,eAAe,CAAC,WAAW,CAAC,YAAY,CAAC;AACzC,IAAA,eAAe,CAAC,WAAW,CAAC,cAAc,CAAC;AAC3C,IAAA,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC;AAClC,IAAA,eAAe,CAAC,WAAW,CAAC,WAAW,CAAC;AACxC,IAAA,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC;AAClC,IAAA,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC;AAElC,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAChC,IAAA,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC;AACzD;;MCzIa,kBAAkB,CAAA;AAa3B,IAAA,WAAA,CAAY,MAA0B,EAAA;QAX9B,IAAA,CAAA,oBAAoB,GAAkB,IAAI;QAC1C,IAAA,CAAA,qBAAqB,GAAY,KAAK;QACtC,IAAA,CAAA,aAAa,GAKV,IAAI;QACP,IAAA,CAAA,mBAAmB,GAAkB,IAAI;QACzC,IAAA,CAAA,YAAY,GAA6B,IAAI;QAGjD,IAAI,CAAC,MAAM,GAAG;YACV,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;YACjD,cAAc,EAAE,MAAM,CAAC,cAAc;SACxC;IACL;AAEA;;;AAGG;AACI,IAAA,MAAM,IAAI,GAAA;AACb,QAAA,IAAI;;AAEA,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE;gBACrE;YACJ;;AAGA,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;YACrE,IAAI,CAAC,SAAS,IAAI,EAAE,SAAS,YAAY,WAAW,CAAC,EAAE;gBACnD,OAAO,CAAC,IAAI,CACR,2CAA2C,EAC3C,IAAI,CAAC,MAAM,CAAC,eAAe,CAC9B;gBACD;YACJ;;YAGA,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE;AACnD,gBAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;YACzC;;AAGA,YAAA,MAAM,eAAe,GAAG,SAAS,CAAC,iBAAiB,CAAC;AACpD,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,YAAY,CAAC;YAC1C,MAAM,cAAc,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,UAAU;;AAGxD,YAAA,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,YAAW;gBAC/D,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAClD,oBAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;gBACjC;AACJ,YAAA,CAAC,EAAE,CAAC,cAAc,CAAC;;YAGnB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC;AAC1D,YAAA,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;AAC7B,YAAA,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC;;YAG3D,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;AAC/C,gBAAA,MAAM,WAAW,GAAG,SAAS,CAAC,iBAAiB,CAAC;AAChD,gBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC;gBACtC,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM;AACzC,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;oBACnB,IAAI,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACvC,wBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,KAAK;wBAClC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;wBACrC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;AAC1C,wBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE;oBAChC;yBAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAChD,wBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI;wBACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;wBACvC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa;AAC9C,wBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,0BAA0B;oBACxD;gBACJ;AACJ,YAAA,CAAC,EAAE,IAAI,CAAC,CAAC;QACb;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;QAC/D;IACJ;AAEA;;;AAGG;AACK,IAAA,MAAM,gBAAgB,GAAA;AAC1B,QAAA,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC;AAEtE,QAAA,IAAI;;AAEA,YAAA,MAAM,eAAe,GAAG,SAAS,CAAC,iBAAiB,CAAC;AACpD,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,YAAY,CAAC;AAC1C,YAAA,MAAM,mBAAmB,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAqB;YACxG,MAAM,gBAAgB,GAAG,CAAA,mBAAmB,KAAA,IAAA,IAAnB,mBAAmB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAnB,mBAAmB,CAAE,GAAG,MAAI,mBAAmB,aAAnB,mBAAmB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAnB,mBAAmB,CAAE,YAAY,CAAC,UAAU,CAAC,CAAA,IAAI,EAAE;AAExG,YAAA,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE;gBACxC,UAAU;gBACV,gBAAgB;gBAChB,eAAe;AAClB,aAAA,CAAC;;YAGF,IAAI,CAAC,UAAU,EAAE;AACb,gBAAA,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC;gBAChE;YACJ;YAEA,IAAI,CAAC,gBAAgB,EAAE;gBACnB,OAAO,CAAC,IAAI,CACR,uCAAuC,EACvC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CACnC;gBACD;YACJ;YAEA,IAAI,CAAC,eAAe,EAAE;AAClB,gBAAA,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC;gBACrE;YACJ;;YAGA,IAAI,CAAC,4BAA4B,CAC7B,eAAe,EACf,UAAU,EACV,gBAAgB,CACnB;QACL;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;QAC/D;IACJ;AAEA;;;AAGG;AACK,IAAA,4BAA4B,CAChC,eAAuB,EACvB,UAAkB,EAClB,gBAAwB,EAAA;AAExB,QAAA,MAAM,SAAS,GAAyB;AACpC,YAAA,SAAS,EAAE,OAAO,KAAuB,EAAE,MAAyB,KAAI;AACpE,gBAAA,IAAI;;oBAEA,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC;;oBAG5D,UAAU,CAAC,KAAK,CAAC;;oBAGjB,IAAI,CAAC,4BAA4B,CAC7B,SAAS,EACT,eAAe,EACf,UAAU,EACV,gBAAgB,CACnB;gBACL;gBAAE,OAAO,KAAK,EAAE;AACZ,oBAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC;gBAC7D;YACJ,CAAC;SACJ;QAED,eAAe,CAAC,SAAS,CAAC;IAC9B;AAEA;;;AAGG;AACK,IAAA,4BAA4B,CAChC,SAAe,EACf,eAAuB,EACvB,UAAkB,EAClB,gBAAwB,EAAA;AAExB,QAAA,MAAM,SAAS,GAAyB;YACpC,QAAQ,EAAE,MAAK;;gBAEX,IAAI,CAAC,4BAA4B,CAC7B,eAAe,EACf,UAAU,EACV,gBAAgB,CACnB;YACL,CAAC;AACD,YAAA,QAAQ,EAAE,OAAO,iBAAuB,KAAI;gBACxC,MAAM,IAAI,CAAC,oBAAoB,CAC3B,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAgB,CACrE;YACL,CAAC;SACJ;AAED,QAAA,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC;IACzC;AAEA;;;AAGG;IACK,MAAM,oBAAoB,CAC9B,SAAe,EACf,eAAuB,EACvB,UAAkB,EAClB,gBAAwB,EACxB,SAAsB,EAAA;AAEtB,QAAA,IAAI;AACA,YAAA,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC;;YAGxD,gBAAgB,CAAC,SAAS,CAAC;;YAG3B,IAAI,CAAC,aAAa,GAAG;gBACjB,SAAS;gBACT,eAAe;gBACf,UAAU;gBACV,gBAAgB;aACnB;;AAGD,YAAA,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACpC,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,SAAS,CACZ;;AAGD,YAAA,kBAAkB,EAAE;AACpB,YAAA,cAAc,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,KAAK,CAAA,CAAE,CAAC;YAEvC,IAAI,MAAM,aAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,QAAQ,EAAE;AAClB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC7C;QACJ;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC;;AAErE,YAAA,kBAAkB,EAAE;QACxB;IACJ;AAEA;;;AAGG;AACK,IAAA,MAAM,mBAAmB,GAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACrB,YAAA,OAAO,CAAC,IAAI,CACR,+DAA+D,CAClE;YACD;QACJ;AAEA,QAAA,IAAI;AACA,YAAA,OAAO,CAAC,GAAG,CACP,oEAAoE,CACvE;;AAGD,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACrE,YAAA,IAAI,SAAS,YAAY,WAAW,EAAE;AAClC,gBAAA,kBAAkB,CAAC,SAAS,EAAE,kCAAkC,CAAC;YACrE;;AAGA,YAAA,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACpC,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,IAAI,CAAC,aAAa,CAAC,eAAe,EAClC,IAAI,CAAC,aAAa,CAAC,UAAU,EAC7B,IAAI,CAAC,aAAa,CAAC,gBAAgB,EACnC,IAAI,CAAC,aAAa,CAAC,SAAS,CAC/B;YAED,IAAI,MAAM,aAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,QAAQ,EAAE;AAClB,gBAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,QAAQ;;AAG3C,gBAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACrE,gBAAA,IAAI,SAAS,YAAY,WAAW,EAAE;oBAClC,oBAAoB,CAAC,SAAS,CAAC;AAC/B,oBAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;AACrC,oBAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;gBACzC;YACJ;iBAAO;AACH,gBAAA,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,MAAM,CAAC;;AAEtE,gBAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACrE,gBAAA,IAAI,SAAS,YAAY,WAAW,EAAE;oBAClC,oBAAoB,CAAC,SAAS,CAAC;gBACnC;YACJ;QACJ;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC;;AAErE,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACrE,YAAA,IAAI,SAAS,YAAY,WAAW,EAAE;gBAClC,oBAAoB,CAAC,SAAS,CAAC;YACnC;QACJ;IACJ;AAEA;;;AAGG;AACK,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AACxC,QAAA,IAAI;;AAEA,YAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ;;AAGpC,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;YACrE,IAAI,CAAC,SAAS,IAAI,EAAE,SAAS,YAAY,WAAW,CAAC,EAAE;gBACnD,OAAO,CAAC,IAAI,CACR,iEAAiE,EACjE,IAAI,CAAC,MAAM,CAAC,eAAe,CAC9B;gBACD;YACJ;;YAGA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,0BAA0B,CAAC,EAAE;gBACrD,SAAS,CAAC,YAAY,CAAC,0BAA0B,EAAE,SAAS,CAAC,SAAS,CAAC;YAC3E;;YAGA,MAAM,WAAW,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;YAClD,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,6BAA6B,CAAC,EAAE;gBACvE,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC;AAC1D,gBAAA,MAAM,IAAI,GAAG,WAAW,CAAC,qBAAqB,EAAE;gBAChD,SAAS,CAAC,YAAY,CAAC,wBAAwB,EAAE,aAAa,CAAC,KAAK,CAAC;gBACrE,SAAS,CAAC,YAAY,CAAC,yBAAyB,EAAE,aAAa,CAAC,MAAM,CAAC;AACvE,gBAAA,SAAS,CAAC,YAAY,CAAC,6BAA6B,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC5E,gBAAA,SAAS,CAAC,YAAY,CAAC,8BAA8B,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC9E,gBAAA,SAAS,CAAC,YAAY,CAAC,6BAA6B,EAAE,MAAM,CAAC;YACjE;;AAGA,YAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;;AAGrC,YAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;AAErC,YAAA,OAAO,CAAC,GAAG,CACP,gEAAgE,CACnE;QACL;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC;QACvE;IACJ;AAEA;;;AAGG;AACK,IAAA,qBAAqB,CAAC,SAAsB,EAAA;;AAEhD,QAAA,MAAM,eAAe,GAAG,SAAS,CAAC,gBAAgB,CAC9C,CAAA,CAAA,EAAI,WAAW,CAAC,gBAAgB,CAAA,CAAE,CACrC;AACD,QAAA,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC5B,GAAG,CAAC,MAAM,EAAE;AAChB,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,eAAe,GAAG,qBAAqB,CACzC,IAAI,CAAC,MAAM,CAAC,cAAc,EAC1B,IAAI,CAAC,oBAAoB,KAAK,IAAI,EAClC,YAAW;AACP,YAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QACjC,CAAC,EACD,YAAW;AACP,YAAA,MAAM,IAAI,CAAC,mBAAmB,EAAE;QACpC,CAAC,EACD,MAAK;AACD,YAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC5B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;YACrC;iBAAO;AACH,gBAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;YACzC;AACA,YAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;AACzC,QAAA,CAAC,EACD,IAAI,CAAC,qBAAqB,CAC7B;AAED,QAAA,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC;IAC1C;AAEA;;;AAGG;AACK,IAAA,qBAAqB,CAAC,SAAsB,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC5B,YAAA,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC;YAClE;QACJ;;AAGA,QAAA,MAAM,eAAe,GAAG,SAAS,CAAC,gBAAgB,CAC9C,CAAA,CAAA,EAAI,WAAW,CAAC,gBAAgB,CAAA,CAAE,CACrC;AACD,QAAA,SAAS,CAAC,SAAS,GAAG,EAAE;;QAGxB,MAAM,aAAa,GAAG,SAAS,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,EAAE;QAC5E,MAAM,cAAc,GAAG,SAAS,CAAC,YAAY,CAAC,yBAAyB,CAAC,IAAI,EAAE;QAC9E,MAAM,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC,6BAA6B,CAAC,IAAI,EAAE;QACrF,MAAM,kBAAkB,GAAG,SAAS,CAAC,YAAY,CAAC,8BAA8B,CAAC,IAAI,EAAE;QAEvF,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,QAAA,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,oBAAoB;AACrC,QAAA,KAAK,CAAC,GAAG,GAAG,uBAAuB;;QAGnC,IAAI,UAAU,GAAG,MAAM;QACvB,IAAI,WAAW,GAAG,MAAM;;QAGxB,IAAI,aAAa,IAAI,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,KAAK,EAAE;YACtE,UAAU,GAAG,aAAa;QAC9B;AAAO,aAAA,IAAI,iBAAiB,IAAI,iBAAiB,KAAK,GAAG,EAAE;AACvD,YAAA,UAAU,GAAG,CAAA,EAAG,iBAAiB,CAAA,EAAA,CAAI;QACzC;QAEA,IAAI,cAAc,IAAI,cAAc,KAAK,MAAM,IAAI,cAAc,KAAK,KAAK,EAAE;YACzE,WAAW,GAAG,cAAc;QAChC;AAAO,aAAA,IAAI,kBAAkB,IAAI,kBAAkB,KAAK,GAAG,EAAE;AACzD,YAAA,WAAW,GAAG,CAAA,EAAG,kBAAkB,CAAA,EAAA,CAAI;QAC3C;AAEA,QAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;qBACT,UAAU,CAAA;sBACT,WAAW,CAAA;;;SAGxB;AAED,QAAA,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;;AAG5B,QAAA,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC5B,YAAA,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC;AAC9B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;IACrC;AAEA;;;AAGG;AACK,IAAA,iBAAiB,CAAC,SAAsB,EAAA;QAC5C,MAAM,eAAe,GAAG,SAAS,CAAC,YAAY,CAAC,0BAA0B,CAAC;QAC1E,IAAI,eAAe,EAAE;;AAEjB,YAAA,MAAM,eAAe,GAAG,SAAS,CAAC,gBAAgB,CAC9C,CAAA,CAAA,EAAI,WAAW,CAAC,gBAAgB,CAAA,CAAE,CACrC;;AAGD,YAAA,SAAS,CAAC,SAAS,GAAG,eAAe;;AAGrC,YAAA,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC5B,gBAAA,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC;AAC9B,YAAA,CAAC,CAAC;QACN;AAEA,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;IACtC;AAEA;;AAEG;IACI,OAAO,GAAA;AACV,QAAA,IAAI;;AAEA,YAAA,cAAc,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,gBAAgB,CAAA,CAAE,CAAC;;AAGlD,YAAA,cAAc,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,KAAK,CAAA,CAAE,CAAC;;AAGvC,YAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,EAAE;AACnC,gBAAA,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACvC,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;YACnC;AACA,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;AAGxB,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,YAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAClC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,YAAA,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC;QAC7D;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC;QACzE;IACJ;AACH;;ACjhBD,IAAI,cAAc,GAA8B,IAAI;AAE9C,SAAU,gBAAgB,CAAC,MAA2B,EAAA;AACxD,IAAA,IAAI;;QAEA,IAAI,cAAc,EAAE;YAChB,cAAc,CAAC,OAAO,EAAE;YACxB,cAAc,GAAG,IAAI;QACzB;;QAGA,IAAI,CAAC,MAAM,EAAE;AACT,YAAA,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC;YAC1E;QACJ;;AAGA,QAAA,cAAc,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC;;AAG/C,QAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;AACnC,YAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAK;AAC/C,gBAAA,cAAc,KAAA,IAAA,IAAd,cAAc,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAd,cAAc,CAAE,IAAI,EAAA,CAAG,KAAK,CAAC,CAAC,KAAK,KAAI;AACnC,oBAAA,OAAO,CAAC,KAAK,CACT,oDAAoD,EACpD,KAAK,CACR;AACL,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;QACN;aAAO;YACH,cAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AAClC,gBAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC9D,YAAA,CAAC,CAAC;QACN;IACJ;IAAE,OAAO,KAAK,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;IAC9D;AACJ;SAEgB,mBAAmB,GAAA;AAC/B,IAAA,IAAI;QACA,IAAI,cAAc,EAAE;YAChB,cAAc,CAAC,OAAO,EAAE;YACxB,cAAc,GAAG,IAAI;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC;QACzD;IACJ;IAAE,OAAO,KAAK,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC;IACjE;AACJ;SAEgB,iBAAiB,GAAA;AAC7B,IAAA,OAAO,cAAc;AACzB;AAEA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC/B,IAAA,gBAAgB,EAAE;AACtB;;;;"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/api.ts","../src/constants.ts","../src/camera.ts","../src/utils.ts","../src/components/button.ts","../src/components/camera-modal.ts","../src/components/loading-overlay.ts","../src/components/review-modal.ts","../src/components/alert-overlay.ts","../src/widget.ts","../src/installer.ts"],"sourcesContent":["import type { VirtualTryOnResult } from \"./index.js\";\r\n\r\nexport async function callVirtualTryOnApi(\r\n baseUrl: string,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ww_image: Blob,\r\n): Promise<VirtualTryOnResult | null> {\r\n const formData = new FormData();\r\n formData.append(\"ww_user_id\", ww_user_id);\r\n formData.append(\"ww_product_image\", ww_product_image);\r\n formData.append(\"ww_image\", ww_image, \"captured-image.jpg\");\r\n formData.append(\"ww_access_token\", ww_access_token);\r\n\r\n const response = await fetch(`${baseUrl}/api/virtual-try-on`, {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n if (!response.ok) {\r\n console.error(\r\n \"[WeWear VTO] API request failed:\",\r\n response.status,\r\n response.statusText,\r\n );\r\n if (response.status === 500) {\r\n return { \"imageUrl\": null, \"error\": { message: `Service unavailable. Please try again later.`, type: 'error' } };\r\n }\r\n else if (response.status === 503) {\r\n return { \"imageUrl\": null, \"error\": { message: `Service overloaded. Please try again later.`, type: 'warning' } };\r\n }\r\n return { \"imageUrl\": null, \"error\": { message: `${response.statusText}`, type: 'warning' } };\r\n }\r\n\r\n const result = await response.json();\r\n console.log(\"[WeWear VTO] API response:\", result);\r\n return result;\r\n\r\n}\r\n","/** CSS class names for consistent styling */\nexport const CSS_CLASSES = {\n BUTTON_CONTAINER: \"wewear-vto-button-container\",\n BUTTON: \"wewear-vto-button\",\n MODAL: \"wewear-vto-modal\",\n} as const;\n\n/** Z-index values for proper layering */\nexport const Z_INDEX = {\n BUTTON: 10,\n MODAL: 99999,\n} as const;\n\n/** Camera constraints for optimal capture */\nexport const CAMERA_CONSTRAINTS = {\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n facingMode: \"user\", // Front-facing camera\n },\n audio: false,\n} as const;\n\n/** Image capture settings */\nexport const IMAGE_SETTINGS = {\n FORMAT: \"image/jpeg\",\n QUALITY: 0.8,\n} as const;\n","import { CAMERA_CONSTRAINTS, IMAGE_SETTINGS } from \"./constants.js\";\n\nexport async function startCamera(\n video: HTMLVideoElement,\n loadingIndicator: HTMLElement,\n captureButton: HTMLButtonElement,\n): Promise<void> {\n console.log(\"[WeWear VTO] Starting camera...\");\n\n try {\n console.log(\"[WeWear VTO] Requesting camera access...\");\n const stream =\n await navigator.mediaDevices.getUserMedia(CAMERA_CONSTRAINTS);\n video.srcObject = stream;\n\n video.onloadedmetadata = () => {\n console.log(\"[WeWear VTO] Camera stream loaded successfully\");\n loadingIndicator.style.display = \"none\";\n captureButton.style.display = \"flex\";\n };\n } catch (error) {\n console.error(\"[WeWear VTO] Camera access error:\", error);\n loadingIndicator.innerHTML =\n \"Camera access denied. Please allow camera permissions.\";\n }\n}\n\nexport function stopCamera(video: HTMLVideoElement): void {\n const stream = video.srcObject as MediaStream;\n if (stream) {\n const tracks = stream.getTracks();\n tracks.forEach((track) => {\n track.stop();\n });\n video.srcObject = null;\n }\n}\n\nexport async function captureImageFromVideo(\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n): Promise<Blob> {\n // Set canvas dimensions to match video\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n // Draw video frame to canvas\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Could not get canvas context\");\n }\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n // Convert canvas to blob\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n IMAGE_SETTINGS.FORMAT,\n IMAGE_SETTINGS.QUALITY,\n );\n });\n}\n","export function getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n\n if (parts.length === 2) {\n const part = parts.pop();\n return part ? part.split(\";\").shift()?.trim() || null : null;\n }\n\n return null;\n}\n\nexport function getPositionStyles(position: string): string {\n switch (position) {\n case \"bottom-left\":\n return \"left: 20px; bottom: 20px;\";\n case \"top-right\":\n return \"right: 20px; top: 20px;\";\n case \"top-left\":\n return \"left: 20px; top: 20px;\";\n default:\n return \"right: 20px; bottom: 20px;\";\n }\n}\n\nexport function removeElements(selector: string): void {\n const elements = document.querySelectorAll(selector);\n elements.forEach((element) => {\n element.remove();\n });\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { getPositionStyles } from \"../utils.js\";\n\nexport function createButtonContainer(\n buttonPosition: string,\n hasVirtualTryOn: boolean = false,\n onCameraClick: () => void,\n onRefreshClick?: () => void,\n onToggleClick?: () => void,\n isShowingVirtualTryOn: boolean = false,\n): HTMLElement {\n const container = document.createElement(\"div\");\n container.className = `${CSS_CLASSES.BUTTON_CONTAINER} ww-button-group`;\n\n const positionStyles = getPositionStyles(buttonPosition);\n container.style.cssText = `\n position: absolute;\n ${positionStyles}\n display: flex;\n border-radius: 9999px;\n background: white;\n padding: 4px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: ${Z_INDEX.BUTTON};\n `;\n\n // Camera button\n const cameraButton = document.createElement(\"button\");\n cameraButton.type = \"button\";\n cameraButton.className = `${CSS_CLASSES.BUTTON} ww-camera-btn`;\n cameraButton.setAttribute(\"aria-label\", \"Virtual Try-On\");\n cameraButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n cameraButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-camera\">\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\"></path>\n <circle cx=\"12\" cy=\"13\" r=\"3\"></circle>\n </svg>\n `;\n\n cameraButton.onclick = onCameraClick;\n container.appendChild(cameraButton);\n\n // Add refresh and toggle buttons if we have a virtual try-on\n if (hasVirtualTryOn) {\n // Refresh button - calls API again\n if (onRefreshClick) {\n const refreshButton = document.createElement(\"button\");\n refreshButton.type = \"button\";\n refreshButton.className = \"ww-refresh-btn\";\n refreshButton.setAttribute(\"aria-label\", \"Refresh virtual try-on\");\n refreshButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n refreshButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-refresh-ccw\">\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\n <path d=\"M3 3v5h5\"></path>\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\"></path>\n <path d=\"M16 16h5v5\"></path>\n </svg>\n `;\n\n refreshButton.onclick = onRefreshClick;\n container.appendChild(refreshButton);\n }\n\n // Toggle button (scan-face) - switches between original and virtual try-on\n if (onToggleClick) {\n const toggleButton = document.createElement(\"button\");\n toggleButton.type = \"button\";\n toggleButton.className = \"ww-toggle-btn\";\n toggleButton.setAttribute(\n \"aria-label\",\n isShowingVirtualTryOn ? \"Show Original Image\" : \"Show Virtual Try-On\",\n );\n toggleButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: ${isShowingVirtualTryOn ? \"rgba(0, 0, 0)\" : \"none\"};\n color: ${isShowingVirtualTryOn ? \"white\" : \"currentColor\"};\n `;\n\n toggleButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-scan-face\">\n <path d=\"M3 7V5a2 2 0 0 1 2-2h2\"></path>\n <path d=\"M17 3h2a2 2 0 0 1 2 2v2\"></path>\n <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\"></path>\n <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\"></path>\n <path d=\"M8 14s1.5 2 4 2 4-2 4-2\"></path>\n <path d=\"M9 9h.01\"></path>\n <path d=\"M15 9h.01\"></path>\n </svg>\n `;\n\n toggleButton.onclick = onToggleClick;\n container.appendChild(toggleButton);\n }\n }\n\n return container;\n}\n\nexport function createButton(\n buttonPosition: string,\n onClick: () => void,\n disabled: boolean = false,\n): HTMLElement {\n const container = createButtonContainer(buttonPosition, false, onClick);\n const cameraButton = container.querySelector('.ww-camera-btn') as HTMLButtonElement;\n if (cameraButton) {\n cameraButton.disabled = disabled;\n if (disabled) {\n cameraButton.style.opacity = '0.5';\n cameraButton.style.cursor = 'not-allowed';\n cameraButton.title = 'Find your ideal size first';\n }\n }\n return container;\n}\n","import { startCamera, stopCamera } from \"../camera.js\";\nimport { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface CameraModalCallbacks {\n onCapture: (\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n ) => Promise<void>;\n}\n\nexport function showCameraModal(callbacks: CameraModalCallbacks): void {\n console.log(\"[WeWear VTO] Opening camera modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n `;\n\n // Create camera container\n const cameraContainer = document.createElement(\"div\");\n cameraContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 70vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create video element\n const video = document.createElement(\"video\");\n video.autoplay = true;\n video.playsInline = true;\n video.muted = true;\n video.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create canvas for capturing\n const canvas = document.createElement(\"canvas\");\n canvas.style.display = \"none\";\n // Create face overlay\n const faceOverlay = document.createElement(\"div\");\n faceOverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n `;\n // SVG face outline (simple oval)\n faceOverlay.innerHTML = `\n <svg width=\"380\" height=\"520\" viewBox=\"0 0 380 520\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.7;\">\n <ellipse cx=\"190\" cy=\"240\" rx=\"160\" ry=\"220\" stroke=\"rgba(0, 0, 0, 0.7)\" stroke-width=\"6\" fill=\"none\" />\n </svg>\n `;\n\n // Create capture button\n const captureButton = document.createElement(\"button\");\n captureButton.innerHTML = \"\";\n captureButton.style.cssText = `\n position: absolute;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n width: 60px;\n height: 60px;\n border: 3px solid white;\n background-color: rgba(0, 0, 0, 0.7);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create loading indicator\n const loadingIndicator = document.createElement(\"div\");\n loadingIndicator.innerHTML = \"Initializing camera...\";\n loadingIndicator.style.cssText = `\n color: white;\n font-size: 16px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n stopCamera(video);\n modal.remove();\n };\n\n captureButton.onclick = async () => {\n await callbacks.onCapture(video, canvas);\n };\n\n // Assemble the camera modal\n cameraContainer.appendChild(video);\n cameraContainer.appendChild(faceOverlay);\n cameraContainer.appendChild(canvas);\n cameraContainer.appendChild(captureButton);\n cameraContainer.appendChild(closeButton);\n modal.appendChild(cameraContainer);\n\n // Add instruction text outside the camera box\n const instructionText = document.createElement(\"div\");\n instructionText.style.cssText = `\n width: 100%;\n max-width: 500px;\n margin: 18px auto 0 auto;\n text-align: center;\n color: #fff;\n font-size: 18px;\n font-weight: bold;\n text-shadow: 0 2px 8px #000;\n `;\n instructionText.innerText = \"Please align your face inside the outline for better results.\";\n modal.appendChild(instructionText);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Camera modal added to DOM\");\n\n // Start camera\n startCamera(video, loadingIndicator, captureButton);\n}\n","import { Z_INDEX } from \"../constants.js\";\n\n/**\n * Creates a loading overlay that can be shown in different containers\n */\nexport function createLoadingOverlay(\n text: string = \"Processing...\",\n): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"ww-loading-overlay\";\n overlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.8);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL + 1};\n border-radius: inherit;\n `;\n\n // Add CSS animation to the document if not already added\n if (!document.getElementById(\"ww-loading-animation\")) {\n const style = document.createElement(\"style\");\n style.id = \"ww-loading-animation\";\n style.textContent = `\n @keyframes ww-pulse {\n 0%, 100% { opacity: 0.7; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n .ww-loading-overlay .ww-logo {\n animation: ww-pulse 2s ease-in-out infinite;\n }\n `;\n document.head.appendChild(style);\n }\n\n overlay.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; gap: 24px; color: white;\">\n <svg class=\"ww-logo\" width=\"80\" height=\"50\" viewBox=\"0 0 214 135\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_3624_12755)\">\n <path d=\"M102.906 74.8679C102.906 77.9717 101.574 80.7453 98.9104 83.1887C96.6871 85.1918 93.9025 86.6997 90.5566 87.7123C87.695 88.5708 84.6462 89 81.4104 89C73.8821 89 68.0047 87.0189 63.7783 83.0566C59.5519 87.0189 53.6855 89 46.1792 89C42.9434 89 39.9057 88.5708 37.066 87.7123C33.7201 86.6997 30.9245 85.1918 28.6792 83.1887C26.0157 80.7453 24.684 77.9717 24.684 74.8679V41.6509H32.3774V74.8679C32.3774 76.2547 33.489 77.5645 35.7123 78.7972C37.3632 79.7217 39.0692 80.3711 40.8302 80.7453C42.5252 81.1195 44.3082 81.3066 46.1792 81.3066C48.0063 81.3066 49.7673 81.1195 51.4623 80.7453C53.2453 80.3711 54.9623 79.7217 56.6132 78.7972C58.8585 77.5645 59.9811 76.2547 59.9811 74.8679V41.6509H67.6085V74.8679C67.6085 76.2547 68.7311 77.5645 70.9764 78.7972C72.6274 79.7217 74.3443 80.3711 76.1274 80.7453C77.8223 81.1195 79.5833 81.3066 81.4104 81.3066C83.2814 81.3066 85.0755 81.1195 86.7925 80.7453C88.5314 80.3711 90.2264 79.7217 91.8774 78.7972C94.1006 77.5645 95.2123 76.2547 95.2123 74.8679V41.6509H102.906V74.8679ZM189.283 74.8679C189.283 77.9717 187.951 80.7453 185.288 83.1887C183.064 85.1918 180.28 86.6997 176.934 87.7123C174.072 88.5708 171.024 89 167.788 89C160.259 89 154.382 87.0189 150.156 83.0566C145.929 87.0189 140.063 89 132.557 89C129.321 89 126.283 88.5708 123.443 87.7123C120.097 86.6997 117.302 85.1918 115.057 83.1887C112.393 80.7453 111.061 77.9717 111.061 74.8679V41.6509H118.755V74.8679C118.755 76.2547 119.866 77.5645 122.09 78.7972C123.741 79.7217 125.447 80.3711 127.208 80.7453C128.903 81.1195 130.686 81.3066 132.557 81.3066C134.384 81.3066 136.145 81.1195 137.84 80.7453C139.623 80.3711 141.34 79.7217 142.991 78.7972C145.236 77.5645 146.358 76.2547 146.358 74.8679V41.6509H153.986V74.8679C153.986 76.2547 155.108 77.5645 157.354 78.7972C159.005 79.7217 160.722 80.3711 162.505 80.7453C164.2 81.1195 165.961 81.3066 167.788 81.3066C169.659 81.3066 171.453 81.1195 173.17 80.7453C174.909 80.3711 176.604 79.7217 178.255 78.7972C180.478 77.5645 181.59 76.2547 181.59 74.8679V41.6509H189.283V74.8679Z\" fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_3624_12755\">\n <rect width=\"214\" height=\"135\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n <div style=\"font-size: 16px; font-weight: 500; text-align: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\">${text}</div>\n </div>\n `;\n\n return overlay;\n}\n\n/**\n * Shows a loading overlay in a modal container\n */\nexport function showModalLoading(container: HTMLElement): void {\n // Remove any existing loading overlays\n removeModalLoading();\n\n // Show loading in the product area\n showProductLoading(container);\n}\n\n/**\n * Removes loading overlay from modal\n */\nexport function removeModalLoading(): void {\n const existingOverlay = document.body.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n\n/**\n * Shows a loading overlay in the product gallery container\n */\nexport function showProductLoading(\n container: HTMLElement,\n text: string = \"Generating virtual try-on...\",\n): void {\n // Remove any existing loading overlays\n removeProductLoading(container);\n\n // Make container relative if it's not already positioned\n const computedStyle = window.getComputedStyle(container);\n if (computedStyle.position === \"static\") {\n container.style.position = \"relative\";\n }\n\n const loadingOverlay = createLoadingOverlay(text);\n container.appendChild(loadingOverlay);\n}\n\n/**\n * Removes loading overlay from product container\n */\nexport function removeProductLoading(container: HTMLElement): void {\n const existingOverlay = container.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface ReviewModalCallbacks {\n onRetake: () => void;\n onAccept: (imageBlob: Blob) => Promise<void>;\n}\n\nexport function showReviewModal(\n imageBlob: Blob,\n callbacks: ReviewModalCallbacks\n): void {\n console.log(\"[WeWear VTO] Opening review modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create image URL for preview\n const imageUrl = URL.createObjectURL(imageBlob);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n gap: 20px;\n `;\n\n // Create review container\n const reviewContainer = document.createElement(\"div\");\n reviewContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 63vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create image element\n const image = document.createElement(\"img\");\n image.src = imageUrl;\n image.alt = \"Review your photo\";\n image.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create button container\n const buttonContainer = document.createElement(\"div\");\n buttonContainer.style.cssText = `\n display: flex;\n gap: 15px;\n width: 100%;\n max-width: 500px;\n `;\n\n // Create retake button\n const retakeButton = document.createElement(\"button\");\n retakeButton.textContent = \"Retake\";\n retakeButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(255, 255, 255, 0.9);\n color: black;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Create use photo button\n const usePhotoButton = document.createElement(\"button\");\n usePhotoButton.textContent = \"Use Photo\";\n usePhotoButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n };\n\n retakeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n callbacks.onRetake();\n };\n\n usePhotoButton.onclick = async () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n await callbacks.onAccept(imageBlob);\n };\n\n // Assemble the review modal\n buttonContainer.appendChild(retakeButton);\n buttonContainer.appendChild(usePhotoButton);\n reviewContainer.appendChild(image);\n reviewContainer.appendChild(closeButton);\n modal.appendChild(reviewContainer);\n modal.appendChild(buttonContainer);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Review modal added to DOM\");\n}\n","export function showAlert(\r\n container: HTMLElement,\r\n message: string,\r\n type: 'error' | 'warning'\r\n) {\r\n removeAlert(container); // Remove any existing alert\r\n\r\n const alertDiv = document.createElement('div');\r\n alertDiv.className = `ww-alert ww-alert-${type}`;\r\n alertDiv.setAttribute('role', type === 'error' ? 'alert' : 'status');\r\n alertDiv.setAttribute('aria-live', 'assertive');\r\n\r\n alertDiv.style.cssText = `\r\n position: absolute;\r\n top: 16px;\r\n left: 50%;\r\n transform: translateX(-50%) translateY(-10px);\r\n background: ${type === 'error' ? '#FEE2E2' : '#FEF9C3'};\r\n color: ${type === 'error' ? '#B91C1C' : '#92400E'};\r\n border: 1px solid ${type === 'error' ? '#F87171' : '#FBBF24'};\r\n border-radius: 8px;\r\n padding: 12px 16px;\r\n z-index: 9999;\r\n font-size: 15px;\r\n font-weight: 500;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n display: flex;\r\n align-items: center;\r\n min-width: 220px;\r\n max-width: 90%;\r\n opacity: 0;\r\n transition: opacity 0.3s ease, transform 0.3s ease;\r\n `;\r\n\r\n alertDiv.innerHTML = `\r\n <span style=\"flex: 1; line-height: 1.4;\">${message}</span>\r\n <button type=\"button\" aria-label=\"Close alert\"\r\n style=\"\r\n background: none;\r\n border: none;\r\n font-size: 20px;\r\n color: inherit;\r\n cursor: pointer;\r\n margin-left: 12px;\r\n padding: 0;\r\n line-height: 1;\r\n \">\r\n ×\r\n </button>\r\n `;\r\n\r\n // Close on button click\r\n alertDiv.querySelector('button')?.addEventListener('click', () => {\r\n fadeOutAndRemove(alertDiv);\r\n });\r\n\r\n container.appendChild(alertDiv);\r\n\r\n // Animate in\r\n requestAnimationFrame(() => {\r\n alertDiv.style.opacity = '1';\r\n alertDiv.style.transform = 'translateX(-50%) translateY(0)';\r\n });\r\n}\r\n\r\nfunction fadeOutAndRemove(element: HTMLElement) {\r\n element.style.opacity = '0';\r\n element.style.transform = 'translateX(-50%) translateY(-10px)';\r\n setTimeout(() => {\r\n element.remove();\r\n }, 300);\r\n}\r\n\r\nexport function removeAlert(container: HTMLElement) {\r\n const alert = container.querySelector('.ww-alert') as HTMLElement;\r\n if (alert) fadeOutAndRemove(alert);\r\n}\r\n","import { callVirtualTryOnApi } from \"./api.js\";\r\nimport { captureImageFromVideo, stopCamera } from \"./camera.js\";\r\nimport {\r\n type CameraModalCallbacks,\r\n createButton,\r\n createButtonContainer,\r\n type ReviewModalCallbacks,\r\n removeModalLoading,\r\n removeProductLoading,\r\n showCameraModal,\r\n showModalLoading,\r\n showProductLoading,\r\n showReviewModal,\r\n} from \"./components/index.js\";\r\nimport { CSS_CLASSES } from \"./constants.js\";\r\nimport type { VirtualTryOnConfig } from \"./index.js\";\r\nimport { getCookie, removeElements } from \"./utils.js\";\r\nimport { showAlert } from \"./components/alert-overlay.js\";\r\n\r\nexport class VirtualTryOnWidget {\r\n private readonly config: Required<VirtualTryOnConfig>;\r\n private virtualTryOnImageUrl: string | null = null;\r\n private isShowingVirtualTryOn: boolean = false;\r\n private lastApiParams: {\r\n imageBlob: Blob;\r\n ww_access_token: string;\r\n ww_user_id: string;\r\n ww_product_image: string;\r\n } | null = null;\r\n private cookieCheckInterval: number | null = null;\r\n private cameraButton: HTMLButtonElement | null = null;\r\n\r\n constructor(config: VirtualTryOnConfig) {\r\n this.config = {\r\n baseUrl: config.baseUrl,\r\n productPageSelector: config.productPageSelector,\r\n gallerySelector: config.gallerySelector,\r\n productImageSelector: config.productImageSelector,\r\n buttonPosition: config.buttonPosition,\r\n };\r\n }\r\n\r\n /**\r\n * Initializes the virtual try-on widget on the current page\r\n * @returns Promise that resolves when initialization is complete\r\n */\r\n public async init(): Promise<void> {\r\n try {\r\n // Check if we're on a product page\r\n if (!window.location.pathname.includes(this.config.productPageSelector)) {\r\n return;\r\n }\r\n\r\n // Find the gallery container\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (!container || !(container instanceof HTMLElement)) {\r\n console.warn(\r\n \"[WeWear VTO] Gallery container not found:\",\r\n this.config.gallerySelector,\r\n );\r\n return;\r\n }\r\n\r\n // Ensure container has relative positioning for button placement\r\n if (getComputedStyle(container).position === \"static\") {\r\n container.style.position = \"relative\";\r\n }\r\n\r\n // Check required cookies\r\n const ww_access_token = getCookie(\"ww_access_token\");\r\n const ww_user_id = getCookie(\"ww_user_id\");\r\n const cookiesPresent = !!ww_access_token && !!ww_user_id;\r\n\r\n // Create and add the virtual try-on button\r\n const button = createButton(this.config.buttonPosition, async () => {\r\n if (this.cameraButton && !this.cameraButton.disabled) {\r\n await this.handleTryOnClick();\r\n }\r\n }, !cookiesPresent);\r\n\r\n // Store reference to camera button for dynamic enable/disable\r\n this.cameraButton = button.querySelector('.ww-camera-btn');\r\n container.appendChild(button);\r\n console.log(\"[WeWear VTO] Widget initialized successfully\");\r\n\r\n // Periodically check cookies and update button state\r\n this.cookieCheckInterval = window.setInterval(() => {\r\n const accessToken = getCookie(\"ww_access_token\");\r\n const userId = getCookie(\"ww_user_id\");\r\n const present = !!accessToken && !!userId;\r\n if (this.cameraButton) {\r\n if (present && this.cameraButton.disabled) {\r\n this.cameraButton.disabled = false;\r\n this.cameraButton.style.opacity = '1';\r\n this.cameraButton.style.cursor = 'pointer';\r\n this.cameraButton.title = '';\r\n } else if (!present && !this.cameraButton.disabled) {\r\n this.cameraButton.disabled = true;\r\n this.cameraButton.style.opacity = '0.5';\r\n this.cameraButton.style.cursor = 'not-allowed';\r\n this.cameraButton.title = 'Required cookies missing';\r\n }\r\n }\r\n }, 2000); // check every 2 seconds\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Initialization failed:\", error);\r\n }\r\n }\r\n\r\n /**\r\n * Handles virtual try-on button click\r\n * @private\r\n */\r\n private async handleTryOnClick(): Promise<void> {\r\n console.log(\"[WeWear VTO] Button clicked, starting try-on process...\");\r\n\r\n try {\r\n // Get required data\r\n const ww_access_token = getCookie(\"ww_access_token\");\r\n const ww_user_id = getCookie(\"ww_user_id\");\r\n const productImageElement = document.querySelector(this.config.productImageSelector) as HTMLImageElement;\r\n const ww_product_image = productImageElement?.src || productImageElement?.getAttribute('data-src') || '';\r\n\r\n console.log(\"[WeWear VTO] Retrieved data:\", {\r\n ww_user_id,\r\n ww_product_image,\r\n ww_access_token,\r\n });\r\n\r\n // Validate required data\r\n if (!ww_user_id) {\r\n console.warn(\"[WeWear VTO] Missing required cookie: ww_user_id\");\r\n return;\r\n }\r\n\r\n if (!ww_product_image) {\r\n console.warn(\r\n \"[WeWear VTO] Product image not found:\",\r\n this.config.productImageSelector,\r\n );\r\n return;\r\n }\r\n\r\n if (!ww_access_token) {\r\n console.warn(\"[WeWear VTO] Missing required cookie: ww_access_token\");\r\n return;\r\n }\r\n\r\n // Show camera capture modal\r\n this.showCameraModalWithCallbacks(\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n );\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Try-on request failed:\", error);\r\n }\r\n }\r\n\r\n /**\r\n * Shows camera modal with appropriate callbacks\r\n * @private\r\n */\r\n private showCameraModalWithCallbacks(\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ): void {\r\n const callbacks: CameraModalCallbacks = {\r\n onCapture: async (video: HTMLVideoElement, canvas: HTMLCanvasElement) => {\r\n try {\r\n // Capture image from video\r\n const imageBlob = await captureImageFromVideo(video, canvas);\r\n\r\n // Stop camera and show review modal\r\n stopCamera(video);\r\n\r\n // Show review modal instead of immediately processing\r\n this.showReviewModalWithCallbacks(\r\n imageBlob,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n );\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Image capture error:\", error);\r\n }\r\n },\r\n };\r\n\r\n showCameraModal(callbacks);\r\n }\r\n\r\n /**\r\n * Shows review modal with appropriate callbacks\r\n * @private\r\n */\r\n private showReviewModalWithCallbacks(\r\n imageBlob: Blob,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ): void {\r\n const callbacks: ReviewModalCallbacks = {\r\n onRetake: () => {\r\n // Reopen camera modal\r\n this.showCameraModalWithCallbacks(\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n );\r\n },\r\n onAccept: async (acceptedImageBlob: Blob) => {\r\n await this.processAcceptedImage(\r\n acceptedImageBlob,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n document.querySelector(this.config.gallerySelector) as HTMLElement\r\n );\r\n },\r\n };\r\n\r\n showReviewModal(imageBlob, callbacks);\r\n }\r\n\r\n /**\r\n * Processes the accepted image by calling the API\r\n * @private\r\n */\r\n private async processAcceptedImage(\r\n imageBlob: Blob,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n container: HTMLElement\r\n ): Promise<void> {\r\n try {\r\n console.log(\"[WeWear VTO] Processing accepted image...\");\r\n\r\n // Show loading in the review modal first\r\n showModalLoading(container);\r\n\r\n // Store the API parameters for potential refresh\r\n this.lastApiParams = {\r\n imageBlob,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n };\r\n\r\n // Call the API with the accepted image\r\n const result = await callVirtualTryOnApi(\r\n this.config.baseUrl,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n imageBlob,\r\n );\r\n\r\n // Remove modal loading and close modal\r\n removeModalLoading();\r\n removeElements(`.${CSS_CLASSES.MODAL}`);\r\n\r\n if (result?.imageUrl) {\r\n this.replaceProductImage(result.imageUrl);\r\n } else if (result?.error) {\r\n showAlert(container, result.error.message, result.error.type);\r\n }\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error processing accepted image:\", error);\r\n // Remove loading on error\r\n removeModalLoading();\r\n }\r\n }\r\n\r\n /**\r\n * Recalls the virtual try-on API with the same parameters\r\n * @private\r\n */\r\n private async refreshVirtualTryOn(): Promise<void> {\r\n if (!this.lastApiParams) {\r\n console.warn(\r\n \"[WeWear VTO] No previous API parameters available for refresh\",\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n console.log(\r\n \"[WeWear VTO] Refreshing virtual try-on with previous parameters...\",\r\n );\r\n\r\n // Show loading in the product area\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n showProductLoading(container, \"Generating new virtual try-on...\");\r\n }\r\n\r\n // Call the API with the stored parameters\r\n const result = await callVirtualTryOnApi(\r\n this.config.baseUrl,\r\n this.lastApiParams.ww_access_token,\r\n this.lastApiParams.ww_user_id,\r\n this.lastApiParams.ww_product_image,\r\n this.lastApiParams.imageBlob,\r\n );\r\n\r\n if (result?.imageUrl) {\r\n this.virtualTryOnImageUrl = result.imageUrl;\r\n\r\n // Find the gallery container and update the image\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n removeProductLoading(container);\r\n this.showVirtualTryOnImage(container);\r\n this.updateButtonContainer(container);\r\n }\r\n } else if (result?.error) {\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n removeProductLoading(container);\r\n showAlert(container, result.error.message, result.error.type);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error refreshing virtual try-on:\", error);\r\n // Remove loading on error\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n removeProductLoading(container);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Replaces the product image in the gallery with the virtual try-on result\r\n * @private\r\n */\r\n private replaceProductImage(imageUrl: string): void {\r\n try {\r\n // Store the virtual try-on image URL\r\n this.virtualTryOnImageUrl = imageUrl;\r\n\r\n // Find the gallery container\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (!container || !(container instanceof HTMLElement)) {\r\n console.warn(\r\n \"[WeWear VTO] Gallery container not found for image replacement:\",\r\n this.config.gallerySelector,\r\n );\r\n return;\r\n }\r\n\r\n // Store the original content if not already stored\r\n if (!container.hasAttribute(\"data-ww-original-content\")) {\r\n container.setAttribute(\"data-ww-original-content\", container.innerHTML);\r\n }\r\n\r\n // Capture original image dimensions before replacement to prevent layout shift\r\n const originalImg = container.querySelector('img');\r\n if (originalImg && !container.hasAttribute(\"data-ww-original-dimensions\")) {\r\n const computedStyle = window.getComputedStyle(originalImg);\r\n const rect = originalImg.getBoundingClientRect();\r\n container.setAttribute(\"data-ww-original-width\", computedStyle.width);\r\n container.setAttribute(\"data-ww-original-height\", computedStyle.height);\r\n container.setAttribute(\"data-ww-original-rect-width\", rect.width.toString());\r\n container.setAttribute(\"data-ww-original-rect-height\", rect.height.toString());\r\n container.setAttribute(\"data-ww-original-dimensions\", \"true\");\r\n }\r\n\r\n // Show the virtual try-on image initially\r\n this.showVirtualTryOnImage(container);\r\n\r\n // Replace the button container with the new multi-button version\r\n this.updateButtonContainer(container);\r\n\r\n console.log(\r\n \"[WeWear VTO] Product image replaced with virtual try-on result\",\r\n );\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error replacing product image:\", error);\r\n }\r\n }\r\n\r\n /**\r\n * Updates the button container to show all available buttons\r\n * @private\r\n */\r\n private updateButtonContainer(container: HTMLElement): void {\r\n // Remove existing button containers\r\n const existingButtons = container.querySelectorAll(\r\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\r\n );\r\n existingButtons.forEach((btn) => {\r\n btn.remove();\r\n });\r\n\r\n // Create new button container with all buttons\r\n const buttonContainer = createButtonContainer(\r\n this.config.buttonPosition,\r\n this.virtualTryOnImageUrl !== null,\r\n async () => {\r\n await this.handleTryOnClick();\r\n },\r\n async () => {\r\n await this.refreshVirtualTryOn();\r\n },\r\n () => {\r\n if (this.isShowingVirtualTryOn) {\r\n this.showOriginalImage(container);\r\n } else {\r\n this.showVirtualTryOnImage(container);\r\n }\r\n this.updateButtonContainer(container);\r\n },\r\n this.isShowingVirtualTryOn,\r\n );\r\n\r\n container.appendChild(buttonContainer);\r\n }\r\n\r\n /**\r\n * Shows the virtual try-on image in the container\r\n * @private\r\n */\r\n private showVirtualTryOnImage(container: HTMLElement): void {\r\n if (!this.virtualTryOnImageUrl) {\r\n console.warn(\"[WeWear VTO] No virtual try-on image URL available\");\r\n return;\r\n }\r\n\r\n // Clear existing content except buttons\r\n const existingButtons = container.querySelectorAll(\r\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\r\n );\r\n container.innerHTML = \"\";\r\n\r\n // Get stored original dimensions to prevent layout shift\r\n const originalWidth = container.getAttribute(\"data-ww-original-width\") || '';\r\n const originalHeight = container.getAttribute(\"data-ww-original-height\") || '';\r\n const originalRectWidth = container.getAttribute(\"data-ww-original-rect-width\") || '';\r\n const originalRectHeight = container.getAttribute(\"data-ww-original-rect-height\") || '';\r\n\r\n const image = document.createElement(\"img\");\r\n image.src = this.virtualTryOnImageUrl;\r\n image.alt = \"Virtual Try-On Result\";\r\n\r\n // Use original dimensions to prevent layout shift\r\n let widthStyle = '100%';\r\n let heightStyle = '100%';\r\n\r\n // Prefer computed style dimensions, fallback to bounding rect, then container fill\r\n if (originalWidth && originalWidth !== 'auto' && originalWidth !== '0px') {\r\n widthStyle = originalWidth;\r\n } else if (originalRectWidth && originalRectWidth !== '0') {\r\n widthStyle = `${originalRectWidth}px`;\r\n }\r\n\r\n if (originalHeight && originalHeight !== 'auto' && originalHeight !== '0px') {\r\n heightStyle = originalHeight;\r\n } else if (originalRectHeight && originalRectHeight !== '0') {\r\n heightStyle = `${originalRectHeight}px`;\r\n }\r\n\r\n image.style.cssText = `\r\n width: ${widthStyle};\r\n height: ${heightStyle};\r\n object-fit: cover;\r\n border-radius: 8px;\r\n `;\r\n\r\n container.appendChild(image);\r\n\r\n // Re-add buttons\r\n existingButtons.forEach((btn) => {\r\n container.appendChild(btn);\r\n });\r\n\r\n this.isShowingVirtualTryOn = true;\r\n }\r\n\r\n /**\r\n * Shows the original product image in the container\r\n * @private\r\n */\r\n private showOriginalImage(container: HTMLElement): void {\r\n const originalContent = container.getAttribute(\"data-ww-original-content\");\r\n if (originalContent) {\r\n // Store existing buttons\r\n const existingButtons = container.querySelectorAll(\r\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\r\n );\r\n\r\n // Restore original content\r\n container.innerHTML = originalContent;\r\n\r\n // Re-add buttons\r\n existingButtons.forEach((btn) => {\r\n container.appendChild(btn);\r\n });\r\n }\r\n\r\n this.isShowingVirtualTryOn = false;\r\n }\r\n\r\n /**\r\n * Destroys the widget and cleans up resources\r\n */\r\n public destroy(): void {\r\n try {\r\n // Remove all buttons\r\n removeElements(`.${CSS_CLASSES.BUTTON_CONTAINER}`);\r\n\r\n // Remove all modals\r\n removeElements(`.${CSS_CLASSES.MODAL}`);\r\n\r\n // Clear interval\r\n if (this.cookieCheckInterval !== null) {\r\n clearInterval(this.cookieCheckInterval);\r\n this.cookieCheckInterval = null;\r\n }\r\n this.cameraButton = null;\r\n\r\n // Reset state\r\n this.virtualTryOnImageUrl = null;\r\n this.isShowingVirtualTryOn = false;\r\n this.lastApiParams = null;\r\n\r\n console.log(\"[WeWear VTO] Widget destroyed successfully\");\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error during widget destruction:\", error);\r\n }\r\n }\r\n}\r\n","import type { VirtualTryOnConfig } from \"./index.js\";\nimport { VirtualTryOnWidget } from \"./widget.js\";\n\nlet widgetInstance: VirtualTryOnWidget | null = null;\n\nexport function initVirtualTryOn(config?: VirtualTryOnConfig): void {\n try {\n // Clean up any existing instance\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n }\n\n // Early return if config is missing\n if (!config) {\n console.log(\"[WeWear VTO] Missing configuration. Widget not initialized.\");\n return;\n }\n\n // Create and initialize new instance\n widgetInstance = new VirtualTryOnWidget(config);\n\n // Initialize immediately if DOM is ready, otherwise wait for it\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => {\n widgetInstance?.init().catch((error) => {\n console.error(\n \"[WeWear VTO] Failed to initialize after DOM ready:\",\n error,\n );\n });\n });\n } else {\n widgetInstance.init().catch((error) => {\n console.error(\"[WeWear VTO] Failed to initialize:\", error);\n });\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Initialization error:\", error);\n }\n}\n\nexport function destroyVirtualTryOn(): void {\n try {\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n console.log(\"[WeWear VTO] Widget instance destroyed\");\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error destroying widget:\", error);\n }\n}\n\nexport function getWidgetInstance(): VirtualTryOnWidget | null {\n return widgetInstance;\n}\n\nif (typeof window !== \"undefined\") {\n initVirtualTryOn();\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,28 +5,28 @@
|
|
|
5
5
|
})(this, (function (exports) { 'use strict';
|
|
6
6
|
|
|
7
7
|
async function callVirtualTryOnApi(baseUrl, ww_access_token, ww_user_id, ww_product_image, ww_image) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return null;
|
|
8
|
+
const formData = new FormData();
|
|
9
|
+
formData.append("ww_user_id", ww_user_id);
|
|
10
|
+
formData.append("ww_product_image", ww_product_image);
|
|
11
|
+
formData.append("ww_image", ww_image, "captured-image.jpg");
|
|
12
|
+
formData.append("ww_access_token", ww_access_token);
|
|
13
|
+
const response = await fetch(`${baseUrl}/api/virtual-try-on`, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
body: formData,
|
|
16
|
+
});
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
console.error("[WeWear VTO] API request failed:", response.status, response.statusText);
|
|
19
|
+
if (response.status === 500) {
|
|
20
|
+
return { "imageUrl": null, "error": { message: `Service unavailable. Please try again later.`, type: 'error' } };
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
catch (error) {
|
|
27
|
-
console.error("[WeWear VTO] API call failed:", error);
|
|
28
|
-
return null;
|
|
22
|
+
else if (response.status === 503) {
|
|
23
|
+
return { "imageUrl": null, "error": { message: `Service overloaded. Please try again later.`, type: 'warning' } };
|
|
24
|
+
}
|
|
25
|
+
return { "imageUrl": null, "error": { message: `${response.statusText}`, type: 'warning' } };
|
|
29
26
|
}
|
|
27
|
+
const result = await response.json();
|
|
28
|
+
console.log("[WeWear VTO] API response:", result);
|
|
29
|
+
return result;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/** CSS class names for consistent styling */
|
|
@@ -310,6 +310,26 @@
|
|
|
310
310
|
// Create canvas for capturing
|
|
311
311
|
const canvas = document.createElement("canvas");
|
|
312
312
|
canvas.style.display = "none";
|
|
313
|
+
// Create face overlay
|
|
314
|
+
const faceOverlay = document.createElement("div");
|
|
315
|
+
faceOverlay.style.cssText = `
|
|
316
|
+
position: absolute;
|
|
317
|
+
top: 0;
|
|
318
|
+
left: 0;
|
|
319
|
+
width: 100%;
|
|
320
|
+
height: 100%;
|
|
321
|
+
pointer-events: none;
|
|
322
|
+
display: flex;
|
|
323
|
+
align-items: center;
|
|
324
|
+
justify-content: center;
|
|
325
|
+
z-index: 2;
|
|
326
|
+
`;
|
|
327
|
+
// SVG face outline (simple oval)
|
|
328
|
+
faceOverlay.innerHTML = `
|
|
329
|
+
<svg width="380" height="520" viewBox="0 0 380 520" fill="none" xmlns="http://www.w3.org/2000/svg" style="opacity:0.7;">
|
|
330
|
+
<ellipse cx="190" cy="240" rx="160" ry="220" stroke="rgba(0, 0, 0, 0.7)" stroke-width="6" fill="none" />
|
|
331
|
+
</svg>
|
|
332
|
+
`;
|
|
313
333
|
// Create capture button
|
|
314
334
|
const captureButton = document.createElement("button");
|
|
315
335
|
captureButton.innerHTML = "";
|
|
@@ -324,7 +344,7 @@
|
|
|
324
344
|
background-color: rgba(0, 0, 0, 0.7);
|
|
325
345
|
border-radius: 50%;
|
|
326
346
|
cursor: pointer;
|
|
327
|
-
display:
|
|
347
|
+
display: flex;
|
|
328
348
|
align-items: center;
|
|
329
349
|
justify-content: center;
|
|
330
350
|
transition: all 0.2s ease;
|
|
@@ -370,11 +390,25 @@
|
|
|
370
390
|
};
|
|
371
391
|
// Assemble the camera modal
|
|
372
392
|
cameraContainer.appendChild(video);
|
|
393
|
+
cameraContainer.appendChild(faceOverlay);
|
|
373
394
|
cameraContainer.appendChild(canvas);
|
|
374
395
|
cameraContainer.appendChild(captureButton);
|
|
375
396
|
cameraContainer.appendChild(closeButton);
|
|
376
|
-
cameraContainer.appendChild(loadingIndicator);
|
|
377
397
|
modal.appendChild(cameraContainer);
|
|
398
|
+
// Add instruction text outside the camera box
|
|
399
|
+
const instructionText = document.createElement("div");
|
|
400
|
+
instructionText.style.cssText = `
|
|
401
|
+
width: 100%;
|
|
402
|
+
max-width: 500px;
|
|
403
|
+
margin: 18px auto 0 auto;
|
|
404
|
+
text-align: center;
|
|
405
|
+
color: #fff;
|
|
406
|
+
font-size: 18px;
|
|
407
|
+
font-weight: bold;
|
|
408
|
+
text-shadow: 0 2px 8px #000;
|
|
409
|
+
`;
|
|
410
|
+
instructionText.innerText = "Please align your face inside the outline for better results.";
|
|
411
|
+
modal.appendChild(instructionText);
|
|
378
412
|
document.body.appendChild(modal);
|
|
379
413
|
console.log("[WeWear VTO] Camera modal added to DOM");
|
|
380
414
|
// Start camera
|
|
@@ -607,6 +641,74 @@
|
|
|
607
641
|
console.log("[WeWear VTO] Review modal added to DOM");
|
|
608
642
|
}
|
|
609
643
|
|
|
644
|
+
function showAlert(container, message, type) {
|
|
645
|
+
var _a;
|
|
646
|
+
removeAlert(container); // Remove any existing alert
|
|
647
|
+
const alertDiv = document.createElement('div');
|
|
648
|
+
alertDiv.className = `ww-alert ww-alert-${type}`;
|
|
649
|
+
alertDiv.setAttribute('role', type === 'error' ? 'alert' : 'status');
|
|
650
|
+
alertDiv.setAttribute('aria-live', 'assertive');
|
|
651
|
+
alertDiv.style.cssText = `
|
|
652
|
+
position: absolute;
|
|
653
|
+
top: 16px;
|
|
654
|
+
left: 50%;
|
|
655
|
+
transform: translateX(-50%) translateY(-10px);
|
|
656
|
+
background: ${type === 'error' ? '#FEE2E2' : '#FEF9C3'};
|
|
657
|
+
color: ${type === 'error' ? '#B91C1C' : '#92400E'};
|
|
658
|
+
border: 1px solid ${type === 'error' ? '#F87171' : '#FBBF24'};
|
|
659
|
+
border-radius: 8px;
|
|
660
|
+
padding: 12px 16px;
|
|
661
|
+
z-index: 9999;
|
|
662
|
+
font-size: 15px;
|
|
663
|
+
font-weight: 500;
|
|
664
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
|
665
|
+
display: flex;
|
|
666
|
+
align-items: center;
|
|
667
|
+
min-width: 220px;
|
|
668
|
+
max-width: 90%;
|
|
669
|
+
opacity: 0;
|
|
670
|
+
transition: opacity 0.3s ease, transform 0.3s ease;
|
|
671
|
+
`;
|
|
672
|
+
alertDiv.innerHTML = `
|
|
673
|
+
<span style="flex: 1; line-height: 1.4;">${message}</span>
|
|
674
|
+
<button type="button" aria-label="Close alert"
|
|
675
|
+
style="
|
|
676
|
+
background: none;
|
|
677
|
+
border: none;
|
|
678
|
+
font-size: 20px;
|
|
679
|
+
color: inherit;
|
|
680
|
+
cursor: pointer;
|
|
681
|
+
margin-left: 12px;
|
|
682
|
+
padding: 0;
|
|
683
|
+
line-height: 1;
|
|
684
|
+
">
|
|
685
|
+
×
|
|
686
|
+
</button>
|
|
687
|
+
`;
|
|
688
|
+
// Close on button click
|
|
689
|
+
(_a = alertDiv.querySelector('button')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => {
|
|
690
|
+
fadeOutAndRemove(alertDiv);
|
|
691
|
+
});
|
|
692
|
+
container.appendChild(alertDiv);
|
|
693
|
+
// Animate in
|
|
694
|
+
requestAnimationFrame(() => {
|
|
695
|
+
alertDiv.style.opacity = '1';
|
|
696
|
+
alertDiv.style.transform = 'translateX(-50%) translateY(0)';
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
function fadeOutAndRemove(element) {
|
|
700
|
+
element.style.opacity = '0';
|
|
701
|
+
element.style.transform = 'translateX(-50%) translateY(-10px)';
|
|
702
|
+
setTimeout(() => {
|
|
703
|
+
element.remove();
|
|
704
|
+
}, 300);
|
|
705
|
+
}
|
|
706
|
+
function removeAlert(container) {
|
|
707
|
+
const alert = container.querySelector('.ww-alert');
|
|
708
|
+
if (alert)
|
|
709
|
+
fadeOutAndRemove(alert);
|
|
710
|
+
}
|
|
711
|
+
|
|
610
712
|
class VirtualTryOnWidget {
|
|
611
713
|
constructor(config) {
|
|
612
714
|
this.virtualTryOnImageUrl = null;
|
|
@@ -780,6 +882,9 @@
|
|
|
780
882
|
if (result === null || result === void 0 ? void 0 : result.imageUrl) {
|
|
781
883
|
this.replaceProductImage(result.imageUrl);
|
|
782
884
|
}
|
|
885
|
+
else if (result === null || result === void 0 ? void 0 : result.error) {
|
|
886
|
+
showAlert(container, result.error.message, result.error.type);
|
|
887
|
+
}
|
|
783
888
|
}
|
|
784
889
|
catch (error) {
|
|
785
890
|
console.error("[WeWear VTO] Error processing accepted image:", error);
|
|
@@ -815,12 +920,11 @@
|
|
|
815
920
|
this.updateButtonContainer(container);
|
|
816
921
|
}
|
|
817
922
|
}
|
|
818
|
-
else {
|
|
819
|
-
console.error("[WeWear VTO] Invalid API response on refresh:", result);
|
|
820
|
-
// Remove loading on error
|
|
923
|
+
else if (result === null || result === void 0 ? void 0 : result.error) {
|
|
821
924
|
const container = document.querySelector(this.config.gallerySelector);
|
|
822
925
|
if (container instanceof HTMLElement) {
|
|
823
926
|
removeProductLoading(container);
|
|
927
|
+
showAlert(container, result.error.message, result.error.type);
|
|
824
928
|
}
|
|
825
929
|
}
|
|
826
930
|
}
|
|
@@ -934,11 +1038,11 @@
|
|
|
934
1038
|
else if (originalRectHeight && originalRectHeight !== '0') {
|
|
935
1039
|
heightStyle = `${originalRectHeight}px`;
|
|
936
1040
|
}
|
|
937
|
-
image.style.cssText = `
|
|
938
|
-
width: ${widthStyle};
|
|
939
|
-
height: ${heightStyle};
|
|
940
|
-
object-fit: cover;
|
|
941
|
-
border-radius: 8px;
|
|
1041
|
+
image.style.cssText = `
|
|
1042
|
+
width: ${widthStyle};
|
|
1043
|
+
height: ${heightStyle};
|
|
1044
|
+
object-fit: cover;
|
|
1045
|
+
border-radius: 8px;
|
|
942
1046
|
`;
|
|
943
1047
|
container.appendChild(image);
|
|
944
1048
|
// Re-add buttons
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/api.ts","../src/constants.ts","../src/camera.ts","../src/utils.ts","../src/components/button.ts","../src/components/camera-modal.ts","../src/components/loading-overlay.ts","../src/components/review-modal.ts","../src/widget.ts","../src/installer.ts"],"sourcesContent":["import type { VirtualTryOnResult } from \"./index.js\";\r\n\r\nexport async function callVirtualTryOnApi(\r\n baseUrl: string,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ww_image: Blob,\r\n): Promise<VirtualTryOnResult | null> {\r\n try {\r\n const formData = new FormData();\r\n formData.append(\"ww_user_id\", ww_user_id);\r\n formData.append(\"ww_product_image\", ww_product_image);\r\n formData.append(\"ww_image\", ww_image, \"captured-image.jpg\");\r\n formData.append(\"ww_access_token\", ww_access_token);\r\n\r\n const response = await fetch(`${baseUrl}/api/virtual-try-on`, {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n if (!response.ok) {\r\n console.error(\r\n \"[WeWear VTO] API request failed:\",\r\n response.status,\r\n response.statusText,\r\n );\r\n return null;\r\n }\r\n\r\n const result = await response.json();\r\n console.log(\"[WeWear VTO] API response:\", result);\r\n return result;\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] API call failed:\", error);\r\n return null;\r\n }\r\n}\r\n","/** CSS class names for consistent styling */\nexport const CSS_CLASSES = {\n BUTTON_CONTAINER: \"wewear-vto-button-container\",\n BUTTON: \"wewear-vto-button\",\n MODAL: \"wewear-vto-modal\",\n} as const;\n\n/** Z-index values for proper layering */\nexport const Z_INDEX = {\n BUTTON: 10,\n MODAL: 99999,\n} as const;\n\n/** Camera constraints for optimal capture */\nexport const CAMERA_CONSTRAINTS = {\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n facingMode: \"user\", // Front-facing camera\n },\n audio: false,\n} as const;\n\n/** Image capture settings */\nexport const IMAGE_SETTINGS = {\n FORMAT: \"image/jpeg\",\n QUALITY: 0.8,\n} as const;\n","import { CAMERA_CONSTRAINTS, IMAGE_SETTINGS } from \"./constants.js\";\n\nexport async function startCamera(\n video: HTMLVideoElement,\n loadingIndicator: HTMLElement,\n captureButton: HTMLButtonElement,\n): Promise<void> {\n console.log(\"[WeWear VTO] Starting camera...\");\n\n try {\n console.log(\"[WeWear VTO] Requesting camera access...\");\n const stream =\n await navigator.mediaDevices.getUserMedia(CAMERA_CONSTRAINTS);\n video.srcObject = stream;\n\n video.onloadedmetadata = () => {\n console.log(\"[WeWear VTO] Camera stream loaded successfully\");\n loadingIndicator.style.display = \"none\";\n captureButton.style.display = \"flex\";\n };\n } catch (error) {\n console.error(\"[WeWear VTO] Camera access error:\", error);\n loadingIndicator.innerHTML =\n \"Camera access denied. Please allow camera permissions.\";\n }\n}\n\nexport function stopCamera(video: HTMLVideoElement): void {\n const stream = video.srcObject as MediaStream;\n if (stream) {\n const tracks = stream.getTracks();\n tracks.forEach((track) => {\n track.stop();\n });\n video.srcObject = null;\n }\n}\n\nexport async function captureImageFromVideo(\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n): Promise<Blob> {\n // Set canvas dimensions to match video\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n // Draw video frame to canvas\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Could not get canvas context\");\n }\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n // Convert canvas to blob\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n IMAGE_SETTINGS.FORMAT,\n IMAGE_SETTINGS.QUALITY,\n );\n });\n}\n","export function getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n\n if (parts.length === 2) {\n const part = parts.pop();\n return part ? part.split(\";\").shift()?.trim() || null : null;\n }\n\n return null;\n}\n\nexport function getPositionStyles(position: string): string {\n switch (position) {\n case \"bottom-left\":\n return \"left: 20px; bottom: 20px;\";\n case \"top-right\":\n return \"right: 20px; top: 20px;\";\n case \"top-left\":\n return \"left: 20px; top: 20px;\";\n default:\n return \"right: 20px; bottom: 20px;\";\n }\n}\n\nexport function removeElements(selector: string): void {\n const elements = document.querySelectorAll(selector);\n elements.forEach((element) => {\n element.remove();\n });\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { getPositionStyles } from \"../utils.js\";\n\nexport function createButtonContainer(\n buttonPosition: string,\n hasVirtualTryOn: boolean = false,\n onCameraClick: () => void,\n onRefreshClick?: () => void,\n onToggleClick?: () => void,\n isShowingVirtualTryOn: boolean = false,\n): HTMLElement {\n const container = document.createElement(\"div\");\n container.className = `${CSS_CLASSES.BUTTON_CONTAINER} ww-button-group`;\n\n const positionStyles = getPositionStyles(buttonPosition);\n container.style.cssText = `\n position: absolute;\n ${positionStyles}\n display: flex;\n border-radius: 9999px;\n background: white;\n padding: 4px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: ${Z_INDEX.BUTTON};\n `;\n\n // Camera button\n const cameraButton = document.createElement(\"button\");\n cameraButton.type = \"button\";\n cameraButton.className = `${CSS_CLASSES.BUTTON} ww-camera-btn`;\n cameraButton.setAttribute(\"aria-label\", \"Virtual Try-On\");\n cameraButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n cameraButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-camera\">\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\"></path>\n <circle cx=\"12\" cy=\"13\" r=\"3\"></circle>\n </svg>\n `;\n\n cameraButton.onclick = onCameraClick;\n container.appendChild(cameraButton);\n\n // Add refresh and toggle buttons if we have a virtual try-on\n if (hasVirtualTryOn) {\n // Refresh button - calls API again\n if (onRefreshClick) {\n const refreshButton = document.createElement(\"button\");\n refreshButton.type = \"button\";\n refreshButton.className = \"ww-refresh-btn\";\n refreshButton.setAttribute(\"aria-label\", \"Refresh virtual try-on\");\n refreshButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n refreshButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-refresh-ccw\">\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\n <path d=\"M3 3v5h5\"></path>\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\"></path>\n <path d=\"M16 16h5v5\"></path>\n </svg>\n `;\n\n refreshButton.onclick = onRefreshClick;\n container.appendChild(refreshButton);\n }\n\n // Toggle button (scan-face) - switches between original and virtual try-on\n if (onToggleClick) {\n const toggleButton = document.createElement(\"button\");\n toggleButton.type = \"button\";\n toggleButton.className = \"ww-toggle-btn\";\n toggleButton.setAttribute(\n \"aria-label\",\n isShowingVirtualTryOn ? \"Show Original Image\" : \"Show Virtual Try-On\",\n );\n toggleButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: ${isShowingVirtualTryOn ? \"rgba(0, 0, 0)\" : \"none\"};\n color: ${isShowingVirtualTryOn ? \"white\" : \"currentColor\"};\n `;\n\n toggleButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-scan-face\">\n <path d=\"M3 7V5a2 2 0 0 1 2-2h2\"></path>\n <path d=\"M17 3h2a2 2 0 0 1 2 2v2\"></path>\n <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\"></path>\n <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\"></path>\n <path d=\"M8 14s1.5 2 4 2 4-2 4-2\"></path>\n <path d=\"M9 9h.01\"></path>\n <path d=\"M15 9h.01\"></path>\n </svg>\n `;\n\n toggleButton.onclick = onToggleClick;\n container.appendChild(toggleButton);\n }\n }\n\n return container;\n}\n\nexport function createButton(\n buttonPosition: string,\n onClick: () => void,\n disabled: boolean = false,\n): HTMLElement {\n const container = createButtonContainer(buttonPosition, false, onClick);\n const cameraButton = container.querySelector('.ww-camera-btn') as HTMLButtonElement;\n if (cameraButton) {\n cameraButton.disabled = disabled;\n if (disabled) {\n cameraButton.style.opacity = '0.5';\n cameraButton.style.cursor = 'not-allowed';\n cameraButton.title = 'Find your ideal size first';\n }\n }\n return container;\n}\n","import { startCamera, stopCamera } from \"../camera.js\";\nimport { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface CameraModalCallbacks {\n onCapture: (\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n ) => Promise<void>;\n}\n\nexport function showCameraModal(callbacks: CameraModalCallbacks): void {\n console.log(\"[WeWear VTO] Opening camera modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n `;\n\n // Create camera container\n const cameraContainer = document.createElement(\"div\");\n cameraContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 70vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create video element\n const video = document.createElement(\"video\");\n video.autoplay = true;\n video.playsInline = true;\n video.muted = true;\n video.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create canvas for capturing\n const canvas = document.createElement(\"canvas\");\n canvas.style.display = \"none\";\n\n // Create capture button\n const captureButton = document.createElement(\"button\");\n captureButton.innerHTML = \"\";\n captureButton.style.cssText = `\n position: absolute;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n width: 60px;\n height: 60px;\n border: 3px solid white;\n background-color: rgba(0, 0, 0, 0.7);\n border-radius: 50%;\n cursor: pointer;\n display: none;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create loading indicator\n const loadingIndicator = document.createElement(\"div\");\n loadingIndicator.innerHTML = \"Initializing camera...\";\n loadingIndicator.style.cssText = `\n color: white;\n font-size: 16px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n stopCamera(video);\n modal.remove();\n };\n\n captureButton.onclick = async () => {\n await callbacks.onCapture(video, canvas);\n };\n\n // Assemble the camera modal\n cameraContainer.appendChild(video);\n cameraContainer.appendChild(canvas);\n cameraContainer.appendChild(captureButton);\n cameraContainer.appendChild(closeButton);\n cameraContainer.appendChild(loadingIndicator);\n modal.appendChild(cameraContainer);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Camera modal added to DOM\");\n\n // Start camera\n startCamera(video, loadingIndicator, captureButton);\n}\n","import { Z_INDEX } from \"../constants.js\";\n\n/**\n * Creates a loading overlay that can be shown in different containers\n */\nexport function createLoadingOverlay(\n text: string = \"Processing...\",\n): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"ww-loading-overlay\";\n overlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.8);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL + 1};\n border-radius: inherit;\n `;\n\n // Add CSS animation to the document if not already added\n if (!document.getElementById(\"ww-loading-animation\")) {\n const style = document.createElement(\"style\");\n style.id = \"ww-loading-animation\";\n style.textContent = `\n @keyframes ww-pulse {\n 0%, 100% { opacity: 0.7; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n .ww-loading-overlay .ww-logo {\n animation: ww-pulse 2s ease-in-out infinite;\n }\n `;\n document.head.appendChild(style);\n }\n\n overlay.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; gap: 24px; color: white;\">\n <svg class=\"ww-logo\" width=\"80\" height=\"50\" viewBox=\"0 0 214 135\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_3624_12755)\">\n <path d=\"M102.906 74.8679C102.906 77.9717 101.574 80.7453 98.9104 83.1887C96.6871 85.1918 93.9025 86.6997 90.5566 87.7123C87.695 88.5708 84.6462 89 81.4104 89C73.8821 89 68.0047 87.0189 63.7783 83.0566C59.5519 87.0189 53.6855 89 46.1792 89C42.9434 89 39.9057 88.5708 37.066 87.7123C33.7201 86.6997 30.9245 85.1918 28.6792 83.1887C26.0157 80.7453 24.684 77.9717 24.684 74.8679V41.6509H32.3774V74.8679C32.3774 76.2547 33.489 77.5645 35.7123 78.7972C37.3632 79.7217 39.0692 80.3711 40.8302 80.7453C42.5252 81.1195 44.3082 81.3066 46.1792 81.3066C48.0063 81.3066 49.7673 81.1195 51.4623 80.7453C53.2453 80.3711 54.9623 79.7217 56.6132 78.7972C58.8585 77.5645 59.9811 76.2547 59.9811 74.8679V41.6509H67.6085V74.8679C67.6085 76.2547 68.7311 77.5645 70.9764 78.7972C72.6274 79.7217 74.3443 80.3711 76.1274 80.7453C77.8223 81.1195 79.5833 81.3066 81.4104 81.3066C83.2814 81.3066 85.0755 81.1195 86.7925 80.7453C88.5314 80.3711 90.2264 79.7217 91.8774 78.7972C94.1006 77.5645 95.2123 76.2547 95.2123 74.8679V41.6509H102.906V74.8679ZM189.283 74.8679C189.283 77.9717 187.951 80.7453 185.288 83.1887C183.064 85.1918 180.28 86.6997 176.934 87.7123C174.072 88.5708 171.024 89 167.788 89C160.259 89 154.382 87.0189 150.156 83.0566C145.929 87.0189 140.063 89 132.557 89C129.321 89 126.283 88.5708 123.443 87.7123C120.097 86.6997 117.302 85.1918 115.057 83.1887C112.393 80.7453 111.061 77.9717 111.061 74.8679V41.6509H118.755V74.8679C118.755 76.2547 119.866 77.5645 122.09 78.7972C123.741 79.7217 125.447 80.3711 127.208 80.7453C128.903 81.1195 130.686 81.3066 132.557 81.3066C134.384 81.3066 136.145 81.1195 137.84 80.7453C139.623 80.3711 141.34 79.7217 142.991 78.7972C145.236 77.5645 146.358 76.2547 146.358 74.8679V41.6509H153.986V74.8679C153.986 76.2547 155.108 77.5645 157.354 78.7972C159.005 79.7217 160.722 80.3711 162.505 80.7453C164.2 81.1195 165.961 81.3066 167.788 81.3066C169.659 81.3066 171.453 81.1195 173.17 80.7453C174.909 80.3711 176.604 79.7217 178.255 78.7972C180.478 77.5645 181.59 76.2547 181.59 74.8679V41.6509H189.283V74.8679Z\" fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_3624_12755\">\n <rect width=\"214\" height=\"135\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n <div style=\"font-size: 16px; font-weight: 500; text-align: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\">${text}</div>\n </div>\n `;\n\n return overlay;\n}\n\n/**\n * Shows a loading overlay in a modal container\n */\nexport function showModalLoading(container: HTMLElement): void {\n // Remove any existing loading overlays\n removeModalLoading();\n\n // Show loading in the product area\n showProductLoading(container);\n}\n\n/**\n * Removes loading overlay from modal\n */\nexport function removeModalLoading(): void {\n const existingOverlay = document.body.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n\n/**\n * Shows a loading overlay in the product gallery container\n */\nexport function showProductLoading(\n container: HTMLElement,\n text: string = \"Generating virtual try-on...\",\n): void {\n // Remove any existing loading overlays\n removeProductLoading(container);\n\n // Make container relative if it's not already positioned\n const computedStyle = window.getComputedStyle(container);\n if (computedStyle.position === \"static\") {\n container.style.position = \"relative\";\n }\n\n const loadingOverlay = createLoadingOverlay(text);\n container.appendChild(loadingOverlay);\n}\n\n/**\n * Removes loading overlay from product container\n */\nexport function removeProductLoading(container: HTMLElement): void {\n const existingOverlay = container.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface ReviewModalCallbacks {\n onRetake: () => void;\n onAccept: (imageBlob: Blob) => Promise<void>;\n}\n\nexport function showReviewModal(\n imageBlob: Blob,\n callbacks: ReviewModalCallbacks\n): void {\n console.log(\"[WeWear VTO] Opening review modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create image URL for preview\n const imageUrl = URL.createObjectURL(imageBlob);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n gap: 20px;\n `;\n\n // Create review container\n const reviewContainer = document.createElement(\"div\");\n reviewContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 63vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create image element\n const image = document.createElement(\"img\");\n image.src = imageUrl;\n image.alt = \"Review your photo\";\n image.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create button container\n const buttonContainer = document.createElement(\"div\");\n buttonContainer.style.cssText = `\n display: flex;\n gap: 15px;\n width: 100%;\n max-width: 500px;\n `;\n\n // Create retake button\n const retakeButton = document.createElement(\"button\");\n retakeButton.textContent = \"Retake\";\n retakeButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(255, 255, 255, 0.9);\n color: black;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Create use photo button\n const usePhotoButton = document.createElement(\"button\");\n usePhotoButton.textContent = \"Use Photo\";\n usePhotoButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n };\n\n retakeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n callbacks.onRetake();\n };\n\n usePhotoButton.onclick = async () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n await callbacks.onAccept(imageBlob);\n };\n\n // Assemble the review modal\n buttonContainer.appendChild(retakeButton);\n buttonContainer.appendChild(usePhotoButton);\n reviewContainer.appendChild(image);\n reviewContainer.appendChild(closeButton);\n modal.appendChild(reviewContainer);\n modal.appendChild(buttonContainer);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Review modal added to DOM\");\n}\n","import { callVirtualTryOnApi } from \"./api.js\";\nimport { captureImageFromVideo, stopCamera } from \"./camera.js\";\nimport {\n type CameraModalCallbacks,\n createButton,\n createButtonContainer,\n type ReviewModalCallbacks,\n removeModalLoading,\n removeProductLoading,\n showCameraModal,\n showModalLoading,\n showProductLoading,\n showReviewModal,\n} from \"./components/index.js\";\nimport { CSS_CLASSES } from \"./constants.js\";\nimport type { VirtualTryOnConfig } from \"./index.js\";\nimport { getCookie, removeElements } from \"./utils.js\";\n\nexport class VirtualTryOnWidget {\n private readonly config: Required<VirtualTryOnConfig>;\n private virtualTryOnImageUrl: string | null = null;\n private isShowingVirtualTryOn: boolean = false;\n private lastApiParams: {\n imageBlob: Blob;\n ww_access_token: string;\n ww_user_id: string;\n ww_product_image: string;\n } | null = null;\n private cookieCheckInterval: number | null = null;\n private cameraButton: HTMLButtonElement | null = null;\n\n constructor(config: VirtualTryOnConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n productPageSelector: config.productPageSelector,\n gallerySelector: config.gallerySelector,\n productImageSelector: config.productImageSelector,\n buttonPosition: config.buttonPosition,\n };\n }\n\n /**\n * Initializes the virtual try-on widget on the current page\n * @returns Promise that resolves when initialization is complete\n */\n public async init(): Promise<void> {\n try {\n // Check if we're on a product page\n if (!window.location.pathname.includes(this.config.productPageSelector)) {\n return;\n }\n\n // Find the gallery container\n const container = document.querySelector(this.config.gallerySelector);\n if (!container || !(container instanceof HTMLElement)) {\n console.warn(\n \"[WeWear VTO] Gallery container not found:\",\n this.config.gallerySelector,\n );\n return;\n }\n\n // Ensure container has relative positioning for button placement\n if (getComputedStyle(container).position === \"static\") {\n container.style.position = \"relative\";\n }\n\n // Check required cookies\n const ww_access_token = getCookie(\"ww_access_token\");\n const ww_user_id = getCookie(\"ww_user_id\");\n const cookiesPresent = !!ww_access_token && !!ww_user_id;\n\n // Create and add the virtual try-on button\n const button = createButton(this.config.buttonPosition, async () => {\n if (this.cameraButton && !this.cameraButton.disabled) {\n await this.handleTryOnClick();\n }\n }, !cookiesPresent);\n\n // Store reference to camera button for dynamic enable/disable\n this.cameraButton = button.querySelector('.ww-camera-btn');\n container.appendChild(button);\n console.log(\"[WeWear VTO] Widget initialized successfully\");\n\n // Periodically check cookies and update button state\n this.cookieCheckInterval = window.setInterval(() => {\n const accessToken = getCookie(\"ww_access_token\");\n const userId = getCookie(\"ww_user_id\");\n const present = !!accessToken && !!userId;\n if (this.cameraButton) {\n if (present && this.cameraButton.disabled) {\n this.cameraButton.disabled = false;\n this.cameraButton.style.opacity = '1';\n this.cameraButton.style.cursor = 'pointer';\n this.cameraButton.title = '';\n } else if (!present && !this.cameraButton.disabled) {\n this.cameraButton.disabled = true;\n this.cameraButton.style.opacity = '0.5';\n this.cameraButton.style.cursor = 'not-allowed';\n this.cameraButton.title = 'Required cookies missing';\n }\n }\n }, 2000); // check every 2 seconds\n } catch (error) {\n console.error(\"[WeWear VTO] Initialization failed:\", error);\n }\n }\n\n /**\n * Handles virtual try-on button click\n * @private\n */\n private async handleTryOnClick(): Promise<void> {\n console.log(\"[WeWear VTO] Button clicked, starting try-on process...\");\n\n try {\n // Get required data\n const ww_access_token = getCookie(\"ww_access_token\");\n const ww_user_id = getCookie(\"ww_user_id\");\n const productImageElement = document.querySelector(this.config.productImageSelector) as HTMLImageElement;\n const ww_product_image = productImageElement?.src || productImageElement?.getAttribute('data-src') || '';\n\n console.log(\"[WeWear VTO] Retrieved data:\", {\n ww_user_id,\n ww_product_image,\n ww_access_token,\n });\n\n // Validate required data\n if (!ww_user_id) {\n console.warn(\"[WeWear VTO] Missing required cookie: ww_user_id\");\n return;\n }\n\n if (!ww_product_image) {\n console.warn(\n \"[WeWear VTO] Product image not found:\",\n this.config.productImageSelector,\n );\n return;\n }\n\n if (!ww_access_token) {\n console.warn(\"[WeWear VTO] Missing required cookie: ww_access_token\");\n return;\n }\n\n // Show camera capture modal\n this.showCameraModalWithCallbacks(\n ww_access_token,\n ww_user_id,\n ww_product_image,\n );\n } catch (error) {\n console.error(\"[WeWear VTO] Try-on request failed:\", error);\n }\n }\n\n /**\n * Shows camera modal with appropriate callbacks\n * @private\n */\n private showCameraModalWithCallbacks(\n ww_access_token: string,\n ww_user_id: string,\n ww_product_image: string,\n ): void {\n const callbacks: CameraModalCallbacks = {\n onCapture: async (video: HTMLVideoElement, canvas: HTMLCanvasElement) => {\n try {\n // Capture image from video\n const imageBlob = await captureImageFromVideo(video, canvas);\n\n // Stop camera and show review modal\n stopCamera(video);\n\n // Show review modal instead of immediately processing\n this.showReviewModalWithCallbacks(\n imageBlob,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n );\n } catch (error) {\n console.error(\"[WeWear VTO] Image capture error:\", error);\n }\n },\n };\n\n showCameraModal(callbacks);\n }\n\n /**\n * Shows review modal with appropriate callbacks\n * @private\n */\n private showReviewModalWithCallbacks(\n imageBlob: Blob,\n ww_access_token: string,\n ww_user_id: string,\n ww_product_image: string,\n ): void {\n const callbacks: ReviewModalCallbacks = {\n onRetake: () => {\n // Reopen camera modal\n this.showCameraModalWithCallbacks(\n ww_access_token,\n ww_user_id,\n ww_product_image,\n );\n },\n onAccept: async (acceptedImageBlob: Blob) => {\n await this.processAcceptedImage(\n acceptedImageBlob,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n document.querySelector(this.config.gallerySelector) as HTMLElement\n );\n },\n };\n\n showReviewModal(imageBlob, callbacks);\n }\n\n /**\n * Processes the accepted image by calling the API\n * @private\n */\n private async processAcceptedImage(\n imageBlob: Blob,\n ww_access_token: string,\n ww_user_id: string,\n ww_product_image: string,\n container: HTMLElement\n ): Promise<void> {\n try {\n console.log(\"[WeWear VTO] Processing accepted image...\");\n\n // Show loading in the review modal first\n showModalLoading(container);\n\n // Store the API parameters for potential refresh\n this.lastApiParams = {\n imageBlob,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n };\n\n // Call the API with the accepted image\n const result = await callVirtualTryOnApi(\n this.config.baseUrl,\n ww_access_token,\n ww_user_id,\n ww_product_image,\n imageBlob,\n );\n\n // Remove modal loading and close modal\n removeModalLoading();\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n if (result?.imageUrl) {\n this.replaceProductImage(result.imageUrl);\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error processing accepted image:\", error);\n // Remove loading on error\n removeModalLoading();\n }\n }\n\n /**\n * Recalls the virtual try-on API with the same parameters\n * @private\n */\n private async refreshVirtualTryOn(): Promise<void> {\n if (!this.lastApiParams) {\n console.warn(\n \"[WeWear VTO] No previous API parameters available for refresh\",\n );\n return;\n }\n\n try {\n console.log(\n \"[WeWear VTO] Refreshing virtual try-on with previous parameters...\",\n );\n\n // Show loading in the product area\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n showProductLoading(container, \"Generating new virtual try-on...\");\n }\n\n // Call the API with the stored parameters\n const result = await callVirtualTryOnApi(\n this.config.baseUrl,\n this.lastApiParams.ww_access_token,\n this.lastApiParams.ww_user_id,\n this.lastApiParams.ww_product_image,\n this.lastApiParams.imageBlob,\n );\n\n if (result?.imageUrl) {\n this.virtualTryOnImageUrl = result.imageUrl;\n\n // Find the gallery container and update the image\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n removeProductLoading(container);\n this.showVirtualTryOnImage(container);\n this.updateButtonContainer(container);\n }\n } else {\n console.error(\"[WeWear VTO] Invalid API response on refresh:\", result);\n // Remove loading on error\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n removeProductLoading(container);\n }\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error refreshing virtual try-on:\", error);\n // Remove loading on error\n const container = document.querySelector(this.config.gallerySelector);\n if (container instanceof HTMLElement) {\n removeProductLoading(container);\n }\n }\n }\n\n /**\n * Replaces the product image in the gallery with the virtual try-on result\n * @private\n */\n private replaceProductImage(imageUrl: string): void {\n try {\n // Store the virtual try-on image URL\n this.virtualTryOnImageUrl = imageUrl;\n\n // Find the gallery container\n const container = document.querySelector(this.config.gallerySelector);\n if (!container || !(container instanceof HTMLElement)) {\n console.warn(\n \"[WeWear VTO] Gallery container not found for image replacement:\",\n this.config.gallerySelector,\n );\n return;\n }\n\n // Store the original content if not already stored\n if (!container.hasAttribute(\"data-ww-original-content\")) {\n container.setAttribute(\"data-ww-original-content\", container.innerHTML);\n }\n\n // Capture original image dimensions before replacement to prevent layout shift\n const originalImg = container.querySelector('img');\n if (originalImg && !container.hasAttribute(\"data-ww-original-dimensions\")) {\n const computedStyle = window.getComputedStyle(originalImg);\n const rect = originalImg.getBoundingClientRect();\n container.setAttribute(\"data-ww-original-width\", computedStyle.width);\n container.setAttribute(\"data-ww-original-height\", computedStyle.height);\n container.setAttribute(\"data-ww-original-rect-width\", rect.width.toString());\n container.setAttribute(\"data-ww-original-rect-height\", rect.height.toString());\n container.setAttribute(\"data-ww-original-dimensions\", \"true\");\n }\n\n // Show the virtual try-on image initially\n this.showVirtualTryOnImage(container);\n\n // Replace the button container with the new multi-button version\n this.updateButtonContainer(container);\n\n console.log(\n \"[WeWear VTO] Product image replaced with virtual try-on result\",\n );\n } catch (error) {\n console.error(\"[WeWear VTO] Error replacing product image:\", error);\n }\n }\n\n /**\n * Updates the button container to show all available buttons\n * @private\n */\n private updateButtonContainer(container: HTMLElement): void {\n // Remove existing button containers\n const existingButtons = container.querySelectorAll(\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\n );\n existingButtons.forEach((btn) => {\n btn.remove();\n });\n\n // Create new button container with all buttons\n const buttonContainer = createButtonContainer(\n this.config.buttonPosition,\n this.virtualTryOnImageUrl !== null,\n async () => {\n await this.handleTryOnClick();\n },\n async () => {\n await this.refreshVirtualTryOn();\n },\n () => {\n if (this.isShowingVirtualTryOn) {\n this.showOriginalImage(container);\n } else {\n this.showVirtualTryOnImage(container);\n }\n this.updateButtonContainer(container);\n },\n this.isShowingVirtualTryOn,\n );\n\n container.appendChild(buttonContainer);\n }\n\n /**\n * Shows the virtual try-on image in the container\n * @private\n */\n private showVirtualTryOnImage(container: HTMLElement): void {\n if (!this.virtualTryOnImageUrl) {\n console.warn(\"[WeWear VTO] No virtual try-on image URL available\");\n return;\n }\n\n // Clear existing content except buttons\n const existingButtons = container.querySelectorAll(\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\n );\n container.innerHTML = \"\";\n\n // Get stored original dimensions to prevent layout shift\n const originalWidth = container.getAttribute(\"data-ww-original-width\") || '';\n const originalHeight = container.getAttribute(\"data-ww-original-height\") || '';\n const originalRectWidth = container.getAttribute(\"data-ww-original-rect-width\") || '';\n const originalRectHeight = container.getAttribute(\"data-ww-original-rect-height\") || '';\n\n const image = document.createElement(\"img\");\n image.src = this.virtualTryOnImageUrl;\n image.alt = \"Virtual Try-On Result\";\n\n // Use original dimensions to prevent layout shift\n let widthStyle = '100%';\n let heightStyle = '100%';\n\n // Prefer computed style dimensions, fallback to bounding rect, then container fill\n if (originalWidth && originalWidth !== 'auto' && originalWidth !== '0px') {\n widthStyle = originalWidth;\n } else if (originalRectWidth && originalRectWidth !== '0') {\n widthStyle = `${originalRectWidth}px`;\n }\n\n if (originalHeight && originalHeight !== 'auto' && originalHeight !== '0px') {\n heightStyle = originalHeight;\n } else if (originalRectHeight && originalRectHeight !== '0') {\n heightStyle = `${originalRectHeight}px`;\n }\n\n image.style.cssText = `\n width: ${widthStyle};\n height: ${heightStyle};\n object-fit: cover;\n border-radius: 8px;\n `;\n\n container.appendChild(image);\n\n // Re-add buttons\n existingButtons.forEach((btn) => {\n container.appendChild(btn);\n });\n\n this.isShowingVirtualTryOn = true;\n }\n\n /**\n * Shows the original product image in the container\n * @private\n */\n private showOriginalImage(container: HTMLElement): void {\n const originalContent = container.getAttribute(\"data-ww-original-content\");\n if (originalContent) {\n // Store existing buttons\n const existingButtons = container.querySelectorAll(\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\n );\n\n // Restore original content\n container.innerHTML = originalContent;\n\n // Re-add buttons\n existingButtons.forEach((btn) => {\n container.appendChild(btn);\n });\n }\n\n this.isShowingVirtualTryOn = false;\n }\n\n /**\n * Destroys the widget and cleans up resources\n */\n public destroy(): void {\n try {\n // Remove all buttons\n removeElements(`.${CSS_CLASSES.BUTTON_CONTAINER}`);\n\n // Remove all modals\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Clear interval\n if (this.cookieCheckInterval !== null) {\n clearInterval(this.cookieCheckInterval);\n this.cookieCheckInterval = null;\n }\n this.cameraButton = null;\n\n // Reset state\n this.virtualTryOnImageUrl = null;\n this.isShowingVirtualTryOn = false;\n this.lastApiParams = null;\n\n console.log(\"[WeWear VTO] Widget destroyed successfully\");\n } catch (error) {\n console.error(\"[WeWear VTO] Error during widget destruction:\", error);\n }\n }\n}\n","import type { VirtualTryOnConfig } from \"./index.js\";\nimport { VirtualTryOnWidget } from \"./widget.js\";\n\nlet widgetInstance: VirtualTryOnWidget | null = null;\n\nexport function initVirtualTryOn(config?: VirtualTryOnConfig): void {\n try {\n // Clean up any existing instance\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n }\n\n // Early return if config is missing\n if (!config) {\n console.log(\"[WeWear VTO] Missing configuration. Widget not initialized.\");\n return;\n }\n\n // Create and initialize new instance\n widgetInstance = new VirtualTryOnWidget(config);\n\n // Initialize immediately if DOM is ready, otherwise wait for it\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => {\n widgetInstance?.init().catch((error) => {\n console.error(\n \"[WeWear VTO] Failed to initialize after DOM ready:\",\n error,\n );\n });\n });\n } else {\n widgetInstance.init().catch((error) => {\n console.error(\"[WeWear VTO] Failed to initialize:\", error);\n });\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Initialization error:\", error);\n }\n}\n\nexport function destroyVirtualTryOn(): void {\n try {\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n console.log(\"[WeWear VTO] Widget instance destroyed\");\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error destroying widget:\", error);\n }\n}\n\nexport function getWidgetInstance(): VirtualTryOnWidget | null {\n return widgetInstance;\n}\n\nif (typeof window !== \"undefined\") {\n initVirtualTryOn();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/api.ts","../src/constants.ts","../src/camera.ts","../src/utils.ts","../src/components/button.ts","../src/components/camera-modal.ts","../src/components/loading-overlay.ts","../src/components/review-modal.ts","../src/components/alert-overlay.ts","../src/widget.ts","../src/installer.ts"],"sourcesContent":["import type { VirtualTryOnResult } from \"./index.js\";\r\n\r\nexport async function callVirtualTryOnApi(\r\n baseUrl: string,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ww_image: Blob,\r\n): Promise<VirtualTryOnResult | null> {\r\n const formData = new FormData();\r\n formData.append(\"ww_user_id\", ww_user_id);\r\n formData.append(\"ww_product_image\", ww_product_image);\r\n formData.append(\"ww_image\", ww_image, \"captured-image.jpg\");\r\n formData.append(\"ww_access_token\", ww_access_token);\r\n\r\n const response = await fetch(`${baseUrl}/api/virtual-try-on`, {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n if (!response.ok) {\r\n console.error(\r\n \"[WeWear VTO] API request failed:\",\r\n response.status,\r\n response.statusText,\r\n );\r\n if (response.status === 500) {\r\n return { \"imageUrl\": null, \"error\": { message: `Service unavailable. Please try again later.`, type: 'error' } };\r\n }\r\n else if (response.status === 503) {\r\n return { \"imageUrl\": null, \"error\": { message: `Service overloaded. Please try again later.`, type: 'warning' } };\r\n }\r\n return { \"imageUrl\": null, \"error\": { message: `${response.statusText}`, type: 'warning' } };\r\n }\r\n\r\n const result = await response.json();\r\n console.log(\"[WeWear VTO] API response:\", result);\r\n return result;\r\n\r\n}\r\n","/** CSS class names for consistent styling */\nexport const CSS_CLASSES = {\n BUTTON_CONTAINER: \"wewear-vto-button-container\",\n BUTTON: \"wewear-vto-button\",\n MODAL: \"wewear-vto-modal\",\n} as const;\n\n/** Z-index values for proper layering */\nexport const Z_INDEX = {\n BUTTON: 10,\n MODAL: 99999,\n} as const;\n\n/** Camera constraints for optimal capture */\nexport const CAMERA_CONSTRAINTS = {\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n facingMode: \"user\", // Front-facing camera\n },\n audio: false,\n} as const;\n\n/** Image capture settings */\nexport const IMAGE_SETTINGS = {\n FORMAT: \"image/jpeg\",\n QUALITY: 0.8,\n} as const;\n","import { CAMERA_CONSTRAINTS, IMAGE_SETTINGS } from \"./constants.js\";\n\nexport async function startCamera(\n video: HTMLVideoElement,\n loadingIndicator: HTMLElement,\n captureButton: HTMLButtonElement,\n): Promise<void> {\n console.log(\"[WeWear VTO] Starting camera...\");\n\n try {\n console.log(\"[WeWear VTO] Requesting camera access...\");\n const stream =\n await navigator.mediaDevices.getUserMedia(CAMERA_CONSTRAINTS);\n video.srcObject = stream;\n\n video.onloadedmetadata = () => {\n console.log(\"[WeWear VTO] Camera stream loaded successfully\");\n loadingIndicator.style.display = \"none\";\n captureButton.style.display = \"flex\";\n };\n } catch (error) {\n console.error(\"[WeWear VTO] Camera access error:\", error);\n loadingIndicator.innerHTML =\n \"Camera access denied. Please allow camera permissions.\";\n }\n}\n\nexport function stopCamera(video: HTMLVideoElement): void {\n const stream = video.srcObject as MediaStream;\n if (stream) {\n const tracks = stream.getTracks();\n tracks.forEach((track) => {\n track.stop();\n });\n video.srcObject = null;\n }\n}\n\nexport async function captureImageFromVideo(\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n): Promise<Blob> {\n // Set canvas dimensions to match video\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n // Draw video frame to canvas\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Could not get canvas context\");\n }\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n // Convert canvas to blob\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n IMAGE_SETTINGS.FORMAT,\n IMAGE_SETTINGS.QUALITY,\n );\n });\n}\n","export function getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n\n if (parts.length === 2) {\n const part = parts.pop();\n return part ? part.split(\";\").shift()?.trim() || null : null;\n }\n\n return null;\n}\n\nexport function getPositionStyles(position: string): string {\n switch (position) {\n case \"bottom-left\":\n return \"left: 20px; bottom: 20px;\";\n case \"top-right\":\n return \"right: 20px; top: 20px;\";\n case \"top-left\":\n return \"left: 20px; top: 20px;\";\n default:\n return \"right: 20px; bottom: 20px;\";\n }\n}\n\nexport function removeElements(selector: string): void {\n const elements = document.querySelectorAll(selector);\n elements.forEach((element) => {\n element.remove();\n });\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { getPositionStyles } from \"../utils.js\";\n\nexport function createButtonContainer(\n buttonPosition: string,\n hasVirtualTryOn: boolean = false,\n onCameraClick: () => void,\n onRefreshClick?: () => void,\n onToggleClick?: () => void,\n isShowingVirtualTryOn: boolean = false,\n): HTMLElement {\n const container = document.createElement(\"div\");\n container.className = `${CSS_CLASSES.BUTTON_CONTAINER} ww-button-group`;\n\n const positionStyles = getPositionStyles(buttonPosition);\n container.style.cssText = `\n position: absolute;\n ${positionStyles}\n display: flex;\n border-radius: 9999px;\n background: white;\n padding: 4px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: ${Z_INDEX.BUTTON};\n `;\n\n // Camera button\n const cameraButton = document.createElement(\"button\");\n cameraButton.type = \"button\";\n cameraButton.className = `${CSS_CLASSES.BUTTON} ww-camera-btn`;\n cameraButton.setAttribute(\"aria-label\", \"Virtual Try-On\");\n cameraButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n cameraButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-camera\">\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\"></path>\n <circle cx=\"12\" cy=\"13\" r=\"3\"></circle>\n </svg>\n `;\n\n cameraButton.onclick = onCameraClick;\n container.appendChild(cameraButton);\n\n // Add refresh and toggle buttons if we have a virtual try-on\n if (hasVirtualTryOn) {\n // Refresh button - calls API again\n if (onRefreshClick) {\n const refreshButton = document.createElement(\"button\");\n refreshButton.type = \"button\";\n refreshButton.className = \"ww-refresh-btn\";\n refreshButton.setAttribute(\"aria-label\", \"Refresh virtual try-on\");\n refreshButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: transparent;\n color: currentColor;\n `;\n\n refreshButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-refresh-ccw\">\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\n <path d=\"M3 3v5h5\"></path>\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\"></path>\n <path d=\"M16 16h5v5\"></path>\n </svg>\n `;\n\n refreshButton.onclick = onRefreshClick;\n container.appendChild(refreshButton);\n }\n\n // Toggle button (scan-face) - switches between original and virtual try-on\n if (onToggleClick) {\n const toggleButton = document.createElement(\"button\");\n toggleButton.type = \"button\";\n toggleButton.className = \"ww-toggle-btn\";\n toggleButton.setAttribute(\n \"aria-label\",\n isShowingVirtualTryOn ? \"Show Original Image\" : \"Show Virtual Try-On\",\n );\n toggleButton.style.cssText = `\n display: flex;\n width: 36px;\n height: 36px;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 8px;\n border: none;\n background: ${isShowingVirtualTryOn ? \"rgba(0, 0, 0)\" : \"none\"};\n color: ${isShowingVirtualTryOn ? \"white\" : \"currentColor\"};\n `;\n\n toggleButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-scan-face\">\n <path d=\"M3 7V5a2 2 0 0 1 2-2h2\"></path>\n <path d=\"M17 3h2a2 2 0 0 1 2 2v2\"></path>\n <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\"></path>\n <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\"></path>\n <path d=\"M8 14s1.5 2 4 2 4-2 4-2\"></path>\n <path d=\"M9 9h.01\"></path>\n <path d=\"M15 9h.01\"></path>\n </svg>\n `;\n\n toggleButton.onclick = onToggleClick;\n container.appendChild(toggleButton);\n }\n }\n\n return container;\n}\n\nexport function createButton(\n buttonPosition: string,\n onClick: () => void,\n disabled: boolean = false,\n): HTMLElement {\n const container = createButtonContainer(buttonPosition, false, onClick);\n const cameraButton = container.querySelector('.ww-camera-btn') as HTMLButtonElement;\n if (cameraButton) {\n cameraButton.disabled = disabled;\n if (disabled) {\n cameraButton.style.opacity = '0.5';\n cameraButton.style.cursor = 'not-allowed';\n cameraButton.title = 'Find your ideal size first';\n }\n }\n return container;\n}\n","import { startCamera, stopCamera } from \"../camera.js\";\nimport { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface CameraModalCallbacks {\n onCapture: (\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement,\n ) => Promise<void>;\n}\n\nexport function showCameraModal(callbacks: CameraModalCallbacks): void {\n console.log(\"[WeWear VTO] Opening camera modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n `;\n\n // Create camera container\n const cameraContainer = document.createElement(\"div\");\n cameraContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 70vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create video element\n const video = document.createElement(\"video\");\n video.autoplay = true;\n video.playsInline = true;\n video.muted = true;\n video.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create canvas for capturing\n const canvas = document.createElement(\"canvas\");\n canvas.style.display = \"none\";\n // Create face overlay\n const faceOverlay = document.createElement(\"div\");\n faceOverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n `;\n // SVG face outline (simple oval)\n faceOverlay.innerHTML = `\n <svg width=\"380\" height=\"520\" viewBox=\"0 0 380 520\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.7;\">\n <ellipse cx=\"190\" cy=\"240\" rx=\"160\" ry=\"220\" stroke=\"rgba(0, 0, 0, 0.7)\" stroke-width=\"6\" fill=\"none\" />\n </svg>\n `;\n\n // Create capture button\n const captureButton = document.createElement(\"button\");\n captureButton.innerHTML = \"\";\n captureButton.style.cssText = `\n position: absolute;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n width: 60px;\n height: 60px;\n border: 3px solid white;\n background-color: rgba(0, 0, 0, 0.7);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create loading indicator\n const loadingIndicator = document.createElement(\"div\");\n loadingIndicator.innerHTML = \"Initializing camera...\";\n loadingIndicator.style.cssText = `\n color: white;\n font-size: 16px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n stopCamera(video);\n modal.remove();\n };\n\n captureButton.onclick = async () => {\n await callbacks.onCapture(video, canvas);\n };\n\n // Assemble the camera modal\n cameraContainer.appendChild(video);\n cameraContainer.appendChild(faceOverlay);\n cameraContainer.appendChild(canvas);\n cameraContainer.appendChild(captureButton);\n cameraContainer.appendChild(closeButton);\n modal.appendChild(cameraContainer);\n\n // Add instruction text outside the camera box\n const instructionText = document.createElement(\"div\");\n instructionText.style.cssText = `\n width: 100%;\n max-width: 500px;\n margin: 18px auto 0 auto;\n text-align: center;\n color: #fff;\n font-size: 18px;\n font-weight: bold;\n text-shadow: 0 2px 8px #000;\n `;\n instructionText.innerText = \"Please align your face inside the outline for better results.\";\n modal.appendChild(instructionText);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Camera modal added to DOM\");\n\n // Start camera\n startCamera(video, loadingIndicator, captureButton);\n}\n","import { Z_INDEX } from \"../constants.js\";\n\n/**\n * Creates a loading overlay that can be shown in different containers\n */\nexport function createLoadingOverlay(\n text: string = \"Processing...\",\n): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"ww-loading-overlay\";\n overlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.8);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL + 1};\n border-radius: inherit;\n `;\n\n // Add CSS animation to the document if not already added\n if (!document.getElementById(\"ww-loading-animation\")) {\n const style = document.createElement(\"style\");\n style.id = \"ww-loading-animation\";\n style.textContent = `\n @keyframes ww-pulse {\n 0%, 100% { opacity: 0.7; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n .ww-loading-overlay .ww-logo {\n animation: ww-pulse 2s ease-in-out infinite;\n }\n `;\n document.head.appendChild(style);\n }\n\n overlay.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; gap: 24px; color: white;\">\n <svg class=\"ww-logo\" width=\"80\" height=\"50\" viewBox=\"0 0 214 135\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_3624_12755)\">\n <path d=\"M102.906 74.8679C102.906 77.9717 101.574 80.7453 98.9104 83.1887C96.6871 85.1918 93.9025 86.6997 90.5566 87.7123C87.695 88.5708 84.6462 89 81.4104 89C73.8821 89 68.0047 87.0189 63.7783 83.0566C59.5519 87.0189 53.6855 89 46.1792 89C42.9434 89 39.9057 88.5708 37.066 87.7123C33.7201 86.6997 30.9245 85.1918 28.6792 83.1887C26.0157 80.7453 24.684 77.9717 24.684 74.8679V41.6509H32.3774V74.8679C32.3774 76.2547 33.489 77.5645 35.7123 78.7972C37.3632 79.7217 39.0692 80.3711 40.8302 80.7453C42.5252 81.1195 44.3082 81.3066 46.1792 81.3066C48.0063 81.3066 49.7673 81.1195 51.4623 80.7453C53.2453 80.3711 54.9623 79.7217 56.6132 78.7972C58.8585 77.5645 59.9811 76.2547 59.9811 74.8679V41.6509H67.6085V74.8679C67.6085 76.2547 68.7311 77.5645 70.9764 78.7972C72.6274 79.7217 74.3443 80.3711 76.1274 80.7453C77.8223 81.1195 79.5833 81.3066 81.4104 81.3066C83.2814 81.3066 85.0755 81.1195 86.7925 80.7453C88.5314 80.3711 90.2264 79.7217 91.8774 78.7972C94.1006 77.5645 95.2123 76.2547 95.2123 74.8679V41.6509H102.906V74.8679ZM189.283 74.8679C189.283 77.9717 187.951 80.7453 185.288 83.1887C183.064 85.1918 180.28 86.6997 176.934 87.7123C174.072 88.5708 171.024 89 167.788 89C160.259 89 154.382 87.0189 150.156 83.0566C145.929 87.0189 140.063 89 132.557 89C129.321 89 126.283 88.5708 123.443 87.7123C120.097 86.6997 117.302 85.1918 115.057 83.1887C112.393 80.7453 111.061 77.9717 111.061 74.8679V41.6509H118.755V74.8679C118.755 76.2547 119.866 77.5645 122.09 78.7972C123.741 79.7217 125.447 80.3711 127.208 80.7453C128.903 81.1195 130.686 81.3066 132.557 81.3066C134.384 81.3066 136.145 81.1195 137.84 80.7453C139.623 80.3711 141.34 79.7217 142.991 78.7972C145.236 77.5645 146.358 76.2547 146.358 74.8679V41.6509H153.986V74.8679C153.986 76.2547 155.108 77.5645 157.354 78.7972C159.005 79.7217 160.722 80.3711 162.505 80.7453C164.2 81.1195 165.961 81.3066 167.788 81.3066C169.659 81.3066 171.453 81.1195 173.17 80.7453C174.909 80.3711 176.604 79.7217 178.255 78.7972C180.478 77.5645 181.59 76.2547 181.59 74.8679V41.6509H189.283V74.8679Z\" fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_3624_12755\">\n <rect width=\"214\" height=\"135\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n <div style=\"font-size: 16px; font-weight: 500; text-align: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\">${text}</div>\n </div>\n `;\n\n return overlay;\n}\n\n/**\n * Shows a loading overlay in a modal container\n */\nexport function showModalLoading(container: HTMLElement): void {\n // Remove any existing loading overlays\n removeModalLoading();\n\n // Show loading in the product area\n showProductLoading(container);\n}\n\n/**\n * Removes loading overlay from modal\n */\nexport function removeModalLoading(): void {\n const existingOverlay = document.body.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n\n/**\n * Shows a loading overlay in the product gallery container\n */\nexport function showProductLoading(\n container: HTMLElement,\n text: string = \"Generating virtual try-on...\",\n): void {\n // Remove any existing loading overlays\n removeProductLoading(container);\n\n // Make container relative if it's not already positioned\n const computedStyle = window.getComputedStyle(container);\n if (computedStyle.position === \"static\") {\n container.style.position = \"relative\";\n }\n\n const loadingOverlay = createLoadingOverlay(text);\n container.appendChild(loadingOverlay);\n}\n\n/**\n * Removes loading overlay from product container\n */\nexport function removeProductLoading(container: HTMLElement): void {\n const existingOverlay = container.querySelector(\".ww-loading-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n}\n","import { CSS_CLASSES, Z_INDEX } from \"../constants.js\";\nimport { removeElements } from \"../utils.js\";\n\nexport interface ReviewModalCallbacks {\n onRetake: () => void;\n onAccept: (imageBlob: Blob) => Promise<void>;\n}\n\nexport function showReviewModal(\n imageBlob: Blob,\n callbacks: ReviewModalCallbacks\n): void {\n console.log(\"[WeWear VTO] Opening review modal...\");\n\n // Remove any existing modals first\n removeElements(`.${CSS_CLASSES.MODAL}`);\n\n // Create image URL for preview\n const imageUrl = URL.createObjectURL(imageBlob);\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = CSS_CLASSES.MODAL;\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: ${Z_INDEX.MODAL};\n padding: 20px;\n box-sizing: border-box;\n gap: 20px;\n `;\n\n // Create review container\n const reviewContainer = document.createElement(\"div\");\n reviewContainer.style.cssText = `\n position: relative;\n width: 100%;\n max-width: 500px;\n height: 63vh;\n background-color: #000;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `;\n\n // Create image element\n const image = document.createElement(\"img\");\n image.src = imageUrl;\n image.alt = \"Review your photo\";\n image.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n `;\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"×\";\n closeButton.style.cssText = `\n position: absolute;\n top: 15px;\n right: 15px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 24px;\n font-weight: bold;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n // Create button container\n const buttonContainer = document.createElement(\"div\");\n buttonContainer.style.cssText = `\n display: flex;\n gap: 15px;\n width: 100%;\n max-width: 500px;\n `;\n\n // Create retake button\n const retakeButton = document.createElement(\"button\");\n retakeButton.textContent = \"Retake\";\n retakeButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(255, 255, 255, 0.9);\n color: black;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Create use photo button\n const usePhotoButton = document.createElement(\"button\");\n usePhotoButton.textContent = \"Use Photo\";\n usePhotoButton.style.cssText = `\n flex: 1;\n padding: 12px 24px;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n border-radius: 8px;\n border: none;\n font-size: 16px;\n font-weight: normal;\n cursor: pointer;\n `;\n\n // Add event listeners\n closeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n };\n\n retakeButton.onclick = () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n callbacks.onRetake();\n };\n\n usePhotoButton.onclick = async () => {\n URL.revokeObjectURL(imageUrl); // Clean up\n modal.remove();\n await callbacks.onAccept(imageBlob);\n };\n\n // Assemble the review modal\n buttonContainer.appendChild(retakeButton);\n buttonContainer.appendChild(usePhotoButton);\n reviewContainer.appendChild(image);\n reviewContainer.appendChild(closeButton);\n modal.appendChild(reviewContainer);\n modal.appendChild(buttonContainer);\n\n document.body.appendChild(modal);\n console.log(\"[WeWear VTO] Review modal added to DOM\");\n}\n","export function showAlert(\r\n container: HTMLElement,\r\n message: string,\r\n type: 'error' | 'warning'\r\n) {\r\n removeAlert(container); // Remove any existing alert\r\n\r\n const alertDiv = document.createElement('div');\r\n alertDiv.className = `ww-alert ww-alert-${type}`;\r\n alertDiv.setAttribute('role', type === 'error' ? 'alert' : 'status');\r\n alertDiv.setAttribute('aria-live', 'assertive');\r\n\r\n alertDiv.style.cssText = `\r\n position: absolute;\r\n top: 16px;\r\n left: 50%;\r\n transform: translateX(-50%) translateY(-10px);\r\n background: ${type === 'error' ? '#FEE2E2' : '#FEF9C3'};\r\n color: ${type === 'error' ? '#B91C1C' : '#92400E'};\r\n border: 1px solid ${type === 'error' ? '#F87171' : '#FBBF24'};\r\n border-radius: 8px;\r\n padding: 12px 16px;\r\n z-index: 9999;\r\n font-size: 15px;\r\n font-weight: 500;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n display: flex;\r\n align-items: center;\r\n min-width: 220px;\r\n max-width: 90%;\r\n opacity: 0;\r\n transition: opacity 0.3s ease, transform 0.3s ease;\r\n `;\r\n\r\n alertDiv.innerHTML = `\r\n <span style=\"flex: 1; line-height: 1.4;\">${message}</span>\r\n <button type=\"button\" aria-label=\"Close alert\"\r\n style=\"\r\n background: none;\r\n border: none;\r\n font-size: 20px;\r\n color: inherit;\r\n cursor: pointer;\r\n margin-left: 12px;\r\n padding: 0;\r\n line-height: 1;\r\n \">\r\n ×\r\n </button>\r\n `;\r\n\r\n // Close on button click\r\n alertDiv.querySelector('button')?.addEventListener('click', () => {\r\n fadeOutAndRemove(alertDiv);\r\n });\r\n\r\n container.appendChild(alertDiv);\r\n\r\n // Animate in\r\n requestAnimationFrame(() => {\r\n alertDiv.style.opacity = '1';\r\n alertDiv.style.transform = 'translateX(-50%) translateY(0)';\r\n });\r\n}\r\n\r\nfunction fadeOutAndRemove(element: HTMLElement) {\r\n element.style.opacity = '0';\r\n element.style.transform = 'translateX(-50%) translateY(-10px)';\r\n setTimeout(() => {\r\n element.remove();\r\n }, 300);\r\n}\r\n\r\nexport function removeAlert(container: HTMLElement) {\r\n const alert = container.querySelector('.ww-alert') as HTMLElement;\r\n if (alert) fadeOutAndRemove(alert);\r\n}\r\n","import { callVirtualTryOnApi } from \"./api.js\";\r\nimport { captureImageFromVideo, stopCamera } from \"./camera.js\";\r\nimport {\r\n type CameraModalCallbacks,\r\n createButton,\r\n createButtonContainer,\r\n type ReviewModalCallbacks,\r\n removeModalLoading,\r\n removeProductLoading,\r\n showCameraModal,\r\n showModalLoading,\r\n showProductLoading,\r\n showReviewModal,\r\n} from \"./components/index.js\";\r\nimport { CSS_CLASSES } from \"./constants.js\";\r\nimport type { VirtualTryOnConfig } from \"./index.js\";\r\nimport { getCookie, removeElements } from \"./utils.js\";\r\nimport { showAlert } from \"./components/alert-overlay.js\";\r\n\r\nexport class VirtualTryOnWidget {\r\n private readonly config: Required<VirtualTryOnConfig>;\r\n private virtualTryOnImageUrl: string | null = null;\r\n private isShowingVirtualTryOn: boolean = false;\r\n private lastApiParams: {\r\n imageBlob: Blob;\r\n ww_access_token: string;\r\n ww_user_id: string;\r\n ww_product_image: string;\r\n } | null = null;\r\n private cookieCheckInterval: number | null = null;\r\n private cameraButton: HTMLButtonElement | null = null;\r\n\r\n constructor(config: VirtualTryOnConfig) {\r\n this.config = {\r\n baseUrl: config.baseUrl,\r\n productPageSelector: config.productPageSelector,\r\n gallerySelector: config.gallerySelector,\r\n productImageSelector: config.productImageSelector,\r\n buttonPosition: config.buttonPosition,\r\n };\r\n }\r\n\r\n /**\r\n * Initializes the virtual try-on widget on the current page\r\n * @returns Promise that resolves when initialization is complete\r\n */\r\n public async init(): Promise<void> {\r\n try {\r\n // Check if we're on a product page\r\n if (!window.location.pathname.includes(this.config.productPageSelector)) {\r\n return;\r\n }\r\n\r\n // Find the gallery container\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (!container || !(container instanceof HTMLElement)) {\r\n console.warn(\r\n \"[WeWear VTO] Gallery container not found:\",\r\n this.config.gallerySelector,\r\n );\r\n return;\r\n }\r\n\r\n // Ensure container has relative positioning for button placement\r\n if (getComputedStyle(container).position === \"static\") {\r\n container.style.position = \"relative\";\r\n }\r\n\r\n // Check required cookies\r\n const ww_access_token = getCookie(\"ww_access_token\");\r\n const ww_user_id = getCookie(\"ww_user_id\");\r\n const cookiesPresent = !!ww_access_token && !!ww_user_id;\r\n\r\n // Create and add the virtual try-on button\r\n const button = createButton(this.config.buttonPosition, async () => {\r\n if (this.cameraButton && !this.cameraButton.disabled) {\r\n await this.handleTryOnClick();\r\n }\r\n }, !cookiesPresent);\r\n\r\n // Store reference to camera button for dynamic enable/disable\r\n this.cameraButton = button.querySelector('.ww-camera-btn');\r\n container.appendChild(button);\r\n console.log(\"[WeWear VTO] Widget initialized successfully\");\r\n\r\n // Periodically check cookies and update button state\r\n this.cookieCheckInterval = window.setInterval(() => {\r\n const accessToken = getCookie(\"ww_access_token\");\r\n const userId = getCookie(\"ww_user_id\");\r\n const present = !!accessToken && !!userId;\r\n if (this.cameraButton) {\r\n if (present && this.cameraButton.disabled) {\r\n this.cameraButton.disabled = false;\r\n this.cameraButton.style.opacity = '1';\r\n this.cameraButton.style.cursor = 'pointer';\r\n this.cameraButton.title = '';\r\n } else if (!present && !this.cameraButton.disabled) {\r\n this.cameraButton.disabled = true;\r\n this.cameraButton.style.opacity = '0.5';\r\n this.cameraButton.style.cursor = 'not-allowed';\r\n this.cameraButton.title = 'Required cookies missing';\r\n }\r\n }\r\n }, 2000); // check every 2 seconds\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Initialization failed:\", error);\r\n }\r\n }\r\n\r\n /**\r\n * Handles virtual try-on button click\r\n * @private\r\n */\r\n private async handleTryOnClick(): Promise<void> {\r\n console.log(\"[WeWear VTO] Button clicked, starting try-on process...\");\r\n\r\n try {\r\n // Get required data\r\n const ww_access_token = getCookie(\"ww_access_token\");\r\n const ww_user_id = getCookie(\"ww_user_id\");\r\n const productImageElement = document.querySelector(this.config.productImageSelector) as HTMLImageElement;\r\n const ww_product_image = productImageElement?.src || productImageElement?.getAttribute('data-src') || '';\r\n\r\n console.log(\"[WeWear VTO] Retrieved data:\", {\r\n ww_user_id,\r\n ww_product_image,\r\n ww_access_token,\r\n });\r\n\r\n // Validate required data\r\n if (!ww_user_id) {\r\n console.warn(\"[WeWear VTO] Missing required cookie: ww_user_id\");\r\n return;\r\n }\r\n\r\n if (!ww_product_image) {\r\n console.warn(\r\n \"[WeWear VTO] Product image not found:\",\r\n this.config.productImageSelector,\r\n );\r\n return;\r\n }\r\n\r\n if (!ww_access_token) {\r\n console.warn(\"[WeWear VTO] Missing required cookie: ww_access_token\");\r\n return;\r\n }\r\n\r\n // Show camera capture modal\r\n this.showCameraModalWithCallbacks(\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n );\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Try-on request failed:\", error);\r\n }\r\n }\r\n\r\n /**\r\n * Shows camera modal with appropriate callbacks\r\n * @private\r\n */\r\n private showCameraModalWithCallbacks(\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ): void {\r\n const callbacks: CameraModalCallbacks = {\r\n onCapture: async (video: HTMLVideoElement, canvas: HTMLCanvasElement) => {\r\n try {\r\n // Capture image from video\r\n const imageBlob = await captureImageFromVideo(video, canvas);\r\n\r\n // Stop camera and show review modal\r\n stopCamera(video);\r\n\r\n // Show review modal instead of immediately processing\r\n this.showReviewModalWithCallbacks(\r\n imageBlob,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n );\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Image capture error:\", error);\r\n }\r\n },\r\n };\r\n\r\n showCameraModal(callbacks);\r\n }\r\n\r\n /**\r\n * Shows review modal with appropriate callbacks\r\n * @private\r\n */\r\n private showReviewModalWithCallbacks(\r\n imageBlob: Blob,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n ): void {\r\n const callbacks: ReviewModalCallbacks = {\r\n onRetake: () => {\r\n // Reopen camera modal\r\n this.showCameraModalWithCallbacks(\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n );\r\n },\r\n onAccept: async (acceptedImageBlob: Blob) => {\r\n await this.processAcceptedImage(\r\n acceptedImageBlob,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n document.querySelector(this.config.gallerySelector) as HTMLElement\r\n );\r\n },\r\n };\r\n\r\n showReviewModal(imageBlob, callbacks);\r\n }\r\n\r\n /**\r\n * Processes the accepted image by calling the API\r\n * @private\r\n */\r\n private async processAcceptedImage(\r\n imageBlob: Blob,\r\n ww_access_token: string,\r\n ww_user_id: string,\r\n ww_product_image: string,\r\n container: HTMLElement\r\n ): Promise<void> {\r\n try {\r\n console.log(\"[WeWear VTO] Processing accepted image...\");\r\n\r\n // Show loading in the review modal first\r\n showModalLoading(container);\r\n\r\n // Store the API parameters for potential refresh\r\n this.lastApiParams = {\r\n imageBlob,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n };\r\n\r\n // Call the API with the accepted image\r\n const result = await callVirtualTryOnApi(\r\n this.config.baseUrl,\r\n ww_access_token,\r\n ww_user_id,\r\n ww_product_image,\r\n imageBlob,\r\n );\r\n\r\n // Remove modal loading and close modal\r\n removeModalLoading();\r\n removeElements(`.${CSS_CLASSES.MODAL}`);\r\n\r\n if (result?.imageUrl) {\r\n this.replaceProductImage(result.imageUrl);\r\n } else if (result?.error) {\r\n showAlert(container, result.error.message, result.error.type);\r\n }\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error processing accepted image:\", error);\r\n // Remove loading on error\r\n removeModalLoading();\r\n }\r\n }\r\n\r\n /**\r\n * Recalls the virtual try-on API with the same parameters\r\n * @private\r\n */\r\n private async refreshVirtualTryOn(): Promise<void> {\r\n if (!this.lastApiParams) {\r\n console.warn(\r\n \"[WeWear VTO] No previous API parameters available for refresh\",\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n console.log(\r\n \"[WeWear VTO] Refreshing virtual try-on with previous parameters...\",\r\n );\r\n\r\n // Show loading in the product area\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n showProductLoading(container, \"Generating new virtual try-on...\");\r\n }\r\n\r\n // Call the API with the stored parameters\r\n const result = await callVirtualTryOnApi(\r\n this.config.baseUrl,\r\n this.lastApiParams.ww_access_token,\r\n this.lastApiParams.ww_user_id,\r\n this.lastApiParams.ww_product_image,\r\n this.lastApiParams.imageBlob,\r\n );\r\n\r\n if (result?.imageUrl) {\r\n this.virtualTryOnImageUrl = result.imageUrl;\r\n\r\n // Find the gallery container and update the image\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n removeProductLoading(container);\r\n this.showVirtualTryOnImage(container);\r\n this.updateButtonContainer(container);\r\n }\r\n } else if (result?.error) {\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n removeProductLoading(container);\r\n showAlert(container, result.error.message, result.error.type);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error refreshing virtual try-on:\", error);\r\n // Remove loading on error\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (container instanceof HTMLElement) {\r\n removeProductLoading(container);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Replaces the product image in the gallery with the virtual try-on result\r\n * @private\r\n */\r\n private replaceProductImage(imageUrl: string): void {\r\n try {\r\n // Store the virtual try-on image URL\r\n this.virtualTryOnImageUrl = imageUrl;\r\n\r\n // Find the gallery container\r\n const container = document.querySelector(this.config.gallerySelector);\r\n if (!container || !(container instanceof HTMLElement)) {\r\n console.warn(\r\n \"[WeWear VTO] Gallery container not found for image replacement:\",\r\n this.config.gallerySelector,\r\n );\r\n return;\r\n }\r\n\r\n // Store the original content if not already stored\r\n if (!container.hasAttribute(\"data-ww-original-content\")) {\r\n container.setAttribute(\"data-ww-original-content\", container.innerHTML);\r\n }\r\n\r\n // Capture original image dimensions before replacement to prevent layout shift\r\n const originalImg = container.querySelector('img');\r\n if (originalImg && !container.hasAttribute(\"data-ww-original-dimensions\")) {\r\n const computedStyle = window.getComputedStyle(originalImg);\r\n const rect = originalImg.getBoundingClientRect();\r\n container.setAttribute(\"data-ww-original-width\", computedStyle.width);\r\n container.setAttribute(\"data-ww-original-height\", computedStyle.height);\r\n container.setAttribute(\"data-ww-original-rect-width\", rect.width.toString());\r\n container.setAttribute(\"data-ww-original-rect-height\", rect.height.toString());\r\n container.setAttribute(\"data-ww-original-dimensions\", \"true\");\r\n }\r\n\r\n // Show the virtual try-on image initially\r\n this.showVirtualTryOnImage(container);\r\n\r\n // Replace the button container with the new multi-button version\r\n this.updateButtonContainer(container);\r\n\r\n console.log(\r\n \"[WeWear VTO] Product image replaced with virtual try-on result\",\r\n );\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error replacing product image:\", error);\r\n }\r\n }\r\n\r\n /**\r\n * Updates the button container to show all available buttons\r\n * @private\r\n */\r\n private updateButtonContainer(container: HTMLElement): void {\r\n // Remove existing button containers\r\n const existingButtons = container.querySelectorAll(\r\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\r\n );\r\n existingButtons.forEach((btn) => {\r\n btn.remove();\r\n });\r\n\r\n // Create new button container with all buttons\r\n const buttonContainer = createButtonContainer(\r\n this.config.buttonPosition,\r\n this.virtualTryOnImageUrl !== null,\r\n async () => {\r\n await this.handleTryOnClick();\r\n },\r\n async () => {\r\n await this.refreshVirtualTryOn();\r\n },\r\n () => {\r\n if (this.isShowingVirtualTryOn) {\r\n this.showOriginalImage(container);\r\n } else {\r\n this.showVirtualTryOnImage(container);\r\n }\r\n this.updateButtonContainer(container);\r\n },\r\n this.isShowingVirtualTryOn,\r\n );\r\n\r\n container.appendChild(buttonContainer);\r\n }\r\n\r\n /**\r\n * Shows the virtual try-on image in the container\r\n * @private\r\n */\r\n private showVirtualTryOnImage(container: HTMLElement): void {\r\n if (!this.virtualTryOnImageUrl) {\r\n console.warn(\"[WeWear VTO] No virtual try-on image URL available\");\r\n return;\r\n }\r\n\r\n // Clear existing content except buttons\r\n const existingButtons = container.querySelectorAll(\r\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\r\n );\r\n container.innerHTML = \"\";\r\n\r\n // Get stored original dimensions to prevent layout shift\r\n const originalWidth = container.getAttribute(\"data-ww-original-width\") || '';\r\n const originalHeight = container.getAttribute(\"data-ww-original-height\") || '';\r\n const originalRectWidth = container.getAttribute(\"data-ww-original-rect-width\") || '';\r\n const originalRectHeight = container.getAttribute(\"data-ww-original-rect-height\") || '';\r\n\r\n const image = document.createElement(\"img\");\r\n image.src = this.virtualTryOnImageUrl;\r\n image.alt = \"Virtual Try-On Result\";\r\n\r\n // Use original dimensions to prevent layout shift\r\n let widthStyle = '100%';\r\n let heightStyle = '100%';\r\n\r\n // Prefer computed style dimensions, fallback to bounding rect, then container fill\r\n if (originalWidth && originalWidth !== 'auto' && originalWidth !== '0px') {\r\n widthStyle = originalWidth;\r\n } else if (originalRectWidth && originalRectWidth !== '0') {\r\n widthStyle = `${originalRectWidth}px`;\r\n }\r\n\r\n if (originalHeight && originalHeight !== 'auto' && originalHeight !== '0px') {\r\n heightStyle = originalHeight;\r\n } else if (originalRectHeight && originalRectHeight !== '0') {\r\n heightStyle = `${originalRectHeight}px`;\r\n }\r\n\r\n image.style.cssText = `\r\n width: ${widthStyle};\r\n height: ${heightStyle};\r\n object-fit: cover;\r\n border-radius: 8px;\r\n `;\r\n\r\n container.appendChild(image);\r\n\r\n // Re-add buttons\r\n existingButtons.forEach((btn) => {\r\n container.appendChild(btn);\r\n });\r\n\r\n this.isShowingVirtualTryOn = true;\r\n }\r\n\r\n /**\r\n * Shows the original product image in the container\r\n * @private\r\n */\r\n private showOriginalImage(container: HTMLElement): void {\r\n const originalContent = container.getAttribute(\"data-ww-original-content\");\r\n if (originalContent) {\r\n // Store existing buttons\r\n const existingButtons = container.querySelectorAll(\r\n `.${CSS_CLASSES.BUTTON_CONTAINER}`,\r\n );\r\n\r\n // Restore original content\r\n container.innerHTML = originalContent;\r\n\r\n // Re-add buttons\r\n existingButtons.forEach((btn) => {\r\n container.appendChild(btn);\r\n });\r\n }\r\n\r\n this.isShowingVirtualTryOn = false;\r\n }\r\n\r\n /**\r\n * Destroys the widget and cleans up resources\r\n */\r\n public destroy(): void {\r\n try {\r\n // Remove all buttons\r\n removeElements(`.${CSS_CLASSES.BUTTON_CONTAINER}`);\r\n\r\n // Remove all modals\r\n removeElements(`.${CSS_CLASSES.MODAL}`);\r\n\r\n // Clear interval\r\n if (this.cookieCheckInterval !== null) {\r\n clearInterval(this.cookieCheckInterval);\r\n this.cookieCheckInterval = null;\r\n }\r\n this.cameraButton = null;\r\n\r\n // Reset state\r\n this.virtualTryOnImageUrl = null;\r\n this.isShowingVirtualTryOn = false;\r\n this.lastApiParams = null;\r\n\r\n console.log(\"[WeWear VTO] Widget destroyed successfully\");\r\n } catch (error) {\r\n console.error(\"[WeWear VTO] Error during widget destruction:\", error);\r\n }\r\n }\r\n}\r\n","import type { VirtualTryOnConfig } from \"./index.js\";\nimport { VirtualTryOnWidget } from \"./widget.js\";\n\nlet widgetInstance: VirtualTryOnWidget | null = null;\n\nexport function initVirtualTryOn(config?: VirtualTryOnConfig): void {\n try {\n // Clean up any existing instance\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n }\n\n // Early return if config is missing\n if (!config) {\n console.log(\"[WeWear VTO] Missing configuration. Widget not initialized.\");\n return;\n }\n\n // Create and initialize new instance\n widgetInstance = new VirtualTryOnWidget(config);\n\n // Initialize immediately if DOM is ready, otherwise wait for it\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => {\n widgetInstance?.init().catch((error) => {\n console.error(\n \"[WeWear VTO] Failed to initialize after DOM ready:\",\n error,\n );\n });\n });\n } else {\n widgetInstance.init().catch((error) => {\n console.error(\"[WeWear VTO] Failed to initialize:\", error);\n });\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Initialization error:\", error);\n }\n}\n\nexport function destroyVirtualTryOn(): void {\n try {\n if (widgetInstance) {\n widgetInstance.destroy();\n widgetInstance = null;\n console.log(\"[WeWear VTO] Widget instance destroyed\");\n }\n } catch (error) {\n console.error(\"[WeWear VTO] Error destroying widget:\", error);\n }\n}\n\nexport function getWidgetInstance(): VirtualTryOnWidget | null {\n return widgetInstance;\n}\n\nif (typeof window !== \"undefined\") {\n initVirtualTryOn();\n}\n"],"names":[],"mappings":"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"}
|