@primestyleai/tryon 3.4.1 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,6 +21,22 @@ function lsSet(key, value) {
21
21
  } catch {
22
22
  }
23
23
  }
24
+ const FALLBACK_FIELDS_FEMALE = [
25
+ { key: "bust", label: "Bust", required: true, unit: "cm", placeholder: "e.g. 88", category: "body" },
26
+ { key: "waist", label: "Waist", required: true, unit: "cm", placeholder: "e.g. 70", category: "body" },
27
+ { key: "hips", label: "Hips", required: true, unit: "cm", placeholder: "e.g. 96", category: "body" },
28
+ { key: "shoulderWidth", label: "Shoulders", required: false, unit: "cm", placeholder: "e.g. 39", category: "body" },
29
+ { key: "inseam", label: "Inseam", required: false, unit: "cm", placeholder: "e.g. 76", category: "body" },
30
+ { key: "footLengthCm", label: "Foot length", required: false, unit: "cm", placeholder: "e.g. 24", category: "shoe" }
31
+ ];
32
+ const FALLBACK_FIELDS_MALE = [
33
+ { key: "chest", label: "Chest", required: true, unit: "cm", placeholder: "e.g. 104", category: "body" },
34
+ { key: "waist", label: "Waist", required: true, unit: "cm", placeholder: "e.g. 84", category: "body" },
35
+ { key: "shoulderWidth", label: "Shoulders", required: false, unit: "cm", placeholder: "e.g. 46", category: "body" },
36
+ { key: "sleeveLength", label: "Sleeve", required: false, unit: "cm", placeholder: "e.g. 64", category: "body" },
37
+ { key: "inseam", label: "Inseam", required: false, unit: "cm", placeholder: "e.g. 81", category: "body" },
38
+ { key: "footLengthCm", label: "Foot length", required: false, unit: "cm", placeholder: "e.g. 27", category: "shoe" }
39
+ ];
24
40
  const SIZING_COUNTRIES = [
25
41
  { code: "US", label: "United States" },
26
42
  { code: "UK", label: "United Kingdom" },
@@ -425,6 +441,12 @@ function PrimeStyleTryonInner({
425
441
  }
426
442
  }
427
443
  }, [onComplete, onError, cleanupJob]);
