@primestyleai/tryon 5.10.99 → 5.10.100

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.
@@ -135,7 +135,7 @@ export interface SizeGuide {
135
135
  /** Mapping of section name → product image URL (classified by AI) */
136
136
  sectionImages?: Record<string, string>;
137
137
  }
138
- export type ViewState = "idle" | "welcome" | "body-profile" | "estimation-review" | "size-result" | "upload" | "processing" | "result" | "error" | "no-chart" | "profiles";
138
+ export type ViewState = "idle" | "welcome" | "body-profile" | "estimation-review" | "size-result" | "upload" | "photo-guide" | "processing" | "result" | "error" | "no-chart" | "profiles";
139
139
  export type DrawerType = "profiles" | "history" | null;
140
140
  export interface PrimeStyleTryonProps {
141
141
  productImage: string;
@@ -0,0 +1,15 @@
1
+ import type { TranslateFn } from "../../i18n";
2
+ /**
3
+ * Photo guide screen — mirrors the inline `showPhotoGuide` overlay inside
4
+ * SizeResultView. Used for try-on flows that don't have a size result yet
5
+ * (e.g. NoChartView's "See how it looks on you").
6
+ *
7
+ * Desktop: split — photo upload on the left, Do/Don't/Pro-Tip on the right.
8
+ * Mobile: stacked — title + preview + checklist + START TRY-ON.
9
+ */
10
+ export declare function PhotoGuideView({ measurementType, onBack, onSubmit, t, }: {
11
+ measurementType?: "body" | "face" | "head" | "foot";
12
+ onBack: () => void;
13
+ onSubmit: (file: File) => void;
14
+ t: TranslateFn;
15
+ }): import("react/jsx-runtime").JSX.Element;
@@ -21928,6 +21928,275 @@ function UploadView({
21928
21928
  }
21929
21929
  ) });
21930
21930
  }
