@primestyleai/tryon 5.10.173 → 5.10.175

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/api-client.d.ts +8 -3
  2. package/dist/image-utils.d.ts +1 -0
  3. package/dist/{index-B1_VQgps.js → index-D4yjnBvO.js} +147 -82
  4. package/dist/index-D4yjnBvO.js.map +1 -0
  5. package/dist/primestyle-tryon.js +6 -5
  6. package/dist/primestyle-tryon.js.map +1 -1
  7. package/dist/react/PrimeStyleTryonInner.d.ts +7 -2
  8. package/dist/react/components/LangSwitcher.d.ts +2 -1
  9. package/dist/react/components/ProfileDetailModal.d.ts +2 -1
  10. package/dist/react/icons.d.ts +3 -0
  11. package/dist/react/index.js +9334 -6250
  12. package/dist/react/index.js.map +1 -1
  13. package/dist/react/recommendForProduct.d.ts +6 -0
  14. package/dist/react/styles.d.ts +1 -1
  15. package/dist/react/types.d.ts +56 -0
  16. package/dist/react/utils/locale.d.ts +3 -1
  17. package/dist/react/utils/product-fit.d.ts +19 -0
  18. package/dist/react/utils/profile-auth.d.ts +10 -0
  19. package/dist/react/utils/profile-image.d.ts +3 -0
  20. package/dist/react/utils/remote-profiles.d.ts +7 -0
  21. package/dist/react/utils/shoe-reference.d.ts +39 -0
  22. package/dist/react/views/AccessorySizeView.d.ts +1 -0
  23. package/dist/react/views/BasicsStepMobile.d.ts +3 -1
  24. package/dist/react/views/BodyProfileView.d.ts +11 -3
  25. package/dist/react/views/CreateProfileWizard.d.ts +4 -2
  26. package/dist/react/views/ErrorView.d.ts +4 -3
  27. package/dist/react/views/FootSizeView.d.ts +1 -0
  28. package/dist/react/views/MobileScanningView.d.ts +5 -1
  29. package/dist/react/views/MultiSectionMobile.d.ts +7 -2
  30. package/dist/react/views/MySizingProfilesView.d.ts +5 -2
  31. package/dist/react/views/PhotoGuideView.d.ts +1 -1
  32. package/dist/react/views/PhotoStepMobile.d.ts +3 -1
  33. package/dist/react/views/ProductPhotoCarouselCard.d.ts +8 -2
  34. package/dist/react/views/SizeResultView.d.ts +8 -2
  35. package/dist/react/views/SocialProfileAuthView.d.ts +10 -0
  36. package/dist/react/views/WristSizeView.d.ts +28 -0
  37. package/dist/sizing/fit-compute.d.ts +8 -0
  38. package/dist/storefront/cart-hook.d.ts +4 -4
  39. package/dist/storefront/events.d.ts +6 -0
  40. package/dist/storefront/primestyle-tryon.js +4755 -1046
  41. package/dist/types.d.ts +5 -0
  42. package/package.json +2 -3
  43. package/dist/index-B1_VQgps.js.map +0 -1
@@ -3,6 +3,9 @@ export interface TryOnContext {
3
3
  /** Storefront product the customer is currently viewing — shown in analytics. */
4
4
  productId?: string;
5
5
  productTitle?: string;
6
+ productFitType?: string;
7
+ productType?: string;
8
+ productTags?: string[];
6
9
  /** Free-text product description forwarded to the try-on prompt so Gemini
7
10
  * knows the garment context (e.g. "Brown slip maxi dress, spaghetti straps"). */
8
11
  productDescription?: string;
@@ -30,15 +33,17 @@ export interface TryOnContext {
30
33
  * drift). On cache miss the SDK should fall back to sending the full image. */
31
34
  modelImageId?: string;
32
35
  }
36
+ export type TryOnCategory = "apparel" | "shoe" | "bag" | "hat" | "sunglasses" | "earring" | "necklace" | "bracelet" | "ring" | "belt" | "watch" | "accessory";
33
37
  export declare class ApiClient {
34
- private apiKey;
38
+ private apiKey?;
35
39
  private baseUrl;
36
- constructor(apiKey: string, apiUrl?: string);
40
+ constructor(apiKey?: string, apiUrl?: string);
37
41
  private get headers();
38
- submitTryOn(modelImage: string, garmentImage: string, fitInfo?: FitAreaInfo[], category?: "apparel" | "hat" | "sunglasses", context?: TryOnContext): Promise<TryOnResponse>;
42
+ submitTryOn(modelImage: string, garmentImage: string, fitInfo?: FitAreaInfo[], category?: TryOnCategory, context?: TryOnContext): Promise<TryOnResponse>;
39
43
  getStatus(jobId: string): Promise<TryOnStatus>;
40
44
  getStreamUrl(): string;
41
45
  }