444
+ const dynamicFields = useMemo(() => {
445
+ if (sizeGuide?.found && sizeGuide.requiredFields && sizeGuide.requiredFields.length > 0) {
446
+ return sizeGuide.requiredFields;
447
+ }
448
+ return formGender === "female" ? FALLBACK_FIELDS_FEMALE : FALLBACK_FIELDS_MALE;
449
+ }, [sizeGuide, formGender]);
428
450
  const submitSizing = useCallback(async () => {
429
451
  if (!apiRef.current) return;
430
452
  const baseUrl = getApiUrl(apiUrl);
@@ -435,10 +457,17 @@ function PrimeStyleTryonInner({
435
457
  product: { title: productTitle, description: "", variants: [] }
436
458
  };
437
459
  if (sizeGuide?.found) payload.sizeGuide = sizeGuide;
460
+ payload.sizingUnit = sizingUnit;
438
461
  if (sizingMethod === "exact") {
439
- const m = { gender: formRef.current.gender || "male" };
440
- const keys = ["chest", "bust", "waist", "hips", "shoulderWidth", "sleeveLength", "inseam", "neckCircumference", "footLengthCm"];
441
- for (const k of keys) {
462
+ const m = { gender: formRef.current.gender || "male", sizingUnit };
463
+ const numericKeys = /* @__PURE__ */ new Set();
464
+ for (const f of dynamicFields) {
465
+ if (f.unit !== "size" && !["shoeEU", "shoeUS", "shoeUK"].includes(f.key)) numericKeys.add(f.key);
466
+ }
467
+ for (const k of ["chest", "bust", "waist", "hips", "shoulderWidth", "sleeveLength", "inseam", "neckCircumference", "footLengthCm"]) {
468
+ if (formRef.current[k]) numericKeys.add(k);
469
+ }
470
+ for (const k of numericKeys) {
442
471
  if (formRef.current[k]) m[k] = sizingUnit === "in" ? inToCm(parseFloat(formRef.current[k])) : parseFloat(formRef.current[k]);
443
472
  }
444
473
  if (formRef.current.shoeEU) m.shoeEU = formRef.current.shoeEU;
@@ -450,7 +479,6 @@ function PrimeStyleTryonInner({
450
479
  const qHeight = heightUnit === "ft" ? ftInToCm(parseFloat(formRef.current.heightFeet || "0"), parseFloat(formRef.current.heightInches || "0")) : parseFloat(formRef.current.height || "0");
451
480
  const qWeight = weightUnit === "lbs" ? lbsToKg(parseFloat(formRef.current.weight || "0")) : parseFloat(formRef.current.weight || "0");
452
481
  if (!qHeight || qHeight < 100 || !qWeight || qWeight < 30) {
453
- console.warn("[PrimeStyle] Skipping sizing — invalid height/weight:", { qHeight, qWeight });
454
482
  setSizingLoading(false);
455
483
  return;
456
484
  }
@@ -470,20 +498,12 @@ function PrimeStyleTryonInner({
470
498
  const data = await res.json();
471
499
  setSizingResult(data);
472
500
  } else {
473
- const errBody = await res.text().catch(() => "");
474
- console.error("[PrimeStyle] Sizing API error:", res.status, errBody);
475
- try {
476
- const parsed = JSON.parse(errBody);
477
- if (parsed.issues) console.error("[PrimeStyle] Validation issues:", JSON.stringify(parsed.issues, null, 2));
478
- } catch {
479
- }
480
501
  }
481
- } catch (err) {
482
- console.warn("[PrimeStyle] Sizing request failed:", err);
502
+ } catch {
483
503
  } finally {
484
504
  setSizingLoading(false);
485
505
  }
486
- }, [apiUrl, sizingMethod, sizingCountry, heightUnit, weightUnit, sizingUnit, sizeGuide, productTitle]);
506
+ }, [apiUrl, sizingMethod, sizingCountry, heightUnit, weightUnit, sizingUnit, sizeGuide, productTitle, dynamicFields]);
487
507
  const handleSubmit = useCallback(async () => {
488
508
  if (!selectedFile || !apiRef.current || !sseRef.current) {
489
509
  const msg = !apiRef.current ? "Missing NEXT_PUBLIC_PRIMESTYLE_API_KEY" : "No file selected";
@@ -584,6 +604,11 @@ function PrimeStyleTryonInner({
584
604
  if (p.shoeUS) fd.shoeUS = p.shoeUS;
585
605
  if (p.shoeUK) fd.shoeUK = p.shoeUK;
586
606
  if (p.fitPreference) fd.fitPreference = p.fitPreference;
607
+ if (p.customMeasurements) {
608
+ for (const [key, value] of Object.entries(p.customMeasurements)) {
609
+ fd[key] = String(value);
610
+ }
611
+ }
587
612
  formRef.current = fd;
588
613
  setFormGender(fd.gender || "male");
589
614
  if (p.country) setSizingCountry(p.country);
@@ -619,6 +644,33 @@ function PrimeStyleTryonInner({
619
644
  weightUnit,
620
645
  createdAt: Date.now()
621
646
  };
647
+ const KNOWN_PROFILE_KEYS = /* @__PURE__ */ new Set([
648
+ "chest",
649
+ "bust",
650
+ "waist",
651
+ "hips",
652
+ "shoulderWidth",
653
+ "sleeveLength",
654
+ "inseam",
655
+ "neckCircumference",
656
+ "footLengthCm",
657
+ "shoeEU",
658
+ "shoeUS",
659
+ "shoeUK",
660
+ "fitPreference",
661
+ "gender",
662
+ "height",
663
+ "weight",
664
+ "heightFeet",
665
+ "heightInches"
666
+ ]);
667
+ const custom = {};
668
+ for (const [key, val] of Object.entries(formRef.current)) {
669
+ if (!KNOWN_PROFILE_KEYS.has(key) && val && !isNaN(Number(val))) {
670
+ custom[key] = parseFloat(val);
671
+ }
672
+ }
673
+ if (Object.keys(custom).length > 0) p.customMeasurements = custom;
622
674
  setProfiles((prev) => {
623
675
  const idx = prev.findIndex((x) => x.id === id);
624
676
  if (idx >= 0) {
@@ -830,7 +882,7 @@ function PrimeStyleTryonInner({
830
882
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-choice-icon", children: /* @__PURE__ */ jsx(RulerIcon, { size: 24 }) }),
831
883
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-choice-info", children: [
832
884
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-choice-title", children: "Enter my measurements" }),
833
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-choice-desc", children: "Chest, waist, hips, shoes & more" })
885
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-choice-desc", children: sizeGuide?.requiredFields?.length ? sizeGuide.requiredFields.filter((f) => f.required).slice(0, 3).map((f) => f.label).join(", ") + (sizeGuide.requiredFields.length > 3 ? " & more" : "") : "Chest, waist, hips, shoes & more" })
834
886
  ] }),
835
887
  /* @__PURE__ */ jsx("span", { className: "ps-tryon-choice-badge", children: "Best accuracy" })
836
888
  ] }),
@@ -900,42 +952,77 @@ function PrimeStyleTryonInner({
900
952
  setHeightUnit(v === "cm" ? "cm" : "ft");
901
953
  setWeightUnit(v === "cm" ? "kg" : "lbs");
902
954
  } }) }),
903
- sizingMethod === "exact" ? /* @__PURE__ */ jsxs(Fragment, { children: [
904
- isFemale ? /* @__PURE__ */ jsxs(Fragment, { children: [
905
- /* @__PURE__ */ jsx(InputRow, { label: "Bust *", fieldKey: "bust", placeholder: isCm ? "e.g. 88" : "e.g. 35", type: "number", unit: sizingUnit }),
906
- /* @__PURE__ */ jsx(InputRow, { label: "Waist *", fieldKey: "waist", placeholder: isCm ? "e.g. 70" : "e.g. 28", type: "number", unit: sizingUnit }),
907
- /* @__PURE__ */ jsx(InputRow, { label: "Hips *", fieldKey: "hips", placeholder: isCm ? "e.g. 96" : "e.g. 38", type: "number", unit: sizingUnit }),
908
- /* @__PURE__ */ jsx(InputRow, { label: "Shoulders", fieldKey: "shoulderWidth", placeholder: isCm ? "e.g. 39" : "e.g. 15", type: "number", unit: sizingUnit }),
909
- /* @__PURE__ */ jsx(InputRow, { label: "Inseam", fieldKey: "inseam", placeholder: isCm ? "e.g. 76" : "e.g. 30", type: "number", unit: sizingUnit })
910
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
911
- /* @__PURE__ */ jsx(InputRow, { label: "Chest *", fieldKey: "chest", placeholder: isCm ? "e.g. 104" : "e.g. 41", type: "number", unit: sizingUnit }),
912
- /* @__PURE__ */ jsx(InputRow, { label: "Waist *", fieldKey: "waist", placeholder: isCm ? "e.g. 84" : "e.g. 33", type: "number", unit: sizingUnit }),
913
- /* @__PURE__ */ jsx(InputRow, { label: "Shoulders", fieldKey: "shoulderWidth", placeholder: isCm ? "e.g. 46" : "e.g. 18", type: "number", unit: sizingUnit }),
914
- /* @__PURE__ */ jsx(InputRow, { label: "Sleeve", fieldKey: "sleeveLength", placeholder: isCm ? "e.g. 64" : "e.g. 25", type: "number", unit: sizingUnit }),
915
- /* @__PURE__ */ jsx(InputRow, { label: "Inseam", fieldKey: "inseam", placeholder: isCm ? "e.g. 81" : "e.g. 32", type: "number", unit: sizingUnit })
916
- ] }),
917
- isFemale && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-input-row", children: [
918
- /* @__PURE__ */ jsx("label", { children: "Fit type" }),
919
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-unit-toggle", children: ["petite", "standard", "tall", "plus"].map((fp) => /* @__PURE__ */ jsx(
920
- "button",
955
+ sizingMethod === "exact" ? /* @__PURE__ */ jsx(Fragment, { children: (() => {
956
+ const reqFields = dynamicFields.filter((f) => f.required);
957
+ const optFields = dynamicFields.filter((f) => !f.required);
958
+ const renderField = (field) => {
959
+ if (["shoeEU", "shoeUS", "shoeUK"].includes(field.key)) {
960
+ return /* @__PURE__ */ jsx(InputRow, { label: `${field.label} *`, fieldKey: field.key, placeholder: field.placeholder }, field.key);
961
+ }
962
+ const phCm = field.placeholder?.replace(/[^0-9.]/g, "") || "0";
963
+ const phIn = String(field.unit === "cm" ? Math.round(parseFloat(phCm) / 2.54) : phCm);
964
+ const placeholder = isCm ? field.placeholder || "" : `e.g. ${phIn}`;
965
+ return /* @__PURE__ */ jsx(
966
+ InputRow,
921
967
  {
922
- className: `ps-tryon-unit-btn${(formRef.current.fitPreference || "standard") === fp ? " ps-active" : ""}`,
923
- onClick: (e) => {
924
- updateField("fitPreference", fp);
925
- const btns = e.target.parentElement.querySelectorAll(".ps-tryon-unit-btn");
926
- btns.forEach((b) => b.classList.toggle("ps-active", b.textContent?.toLowerCase() === fp));
927
- },
928
- children: fp.charAt(0).toUpperCase() + fp.slice(1)
968
+ label: `${field.label}${field.required ? " *" : ""}`,
969
+ fieldKey: field.key,
970
+ placeholder,
971
+ type: "number",
972
+ unit: field.unit === "cm" ? sizingUnit : void 0
929
973
  },
930
- fp
931
- )) })
932
- ] }),
933
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-shoe-section", children: [
934
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-shoe-title", children: "Shoe sizing (optional)" }),
935
- /* @__PURE__ */ jsx(InputRow, { label: "Foot length", fieldKey: "footLengthCm", placeholder: isCm ? "e.g. 27" : "e.g. 10.5", type: "number", unit: sizingUnit }),
936
- /* @__PURE__ */ jsx(InputRow, { label: shoeField.label, fieldKey: shoeField.key, placeholder: shoeField.ph })
937
- ] })
938
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
974
+ field.key
975
+ );
976
+ };
977
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
978
+ reqFields.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
979
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-section-label", children: "Required for this product" }),
980
+ reqFields.map(renderField)
981
+ ] }),
982
+ isFemale && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-input-row", children: [
983
+ /* @__PURE__ */ jsx("label", { children: "Fit type" }),
984
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-unit-toggle", children: ["petite", "standard", "tall", "plus"].map((fp) => /* @__PURE__ */ jsx(
985
+ "button",
986
+ {
987
+ className: `ps-tryon-unit-btn${(formRef.current.fitPreference || "standard") === fp ? " ps-active" : ""}`,
988
+ onClick: (e) => {
989
+ updateField("fitPreference", fp);
990
+ const btns = e.target.parentElement.querySelectorAll(".ps-tryon-unit-btn");
991
+ btns.forEach((b) => b.classList.toggle("ps-active", b.textContent?.toLowerCase() === fp));
992
+ },
993
+ children: fp.charAt(0).toUpperCase() + fp.slice(1)
994
+ },
995
+ fp
996
+ )) })
997
+ ] }),
998
+ optFields.length > 0 && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-optional-section", children: [
999
+ /* @__PURE__ */ jsxs("button", { className: "ps-tryon-optional-toggle", onClick: (e) => {
1000
+ const wrap = e.target.closest(".ps-tryon-optional-section").querySelector(".ps-tryon-optional-fields");
1001
+ const arrow = e.target.closest(".ps-tryon-optional-toggle").querySelector(".ps-tryon-chevron");
1002
+ if (wrap) {
1003
+ const open = wrap.style.display !== "none";
1004
+ wrap.style.display = open ? "none" : "flex";
1005
+ if (arrow) arrow.style.transform = open ? "rotate(0deg)" : "rotate(180deg)";
1006
+ }
1007
+ }, children: [
1008
+ /* @__PURE__ */ jsx("span", { children: "Optional — improve accuracy & save to profile" }),
1009
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-chevron", children: "▾" })
1010
+ ] }),
1011
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-optional-fields", style: { display: "none" }, children: [
1012
+ optFields.map(renderField),
1013
+ !dynamicFields.some((f) => f.category === "shoe") && /* @__PURE__ */ jsxs(Fragment, { children: [
1014
+ /* @__PURE__ */ jsx(InputRow, { label: "Foot length", fieldKey: "footLengthCm", placeholder: isCm ? "e.g. 27" : "e.g. 10.5", type: "number", unit: sizingUnit }),
1015
+ /* @__PURE__ */ jsx(InputRow, { label: shoeField.label, fieldKey: shoeField.key, placeholder: shoeField.ph })
1016
+ ] })
1017
+ ] })
1018
+ ] }),
1019
+ optFields.length === 0 && !dynamicFields.some((f) => f.category === "shoe") && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-shoe-section", children: [
1020
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-shoe-title", children: "Shoe sizing (optional)" }),
1021
+ /* @__PURE__ */ jsx(InputRow, { label: "Foot length", fieldKey: "footLengthCm", placeholder: isCm ? "e.g. 27" : "e.g. 10.5", type: "number", unit: sizingUnit }),
1022
+ /* @__PURE__ */ jsx(InputRow, { label: shoeField.label, fieldKey: shoeField.key, placeholder: shoeField.ph })
1023
+ ] })
1024
+ ] });
1025
+ })() }) : /* @__PURE__ */ jsxs(Fragment, { children: [
939
1026
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-input-row", children: [
940
1027
  /* @__PURE__ */ jsx("label", { children: "Height *" }),
941
1028
  heightUnit === "ft" ? /* @__PURE__ */ jsxs("div", { className: "ps-tryon-height-ft", children: [
@@ -983,7 +1070,10 @@ function PrimeStyleTryonInner({
983
1070
  function ProcessingView() {
984
1071
  return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-processing", children: [
985
1072
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-processing-image-wrap", children: [
986
- previewUrl && /* @__PURE__ */ jsx("img", { src: previewUrl, alt: "Your photo", className: "ps-tryon-processing-model" }),
1073
+ previewUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
1074
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-processing-blur", style: { backgroundImage: `url(${previewUrl})` } }),
1075
+ /* @__PURE__ */ jsx("img", { src: previewUrl, alt: "Your photo", className: "ps-tryon-processing-model" })
1076
+ ] }),
987
1077
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-scan-line" }),
988
1078
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-scan-overlay" })
989
1079
  ] }),
@@ -999,6 +1089,8 @@ function PrimeStyleTryonInner({
999
1089
  const hasSizing = !!sizingResult || sizingLoading;
1000
1090
  const hasBoth = !!resultImageUrl && hasSizing;
1001
1091
  const [profileName, setProfileName] = useState("");
1092
+ const [showFitDetails, setShowFitDetails] = useState(false);
1093
+ const confidenceLabel = sizingResult?.confidence === "high" ? "High Confidence" : sizingResult?.confidence === "medium" ? "Medium Confidence" : sizingResult?.confidence === "low" ? "Low Confidence" : "";
1002
1094
  return /* @__PURE__ */ jsxs("div", { className: `ps-tryon-result-layout${hasBoth ? " ps-tryon-result-split" : ""}`, children: [
1003
1095
  resultImageUrl && /* @__PURE__ */ jsx("div", { className: "ps-tryon-result-image-col", children: /* @__PURE__ */ jsx("img", { src: resultImageUrl, alt: "Try-on result", className: cn.resultImage }) }),
1004
1096
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-result-info-col", children: [
@@ -1007,20 +1099,23 @@ function PrimeStyleTryonInner({
1007
1099
  /* @__PURE__ */ jsx("p", { className: "ps-tryon-size-reasoning", children: "Analyzing your size..." })
1008
1100
  ] }),
1009
1101
  sizingResult && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-size-recommend", children: [
1010
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-size-badge", children: sizingResult.recommendedSize }),
1011
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-size-confidence", children: [
1012
- "Confidence: ",
1013
- /* @__PURE__ */ jsx("span", { className: `ps-conf-${sizingResult.confidence}`, children: sizingResult.confidence })
1102
+ /* @__PURE__ */ jsx("h3", { className: "ps-tryon-size-title", children: "Recommended Size" }),
1103
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-size-hero-row", children: [
1104
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-size-badge", children: sizingResult.recommendedSize }),
1105
+ /* @__PURE__ */ jsx("span", { className: `ps-tryon-size-conf-label ps-conf-${sizingResult.confidence}`, children: confidenceLabel })
1014
1106
  ] }),
1015
- /* @__PURE__ */ jsx("p", { className: "ps-tryon-size-reasoning", children: sizingResult.reasoning }),
1016
- sizingResult.internationalSizes && /* @__PURE__ */ jsx("div", { className: "ps-tryon-intl-sizes", children: Object.entries(sizingResult.internationalSizes).map(([k, v]) => /* @__PURE__ */ jsxs("span", { className: "ps-tryon-intl-chip", children: [
1017
- k,
1018
- ": ",
1019
- v
1020
- ] }, k)) }),
1021
- sizingResult.matchDetails && sizingResult.matchDetails.length > 0 && /* @__PURE__ */ jsxs("details", { className: "ps-tryon-match-details", children: [
1022
- /* @__PURE__ */ jsx("summary", { children: "Measurement breakdown" }),
1023
- /* @__PURE__ */ jsxs("table", { children: [
1107
+ sizingResult.matchDetails && sizingResult.matchDetails.length > 0 && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-fit-summary", children: [
1108
+ /* @__PURE__ */ jsx("h4", { className: "ps-tryon-fit-summary-title", children: "Fit Summary" }),
1109
+ sizingResult.matchDetails.map((m, i) => /* @__PURE__ */ jsxs("div", { className: "ps-tryon-fit-row", children: [
1110
+ /* @__PURE__ */ jsx("span", { className: `ps-tryon-fit-icon ps-fit-icon-${m.fit}`, children: m.fit === "good" ? "✓" : m.fit === "tight" ? "↑" : "↓" }),
1111
+ /* @__PURE__ */ jsxs("span", { className: "ps-tryon-fit-text", children: [
1112
+ /* @__PURE__ */ jsx("strong", { children: m.measurement }),
1113
+ " ",
1114
+ m.fit === "good" ? "within range" : m.fit === "tight" ? "may be snug" : "may be loose"
1115
+ ] })
1116
+ ] }, i)),
1117
+ /* @__PURE__ */ jsx("button", { className: "ps-tryon-fit-details-toggle", onClick: () => setShowFitDetails(!showFitDetails), children: showFitDetails ? "Hide detailed fit analysis ↑" : "See detailed fit analysis ↓" }),
1118
+ showFitDetails && /* @__PURE__ */ jsxs("table", { className: "ps-tryon-fit-table", children: [
1024
1119
  /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
1025
1120
  /* @__PURE__ */ jsx("th", { children: "Area" }),
1026
1121
  /* @__PURE__ */ jsx("th", { children: "You" }),
@@ -1034,7 +1129,15 @@ function PrimeStyleTryonInner({
1034
1129
  /* @__PURE__ */ jsx("td", { className: `ps-fit-${m.fit}`, children: m.fit })
1035
1130
  ] }, i)) })
1036
1131
  ] })
1037
- ] })
1132
+ ] }),
1133
+ sizingResult.internationalSizes && Object.keys(sizingResult.internationalSizes).length > 0 && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-equiv-section", children: [
1134
+ /* @__PURE__ */ jsx("h4", { className: "ps-tryon-equiv-title", children: "Equivalent Sizes" }),
1135
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-equiv-chips", children: Object.entries(sizingResult.internationalSizes).map(([k, v]) => /* @__PURE__ */ jsxs("div", { className: "ps-tryon-equiv-chip", children: [
1136
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-equiv-region", children: k }),
1137
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-equiv-value", children: v })
1138
+ ] }, k)) })
1139
+ ] }),
1140
+ (!sizingResult.matchDetails || sizingResult.matchDetails.length === 0) && sizingResult.reasoning && /* @__PURE__ */ jsx("p", { className: "ps-tryon-size-reasoning", children: sizingResult.reasoning })
1038
1141
  ] }),