21931
+ function PhotoGuideView({
21932
+ measurementType = "body",
21933
+ onBack,
21934
+ onSubmit,
21935
+ t: t2
21936
+ }) {
21937
+ const isMobile = useIsMobile();
21938
+ const [guideFile, setGuideFile] = reactExports.useState(null);
21939
+ const [guidePreviewUrl, setGuidePreviewUrl] = reactExports.useState(null);
21940
+ const [, setGuideDragOver] = reactExports.useState(false);
21941
+ const guideInputRef = reactExports.useRef(null);
21942
+ reactExports.useEffect(() => {
21943
+ if (!guideFile) {
21944
+ setGuidePreviewUrl(null);
21945
+ return;
21946
+ }
21947
+ const url = URL.createObjectURL(guideFile);
21948
+ setGuidePreviewUrl(url);
21949
+ return () => URL.revokeObjectURL(url);
21950
+ }, [guideFile]);
21951
+ const submit = () => {
21952
+ if (!guideFile) return;
21953
+ onSubmit(guideFile);
21954
+ };
21955
+ if (isMobile) {
21956
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ps-bp-wrapper", style: { padding: "16px 16px 0", background: "var(--ps-bg-primary)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ps-pm-root", children: [
21957
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ps-pm-header", children: [
21958
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "ps-pm-title", children: t2("Review your photo") }),
21959
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "ps-pm-subtitle", children: measurementType === "face" ? t2("A clear, front-facing face photo — no glasses on — gives us the most accurate try-on.") : measurementType === "head" ? t2("Face the camera with your head and shoulders in frame, leaving space above your head.") : t2("Ensure your full body is visible for the most accurate virtual try-on.") })
21960
+ ] }),
21961
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
21962
+ "input",
21963
+ {
21964
+ ref: guideInputRef,
21965
+ type: "file",
21966
+ accept: "image/jpeg,image/png,image/webp",
21967
+ style: { display: "none" },
21968
+ onChange: (e) => {
21969
+ const f2 = e.target.files?.[0];
21970
+ if (f2) setGuideFile(f2);
21971
+ }
21972
+ }
21973
+ ),
21974
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ps-pm-preview", children: guideFile && guidePreviewUrl ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
21975
+ /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: guidePreviewUrl, alt: t2("Your photo"), className: "ps-pm-preview-img" }),
21976
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
21977
+ "button",
21978
+ {
21979
+ type: "button",
21980
+ className: "ps-pm-preview-remove",
21981
+ onClick: () => setGuideFile(null),
21982
+ "aria-label": t2("Remove photo"),
21983
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", width: "14", height: "14", children: [
21984
+ /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
21985
+ /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
21986
+ ] })
21987
+ }
21988
+ )
21989
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(
21990
+ "button",
21991
+ {
21992
+ type: "button",
21993
+ className: "ps-pm-preview-empty",
21994
+ onClick: () => guideInputRef.current?.click(),
21995
+ children: [
21996
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", width: "32", height: "32", children: [
21997
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
21998
+ /* @__PURE__ */ jsxRuntimeExports.jsx("polyline", { points: "17 8 12 3 7 8" }),
21999
+ /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "12", y1: "3", x2: "12", y2: "15" })
22000
+ ] }),
22001
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ps-pm-preview-empty-title", children: t2("Tap to upload") }),
22002
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ps-pm-preview-empty-hint", children: t2("JPEG, PNG up to 10MB") })
22003
+ ]
22004
+ }
22005
+ ) }),
22006
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ps-pm-checklist", children: [
22007
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ps-pm-checklist-icon", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "14", height: "14", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z" }) }) }),
22008
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ps-pm-checklist-body", children: [
22009
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ps-pm-checklist-title", children: t2("Checklist for accuracy") }),
22010
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "ps-pm-checklist-items", children: measurementType === "face" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22011
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Face the camera directly at eye level") }),
22012
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Remove any glasses you're wearing") }),
22013
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Good lighting, plain background") })
22014
+ ] }) : measurementType === "head" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22015
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Head and shoulders in frame") }),
22016
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Leave space above your head") }),
22017
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Good lighting, plain background") })
22018
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22019
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Form-fitting clothing is recommended") }),
22020
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Standing 2-3 meters from camera") }),
22021
+ /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: t2("Neutral background with good lighting") })
22022
+ ] }) })
22023
+ ] })
22024
+ ] }),
22025
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ps-bpm-spacer" }),
22026
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ps-bpm-bottom", children: [
22027
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
22028
+ "button",
22029
+ {
22030
+ type: "button",
22031
+ className: "ps-pm-primary-btn",
22032
+ disabled: !guideFile,
22033
+ onClick: submit,
22034
+ children: t2("START TRY-ON")
22035
+ }
22036
+ ),
22037
+ guideFile ? /* @__PURE__ */ jsxRuntimeExports.jsx(
22038
+ "button",
22039
+ {
22040
+ type: "button",
22041
+ className: "ps-pm-secondary-btn",
22042
+ onClick: () => guideInputRef.current?.click(),
22043
+ children: t2("RETAKE PHOTO")
22044
+ }
22045
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
22046
+ "button",
22047
+ {
22048
+ type: "button",
22049
+ className: "ps-pm-secondary-btn",
22050
+ onClick: onBack,
22051
+ children: t2("BACK")
22052
+ }
22053
+ )
22054
+ ] })
22055
+ ] }) });
22056
+ }
22057
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", flexDirection: "column", padding: "1.5vw", width: "100%", height: "100%", background: "var(--ps-bg-primary)", borderRadius: "0.8vw", overflow: "hidden" }, children: [
22058
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", gap: "1.2vw", flex: 1, alignItems: "stretch", minHeight: 0, overflow: "hidden" }, children: [
22059
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
22060
+ "div",
22061
+ {
22062
+ onClick: () => guideInputRef.current?.click(),
22063
+ onDragOver: (e) => {
22064
+ e.preventDefault();
22065
+ setGuideDragOver(true);
22066
+ },
22067
+ onDragLeave: () => setGuideDragOver(false),
22068
+ onDrop: (e) => {
22069
+ e.preventDefault();
22070
+ setGuideDragOver(false);
22071
+ const f2 = e.dataTransfer.files[0];
22072
+ if (f2) setGuideFile(f2);
22073
+ },
22074
+ style: {
22075
+ flex: 1,
22076
+ display: "flex",
22077
+ flexDirection: "column",
22078
+ alignItems: "center",
22079
+ justifyContent: "center",
22080
+ border: guideFile ? "none" : "2px dashed var(--ps-border-color)",
22081
+ borderRadius: "0.5vw",
22082
+ cursor: "pointer",
22083
+ position: "relative",
22084
+ background: "var(--ps-bg-secondary)",
22085
+ overflow: "hidden"
22086
+ },
22087
+ className: "ps-tryon-upload-hover",
22088
+ children: [
22089
+ guideFile && guidePreviewUrl ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22090
+ /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: guidePreviewUrl, alt: "preview", style: { width: "100%", height: "100%", objectFit: "contain" } }),
22091
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ps-tryon-upload-hover-overlay", style: { position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center", background: "rgba(0,0,0,0.4)", opacity: 0, transition: "opacity 0.2s", borderRadius: "0.5vw" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#fff", fontSize: "0.8vw", fontWeight: 600 }, children: t2("Click to change photo") }) })
22092
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22093
+ /* @__PURE__ */ jsxRuntimeExports.jsx(UploadIcon, { size: 32 }),
22094
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: "0.85vw", fontWeight: 600, color: "var(--ps-text-primary)", marginTop: "0.5vw" }, children: t2("Upload your photo") }),
22095
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: "0.6vw", color: "var(--ps-text-muted)", marginTop: "0.2vw" }, children: measurementType === "face" ? t2("Click or drag a close-up face photo") : measurementType === "head" ? t2("Click or drag a head-and-shoulders photo") : t2("Click or drag a full-body photo") })
22096
+ ] }),
22097
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
22098
+ "input",
22099
+ {
22100
+ ref: guideInputRef,
22101
+ type: "file",
22102
+ accept: "image/jpeg,image/png,image/webp",
22103
+ style: { display: "none" },
22104
+ onChange: (e) => {
22105
+ const f2 = e.target.files?.[0];
22106
+ if (f2) setGuideFile(f2);
22107
+ }
22108
+ }
22109
+ )
22110
+ ]
22111
+ }
22112
+ ),
22113
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { flex: 1, display: "flex", flexDirection: "column", justifyContent: "center", gap: "0.6vw" }, children: [
22114
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: "0.85vw", fontWeight: 700, color: "var(--ps-text-primary)", marginBottom: "0.3vw" }, children: t2("How to take the best photo") }),
22115
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { background: "#ddfbe7", borderRadius: "0.5vw", padding: "0.6vw 0.8vw" }, children: [
22116
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.3vw", marginBottom: "0.3vw" }, children: [
22117
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#1c9d4c", fontSize: "0.75vw", fontWeight: 700 }, children: "✓" }),
22118
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#1c9d4c", fontSize: "0.65vw", fontWeight: 600 }, children: t2("Do") })
22119
+ ] }),
22120
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: "0.58vw", color: "var(--ps-text-primary)", lineHeight: 1.8 }, children: measurementType === "face" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22121
+ t2("Face the camera directly, centered in frame"),
22122
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22123
+ t2("Use natural, even lighting (e.g. near a window)"),
22124
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22125
+ t2("Keep hair away from your face and ears"),
22126
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22127
+ t2("Choose a plain, light background")
22128
+ ] }) : measurementType === "head" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22129
+ t2("Face the camera with head and shoulders in frame"),
22130
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22131
+ t2("Leave some space above your head"),
22132
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22133
+ t2("Use natural, even lighting"),
22134
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22135
+ t2("Choose a plain, light background")
22136
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22137
+ t2("Stand facing the camera with your full body in frame"),
22138
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22139
+ t2("Use natural or even lighting"),
22140
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22141
+ t2("Wear fitted, simple clothing"),
22142
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22143
+ t2("Stand straight and still, arms relaxed")
22144
+ ] }) })
22145
+ ] }),
22146
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { background: "#ffe2e2", borderRadius: "0.5vw", padding: "0.6vw 0.8vw" }, children: [
22147
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.3vw", marginBottom: "0.3vw" }, children: [
22148
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#e7000b", fontSize: "0.75vw", fontWeight: 700 }, children: "✗" }),
22149
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#e7000b", fontSize: "0.65vw", fontWeight: 600 }, children: t2("Don't") })
22150
+ ] }),
22151
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: "0.58vw", color: "var(--ps-text-primary)", lineHeight: 1.8 }, children: measurementType === "face" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22152
+ t2("Don't wear sunglasses or a hat in the photo"),
22153
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22154
+ t2("Don't tilt or turn your head"),
22155
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22156
+ t2("Don't use strong backlighting or flash"),
22157
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22158
+ t2("Don't apply filters or edits")
22159
+ ] }) : measurementType === "head" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22160
+ t2("Don't wear a hat in the photo"),
22161
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22162
+ t2("Don't crop out the top of your head"),
22163
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22164
+ t2("Don't use strong backlighting or flash"),
22165
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22166
+ t2("Don't apply filters or edits")
22167
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
22168
+ t2("Don't wear loose or baggy clothing"),
22169
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22170
+ t2("Don't sit, pose, or bend"),
22171
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22172
+ t2("Don't take mirror photos or selfies"),
22173
+ /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
22174
+ t2("Don't apply filters or edits")
22175
+ ] }) })
22176
+ ] }),
22177
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { background: "rgba(59,130,246,0.08)", border: "1px solid rgba(59,130,246,0.2)", borderRadius: "0.5vw", padding: "0.5vw 0.8vw" }, children: [
22178
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.3vw", marginBottom: "0.2vw" }, children: [
22179
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SparkleIcon, { size: 12 }),
22180
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--ps-accent)", fontSize: "0.65vw", fontWeight: 700 }, children: t2("Pro Tip") })
22181
+ ] }),
22182
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: "0.55vw", color: "var(--ps-text-secondary)", lineHeight: 1.7 }, children: measurementType === "face" ? t2("A clear, well-lit face photo gives the most accurate eyewear try-on.") : measurementType === "head" ? t2("A clear head-and-shoulders photo with space above your head gives the most accurate headwear try-on.") : t2("Our AI works best with front-facing, full-body photos in fitted clothing. Better photos = more accurate virtual try-on!") })
22183
+ ] })
22184
+ ] })
22185
+ ] }),
22186
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginTop: "0.8vw", gap: "0.5vw", flexShrink: 0 }, children: [
22187
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "ps-bp-back-btn", onClick: onBack, type: "button", children: [
22188
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ps-bp-back-arrow", children: "←" }),
22189
+ " ",
22190
+ t2("Back")
22191
+ ] }),
22192
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "ps-tryon-v2-cta", style: { marginTop: 0 }, disabled: !guideFile, onClick: submit, children: [
22193
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CameraIcon$1, { size: 14 }),
22194
+ " ",
22195
+ t2("Start Try-On")
22196
+ ] })
22197
+ ] })
22198
+ ] });
22199
+ }
21931
22200
  const RING_RADIUS = 38;