46
+ export declare function jsonHeaders(apiKey?: string): Record<string, string>;
42
47
  export declare class PrimeStyleError extends Error {
43
48
  code: string;
44
49
  constructor(message: string, code: string);
@@ -33,4 +33,5 @@ export declare function checkAgeBeforeUpload(imageOrBase64: string | File, apiUr
33
33
  isAdult: boolean;
34
34
  confidence: "high" | "low";
35
35
  reasoning?: string;
36
+ detectedGender?: "male" | "female" | "unknown";
36
37
  }>;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- const p = "ps_session";
2
+ const g = "ps_session";
3
3
  const E = "ps_mem_";
4
4
  let f = null;
5
5
  function y() {
@@ -20,7 +20,7 @@ function b() {
20
20
  function P() {
21
21
  if (!y()) return f;
22
22
  try {
23
- const t = window.localStorage.getItem(p);
23
+ const t = window.localStorage.getItem(g);
24
24
  if (!t) return null;
25
25
  const e = JSON.parse(t);
26
26
  return typeof e.id != "string" || typeof e.issuedAt != "number" ? null : {
@@ -32,51 +32,48 @@ function P() {
32
32
  return null;
33
33
  }
34
34
  }
35
- function g(t) {
35
+ function p(t) {
36
36
  if (f = t, !!y())
37
37
  try {
38
- window.localStorage.setItem(p, JSON.stringify(t));
38
+ window.localStorage.setItem(g, JSON.stringify(t));
39
39
  } catch {
40
40
  }
41
41
  }
42
42
  function A() {
43
43
  const t = Date.now(), e = P();
44
44
  if (e && t - e.lastSeenAt < 2592e6)
45
- return t - e.lastSeenAt > 5 * 60 * 1e3 && g({ ...e, lastSeenAt: t }), e.id;
45
+ return t - e.lastSeenAt > 5 * 60 * 1e3 && p({ ...e, lastSeenAt: t }), e.id;
46
46
  const o = { id: b(), issuedAt: t, lastSeenAt: t };
47
- return g(o), o.id;
47
+ return p(o), o.id;
48
48
  }
49
- function I() {
49
+ function T() {
50
50
  if (typeof navigator > "u") return null;
51
51
  const t = (navigator.userAgent || "").toLowerCase();
52
52
  return /ipad|tablet|(android(?!.*mobile))/.test(t) ? "tablet" : /mobile|android|iphone|ipod|blackberry|iemobile|opera mini/.test(t) ? "mobile" : "desktop";
53
53
  }
54
- const T = "http://localhost:4000";
55
- class O {
54
+ const I = "http://localhost:4000";
55
+ class W {
56
56
  constructor(e, o) {
57
- this.apiKey = e, this.baseUrl = (o || T).replace(/\/+$/, "");
57
+ this.apiKey = e || void 0, this.baseUrl = (o || I).replace(/\/+$/, "");
58
58
  }
59
59
  get headers() {
60
- return {
61
- "Content-Type": "application/json",
62
- Authorization: `Bearer ${this.apiKey}`
63
- };
60
+ return v(this.apiKey);
64
61
  }
65
- async submitTryOn(e, o, a, u, r) {
62
+ async submitTryOn(e, o, a, s, r) {
66
63
  const i = {
67
64
  garmentImage: o,
68
65
  // Attribution fields — backend logs these into the TryOnEvent collection
69
66
  // so non-technical operators can answer "which products are being tried on
70
67
  // and by how many customers". Safe fallbacks when absent.
71
68
  sessionId: A(),
72
- deviceHint: I()
69
+ deviceHint: T()
73
70
  };
74
- if (r?.modelImageId && (i.modelImageId = r.modelImageId), e && (i.modelImage = e), a && a.length > 0 && (i.fitInfo = a), u && u !== "apparel" && (i.category = u), r?.productId && (i.productId = r.productId), r?.productTitle && (i.productTitle = r.productTitle), r?.productDescription && (i.productDescription = r.productDescription), r?.productMaterial && (i.productMaterial = r.productMaterial), r?.silhouetteContext && (i.silhouetteContext = r.silhouetteContext), r?.editFromPrevious && (i.editFromPrevious = !0), a && a.length > 0)
75
- for (const s of a) {
76
- const n = (s.garmentRange || "").replace(/[^\d.\-–]/g, " ").trim().split(/[\s\-–]+/).filter(Boolean).map(Number).filter((l) => !isNaN(l));
77
- if (n.length && s.userValue != null) {
78
- const l = (Math.min(...n) + Math.max(...n)) / 2;
79
- Math.round((s.userValue - l) * 10) / 10;
71
+ if (r?.modelImageId && (i.modelImageId = r.modelImageId), e && (i.modelImage = e), a && a.length > 0 && (i.fitInfo = a), s && s !== "apparel" && (i.category = s), r?.productId && (i.productId = r.productId), r?.productTitle && (i.productTitle = r.productTitle), r?.productFitType && (i.productFitType = r.productFitType), r?.productType && (i.productType = r.productType), r?.productTags?.length && (i.productTags = r.productTags), r?.productDescription && (i.productDescription = r.productDescription), r?.productMaterial && (i.productMaterial = r.productMaterial), r?.silhouetteContext && (i.silhouetteContext = r.silhouetteContext), r?.editFromPrevious && (i.editFromPrevious = !0), a && a.length > 0)
72
+ for (const n of a) {
73
+ const l = (n.garmentRange || "").replace(/[^\d.\-–]/g, " ").trim().split(/[\s\-–]+/).filter(Boolean).map(Number).filter((u) => !isNaN(u));
74
+ if (l.length && n.userValue != null) {
75
+ const u = (Math.min(...l) + Math.max(...l)) / 2;
76
+ Math.round((n.userValue - u) * 10) / 10;
80
77
  }
81
78
  }
82
79
  const d = await fetch(`${this.baseUrl}/api/v1/tryon`, {
@@ -85,12 +82,12 @@ class O {
85
82
  body: JSON.stringify(i)
86
83
  });
87
84
  if (!d.ok) {
88
- const s = await d.json().catch(() => ({}));
85
+ const n = await d.json().catch(() => ({}));
89
86
  throw d.status === 402 ? new c(
90
- s.message || "Insufficient try-ons",
87
+ n.message || "Insufficient try-ons",
91
88
  "INSUFFICIENT_BALANCE"
92
89
  ) : new c(
93
- s.message || "Failed to submit try-on",
90
+ n.message || "Failed to submit try-on",
94
91
  "API_ERROR"
95
92
  );
96
93
  }
@@ -110,15 +107,20 @@ class O {
110
107
  return o.json();
111
108
  }
112
109
  getStreamUrl() {
113
- return `${this.baseUrl}/api/v1/tryon/stream?key=${encodeURIComponent(this.apiKey)}`;
110
+ const e = `${this.baseUrl}/api/v1/tryon/stream`;
111
+ return this.apiKey ? `${e}?key=${encodeURIComponent(this.apiKey)}` : e;
114
112
  }
115
113
  }
114
+ function v(t) {
115
+ const e = { "Content-Type": "application/json" };
116
+ return t && (e.Authorization = `Bearer ${t}`), e;
117
+ }
116
118
  class c extends Error {
117
119
  constructor(e, o) {
118
120
  super(e), this.name = "PrimeStyleError", this.code = o;
119
121
  }
120
122
  }
121
- class W {
123
+ class Y {
122
124
  constructor(e) {
123
125
  this.eventSource = null, this.listeners = /* @__PURE__ */ new Map(), this.reconnectTimer = null, this.reconnectAttempts = 0, this.maxReconnectAttempts = 5, this.streamUrl = e;
124
126
  }
@@ -129,7 +131,20 @@ class W {
129
131
  this.emit(o.galleryId, o);
130
132
  } catch {
131
133
  }
132
- }), this.eventSource.onopen = () => {
134
+ }), this.eventSource.onmessage = (e) => {
135
+ try {
136
+ const o = JSON.parse(e.data), a = this.listeners.keys().next().value, s = o.galleryId || o.jobId || a;
137
+ if (!s) return;
138
+ this.emit(s, {
139
+ galleryId: s,
140
+ status: o.status,
141
+ imageUrl: o.imageUrl ?? null,
142
+ error: o.error ?? null,
143
+ timestamp: o.timestamp ?? Date.now()
144
+ });
145
+ } catch {
146
+ }
147
+ }, this.eventSource.onopen = () => {
133
148
  this.reconnectAttempts = 0;
134
149
  }, this.eventSource.onerror = () => {
135
150
  this.eventSource?.close(), this.eventSource = null, this.scheduleReconnect();
@@ -150,45 +165,45 @@ class W {
150
165
  }
151
166
  emit(e, o) {
152
167
  const a = this.listeners.get(e);
153
- a && a.forEach((u) => u(o));
168
+ a && a.forEach((s) => s(o));
154
169
  }
155
170
  disconnect() {
156
171
  this.reconnectTimer && (clearTimeout(this.reconnectTimer), this.reconnectTimer = null), this.eventSource && (this.eventSource.close(), this.eventSource = null), this.listeners.clear(), this.reconnectAttempts = 0;
157
172
  }
158
173
  }
159
- const v = 512, w = 0.65;
160
- function C(t, e = {}) {
161
- const o = e.maxDimension ?? v, a = e.quality ?? w;
162
- return new Promise((u, r) => {
174
+ const w = 512, C = 0.65;
175
+ function U(t, e = {}) {
176
+ const o = e.maxDimension ?? w, a = e.quality ?? C;
177
+ return new Promise((s, r) => {
163
178
  const i = new FileReader();
164
179
  i.onload = () => {
165
180
  const d = new Image();
166
181
  d.onload = () => {
167
182
  try {
168
- const s = document.createElement("canvas");
169
- let { width: n, height: l } = d;
170
- (n > o || l > o) && (n > l ? (l = Math.round(l * o / n), n = o) : (n = Math.round(n * o / l), l = o)), s.width = n, s.height = l;
171
- const m = s.getContext("2d");
183
+ const n = document.createElement("canvas");
184
+ let { width: l, height: u } = d;
185
+ (l > o || u > o) && (l > u ? (u = Math.round(u * o / l), l = o) : (l = Math.round(l * o / u), u = o)), n.width = l, n.height = u;
186
+ const m = n.getContext("2d");
172
187
  if (!m) {
173
188
  r(new Error("Canvas context not available"));
174
189
  return;
175
190
  }
176
- m.drawImage(d, 0, 0, n, l);
177
- const S = s.toDataURL("image/jpeg", a);
178
- u(S);
179
- } catch (s) {
180
- r(s);
191
+ m.drawImage(d, 0, 0, l, u);
192
+ const S = n.toDataURL("image/jpeg", a);
193
+ s(S);
194
+ } catch (n) {
195
+ r(n);
181
196
  }
182
197
  }, d.onerror = () => r(new Error("Failed to load image")), d.src = i.result;
183
198
  }, i.onerror = () => r(new Error("Failed to read file")), i.readAsDataURL(t);
184
199
  });
185
200
  }
186
- function Y(t) {
201
+ function F(t) {
187
202
  return ["image/jpeg", "image/png", "image/webp", "image/avif"].includes(t.type);
188
203
  }
189
- async function F(t, e, o) {
204
+ async function K(t, e, o) {
190
205
  try {
191
- const a = typeof t == "string" ? t : await C(t, { maxDimension: 384, quality: 0.6 }), u = await fetch(`${e}/api/v1/sizing/age-check`, {
206
+ const a = typeof t == "string" ? t : await U(t, { maxDimension: 384, quality: 0.6 }), s = await fetch(`${e}/api/v1/sizing/age-check`, {
192
207
  method: "POST",
193
208
  headers: {
194
209
  "Content-Type": "application/json",
@@ -196,13 +211,14 @@ async function F(t, e, o) {
196
211
  },
197
212
  body: JSON.stringify({ bodyImage: a })
198
213
  });
199
- if (!u.ok)
214
+ if (!s.ok)
200
215
  return { isAdult: !0, confidence: "low" };
201
- const r = await u.json();
216
+ const r = await s.json();
202
217
  return {
203
218
  isAdult: r?.isAdult !== !1,
204
219
  // anything other than explicit false → allow
205
220
  confidence: r?.confidence === "high" ? "high" : "low",
221
+ detectedGender: r?.detectedGender === "male" || r?.detectedGender === "female" || r?.detectedGender === "unknown" ? r.detectedGender : void 0,
206
222
  reasoning: typeof r?.reasoning == "string" ? r.reasoning : void 0
207
223
  };
208
224
  } catch {
@@ -210,17 +226,17 @@ async function F(t, e, o) {
210
226
  }
211
227
  }
212
228
  const h = {};
213
- function U(t, e) {
229
+ function z(t, e) {
214
230
  h[t] = { ...h[t] || {}, ...e };
215
231
  }
216
- function K(t) {
232
+ function j(t) {
217
233
  const e = t?.toLowerCase().split("-")[0] || "en";
218
234
  return (o) => e === "en" || !h[e] ? o : h[e][o] ?? o;
219
235
  }
220
236
  function V() {
221
237
  return typeof navigator > "u" ? "en" : (navigator.language || navigator.userLanguage || "en").split("-")[0].toLowerCase();
222
238
  }
223
- const j = [
239
+ const J = [
224
240
  "en",
225
241
  "es",
226
242
  "fr",
@@ -231,7 +247,7 @@ const j = [
231
247
  "zh",
232
248
  "ko",
233
249
  "ar"
234
- ], x = {
250
+ ], q = {
235
251
  en: "English",
236
252
  es: "Español",
237
253
  fr: "Français",
@@ -242,9 +258,13 @@ const j = [
242
258
  zh: "中文",
243
259
  ko: "한국어",
244
260
  ar: "العربية"
245
- }, J = [
261
+ }, x = [
246
262
  "Virtual Try-On",
247
263
  "Find Your Size & See It On You",
264
+ "See Your Fit",
265
+ "Your fit basics are saved",
266
+ "Add one profile photo to reuse your measurements across PrimeStyleAI products.",
267
+ "Complete Profile",
248
268
  "Get the perfect fit, then try it on virtually",
249
269
  "Get Your Size",
250
270
  "Instant fit recommendation",
@@ -280,6 +300,7 @@ const j = [
280
300
  "Your fit",
281
301
  "Your measure",
282
302
  "perfect fit",
303
+ "within range",
283
304
  "too tight",
284
305
  "tight",
285
306
  "a bit tight",
@@ -305,6 +326,9 @@ const j = [
305
326
  "This usually takes 15-25 seconds",
306
327
  "Something went wrong",
307
328
  "Try Again",
329
+ "We couldn't find a matching size for you",
330
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.",
331
+ "Try manual measurements",
308
332
  "SDK not configured. Please provide an API key.",
309
333
  "Please upload a JPEG, PNG, or WebP image.",
310
334
  "Image must be under 10MB.",
@@ -391,6 +415,8 @@ const j = [
391
415
  "Long",
392
416
  "Perfect",
393
417
  "Perfect fit",
418
+ "Within range",
419
+ "WITHIN RANGE",
394
420
  "✓ Fit",
395
421
  // Lowercase variants used inline by fitLabelFn / lengthFitLabelFn
396
422
  "tight",
@@ -398,6 +424,7 @@ const j = [
398
424
  "short",
399
425
  "long",
400
426
  "perfect fit",
427
+ "within range",
401
428
  "too tight",
402
429
  "a bit tight",
403
430
  "too loose",
@@ -420,6 +447,7 @@ const j = [
420
447
  ], D = {
421
448
  "Virtual Try-On": "Probador Virtual",
422
449
  "Find Your Size & See It On You": "Encuentra tu talla y pruébatelo",
450
+ "See Your Fit": "Ver tu ajuste",
423
451
  "Get the perfect fit, then try it on virtually": "Encuentra el ajuste perfecto y pruébatelo virtualmente",
424
452
  "Get Your Size": "Tu talla",
425
453
  "Instant fit recommendation": "Recomendación de ajuste instantánea",
@@ -482,6 +510,9 @@ const j = [
482
510
  "This usually takes 15-25 seconds": "Normalmente tarda 15-25 segundos",
483
511
  "Something went wrong": "Algo salió mal",
484
512
  "Try Again": "Intentar de nuevo",
513
+ "We couldn't find a matching size for you": "No pudimos encontrar una talla adecuada para ti",
514
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "Prueba la pantalla de medidas manuales para que podamos calcular tu ajuste con tus medidas.",
515
+ "Try manual measurements": "Probar medidas manuales",
485
516
  "SDK not configured. Please provide an API key.": "SDK no configurado. Por favor, proporciona una clave API.",
486
517
  "Please upload a JPEG, PNG, or WebP image.": "Por favor, sube una imagen JPEG, PNG o WebP.",
487
518
  "Image must be under 10MB.": "La imagen debe ser menor de 10MB.",
@@ -669,9 +700,10 @@ const j = [
669
700
  // ── Photo step — profile photo preload pill ──
670
701
  "Loaded from profile": "Cargada del perfil",
671
702
  Clear: "Borrar"
672
- }, z = {
703
+ }, M = {
673
704
  "Virtual Try-On": "Essayage Virtuel",
674
705
  "Find Your Size & See It On You": "Trouvez votre taille et essayez-le",
706
+ "See Your Fit": "Voir votre ajustement",
675
707
  "Get the perfect fit, then try it on virtually": "Trouvez la coupe parfaite, puis essayez-le virtuellement",
676
708
  "Get Your Size": "Votre taille",
677
709
  "Instant fit recommendation": "Recommandation de coupe instantanée",
@@ -734,6 +766,9 @@ const j = [
734
766
  "This usually takes 15-25 seconds": "Cela prend généralement 15 à 25 secondes",
735
767
  "Something went wrong": "Une erreur est survenue",
736
768
  "Try Again": "Réessayer",
769
+ "We couldn't find a matching size for you": "Nous n'avons pas trouvé de taille adaptée pour vous",
770
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "Essayez l'écran de mesures manuelles afin que nous puissions calculer votre coupe à partir de vos mesures.",
771
+ "Try manual measurements": "Essayer les mesures manuelles",
737
772
  "SDK not configured. Please provide an API key.": "SDK non configuré. Veuillez fournir une clé API.",
738
773
  "Please upload a JPEG, PNG, or WebP image.": "Veuillez télécharger une image JPEG, PNG ou WebP.",
739
774
  "Image must be under 10MB.": "L'image doit faire moins de 10 Mo.",
@@ -921,9 +956,10 @@ const j = [
921
956
  // ── Photo step — profile photo preload pill ──
922
957
  "Loaded from profile": "Chargée depuis le profil",
923
958
  Clear: "Effacer"
924
- }, M = {
959
+ }, N = {
925
960
  "Virtual Try-On": "Virtuelle Anprobe",
926
961
  "Find Your Size & See It On You": "Finden Sie Ihre Größe und probieren Sie es an",
962
+ "See Your Fit": "Ihre Passform ansehen",
927
963
  "Get the perfect fit, then try it on virtually": "Finden Sie die perfekte Passform und probieren Sie es virtuell an",
928
964
  "Get Your Size": "Ihre Größe",
929
965
  "Instant fit recommendation": "Sofortige Passformempfehlung",
@@ -986,6 +1022,9 @@ const j = [
986
1022
  "This usually takes 15-25 seconds": "Dies dauert normalerweise 15–25 Sekunden",
987
1023
  "Something went wrong": "Etwas ist schiefgelaufen",
988
1024
  "Try Again": "Erneut versuchen",
1025
+ "We couldn't find a matching size for you": "Wir konnten keine passende Größe für Sie finden",
1026
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "Bitte nutzen Sie die manuelle Messansicht, damit wir Ihre Passform anhand Ihrer Maße berechnen können.",
1027
+ "Try manual measurements": "Manuelle Maße eingeben",
989
1028
  "SDK not configured. Please provide an API key.": "SDK nicht konfiguriert. Bitte geben Sie einen API-Schlüssel an.",
990
1029
  "Please upload a JPEG, PNG, or WebP image.": "Bitte laden Sie ein JPEG-, PNG- oder WebP-Bild hoch.",
991
1030
  "Image must be under 10MB.": "Das Bild muss kleiner als 10 MB sein.",
@@ -1173,9 +1212,10 @@ const j = [
1173
1212
  // ── Photo step — profile photo preload pill ──
1174
1213
  "Loaded from profile": "Aus Profil geladen",
1175
1214
  Clear: "Löschen"
1176
- }, N = {
1215
+ }, B = {
1177
1216
  "Virtual Try-On": "Prova Virtuale",
1178
1217
  "Find Your Size & See It On You": "Trova la tua taglia e provalo",
1218
+ "See Your Fit": "Vedi la vestibilità",
1179
1219
  "Get the perfect fit, then try it on virtually": "Trova la vestibilità perfetta, poi provalo virtualmente",
1180
1220
  "Get Your Size": "La tua taglia",
1181
1221
  "Instant fit recommendation": "Raccomandazione vestibilità istantanea",
@@ -1238,6 +1278,9 @@ const j = [
1238
1278
  "This usually takes 15-25 seconds": "Di solito richiede 15-25 secondi",
1239
1279
  "Something went wrong": "Qualcosa è andato storto",
1240
1280
  "Try Again": "Riprova",
1281
+ "We couldn't find a matching size for you": "Non abbiamo trovato una taglia adatta a te",
1282
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "Prova la schermata delle misure manuali così possiamo calcolare la vestibilità dalle tue misure.",
1283
+ "Try manual measurements": "Prova misure manuali",
1241
1284
  "SDK not configured. Please provide an API key.": "SDK non configurato. Fornisci una chiave API.",
1242
1285
  "Please upload a JPEG, PNG, or WebP image.": "Carica un'immagine JPEG, PNG o WebP.",
1243
1286
  "Image must be under 10MB.": "L'immagine deve essere inferiore a 10MB.",
@@ -1425,9 +1468,10 @@ const j = [
1425
1468
  // ── Photo step — profile photo preload pill ──
1426
1469
  "Loaded from profile": "Caricata dal profilo",
1427
1470
  Clear: "Cancella"
1428
- }, B = {
1471
+ }, H = {
1429
1472
  "Virtual Try-On": "Provador Virtual",
1430
1473
  "Find Your Size & See It On You": "Encontre seu tamanho e experimente",
1474
+ "See Your Fit": "Veja seu ajuste",
1431
1475
  "Get the perfect fit, then try it on virtually": "Encontre o caimento perfeito e experimente virtualmente",
1432
1476
  "Get Your Size": "Seu tamanho",
1433
1477
  "Instant fit recommendation": "Recomendação de caimento instantânea",
@@ -1490,6 +1534,9 @@ const j = [
1490
1534
  "This usually takes 15-25 seconds": "Isso geralmente leva 15-25 segundos",
1491
1535
  "Something went wrong": "Algo deu errado",
1492
1536
  "Try Again": "Tentar novamente",
1537
+ "We couldn't find a matching size for you": "Não encontramos um tamanho adequado para você",
1538
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "Use a tela de medidas manuais para calcularmos o ajuste com base nas suas medidas.",
1539
+ "Try manual measurements": "Usar medidas manuais",
1493
1540
  "SDK not configured. Please provide an API key.": "SDK não configurado. Forneça uma chave API.",
1494
1541
  "Please upload a JPEG, PNG, or WebP image.": "Envie uma imagem JPEG, PNG ou WebP.",
1495
1542
  "Image must be under 10MB.": "A imagem deve ter menos de 10MB.",
@@ -1677,9 +1724,10 @@ const j = [
1677
1724
  // ── Photo step — profile photo preload pill ──
1678
1725
  "Loaded from profile": "Carregada do perfil",
1679
1726
  Clear: "Limpar"
1680
- }, H = {
1727
+ }, R = {
1681
1728
  "Virtual Try-On": "バーチャル試着",
1682
1729
  "Find Your Size & See It On You": "あなたのサイズを見つけて試着",
1730
+ "See Your Fit": "フィット感を見る",
1683
1731
  "Get the perfect fit, then try it on virtually": "最適なフィットを見つけて、バーチャルで試着しましょう",
1684
1732
  "Get Your Size": "サイズを確認",
1685
1733
  "Instant fit recommendation": "瞬時にフィット提案",
@@ -1742,6 +1790,9 @@ const j = [
1742
1790
  "This usually takes 15-25 seconds": "通常15〜25秒かかります",
1743
1791
  "Something went wrong": "エラーが発生しました",
1744
1792
  "Try Again": "もう一度試す",
1793
+ "We couldn't find a matching size for you": "一致するサイズが見つかりませんでした",
1794
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "手入力の採寸画面を使うと、入力した寸法からフィットを計算できます。",
1795
+ "Try manual measurements": "手入力で採寸する",
1745
1796
  "SDK not configured. Please provide an API key.": "SDKが設定されていません。APIキーを入力してください。",
1746
1797
  "Please upload a JPEG, PNG, or WebP image.": "JPEG、PNG、WebP画像をアップロードしてください。",
1747
1798
  "Image must be under 10MB.": "画像は10MB以下にしてください。",
@@ -1929,9 +1980,10 @@ const j = [
1929
1980
  // ── Photo step — profile photo preload pill ──
1930
1981
  "Loaded from profile": "プロフィールから読み込み",
1931
1982
  Clear: "クリア"
1932
- }, R = {
1983
+ }, L = {
1933
1984
  "Virtual Try-On": "虚拟试穿",
1934
1985
  "Find Your Size & See It On You": "找到你的尺码并试穿",
1986
+ "See Your Fit": "查看合身效果",
1935
1987
  "Get the perfect fit, then try it on virtually": "找到最佳合身度,然后虚拟试穿",
1936
1988
  "Get Your Size": "获取尺码",
1937
1989
  "Instant fit recommendation": "即时合身推荐",
@@ -1994,6 +2046,9 @@ const j = [
1994
2046
  "This usually takes 15-25 seconds": "通常需要15-25秒",
1995
2047
  "Something went wrong": "出错了",
1996
2048
  "Try Again": "重试",
2049
+ "We couldn't find a matching size for you": "我们无法为你找到匹配的尺码",
2050
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "请尝试手动测量页面,我们会根据你的测量数据计算合身度。",
2051
+ "Try manual measurements": "尝试手动测量",
1997
2052
  "SDK not configured. Please provide an API key.": "SDK未配置,请提供API密钥。",
1998
2053
  "Please upload a JPEG, PNG, or WebP image.": "请上传JPEG、PNG或WebP图片。",
1999
2054
  "Image must be under 10MB.": "图片必须小于10MB。",
@@ -2181,9 +2236,10 @@ const j = [
2181
2236
  // ── Photo step — profile photo preload pill ──
2182
2237
  "Loaded from profile": "已从个人资料加载",
2183
2238
  Clear: "清除"
2184
- }, L = {
2239
+ }, k = {
2185
2240
  "Virtual Try-On": "가상 피팅",
2186
2241
  "Find Your Size & See It On You": "사이즈를 찾고 입어보세요",
2242
+ "See Your Fit": "핏 확인하기",
2187
2243
  "Get the perfect fit, then try it on virtually": "완벽한 핏을 찾고 가상으로 입어보세요",
2188
2244
  "Get Your Size": "사이즈 확인",
2189
2245
  "Instant fit recommendation": "즉시 핏 추천",
@@ -2246,6 +2302,9 @@ const j = [
2246
2302
  "This usually takes 15-25 seconds": "보통 15~25초 소요됩니다",
2247
2303
  "Something went wrong": "오류가 발생했습니다",
2248
2304
  "Try Again": "다시 시도",
2305
+ "We couldn't find a matching size for you": "맞는 사이즈를 찾지 못했습니다",
2306
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "수동 측정 화면에서 치수를 입력하면 해당 측정값으로 핏을 계산할 수 있습니다.",
2307
+ "Try manual measurements": "수동 측정 사용",
2249
2308
  "SDK not configured. Please provide an API key.": "SDK가 설정되지 않았습니다. API 키를 입력해주세요.",
2250
2309
  "Please upload a JPEG, PNG, or WebP image.": "JPEG, PNG 또는 WebP 이미지를 업로드해주세요.",
2251
2310
  "Image must be under 10MB.": "이미지는 10MB 이하여야 합니다.",
@@ -2433,9 +2492,10 @@ const j = [
2433
2492
  // ── Photo step — profile photo preload pill ──
2434
2493
  "Loaded from profile": "프로필에서 불러옴",
2435
2494
  Clear: "지우기"
2436
- }, k = {
2495
+ }, G = {
2437
2496
  "Virtual Try-On": "تجربة افتراضية",
2438
2497
  "Find Your Size & See It On You": "اعثر على مقاسك وجرّبه",
2498
+ "See Your Fit": "شاهد الملاءمة",
2439
2499
  "Get the perfect fit, then try it on virtually": "اعثر على المقاس المثالي ثم جرّبه افتراضياً",
2440
2500
  "Get Your Size": "مقاسك",
2441
2501
  "Instant fit recommendation": "توصية فورية بالمقاس",
@@ -2498,6 +2558,9 @@ const j = [
2498
2558
  "This usually takes 15-25 seconds": "عادة ما يستغرق 15-25 ثانية",
2499
2559
  "Something went wrong": "حدث خطأ ما",
2500
2560
  "Try Again": "حاول مرة أخرى",
2561
+ "We couldn't find a matching size for you": "لم نتمكن من العثور على مقاس مناسب لك",
2562
+ "Please try the manual measurement screen so we can calculate your fit from your measurements.": "يرجى تجربة شاشة القياسات اليدوية حتى نتمكن من حساب الملاءمة من قياساتك.",
2563
+ "Try manual measurements": "جرّب القياسات اليدوية",
2501
2564
  "SDK not configured. Please provide an API key.": "SDK غير مُهيأ. يرجى تقديم مفتاح API.",
2502
2565
  "Please upload a JPEG, PNG, or WebP image.": "يرجى رفع صورة بصيغة JPEG أو PNG أو WebP.",
2503
2566
  "Image must be under 10MB.": "يجب أن تكون الصورة أقل من 10 ميجابايت.",
@@ -2685,31 +2748,33 @@ const j = [
2685
2748
  // ── Photo step — profile photo preload pill ──
2686
2749
  "Loaded from profile": "تم التحميل من الملف الشخصي",
2687
2750
  Clear: "مسح"
2688
- }, G = {
2751
+ }, O = {
2689
2752
  es: D,
2690
- fr: z,
2691
- de: M,
2692
- it: N,
2693
- pt: B,
2694
- ja: H,
2695
- zh: R,
2696
- ko: L,
2697
- ar: k
2753
+ fr: M,
2754
+ de: N,
2755
+ it: B,
2756
+ pt: H,
2757
+ ja: R,
2758
+ zh: L,
2759
+ ko: k,
2760
+ ar: G
2698
2761
  };
2699
- for (const [t, e] of Object.entries(G))
2700
- U(t, e);
2762
+ for (const [t, e] of Object.entries(O))
2763
+ z(t, e);
2701
2764
  export {
2702
- O as A,
2703
- x as L,
2765
+ W as A,
2766
+ q as L,
2704
2767
  c as P,
2705
- W as S,
2706
- J as T,
2707
- C as a,
2708
- j as b,
2709
- K as c,
2710
- F as d,
2768
+ Y as S,
2769
+ x as T,
2770
+ U as a,
2771
+ J as b,
2772
+ j as c,
2773
+ K as d,
2711
2774
  V as e,
2712
- Y as i,
2713
- U as r
2775
+ A as g,
2776
+ F as i,
2777
+ v as j,
2778
+ z as r
2714
2779
  };
2715
- //# sourceMappingURL=index-B1_VQgps.js.map
2780
+ //# sourceMappingURL=index-D4yjnBvO.js.map