1039
1142
  /* @__PURE__ */ jsxs("div", { className: cx("ps-tryon-result-actions", cn.resultActions), children: [
1040
1143
  /* @__PURE__ */ jsx("button", { onClick: handleDownload, className: cx("ps-tryon-btn-download", cn.downloadButton), children: "Download" }),
@@ -1045,15 +1148,21 @@ function PrimeStyleTryonInner({
1045
1148
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-save-row", children: [
1046
1149
  /* @__PURE__ */ jsx("input", { type: "text", placeholder: "Name this profile (e.g. John, Sarah)", value: profileName, onChange: (e) => setProfileName(e.target.value) }),
1047
1150
  activeProfileId ? /* @__PURE__ */ jsxs("div", { className: "ps-tryon-save-btn-group", children: [
1048
- /* @__PURE__ */ jsx("button", { onClick: () => {
1151
+ /* @__PURE__ */ jsxs("button", { onClick: () => {
1049
1152
  if (profileName.trim()) saveProfile(profileName.trim());
1050
- }, children: "Update" }),
1153
+ }, children: [
1154
+ "💾",
1155
+ " Update"
1156
+ ] }),
1051
1157
  /* @__PURE__ */ jsx("button", { className: "ps-tryon-save-new-btn", onClick: () => {
1052
1158
  if (profileName.trim()) saveProfile(profileName.trim(), true);
1053
1159
  }, children: "+ New" })
1054
- ] }) : /* @__PURE__ */ jsx("button", { onClick: () => {
1160
+ ] }) : /* @__PURE__ */ jsxs("button", { onClick: () => {
1055
1161
  if (profileName.trim()) saveProfile(profileName.trim());
1056
- }, children: "Save" })
1162
+ }, children: [
1163
+ "💾",
1164
+ " Save"
1165
+ ] })
1057
1166
  ] })