21932
22201
  const RING_CIRCUMFERENCE = 2 * Math.PI * RING_RADIUS;
21933
22202
  function ProcessingView({
@@ -29200,12 +29469,25 @@ function PrimeStyleTryonInner({
29200
29469
  {
29201
29470
  productImage,
29202
29471
  productTitle,
29203
- onTryOn: () => setView("body-profile"),
29472
+ onTryOn: () => setView("photo-guide"),
29204
29473
  onClose: onClose ?? (() => {
29205
29474
  }),
29206
29475
  t: t2
29207
29476
  }
29208
29477
  ) }, "v-nochart");
29478
+ case "photo-guide":
29479
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ps-tryon-view-enter", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
29480
+ PhotoGuideView,
29481
+ {
29482
+ measurementType: detectMeasurementType(productTitle),
29483
+ onBack: () => setView("no-chart"),
29484
+ onSubmit: (file) => {
29485
+ handleFileSelect(file);
29486
+ handleTryOnSubmit(file);
29487
+ },
29488
+ t: t2
29489
+ }
29490
+ ) }, "v-photoguide");
29209
29491
  default:
29210
29492
  return null;
29211
29493
  }
@@ -29227,7 +29509,7 @@ function PrimeStyleTryonInner({
29227
29509
  }
29228
29510
  ),
