@primestyleai/tryon 3.4.2 → 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;
@@ -474,7 +503,7 @@ function PrimeStyleTryonInner({
474
503
  } finally {
475
504
  setSizingLoading(false);
476
505
  }
477
- }, [apiUrl, sizingMethod, sizingCountry, heightUnit, weightUnit, sizingUnit, sizeGuide, productTitle]);
506
+ }, [apiUrl, sizingMethod, sizingCountry, heightUnit, weightUnit, sizingUnit, sizeGuide, productTitle, dynamicFields]);
478
507
  const handleSubmit = useCallback(async () => {
479
508
  if (!selectedFile || !apiRef.current || !sseRef.current) {
480
509
  const msg = !apiRef.current ? "Missing NEXT_PUBLIC_PRIMESTYLE_API_KEY" : "No file selected";
@@ -575,6 +604,11 @@ function PrimeStyleTryonInner({
575
604
  if (p.shoeUS) fd.shoeUS = p.shoeUS;
576
605
  if (p.shoeUK) fd.shoeUK = p.shoeUK;
577
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
+ }
578
612
  formRef.current = fd;
579
613
  setFormGender(fd.gender || "male");
580
614
  if (p.country) setSizingCountry(p.country);
@@ -610,6 +644,33 @@ function PrimeStyleTryonInner({
610
644
  weightUnit,
611
645
  createdAt: Date.now()
612
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;
613
674
  setProfiles((prev) => {
614
675
  const idx = prev.findIndex((x) => x.id === id);
615
676
  if (idx >= 0) {
@@ -821,7 +882,7 @@ function PrimeStyleTryonInner({
821
882
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-choice-icon", children: /* @__PURE__ */ jsx(RulerIcon, { size: 24 }) }),
822
883
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-choice-info", children: [
823
884
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-choice-title", children: "Enter my measurements" }),
824
- /* @__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" })
825
886
  ] }),
826
887
  /* @__PURE__ */ jsx("span", { className: "ps-tryon-choice-badge", children: "Best accuracy" })
827
888
  ] }),
@@ -891,42 +952,77 @@ function PrimeStyleTryonInner({
891
952
  setHeightUnit(v === "cm" ? "cm" : "ft");
892
953
  setWeightUnit(v === "cm" ? "kg" : "lbs");
893
954
  } }) }),
894
- sizingMethod === "exact" ? /* @__PURE__ */ jsxs(Fragment, { children: [
895
- isFemale ? /* @__PURE__ */ jsxs(Fragment, { children: [
896
- /* @__PURE__ */ jsx(InputRow, { label: "Bust *", fieldKey: "bust", placeholder: isCm ? "e.g. 88" : "e.g. 35", type: "number", unit: sizingUnit }),
897
- /* @__PURE__ */ jsx(InputRow, { label: "Waist *", fieldKey: "waist", placeholder: isCm ? "e.g. 70" : "e.g. 28", type: "number", unit: sizingUnit }),
898
- /* @__PURE__ */ jsx(InputRow, { label: "Hips *", fieldKey: "hips", placeholder: isCm ? "e.g. 96" : "e.g. 38", type: "number", unit: sizingUnit }),
899
- /* @__PURE__ */ jsx(InputRow, { label: "Shoulders", fieldKey: "shoulderWidth", placeholder: isCm ? "e.g. 39" : "e.g. 15", type: "number", unit: sizingUnit }),
900
- /* @__PURE__ */ jsx(InputRow, { label: "Inseam", fieldKey: "inseam", placeholder: isCm ? "e.g. 76" : "e.g. 30", type: "number", unit: sizingUnit })
901
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
902
- /* @__PURE__ */ jsx(InputRow, { label: "Chest *", fieldKey: "chest", placeholder: isCm ? "e.g. 104" : "e.g. 41", type: "number", unit: sizingUnit }),
903
- /* @__PURE__ */ jsx(InputRow, { label: "Waist *", fieldKey: "waist", placeholder: isCm ? "e.g. 84" : "e.g. 33", type: "number", unit: sizingUnit }),
904
- /* @__PURE__ */ jsx(InputRow, { label: "Shoulders", fieldKey: "shoulderWidth", placeholder: isCm ? "e.g. 46" : "e.g. 18", type: "number", unit: sizingUnit }),
905
- /* @__PURE__ */ jsx(InputRow, { label: "Sleeve", fieldKey: "sleeveLength", placeholder: isCm ? "e.g. 64" : "e.g. 25", type: "number", unit: sizingUnit }),
906
- /* @__PURE__ */ jsx(InputRow, { label: "Inseam", fieldKey: "inseam", placeholder: isCm ? "e.g. 81" : "e.g. 32", type: "number", unit: sizingUnit })
907
- ] }),
908
- isFemale && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-input-row", children: [
909
- /* @__PURE__ */ jsx("label", { children: "Fit type" }),
910
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-unit-toggle", children: ["petite", "standard", "tall", "plus"].map((fp) => /* @__PURE__ */ jsx(
911
- "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,
912
967
  {
913
- className: `ps-tryon-unit-btn${(formRef.current.fitPreference || "standard") === fp ? " ps-active" : ""}`,
914
- onClick: (e) => {
915
- updateField("fitPreference", fp);
916
- const btns = e.target.parentElement.querySelectorAll(".ps-tryon-unit-btn");
917
- btns.forEach((b) => b.classList.toggle("ps-active", b.textContent?.toLowerCase() === fp));
918
- },
919
- 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
920
973
  },
921
- fp
922
- )) })
923
- ] }),
924
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-shoe-section", children: [
925
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-shoe-title", children: "Shoe sizing (optional)" }),
926
- /* @__PURE__ */ jsx(InputRow, { label: "Foot length", fieldKey: "footLengthCm", placeholder: isCm ? "e.g. 27" : "e.g. 10.5", type: "number", unit: sizingUnit }),
927
- /* @__PURE__ */ jsx(InputRow, { label: shoeField.label, fieldKey: shoeField.key, placeholder: shoeField.ph })
928
- ] })
929
- ] }) : /* @__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: [
930
1026
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-input-row", children: [
931
1027
  /* @__PURE__ */ jsx("label", { children: "Height *" }),