1058
1167
  ] }),
1059
1168
  profileSaved && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-save-done", children: [
@@ -1238,7 +1347,11 @@ const STYLES = `
1238
1347
  .ps-tryon-overlay {
1239
1348
  position: fixed; inset: 0; background: var(--ps-modal-overlay, rgba(0,0,0,0.6));
1240
1349
  display: flex; align-items: center; justify-content: center;
1241
- z-index: 999999; padding: 16px; animation: ps-fade-in 0.2s ease;
1350
+ z-index: 999999;
1351
+ padding: 16px;
1352
+ padding: max(16px, env(safe-area-inset-top)) max(16px, env(safe-area-inset-right)) max(16px, env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left));
1353
+ animation: ps-fade-in 0.2s ease;
1354
+ overflow-y: auto; -webkit-overflow-scrolling: touch;
1242
1355
  }
1243
1356
  @keyframes ps-fade-in { from { opacity: 0; } to { opacity: 1; } }
1244
1357
 
@@ -1249,6 +1362,7 @@ const STYLES = `
1249
1362
  font-family: var(--ps-modal-font, system-ui, -apple-system, sans-serif);
1250
1363
  box-shadow: 0 25px 50px rgba(0,0,0,0.4); animation: ps-slide-up 0.3s ease;
1251
1364
  scrollbar-width: thin; scrollbar-color: #333 transparent;