29229
29511
  view !== "idle" && typeof document !== "undefined" && reactDomExports.createPortal(
29230
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cx("ps-tryon-overlay", cn.overlay), style: cssVars, "data-ps-tryon-portal": true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cx(`ps-tryon-modal${view === "result" && resultImageUrl && sizingResult || view === "size-result" || view === "estimation-review" || view === "body-profile" || view === "profiles" || view === "no-chart" ? " ps-tryon-modal-wide" : ""}`, cn.modal), onClick: (e) => e.stopPropagation(), children: [
29512
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cx("ps-tryon-overlay", cn.overlay), style: cssVars, "data-ps-tryon-portal": true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cx(`ps-tryon-modal${view === "result" && resultImageUrl && sizingResult || view === "size-result" || view === "estimation-review" || view === "body-profile" || view === "profiles" || view === "no-chart" || view === "photo-guide" ? " ps-tryon-modal-wide" : ""}`, cn.modal), onClick: (e) => e.stopPropagation(), children: [
29231
29513
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cx("ps-tryon-header ps-tryon-header-minimal", cn.header), children: [
29232
29514
  /* @__PURE__ */ jsxRuntimeExports.jsx(LangSwitcher, { activeLocale, onSelect: setActiveLocale }),
29233
29515
  /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "ps-tryon-header-icon", title: t2("Profiles"), onClick: () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primestyleai/tryon",
3
- "version": "5.10.99",
3
+ "version": "5.10.100",
4
4
  "description": "PrimeStyle Virtual Try-On SDK — React component & Web Component",
5
5
  "type": "module",
6
6
  "main": "dist/primestyle-tryon.js",