932
1028
  heightUnit === "ft" ? /* @__PURE__ */ jsxs("div", { className: "ps-tryon-height-ft", children: [
@@ -974,7 +1070,10 @@ function PrimeStyleTryonInner({
974
1070
  function ProcessingView() {
975
1071
  return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-processing", children: [
976
1072
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-processing-image-wrap", children: [
977
- 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
+ ] }),
978
1077
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-scan-line" }),
979
1078
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-scan-overlay" })
980
1079
  ] }),
@@ -990,6 +1089,8 @@ function PrimeStyleTryonInner({
990
1089
  const hasSizing = !!sizingResult || sizingLoading;
991
1090
  const hasBoth = !!resultImageUrl && hasSizing;
992
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" : "";
993
1094
  return /* @__PURE__ */ jsxs("div", { className: `ps-tryon-result-layout${hasBoth ? " ps-tryon-result-split" : ""}`, children: [
994
1095
  resultImageUrl && /* @__PURE__ */ jsx("div", { className: "ps-tryon-result-image-col", children: /* @__PURE__ */ jsx("img", { src: resultImageUrl, alt: "Try-on result", className: cn.resultImage }) }),
995
1096
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-result-info-col", children: [
@@ -998,20 +1099,23 @@ function PrimeStyleTryonInner({
998
1099
  /* @__PURE__ */ jsx("p", { className: "ps-tryon-size-reasoning", children: "Analyzing your size..." })
999
1100
  ] }),
1000
1101
  sizingResult && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-size-recommend", children: [
1001
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-size-badge", children: sizingResult.recommendedSize }),
1002
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-size-confidence", children: [
1003
- "Confidence: ",
1004
- /* @__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 })
1005
1106
  ] }),
1006
- /* @__PURE__ */ jsx("p", { className: "ps-tryon-size-reasoning", children: sizingResult.reasoning }),
1007
- 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: [
1008
- k,
1009
- ": ",
1010
- v
1011
- ] }, k)) }),
1012
- sizingResult.matchDetails && sizingResult.matchDetails.length > 0 && /* @__PURE__ */ jsxs("details", { className: "ps-tryon-match-details", children: [
1013
- /* @__PURE__ */ jsx("summary", { children: "Measurement breakdown" }),
1014
- /* @__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: [
1015
1119
  /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
1016
1120
  /* @__PURE__ */ jsx("th", { children: "Area" }),
1017
1121
  /* @__PURE__ */ jsx("th", { children: "You" }),
@@ -1025,7 +1129,15 @@ function PrimeStyleTryonInner({
1025
1129
  /* @__PURE__ */ jsx("td", { className: `ps-fit-${m.fit}`, children: m.fit })
1026
1130
  ] }, i)) })