1365
+ flex-shrink: 0;
1252
1366
  }
1253
1367
  .ps-tryon-modal-wide { max-width: 920px; }
1254
1368
  .ps-tryon-modal:has(.ps-tryon-drawer-open) { overflow: hidden; }
@@ -1448,6 +1562,12 @@ const STYLES = `
1448
1562
  font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s; font-family: inherit;
1449
1563
  }
1450
1564
  .ps-tryon-unit-btn.ps-active { background: #bb945c; color: #111; }
1565
+ .ps-tryon-section-label { font-size: 11px; font-weight: 700; color: #bb945c; text-transform: uppercase; letter-spacing: 0.08em; margin: 4px 0 2px; }
1566
+ .ps-tryon-optional-section { border-top: 1px solid #333; padding-top: 10px; margin-top: 6px; }
1567
+ .ps-tryon-optional-toggle { display: flex; align-items: center; justify-content: space-between; width: 100%; background: none; border: 1px solid #333; border-radius: 10px; padding: 10px 14px; color: #999; font-size: 13px; font-weight: 600; cursor: pointer; font-family: inherit; transition: all 0.2s; }
1568
+ .ps-tryon-optional-toggle:hover { border-color: #555; color: #ccc; }
1569
+ .ps-tryon-chevron { transition: transform 0.2s; font-size: 14px; }
1570
+ .ps-tryon-optional-fields { display: flex; flex-direction: column; gap: 10px; padding-top: 12px; }
1451
1571
  .ps-tryon-shoe-section { border-top: 1px solid #333; padding-top: 14px; margin-top: 6px; display: flex; flex-direction: column; gap: 10px; }
1452
1572
  .ps-tryon-shoe-title { font-size: 13px; font-weight: 600; color: #999; }
1453
1573
  .ps-tryon-disclaimer { font-size: 11px; color: #666; margin: 4px 0 0; }
@@ -1469,11 +1589,15 @@ const STYLES = `
1469
1589
  .ps-tryon-processing { text-align: center; padding: 24px; display: flex; flex-direction: column; align-items: center; }
1470
1590
 
1471
1591
  .ps-tryon-processing-image-wrap {
1472
- position: relative; width: 200px; height: 260px; margin: 0 auto 24px;
1592
+ position: relative; width: 220px; height: 280px; margin: 0 auto 24px;
1473
1593
  border-radius: 16px; overflow: hidden; border: 2px solid #333;
1474
1594
  }
1595
+ .ps-tryon-processing-blur {
1596
+ position: absolute; inset: -20px; background-size: cover; background-position: center;
1597
+ filter: blur(25px) brightness(0.5); transform: scale(1.2);
1598
+ }
1475
1599
  .ps-tryon-processing-model {
1476
- width: 100%; height: 100%; object-fit: cover; display: block;
1600
+ position: relative; z-index: 1; width: 100%; height: 100%; object-fit: contain; display: block;
1477
1601
  }
1478
1602
  .ps-tryon-scan-overlay {
1479
1603
  position: absolute; inset: 0;
@@ -1532,12 +1656,20 @@ const STYLES = `
1532
1656
 
1533
1657
  /* Size recommendation */
1534
1658
  .ps-tryon-size-recommend { margin-bottom: 16px; }
1659
+ .ps-tryon-size-title { font-size: 18px; font-weight: 700; color: #fff; margin: 0 0 14px; }
1660
+ .ps-tryon-size-hero-row {
1661
+ display: flex; align-items: center; gap: 16px; padding: 16px 20px;
1662
+ border: 1.5px solid #333; border-radius: 14px; margin-bottom: 18px; background: rgba(255,255,255,0.02);
1663
+ }
1535
1664
  .ps-tryon-size-badge {
1536
1665
  display: inline-flex; align-items: center; justify-content: center;
1537
- width: 56px; height: 56px; border-radius: 50%;
1666
+ min-width: 56px; height: 56px; padding: 0 12px; border-radius: 12px;
1538
1667
  background: linear-gradient(135deg, #bb945c, #d6ba7d);
1539
- color: #111; font-size: 20px; font-weight: 700; margin-bottom: 10px;
1668
+ color: #111; font-size: 24px; font-weight: 800; letter-spacing: -0.02em;
1540
1669
  }
1670
+ .ps-tryon-size-conf-label { font-size: 15px; font-weight: 600; }
1671
+ .ps-conf-high { color: #4ade80; } .ps-conf-medium { color: #bb945c; } .ps-conf-low { color: #ef4444; }
1672
+
1541
1673
  .ps-tryon-sizing-loading { text-align: center; padding: 20px 0; }
1542
1674
  .ps-tryon-size-loading-spinner {
1543
1675
  width: 36px; height: 36px; border: 3px solid #333;
@@ -1545,18 +1677,42 @@ const STYLES = `
1545
1677
  animation: ps-spin 0.8s linear infinite; margin: 0 auto 12px;
1546
1678
  }
1547
1679
  @keyframes ps-spin { to { transform: rotate(360deg); } }
1548
- .ps-tryon-size-confidence { font-size: 12px; color: #999; margin-bottom: 8px; }
1549
- .ps-conf-high { color: #4ade80; } .ps-conf-medium { color: #bb945c; } .ps-conf-low { color: #ef4444; }
1550
- .ps-tryon-size-reasoning { font-size: 13px; color: #ccc; line-height: 1.5; margin-bottom: 12px; }
1551
- .ps-tryon-intl-sizes { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
1552
- .ps-tryon-intl-chip { padding: 4px 10px; border: 1px solid #333; border-radius: 8px; font-size: 11px; color: #ccc; font-weight: 500; }
1553
- .ps-tryon-match-details { margin-top: 12px; }
1554
- .ps-tryon-match-details summary { font-size: 12px; color: #bb945c; cursor: pointer; font-weight: 600; }
1555
- .ps-tryon-match-details table { width: 100%; border-collapse: collapse; margin-top: 8px; font-size: 12px; }
1556
- .ps-tryon-match-details th { text-align: left; padding: 6px 8px; border-bottom: 1px solid #333; color: #999; font-weight: 600; }
1557
- .ps-tryon-match-details td { padding: 6px 8px; border-bottom: 1px solid #222; color: #ccc; }
1680
+
1681
+ /* Fit Summary */
1682
+ .ps-tryon-fit-summary { margin-bottom: 16px; }
1683
+ .ps-tryon-fit-summary-title { font-size: 15px; font-weight: 700; color: #fff; margin: 0 0 10px; }
1684
+ .ps-tryon-fit-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; }
1685
+ .ps-tryon-fit-icon {
1686
+ width: 22px; height: 22px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
1687
+ font-size: 12px; font-weight: 700; flex-shrink: 0;
1688
+ }
1689
+ .ps-fit-icon-good { background: rgba(74,222,128,0.15); color: #4ade80; }
1690
+ .ps-fit-icon-tight { background: rgba(245,158,11,0.15); color: #f59e0b; }
1691
+ .ps-fit-icon-loose { background: rgba(96,165,250,0.15); color: #60a5fa; }
1692
+ .ps-tryon-fit-text { font-size: 14px; color: #ccc; line-height: 1.4; }
1693
+ .ps-tryon-fit-text strong { color: #fff; font-weight: 600; }
1694
+ .ps-tryon-fit-details-toggle {
1695
+ display: inline-block; margin-top: 8px; font-size: 13px; color: #bb945c; cursor: pointer;
1696
+ font-weight: 600; background: none; border: none; padding: 0; font-family: inherit;
1697
+ }
1698
+ .ps-tryon-fit-details-toggle:hover { color: #d6ba7d; }
1699
+ .ps-tryon-fit-table { width: 100%; border-collapse: collapse; margin-top: 10px; font-size: 13px; }
1700
+ .ps-tryon-fit-table th { text-align: left; padding: 8px 10px; border-bottom: 1px solid #333; color: #999; font-weight: 600; }
1701
+ .ps-tryon-fit-table td { padding: 8px 10px; border-bottom: 1px solid #222; color: #ccc; }
1558
1702
  .ps-fit-good { color: #4ade80; } .ps-fit-tight { color: #f59e0b; } .ps-fit-loose { color: #60a5fa; }
1559
1703
 
1704
+ /* Equivalent Sizes */
1705
+ .ps-tryon-equiv-section { margin-bottom: 16px; }
1706
+ .ps-tryon-equiv-title { font-size: 15px; font-weight: 700; color: #fff; margin: 0 0 10px; }
1707
+ .ps-tryon-equiv-chips { display: flex; flex-wrap: wrap; gap: 8px; }
1708
+ .ps-tryon-equiv-chip {
1709
+ display: flex; align-items: center; border: 1.5px solid #333; border-radius: 10px; overflow: hidden;
1710
+ }
1711
+ .ps-tryon-equiv-region { padding: 7px 10px; font-size: 12px; color: #999; font-weight: 600; background: rgba(255,255,255,0.03); }
1712
+ .ps-tryon-equiv-value { padding: 7px 12px; font-size: 14px; color: #fff; font-weight: 700; }
1713
+
1714
+ .ps-tryon-size-reasoning { font-size: 14px; color: #ccc; line-height: 1.6; margin-bottom: 14px; }
1715
+
1560
1716
  /* Save profile prompt */
1561
1717
  .ps-tryon-save-prompt { margin-top: 14px; padding: 14px; border: 1px solid #333; border-radius: 12px; background: #1a1b1a; }
1562
1718
  .ps-tryon-save-label { font-size: 12px; color: #999; margin-bottom: 10px; }
@@ -1686,13 +1842,27 @@ const STYLES = `
1686
1842
  .ps-tryon-detail-delete svg { stroke: currentColor; fill: none; }
1687
1843
 
1688
1844
  /* Mobile responsive */
1845
+ @media (max-width: 768px) {
1846
+ .ps-tryon-overlay {
1847
+ padding: 0;
1848
+ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
1849
+ align-items: stretch; justify-content: stretch;
1850
+ }
1851
+ .ps-tryon-modal {
1852
+ max-width: 100%; max-height: none; width: 100%;
1853
+ border-radius: 0; box-shadow: none;
1854
+ min-height: 100%; flex: 1;
1855
+ display: flex; flex-direction: column;
1856
+ }
1857
+ .ps-tryon-modal-wide { max-width: 100%; }
1858
+ .ps-tryon-modal > :last-child { flex: 1; }
1859
+ .ps-tryon-header { border-radius: 0; }
1860
+ }
1689
1861
  @media (max-width: 720px) {
1690
1862
  .ps-tryon-result-split { flex-direction: column; }
1691
1863
  .ps-tryon-result-image-col { flex: none; }
1692
- .ps-tryon-modal-wide { max-width: 520px; }
1693
1864
  }
1694
1865
  @media (max-width: 480px) {
1695
- .ps-tryon-modal { max-height: 100vh; border-radius: 14px; }
1696
1866
  .ps-tryon-body { padding: 18px; }
1697
1867
  .ps-tryon-header { padding: 14px 18px; }
1698
1868
  .ps-tryon-stepper { padding: 14px 18px 8px; }
package/logo.svg CHANGED
@@ -1,46 +1,46 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
- viewBox="0 0 841.9 510.4" style="enable-background:new 0 0 841.9 510.4;" xml:space="preserve">
5
- <style type="text/css">
6
- .st0{fill:#D6BA7D;}
7
- </style>
8
- <g>
9
- <path class="st0" d="M333.7,230.1c-9.1-0.1-12.4,3.9-10.7,12.8c1.2,6.3,2.8,12.7,5.3,18.7c16.1,39.2,43.1,69.4,77.8,93.1
10
- c5.8,3.9,11,3.7,16.8,0.2c20.3-12.2,37.5-28.1,52-46.6c15-19.1,27.6-39.7,32.5-64c2.2-11-2.4-15.7-13.8-14.5
11
- c-2.9,0.3-5.7,1.4-8.5,1.9c-1.9,0.4-3.8,0.4-6.9,0.7c10.4-11.8,29.4-13.9,39.3-4.7c11,10.2,21,21.3,31.8,31.7
12
- c5.2,4.9,8,10.6,6.9,17.4c-2.2,14.3-3.6,28.9-8,42.5c-14.1,43.9-41.2,79.8-72.3,113.1c-6.5,6.9-7.2,6.9-13-1.1
13
- c-13.3-18.4-26.3-37-39.7-55.3c-8.3-11.3-8.5-11.2-16.7,0.3c-13.3,18.6-26.6,37.3-39.9,56c-2.8,3.8-5.4,6.9-10.2,1.8
14
- c-27.8-29.9-52.8-61.7-68.4-99.8c-7.6-18.6-14-37.7-13.7-58.1c0.1-4.7,1.5-10.6,4.5-13.9c11.1-12.1,22.8-23.6,34.8-34.8
15
- c9.9-9.2,29.1-6.9,39.2,4.9C345.6,231.4,339.7,230,333.7,230.1z M375.1,401.5c7.5-10.7,14.9-21.4,22.7-31.8c3-4.1,2.6-6.2-1.7-9.1
16
- c-27.9-18.8-50.4-42.9-66.7-72.2c-7.5-13.5-12.2-28.6-18.3-43.3c-0.2,0.2-1.7,1.2-2.9,2.4c-4.1,4.1-7.5,9.1-12.2,12.3
17
- c-12.4,8.4-12.5,19.7-9.7,32.6c7.5,34.4,22.9,64.9,43.9,92.8c9.4,12.4,19.5,24.4,30,37.4C365.7,414.8,370.4,408.1,375.1,401.5z
18
- M429.1,364.4c13.7,19.3,27.2,38.3,41.2,57.9c20.5-23.3,39.3-47,53.7-74c10-18.7,16.8-38.4,20.3-59.3c1.9-11.5,1-21.2-9.4-28.8
19
- c-5.7-4.3-10.2-10.2-16.3-16.4C506.1,297.7,473,334.6,429.1,364.4z"/>
20
- <path class="st0" d="M481.8,268.1c-45.8-25.2-85.4-57.9-117.4-99.3c-6.8-8.8-11.9-19.4-15.4-30c-9.1-28.2,0.9-56.7,24.9-75.2
21
- c21.6-16.5,54-18.1,77.7-3c16.9,10.8,27.8,26.1,30.3,46.3c0.4,3.4-1.6,8.3-4.2,10.6c-2,1.8-7.6,2.4-9.8,0.9
22
- c-3.1-2.2-5.5-6.5-6.5-10.4c-6.6-25.5-26.7-39.5-53-36.5c-23.2,2.6-41.3,23.8-41.5,48.2c-0.1,13,4.2,24.7,12.4,34
23
- c16.2,18.4,32.4,37.2,50.9,53.1c20,17.2,42.7,31.1,65.1,47.1c-1.8,4.5-4.3,10.7-6.9,17.2C485.7,270,483.7,269.3,481.8,268.1z"/>
24
- <path class="st0" d="M134.3,426.9c64-0.3,127.9-0.2,191.9-0.1c2.3,0,5.5-0.2,6.8,1.1c6.5,6.5,12.4,13.5,19.1,20.9
25
- c-2.4,0.2-4.1,0.4-5.7,0.4c-73.1,0-146.3-0.1-219.4-0.2c-3.4,0-6.8-0.2-10.1-0.7c-18.1-2.9-25-17.4-16-35.3
26
- C108.4,426.9,121,426.9,134.3,426.9z"/>
27
- <path class="st0" d="M705.1,448.9c-0.8,0-1.5,0-2.2,0c-73.6,0.1-147.3,0.2-220.9,0.3c-1.3,0-2.6-0.3-4.1-0.5
28
- c5.6-5.9,11.1-11.2,16-17.1c2.9-3.5,5.8-5,10.4-5c64.7,0.2,129.4,0,194.1,0.4c12.9,0.1,24.5-1.1,32.3-14.9
29
- C737.7,437.7,729.3,448.9,705.1,448.9z"/>
30
- <path class="st0" d="M264.5,297.8c1.3,5-0.8,6.7-4.9,8.4c-22.4,9.4-45.2,18.2-67,28.9c-25.3,12.3-50.2,25.6-74.4,40
31
- c-15.8,9.4-26.4,24-30.2,42.5c-1.1,5-0.9,10.3-1.4,17.3c-2.4-3.3-4.2-5.1-5.3-7.3c-8.5-17.5-8.9-35.3,3.8-50.3
32
- c9.4-11,20.8-21.3,33.4-28.2c31.3-17.1,63.6-32.3,95.8-47.6c15.5-7.3,31.6-13.2,48.5-20.2C263.4,287.7,263.2,292.9,264.5,297.8z"/>
33
- <path class="st0" d="M742.9,419.1c-3.1-18.8-13.7-33.1-29-43.3c-15.6-10.4-31.8-20.3-48.7-28.3c-31-14.7-62.6-27.8-93.9-41.8
34
- c-2.2-1.1-5.5-3.5-5.5-5.2c0.2-6.2,1.6-12.3,2.6-18.8c2.2,0.7,4.1,1.1,5.8,1.9c34,15.1,68.3,29.5,101.8,45.5
35
- c17.7,8.5,34.6,19.1,51.2,29.8c11.6,7.6,21.2,17.8,25.4,31.6c4.8,15.9,2.4,30.6-8.8,45C743.4,429,743.6,424,742.9,419.1z"/>
36
- <path class="st0" d="M379.1,227.4c17-9.9,16.9-10.1,30.2,4.5c0.3,0.4,0.5,0.9,1.4,2.5c-22.4,12.4-44.9,24.7-68.2,37.6
37
- c-3-7.7-5.3-13.7-7.8-20C350.1,243.5,364.7,235.7,379.1,227.4z"/>
38
- <path class="st0" d="M556.3,327.9c2-5,3.5-9,5.3-13.4c48.9,20.7,98.9,36.9,143.1,66.1C657,358.4,606.5,344.1,556.3,327.9z"/>
39
- <path class="st0" d="M268.3,315.2c1.1,2.9,2,4.9,2.6,6.9c0.6,2.1,1,4.1,1.2,5.1c-48.9,17.4-97.3,34.7-143.9,51.3
40
- C170.4,351.4,219.9,335,268.3,315.2z"/>
41
- <path class="st0" d="M465,299.1c-33.6,10.9-67,9.6-100.5,0c-7.8-2.2-9.4-3.6-12.6-12.2c42.3,15.7,84.4,16.7,127.2-0.3
42
- C476.5,294.7,471.1,297.1,465,299.1z"/>
43
- <path class="st0" d="M381.9,140.1c9.7,6.8,19.9,14.1,30.2,21.2c11.4,8,17.3,19,18.8,33.9C415.3,183.5,382.7,146,381.9,140.1z"/>
44
- <path class="st0" d="M360.8,276c36.5,10.4,71.8,9.6,107.1,1.3C442.6,294.2,376.8,293.8,360.8,276z"/>
45
- </g>
46
- </svg>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ viewBox="0 0 841.9 510.4" style="enable-background:new 0 0 841.9 510.4;" xml:space="preserve">
5
+ <style type="text/css">
6
+ .st0{fill:#D6BA7D;}
7
+ </style>
8
+ <g>
9
+ <path class="st0" d="M333.7,230.1c-9.1-0.1-12.4,3.9-10.7,12.8c1.2,6.3,2.8,12.7,5.3,18.7c16.1,39.2,43.1,69.4,77.8,93.1
10
+ c5.8,3.9,11,3.7,16.8,0.2c20.3-12.2,37.5-28.1,52-46.6c15-19.1,27.6-39.7,32.5-64c2.2-11-2.4-15.7-13.8-14.5
11
+ c-2.9,0.3-5.7,1.4-8.5,1.9c-1.9,0.4-3.8,0.4-6.9,0.7c10.4-11.8,29.4-13.9,39.3-4.7c11,10.2,21,21.3,31.8,31.7
12
+ c5.2,4.9,8,10.6,6.9,17.4c-2.2,14.3-3.6,28.9-8,42.5c-14.1,43.9-41.2,79.8-72.3,113.1c-6.5,6.9-7.2,6.9-13-1.1
13
+ c-13.3-18.4-26.3-37-39.7-55.3c-8.3-11.3-8.5-11.2-16.7,0.3c-13.3,18.6-26.6,37.3-39.9,56c-2.8,3.8-5.4,6.9-10.2,1.8
14
+ c-27.8-29.9-52.8-61.7-68.4-99.8c-7.6-18.6-14-37.7-13.7-58.1c0.1-4.7,1.5-10.6,4.5-13.9c11.1-12.1,22.8-23.6,34.8-34.8
15
+ c9.9-9.2,29.1-6.9,39.2,4.9C345.6,231.4,339.7,230,333.7,230.1z M375.1,401.5c7.5-10.7,14.9-21.4,22.7-31.8c3-4.1,2.6-6.2-1.7-9.1
16
+ c-27.9-18.8-50.4-42.9-66.7-72.2c-7.5-13.5-12.2-28.6-18.3-43.3c-0.2,0.2-1.7,1.2-2.9,2.4c-4.1,4.1-7.5,9.1-12.2,12.3
17
+ c-12.4,8.4-12.5,19.7-9.7,32.6c7.5,34.4,22.9,64.9,43.9,92.8c9.4,12.4,19.5,24.4,30,37.4C365.7,414.8,370.4,408.1,375.1,401.5z
18
+ M429.1,364.4c13.7,19.3,27.2,38.3,41.2,57.9c20.5-23.3,39.3-47,53.7-74c10-18.7,16.8-38.4,20.3-59.3c1.9-11.5,1-21.2-9.4-28.8
19
+ c-5.7-4.3-10.2-10.2-16.3-16.4C506.1,297.7,473,334.6,429.1,364.4z"/>
20
+ <path class="st0" d="M481.8,268.1c-45.8-25.2-85.4-57.9-117.4-99.3c-6.8-8.8-11.9-19.4-15.4-30c-9.1-28.2,0.9-56.7,24.9-75.2
21
+ c21.6-16.5,54-18.1,77.7-3c16.9,10.8,27.8,26.1,30.3,46.3c0.4,3.4-1.6,8.3-4.2,10.6c-2,1.8-7.6,2.4-9.8,0.9
22
+ c-3.1-2.2-5.5-6.5-6.5-10.4c-6.6-25.5-26.7-39.5-53-36.5c-23.2,2.6-41.3,23.8-41.5,48.2c-0.1,13,4.2,24.7,12.4,34
23
+ c16.2,18.4,32.4,37.2,50.9,53.1c20,17.2,42.7,31.1,65.1,47.1c-1.8,4.5-4.3,10.7-6.9,17.2C485.7,270,483.7,269.3,481.8,268.1z"/>
24
+ <path class="st0" d="M134.3,426.9c64-0.3,127.9-0.2,191.9-0.1c2.3,0,5.5-0.2,6.8,1.1c6.5,6.5,12.4,13.5,19.1,20.9
25
+ c-2.4,0.2-4.1,0.4-5.7,0.4c-73.1,0-146.3-0.1-219.4-0.2c-3.4,0-6.8-0.2-10.1-0.7c-18.1-2.9-25-17.4-16-35.3
26
+ C108.4,426.9,121,426.9,134.3,426.9z"/>
27
+ <path class="st0" d="M705.1,448.9c-0.8,0-1.5,0-2.2,0c-73.6,0.1-147.3,0.2-220.9,0.3c-1.3,0-2.6-0.3-4.1-0.5
28
+ c5.6-5.9,11.1-11.2,16-17.1c2.9-3.5,5.8-5,10.4-5c64.7,0.2,129.4,0,194.1,0.4c12.9,0.1,24.5-1.1,32.3-14.9
29
+ C737.7,437.7,729.3,448.9,705.1,448.9z"/>
30
+ <path class="st0" d="M264.5,297.8c1.3,5-0.8,6.7-4.9,8.4c-22.4,9.4-45.2,18.2-67,28.9c-25.3,12.3-50.2,25.6-74.4,40
31
+ c-15.8,9.4-26.4,24-30.2,42.5c-1.1,5-0.9,10.3-1.4,17.3c-2.4-3.3-4.2-5.1-5.3-7.3c-8.5-17.5-8.9-35.3,3.8-50.3
32
+ c9.4-11,20.8-21.3,33.4-28.2c31.3-17.1,63.6-32.3,95.8-47.6c15.5-7.3,31.6-13.2,48.5-20.2C263.4,287.7,263.2,292.9,264.5,297.8z"/>
33
+ <path class="st0" d="M742.9,419.1c-3.1-18.8-13.7-33.1-29-43.3c-15.6-10.4-31.8-20.3-48.7-28.3c-31-14.7-62.6-27.8-93.9-41.8
34
+ c-2.2-1.1-5.5-3.5-5.5-5.2c0.2-6.2,1.6-12.3,2.6-18.8c2.2,0.7,4.1,1.1,5.8,1.9c34,15.1,68.3,29.5,101.8,45.5
35
+ c17.7,8.5,34.6,19.1,51.2,29.8c11.6,7.6,21.2,17.8,25.4,31.6c4.8,15.9,2.4,30.6-8.8,45C743.4,429,743.6,424,742.9,419.1z"/>
36
+ <path class="st0" d="M379.1,227.4c17-9.9,16.9-10.1,30.2,4.5c0.3,0.4,0.5,0.9,1.4,2.5c-22.4,12.4-44.9,24.7-68.2,37.6
37
+ c-3-7.7-5.3-13.7-7.8-20C350.1,243.5,364.7,235.7,379.1,227.4z"/>
38
+ <path class="st0" d="M556.3,327.9c2-5,3.5-9,5.3-13.4c48.9,20.7,98.9,36.9,143.1,66.1C657,358.4,606.5,344.1,556.3,327.9z"/>
39
+ <path class="st0" d="M268.3,315.2c1.1,2.9,2,4.9,2.6,6.9c0.6,2.1,1,4.1,1.2,5.1c-48.9,17.4-97.3,34.7-143.9,51.3
40
+ C170.4,351.4,219.9,335,268.3,315.2z"/>
41
+ <path class="st0" d="M465,299.1c-33.6,10.9-67,9.6-100.5,0c-7.8-2.2-9.4-3.6-12.6-12.2c42.3,15.7,84.4,16.7,127.2-0.3
42
+ C476.5,294.7,471.1,297.1,465,299.1z"/>
43
+ <path class="st0" d="M381.9,140.1c9.7,6.8,19.9,14.1,30.2,21.2c11.4,8,17.3,19,18.8,33.9C415.3,183.5,382.7,146,381.9,140.1z"/>
44
+ <path class="st0" d="M360.8,276c36.5,10.4,71.8,9.6,107.1,1.3C442.6,294.2,376.8,293.8,360.8,276z"/>
45
+ </g>
46
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primestyleai/tryon",
3
- "version": "3.4.1",
3
+ "version": "3.5.1",
4
4
  "description": "PrimeStyle Virtual Try-On SDK — React component & Web Component",
5
5
  "type": "module",
6
6
  "main": "dist/primestyle-tryon.js",