1027
1131
  ] })
1028
- ] })
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 })
1029
1141
  ] }),
1030
1142
  /* @__PURE__ */ jsxs("div", { className: cx("ps-tryon-result-actions", cn.resultActions), children: [
1031
1143
  /* @__PURE__ */ jsx("button", { onClick: handleDownload, className: cx("ps-tryon-btn-download", cn.downloadButton), children: "Download" }),
@@ -1036,15 +1148,21 @@ function PrimeStyleTryonInner({
1036
1148
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-save-row", children: [
1037
1149
  /* @__PURE__ */ jsx("input", { type: "text", placeholder: "Name this profile (e.g. John, Sarah)", value: profileName, onChange: (e) => setProfileName(e.target.value) }),
1038
1150
  activeProfileId ? /* @__PURE__ */ jsxs("div", { className: "ps-tryon-save-btn-group", children: [
1039
- /* @__PURE__ */ jsx("button", { onClick: () => {
1151
+ /* @__PURE__ */ jsxs("button", { onClick: () => {
1040
1152
  if (profileName.trim()) saveProfile(profileName.trim());
1041
- }, children: "Update" }),
1153
+ }, children: [
1154
+ "💾",
1155
+ " Update"
1156
+ ] }),
1042
1157
  /* @__PURE__ */ jsx("button", { className: "ps-tryon-save-new-btn", onClick: () => {
1043
1158
  if (profileName.trim()) saveProfile(profileName.trim(), true);
1044
1159
  }, children: "+ New" })
1045
- ] }) : /* @__PURE__ */ jsx("button", { onClick: () => {
1160
+ ] }) : /* @__PURE__ */ jsxs("button", { onClick: () => {
1046
1161
  if (profileName.trim()) saveProfile(profileName.trim());
1047
- }, children: "Save" })
1162
+ }, children: [
1163
+ "💾",
1164
+ " Save"
1165
+ ] })
1048
1166
  ] })
1049
1167
  ] }),
1050
1168
  profileSaved && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-save-done", children: [
@@ -1229,7 +1347,11 @@ const STYLES = `
1229
1347
  .ps-tryon-overlay {
1230
1348
  position: fixed; inset: 0; background: var(--ps-modal-overlay, rgba(0,0,0,0.6));
1231
1349
  display: flex; align-items: center; justify-content: center;
1232
- 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;
1233
1355
  }
1234
1356
  @keyframes ps-fade-in { from { opacity: 0; } to { opacity: 1; } }
1235
1357
 
@@ -1240,6 +1362,7 @@ const STYLES = `
1240
1362
  font-family: var(--ps-modal-font, system-ui, -apple-system, sans-serif);
1241
1363
  box-shadow: 0 25px 50px rgba(0,0,0,0.4); animation: ps-slide-up 0.3s ease;
1242
1364
  scrollbar-width: thin; scrollbar-color: #333 transparent;
1365
+ flex-shrink: 0;
1243
1366
  }
1244
1367
  .ps-tryon-modal-wide { max-width: 920px; }
1245
1368
  .ps-tryon-modal:has(.ps-tryon-drawer-open) { overflow: hidden; }
@@ -1439,6 +1562,12 @@ const STYLES = `
1439
1562
  font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s; font-family: inherit;
1440
1563
  }
1441
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; }
1442
1571
  .ps-tryon-shoe-section { border-top: 1px solid #333; padding-top: 14px; margin-top: 6px; display: flex; flex-direction: column; gap: 10px; }
1443
1572
  .ps-tryon-shoe-title { font-size: 13px; font-weight: 600; color: #999; }
1444
1573
  .ps-tryon-disclaimer { font-size: 11px; color: #666; margin: 4px 0 0; }
@@ -1460,11 +1589,15 @@ const STYLES = `
1460
1589
  .ps-tryon-processing { text-align: center; padding: 24px; display: flex; flex-direction: column; align-items: center; }
1461
1590
 
1462
1591
  .ps-tryon-processing-image-wrap {
1463
- position: relative; width: 200px; height: 260px; margin: 0 auto 24px;
1592
+ position: relative; width: 220px; height: 280px; margin: 0 auto 24px;
1464
1593
  border-radius: 16px; overflow: hidden; border: 2px solid #333;
1465
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
+ }
1466
1599
  .ps-tryon-processing-model {
1467
- width: 100%; height: 100%; object-fit: cover; display: block;
1600
+ position: relative; z-index: 1; width: 100%; height: 100%; object-fit: contain; display: block;
1468
1601
  }
1469
1602
  .ps-tryon-scan-overlay {
1470
1603
  position: absolute; inset: 0;
@@ -1523,12 +1656,20 @@ const STYLES = `
1523
1656
 
1524
1657
  /* Size recommendation */
1525
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
+ }
1526
1664
  .ps-tryon-size-badge {
1527
1665
  display: inline-flex; align-items: center; justify-content: center;
1528
- width: 56px; height: 56px; border-radius: 50%;
1666
+ min-width: 56px; height: 56px; padding: 0 12px; border-radius: 12px;
1529
1667
  background: linear-gradient(135deg, #bb945c, #d6ba7d);
1530
- color: #111; font-size: 20px; font-weight: 700; margin-bottom: 10px;
1668
+ color: #111; font-size: 24px; font-weight: 800; letter-spacing: -0.02em;
1531
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
+
1532
1673
  .ps-tryon-sizing-loading { text-align: center; padding: 20px 0; }
1533
1674
  .ps-tryon-size-loading-spinner {
1534
1675
  width: 36px; height: 36px; border: 3px solid #333;
@@ -1536,18 +1677,42 @@ const STYLES = `
1536
1677
  animation: ps-spin 0.8s linear infinite; margin: 0 auto 12px;
1537
1678
  }
1538
1679
  @keyframes ps-spin { to { transform: rotate(360deg); } }
1539
- .ps-tryon-size-confidence { font-size: 12px; color: #999; margin-bottom: 8px; }
1540
- .ps-conf-high { color: #4ade80; } .ps-conf-medium { color: #bb945c; } .ps-conf-low { color: #ef4444; }
1541
- .ps-tryon-size-reasoning { font-size: 13px; color: #ccc; line-height: 1.5; margin-bottom: 12px; }
1542
- .ps-tryon-intl-sizes { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
1543
- .ps-tryon-intl-chip { padding: 4px 10px; border: 1px solid #333; border-radius: 8px; font-size: 11px; color: #ccc; font-weight: 500; }
1544
- .ps-tryon-match-details { margin-top: 12px; }
1545
- .ps-tryon-match-details summary { font-size: 12px; color: #bb945c; cursor: pointer; font-weight: 600; }
1546
- .ps-tryon-match-details table { width: 100%; border-collapse: collapse; margin-top: 8px; font-size: 12px; }
1547
- .ps-tryon-match-details th { text-align: left; padding: 6px 8px; border-bottom: 1px solid #333; color: #999; font-weight: 600; }
1548
- .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; }
1549
1702
  .ps-fit-good { color: #4ade80; } .ps-fit-tight { color: #f59e0b; } .ps-fit-loose { color: #60a5fa; }
1550
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
+
1551
1716
  /* Save profile prompt */
1552
1717
  .ps-tryon-save-prompt { margin-top: 14px; padding: 14px; border: 1px solid #333; border-radius: 12px; background: #1a1b1a; }
1553
1718
  .ps-tryon-save-label { font-size: 12px; color: #999; margin-bottom: 10px; }
@@ -1677,13 +1842,27 @@ const STYLES = `
1677
1842
  .ps-tryon-detail-delete svg { stroke: currentColor; fill: none; }
1678
1843
 
1679
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
+ }
1680
1861
  @media (max-width: 720px) {
1681
1862
  .ps-tryon-result-split { flex-direction: column; }
1682
1863
  .ps-tryon-result-image-col { flex: none; }
1683
- .ps-tryon-modal-wide { max-width: 520px; }
1684
1864
  }
1685
1865
  @media (max-width: 480px) {
1686
- .ps-tryon-modal { max-height: 100vh; border-radius: 14px; }
1687
1866
  .ps-tryon-body { padding: 18px; }
1688
1867
  .ps-tryon-header { padding: 14px 18px; }
1689
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.2",
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",