@primestyleai/tryon 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useMemo, useRef, useCallback } from "react";
4
- import { c as createT, A as ApiClient, S as SseClient, i as isValidImageFile, a as compressImage, P as PrimeStyleError, L as LOCALE_LABELS, b as SUPPORTED_LOCALES } from "../index-CILUifQv.js";
4
+ import { c as createT, A as ApiClient, S as SseClient, i as isValidImageFile, a as compressImage, P as PrimeStyleError, L as LOCALE_LABELS, b as SUPPORTED_LOCALES } from "../index-CZHknuGH.js";
5
5
  const HEADER_ALIASES = {
6
6
  // ── Size label columns (skipped during field derivation) ──
7
7
  size: "__size__",
@@ -226,7 +226,14 @@ function tryPreNormalized(input) {
226
226
  rows = obj.rows.map((r) => r.map(String));
227
227
  } else if (isObject(firstRow)) {
228
228
  rows = obj.rows.map(
229
- (rowObj) => headers.map((h) => String(rowObj[h] ?? ""))
229
+ (rowObj) => headers.map((h) => {
230
+ if (rowObj[h] !== void 0) return String(rowObj[h]);
231
+ const lh = h.toLowerCase();
232
+ for (const k of Object.keys(rowObj)) {
233
+ if (k.toLowerCase() === lh) return String(rowObj[k]);
234
+ }
235
+ return "";
236
+ })
230
237
  );
231
238
  } else {
232
239
  return null;
@@ -371,6 +378,79 @@ function normalizeSizeGuide(input) {
371
378
  reason: typeof input === "string" ? "unstructured string" : "unrecognised format"
372
379
  };
373
380
  }
381
+ const LEFT_SHOULDER = 11;
382
+ const RIGHT_SHOULDER = 12;
383
+ const LEFT_HIP = 23;
384
+ const RIGHT_HIP = 24;
385
+ let poseLandmarker = null;
386
+ let loadingPromise = null;
387
+ async function loadMediaPipe() {
388
+ if (poseLandmarker) return;
389
+ if (loadingPromise) return loadingPromise;
390
+ loadingPromise = (async () => {
391
+ const vision = await import(
392
+ /* webpackIgnore: true */
393
+ "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.33/vision_bundle.mjs"
394
+ );
395
+ const { FilesetResolver, PoseLandmarker } = vision;
396
+ const filesetResolver = await FilesetResolver.forVisionTasks(
397
+ "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.33/wasm"
398
+ );
399
+ poseLandmarker = await PoseLandmarker.createFromOptions(filesetResolver, {
400
+ baseOptions: {
401
+ modelAssetPath: "https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_lite/float16/1/pose_landmarker_lite.task",
402
+ delegate: "GPU"
403
+ },
404
+ runningMode: "IMAGE",
405
+ numPoses: 1
406
+ });
407
+ })();
408
+ return loadingPromise;
409
+ }
410
+ async function detectMeasurementLines(imageSrc) {
411
+ try {
412
+ await loadMediaPipe();
413
+ const img = new Image();
414
+ img.crossOrigin = "anonymous";
415
+ await new Promise((resolve, reject) => {
416
+ img.onload = () => resolve();
417
+ img.onerror = () => reject(new Error("Failed to load image"));
418
+ img.src = imageSrc;
419
+ });
420
+ const result = poseLandmarker.detect(img);
421
+ if (!result?.landmarks?.length || result.landmarks[0].length < 25) {
422
+ return null;
423
+ }
424
+ const landmarks = result.landmarks[0];
425
+ const lShoulder = landmarks[LEFT_SHOULDER];
426
+ const rShoulder = landmarks[RIGHT_SHOULDER];
427
+ const lHip = landmarks[LEFT_HIP];
428
+ const rHip = landmarks[RIGHT_HIP];
429
+ const shoulderY = (lShoulder.y + rShoulder.y) / 2;
430
+ const hipY = (lHip.y + rHip.y) / 2;
431
+ const torsoLen = hipY - shoulderY;
432
+ const chestY = shoulderY + torsoLen * 0.28;
433
+ const shoulderWidth = Math.abs(rShoulder.x - lShoulder.x);
434
+ const chestX1 = Math.min(lShoulder.x, rShoulder.x) - shoulderWidth * 0.05;
435
+ const chestX2 = Math.max(lShoulder.x, rShoulder.x) + shoulderWidth * 0.05;
436
+ const hipWidth = Math.abs(rHip.x - lHip.x);
437
+ const hipX1 = Math.min(lHip.x, rHip.x) - hipWidth * 0.15;
438
+ const hipX2 = Math.max(lHip.x, rHip.x) + hipWidth * 0.15;
439
+ const waistY = chestY + (hipY - chestY) * 0.55;
440
+ const waistWidth = shoulderWidth * 0.85;
441
+ const waistCenterX = (lShoulder.x + rShoulder.x + lHip.x + rHip.x) / 4;
442
+ const waistX1 = waistCenterX - waistWidth / 2;
443
+ const waistX2 = waistCenterX + waistWidth / 2;
444
+ return {
445
+ chest: { y: chestY, x1: chestX1, x2: chestX2 },
446
+ waist: { y: waistY, x1: waistX1, x2: waistX2 },
447
+ hips: { y: hipY, x1: hipX1, x2: hipX2 }
448
+ };
449
+ } catch (err) {
450
+ console.error("[PS-SDK] Pose detection failed:", err);
451
+ return null;
452
+ }
453
+ }
374
454
  function cx(base, override) {
375
455
  return override ? `${base} ${override}` : base;
376
456
  }
@@ -427,6 +507,8 @@ const SIZE_CONVERSIONS = {
427
507
  "50": { US: "XXXL", UK: "22", EU: "50", IT: "54", FR: "50", DE: "50", JP: "21", KR: "110", AU: "22" }
428
508
  };
429
509
  const TOTAL_STEPS = 4;
510
+ const MEASURE_GUIDE_IMG = "data:image/webp;base64,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";
511
+ const LOGO_IMG = "data:image/webp;base64,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";
430
512
  function detectLocale() {
431
513
  if (typeof window === "undefined") return "US";
432
514
  const l = (navigator.language || "en-US").toLowerCase();
@@ -446,6 +528,9 @@ function isImperial(locale) {
446
528
  function inToCm(inches) {
447
529
  return +(inches * 2.54).toFixed(1);
448
530
  }
531
+ function kgToLbs(kg) {
532
+ return +(kg * 2.205).toFixed(1);
533
+ }
449
534
  function lbsToKg(lbs) {
450
535
  return +(lbs / 2.205).toFixed(1);
451
536
  }
@@ -822,7 +907,7 @@ function PrimeStyleTryonInner({
822
907
  if (progressTextRef.current) progressTextRef.current.textContent = "100%";
823
908
  if (progressStatusRef.current) progressStatusRef.current.textContent = t("Complete!");
824
909
  cleanupJob();
825
- setTimeout(() => setView("result"), 400);
910
+ setTimeout(() => setView("size-result"), 400);
826
911
  onComplete?.({ jobId: update.galleryId, imageUrl: update.imageUrl });
827
912
  }
828
913
  } else if (update.status === "failed") {
@@ -842,12 +927,13 @@ function PrimeStyleTryonInner({
842
927
  }
843
928
  return formGender === "female" ? FALLBACK_FIELDS_FEMALE : FALLBACK_FIELDS_MALE;
844
929
  }, [sizeGuide, formGender]);
845
- const submitSizing = useCallback(async () => {
930
+ const submitSizing = useCallback(async (methodOverride) => {
846
931
  if (!apiRef.current) return;
932
+ const method = methodOverride || sizingMethod;
847
933
  const baseUrl = getApiUrl(apiUrl);
848
934
  const key = getApiKey();
849
935
  const payload = {
850
- method: sizingMethod,
936
+ method,
851
937
  locale: sizingCountry,
852
938
  product: { title: productTitle, description: "", variants: [] }
853
939
  };
@@ -858,7 +944,7 @@ function PrimeStyleTryonInner({
858
944
  payload.sizingUnit = sizingUnit;
859
945
  console.log("[PS-SDK] sizeGuide state:", JSON.stringify({ found: sizeGuide?.found, hasHeaders: !!sizeGuide?.headers, hasRows: !!sizeGuide?.rows, headers: sizeGuide?.headers, rowCount: sizeGuide?.rows?.length }));
860
946
  console.log("[PS-SDK] payload.sizeGuide:", payload.sizeGuide ? "present" : "MISSING");
861
- if (sizingMethod === "exact") {
947
+ if (method === "exact") {
862
948
  const m = { gender: formRef.current.gender || "male", sizingUnit };
863
949
  const numericKeys = /* @__PURE__ */ new Set();
864
950
  for (const f of dynamicFields) {
@@ -1240,20 +1326,44 @@ function PrimeStyleTryonInner({
1240
1326
  }
1241
1327
  function SizingChoiceView() {
1242
1328
  const [mode, setMode] = useState("exact");
1329
+ const [showMeasureGuide, setShowMeasureGuide] = useState(false);
1330
+ const [hoveredField, setHoveredField] = useState(null);
1243
1331
  const [saveToggle, setSaveToggle] = useState(false);
1244
1332
  const [saveFormName, setSaveFormName] = useState("");
1333
+ const [optOpen, setOptOpen] = useState(false);
1334
+ const blurTimer = useRef(null);
1245
1335
  const isCm = sizingUnit === "cm";
1246
1336
  const sgAvailable = sizeGuide?.found === true;
1247
1337
  const sgChecked = !sizeGuideFetching && sizeGuide !== null;
1248
1338
  const exactAvailable = sgChecked ? sgAvailable : true;
1339
+ const [validationError, setValidationError] = useState("");
1249
1340
  const handleSubmit = async () => {
1341
+ setValidationError("");
1342
+ if (mode === "quick") {
1343
+ const hasHeight = heightUnit === "ft" ? formRef.current.heightFeet && parseFloat(formRef.current.heightFeet) > 0 : formRef.current.height && parseFloat(formRef.current.height) > 0;
1344
+ const hasWeight = formRef.current.weight && parseFloat(formRef.current.weight) > 0;
1345
+ if (!hasHeight || !hasWeight) {
1346
+ setValidationError(t("Please fill in height and weight"));
1347
+ return;
1348
+ }
1349
+ } else {
1350
+ const reqFields = dynamicFields.filter((f) => f.required);
1351
+ const missing = reqFields.filter((f) => {
1352
+ const val = formRef.current[f.key];
1353
+ return !val || f.unit !== "size" && parseFloat(val) <= 0;
1354
+ });
1355
+ if (missing.length > 0) {
1356
+ setValidationError(t("Please fill in all required fields") + ": " + missing.map((f) => t(f.label)).join(", "));
1357
+ return;
1358
+ }
1359
+ }
1250
1360
  if (saveToggle && saveFormName.trim()) {
1251
1361
  saveProfile(saveFormName.trim());
1252
1362
  }
1253
1363
  setSizingMethod(mode);
1254
1364
  setSizingLoading(true);
1255
1365
  setView("size-result");
1256
- await submitSizing();
1366
+ submitSizing(mode);
1257
1367
  };
1258
1368
  const renderQuickFields = () => /* @__PURE__ */ jsxs(Fragment, { children: [
1259
1369
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sf-row", children: [
@@ -1278,11 +1388,20 @@ function PrimeStyleTryonInner({
1278
1388
  ] });
1279
1389
  const renderExactFields = () => {
1280
1390
  const reqFields = dynamicFields.filter((f) => f.required);
1281
- const optFields = dynamicFields.filter((f) => !f.required);
1391
+ dynamicFields.filter((f) => !f.required);
1392
+ const fieldHover = (key) => ({
1393
+ onFocus: () => {
1394
+ if (blurTimer.current) clearTimeout(blurTimer.current);
1395
+ setHoveredField(key);
1396
+ },
1397
+ onBlur: () => {
1398
+ blurTimer.current = setTimeout(() => setHoveredField(null), 150);
1399
+ }
1400
+ });
1282
1401
  const renderField = (field) => {
1283
1402
  if (["shoeEU", "shoeUS", "shoeUK"].includes(field.key)) {
1284
1403
  const regionField = shoeField;
1285
- return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sf-row", children: [
1404
+ return /* @__PURE__ */ jsxs("div", { className: `ps-tryon-sf-row${hoveredField === field.key ? " ps-tryon-sf-row-active" : ""}`, ...fieldHover(field.key), children: [
1286
1405
  /* @__PURE__ */ jsxs("label", { className: "ps-tryon-sf-label", children: [
1287
1406
  regionField.label.toUpperCase(),
1288
1407
  field.required ? " *" : ""
@@ -1293,7 +1412,7 @@ function PrimeStyleTryonInner({
1293
1412
  const phNum = parseFloat(field.placeholder?.replace(/[^0-9.]/g, "") || "");
1294
1413
  const phIn = !isNaN(phNum) && phNum > 0 && field.unit === "cm" ? String(Math.round(phNum / 2.54)) : "";
1295
1414
  const placeholder = isCm ? field.placeholder?.replace("e.g. ", "") || "" : phIn || field.placeholder?.replace("e.g. ", "") || "";
1296
- return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sf-row", children: [
1415
+ return /* @__PURE__ */ jsxs("div", { className: `ps-tryon-sf-row${hoveredField === field.key ? " ps-tryon-sf-row-active" : ""}`, ...fieldHover(field.key), children: [
1297
1416
  /* @__PURE__ */ jsxs("label", { className: "ps-tryon-sf-label", children: [
1298
1417
  t(field.label).toUpperCase(),
1299
1418
  field.required ? " *" : ""
@@ -1304,41 +1423,55 @@ function PrimeStyleTryonInner({
1304
1423
  ] })
1305
1424
  ] }, field.key);
1306
1425
  };
1307
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1308
- reqFields.map(renderField),
1309
- optFields.length > 0 && /* @__PURE__ */ jsxs("details", { className: "ps-tryon-sf-optional", children: [
1310
- /* @__PURE__ */ jsx("summary", { className: "ps-tryon-sf-optional-toggle", children: t("Optional fields") }),
1311
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sf-optional-fields", children: optFields.map(renderField) })
1312
- ] })
1313
- ] });
1426
+ return /* @__PURE__ */ jsx(Fragment, { children: reqFields.map(renderField) });
1314
1427
  };
1315
1428
  return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sizing-split", children: [
1316
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sizing-img-col", children: /* @__PURE__ */ jsx("img", { src: productImage, alt: productTitle, className: "ps-tryon-sizing-product-img" }) }),
1429
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sizing-img-col", children: [
1430
+ /* @__PURE__ */ jsx("img", { src: productImage, alt: productTitle, className: `ps-tryon-sizing-product-img${hoveredField || showMeasureGuide ? " ps-tryon-img-hidden" : ""}` }),
1431
+ /* @__PURE__ */ jsx("img", { src: MEASURE_GUIDE_IMG, alt: "How to measure", className: `ps-tryon-sizing-measure-img${hoveredField || showMeasureGuide ? " ps-tryon-img-visible" : ""}` })
1432
+ ] }),
1317
1433
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sizing-form-col", children: [
1318
1434
  /* @__PURE__ */ jsx("h3", { className: "ps-tryon-sf-title", children: t("Let's find your best fit") }),
1319
1435
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sf-unit-tabs", children: [
1320
1436
  /* @__PURE__ */ jsx(
1321
1437
  "button",
1322
1438
  {
1323
- className: `ps-tryon-sf-unit-tab${(isCm || heightUnit === "cm") && mode !== "exact" ? " ps-active" : ""} ${mode === "exact" && isCm ? " ps-active" : ""}`,
1439
+ className: `ps-tryon-sf-unit-tab${heightUnit === "cm" ? " ps-active" : ""}`,
1324
1440
  onClick: () => {
1441
+ if (formRef.current.heightFeet) {
1442
+ const cm = ftInToCm(parseFloat(formRef.current.heightFeet || "0"), parseFloat(formRef.current.heightInches || "0"));
1443
+ if (cm > 0) formRef.current.height = String(Math.round(cm));
1444
+ }
1445
+ if (formRef.current.weight && weightUnit === "lbs") {
1446
+ formRef.current.weight = String(Math.round(lbsToKg(parseFloat(formRef.current.weight))));
1447
+ }
1325
1448
  setSizingUnit("cm");
1326
1449
  setHeightUnit("cm");
1327
1450
  setWeightUnit("kg");
1451
+ setFormKey((k) => k + 1);
1328
1452
  },
1329
- children: t("Metric")
1453
+ children: t("Centimeters")
1330
1454
  }
1331
1455
  ),
1332
1456
  /* @__PURE__ */ jsx(
1333
1457
  "button",
1334
1458
  {
1335
- className: `ps-tryon-sf-unit-tab${(!isCm || heightUnit === "ft") && mode !== "exact" ? " ps-active" : ""} ${mode === "exact" && !isCm ? " ps-active" : ""}`,
1459
+ className: `ps-tryon-sf-unit-tab${heightUnit === "ft" ? " ps-active" : ""}`,
1336
1460
  onClick: () => {
1461
+ if (formRef.current.height) {
1462
+ const totalIn = parseFloat(formRef.current.height) / 2.54;
1463
+ formRef.current.heightFeet = String(Math.floor(totalIn / 12));
1464
+ formRef.current.heightInches = String(Math.round(totalIn % 12));
1465
+ }
1466
+ if (formRef.current.weight && weightUnit === "kg") {
1467
+ formRef.current.weight = String(Math.round(kgToLbs(parseFloat(formRef.current.weight))));
1468
+ }
1337
1469
  setSizingUnit("in");
1338
1470
  setHeightUnit("ft");
1339
1471
  setWeightUnit("lbs");
1472
+ setFormKey((k) => k + 1);
1340
1473
  },
1341
- children: t("Imperial")
1474
+ children: t("Inches")
1342
1475
  }
1343
1476
  )
1344
1477
  ] }),
@@ -1348,34 +1481,26 @@ function PrimeStyleTryonInner({
1348
1481
  /* @__PURE__ */ jsx("option", { value: "", children: t("Load saved profile...") }),
1349
1482
  profiles.map((p) => /* @__PURE__ */ jsx("option", { value: p.id, children: p.name }, p.id))
1350
1483
  ] }) }),
1351
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sf-fields", children: mode === "quick" ? renderQuickFields() : renderExactFields() }),
1352
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sf-switch", children: mode === "quick" && exactAvailable ? /* @__PURE__ */ jsxs("button", { className: "ps-tryon-sf-switch-btn", onClick: () => {
1353
- setMode("exact");
1354
- setSizingMethod("exact");
1355
- }, children: [
1356
- t("I know my measurements"),
1357
- " ",
1358
- /* @__PURE__ */ jsx(ArrowRightIcon, {})
1359
- ] }) : mode === "exact" ? /* @__PURE__ */ jsx("button", { className: "ps-tryon-sf-switch-btn", onClick: () => {
1360
- setMode("quick");
1361
- setSizingMethod("quick");
1362
- }, children: t("Not sure? Use height & weight instead") }) : null }),
1363
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sf-save", children: [
1364
- /* @__PURE__ */ jsxs("label", { className: "ps-tryon-sf-save-check", children: [
1365
- /* @__PURE__ */ jsx("input", { type: "checkbox", checked: saveToggle, onChange: (e) => setSaveToggle(e.target.checked) }),
1366
- /* @__PURE__ */ jsx("span", { children: t("Save as profile") })
1484
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-sf-fields", children: mode === "quick" ? renderQuickFields() : renderExactFields() }, `${mode}-${formKey}`),
1485
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sf-switch", children: [
1486
+ mode === "exact" && /* @__PURE__ */ jsxs("button", { type: "button", className: `ps-tryon-sf-measure-btn${showMeasureGuide ? " ps-active" : ""}`, onClick: () => setShowMeasureGuide(!showMeasureGuide), children: [
1487
+ /* @__PURE__ */ jsx(RulerIcon, { size: 14 }),
1488
+ " ",
1489
+ showMeasureGuide ? t("Hide guide") : t("How to measure")
1367
1490
  ] }),
1368
- saveToggle && /* @__PURE__ */ jsx(
1369
- "input",
1370
- {
1371
- type: "text",
1372
- className: "ps-tryon-sf-save-name",
1373
- placeholder: t("Profile name (e.g. John, Sarah)"),
1374
- value: saveFormName,
1375
- onChange: (e) => setSaveFormName(e.target.value)
1376
- }
1377
- )
1491
+ mode === "quick" && exactAvailable ? /* @__PURE__ */ jsxs("button", { type: "button", className: "ps-tryon-sf-switch-btn", onClick: () => {
1492
+ setMode("exact");
1493
+ setShowMeasureGuide(false);
1494
+ }, children: [
1495
+ t("I know my measurements"),
1496
+ " ",
1497
+ /* @__PURE__ */ jsx(ArrowRightIcon, {})
1498
+ ] }) : mode === "exact" ? /* @__PURE__ */ jsx("button", { type: "button", className: "ps-tryon-sf-switch-btn", onClick: () => {
1499
+ setMode("quick");
1500
+ setShowMeasureGuide(false);
1501
+ }, children: t("Not sure? Use height & weight instead") }) : null
1378
1502
  ] }),
1503
+ validationError && /* @__PURE__ */ jsx("div", { className: "ps-tryon-sf-error", children: validationError }),
1379
1504
  /* @__PURE__ */ jsx("button", { className: "ps-tryon-sf-next", onClick: handleSubmit, children: t("Next") })
1380
1505
  ] })
1381
1506
  ] });
@@ -1401,19 +1526,34 @@ function PrimeStyleTryonInner({
1401
1526
  const ns = s.replace(/[^\d.\-–]/g, " ").trim().split(/[\s\-–]+/).filter(Boolean).map(Number).filter((n) => !isNaN(n));
1402
1527
  return ns.length ? { min: Math.min(...ns), max: Math.max(...ns) } : { min: 0, max: 0 };
1403
1528
  };
1529
+ const cellVal = useCallback((row, colIdx, header) => {
1530
+ if (!row) return "";
1531
+ if (Array.isArray(row)) return (row[colIdx] ?? "").toString().trim();
1532
+ const obj = row;
1533
+ if (header && obj[header] !== void 0) return obj[header].toString().trim();
1534
+ if (header) {
1535
+ const lh = header.toLowerCase();
1536
+ for (const k of Object.keys(obj)) {
1537
+ if (k.toLowerCase() === lh) return obj[k].toString().trim();
1538
+ }
1539
+ }
1540
+ return "";
1541
+ }, []);
1404
1542
  const sizeColIdx = useMemo(() => {
1405
1543
  if (!sizeGuide?.headers || !sizeGuide?.rows) return -1;
1406
1544
  const byName = sizeGuide.headers.findIndex((h) => /size|taglia|größe|taille/i.test(h.trim()));
1407
1545
  if (byName >= 0) return byName;
1408
1546
  for (let c = 0; c < sizeGuide.headers.length; c++) {
1409
- if (sizeGuide.rows.some((r) => /^(XXS|XS|S|M|L|XL|XXL|XXXL|ONE SIZE|\d{1,2})$/i.test(r[c]?.trim() || ""))) return c;
1547
+ const hdr = sizeGuide.headers[c];
1548
+ if (sizeGuide.rows.some((r) => /^(XXS|XS|S|M|L|XL|XXL|XXXL|ONE SIZE|\d{1,2})$/i.test(cellVal(r, c, hdr)))) return c;
1410
1549
  }
1411
1550
  return 0;
1412
- }, [sizeGuide]);
1551
+ }, [sizeGuide, cellVal]);
1552
+ const sizeHeader = sizeGuide?.headers?.[sizeColIdx] || "Size";
1413
1553
  const allSizes = useMemo(() => {
1414
1554
  if (sizeColIdx < 0 || !sizeGuide?.rows) return [];
1415
- return sizeGuide.rows.map((r) => r[sizeColIdx]?.trim()).filter(Boolean);
1416
- }, [sizeGuide, sizeColIdx]);
1555
+ return sizeGuide.rows.map((r) => cellVal(r, sizeColIdx, sizeHeader)).filter(Boolean);
1556
+ }, [sizeGuide, sizeColIdx, sizeHeader, cellVal]);
1417
1557
  const chartRangeFor = useCallback((measurement, size) => {
1418
1558
  if (!sizeGuide?.headers || !sizeGuide?.rows || sizeColIdx < 0) return null;
1419
1559
  const mc = sizeGuide.headers.findIndex((h) => {
@@ -1421,9 +1561,12 @@ function PrimeStyleTryonInner({
1421
1561
  return a === b || a.includes(b) || b.includes(a);
1422
1562
  });
1423
1563
  if (mc < 0) return null;
1424
- const row = sizeGuide.rows.find((r) => r[sizeColIdx]?.trim() === size);
1425
- return row?.[mc] ? { range: row[mc], ...pRange(row[mc]) } : null;
1426
- }, [sizeGuide, sizeColIdx]);
1564
+ const mHeader = sizeGuide.headers[mc];
1565
+ const row = sizeGuide.rows.find((r) => cellVal(r, sizeColIdx, sizeHeader) === size);
1566
+ if (!row) return null;
1567
+ const val = cellVal(row, mc, mHeader);
1568
+ return val ? { range: val, ...pRange(val) } : null;
1569
+ }, [sizeGuide, sizeColIdx, sizeHeader, cellVal]);
1427
1570
  const bestSize = useMemo(() => {
1428
1571
  if (!sizingResult?.matchDetails?.length || !allSizes.length) return sizingResult?.recommendedSize || "";
1429
1572
  if (!Object.keys(editVals).length) return sizingResult?.recommendedSize || "";
@@ -1446,8 +1589,8 @@ function PrimeStyleTryonInner({
1446
1589
  }, [editVals, sizingResult, allSizes, chartRangeFor]);
1447
1590
  const origSize = sizingResult?.recommendedSize || "";
1448
1591
  const activeSize = bestSize || origSize;
1449
- const sizeChanged = Object.keys(editVals).length > 0 && bestSize !== origSize;
1450
- const fitRows = useMemo(() => {
1592
+ Object.keys(editVals).length > 0 && bestSize !== origSize;
1593
+ useMemo(() => {
1451
1594
  if (!sizingResult?.matchDetails?.length) return [];
1452
1595
  return sizingResult.matchDetails.map((m) => {
1453
1596
  const origNum = pNum(m.userValue);
@@ -1463,90 +1606,280 @@ function PrimeStyleTryonInner({
1463
1606
  rMax = alt.max;
1464
1607
  }
1465
1608
  }
1466
- const fit = userNum >= rMin && userNum <= rMax ? "good" : userNum < rMin ? "tight" : "loose";
1609
+ const range = rMax - rMin;
1610
+ const threshold = range > 0 ? range * 0.5 : rMin * 0.05 || 3;
1611
+ let fit;
1612
+ if (userNum >= rMin && userNum <= rMax) {
1613
+ fit = "good";
1614
+ } else if (userNum < rMin) {
1615
+ const diff = rMin - userNum;
1616
+ fit = diff > threshold * 2 ? "too-loose" : diff > threshold ? "loose" : "a-bit-loose";
1617
+ } else {
1618
+ const diff = userNum - rMax;
1619
+ fit = diff > threshold * 2 ? "too-tight" : diff > threshold ? "tight" : "a-bit-tight";
1620
+ }
1467
1621
  return { area: m.measurement, userNum, chartLabel: cleanNum(chartLabel), fit };
1468
1622
  });
1469
1623
  }, [sizingResult, editVals, chartRangeFor, activeSize, origSize]);
1470
- const allIntlSizes = useMemo(() => {
1624
+ useMemo(() => {
1471
1625
  const backendIntl = sizingResult?.internationalSizes || {};
1472
1626
  const upper = activeSize.toUpperCase().trim();
1473
1627
  const fromTable = SIZE_CONVERSIONS[upper] || SIZE_CONVERSIONS[activeSize] || {};
1474
1628
  return { ...fromTable, ...backendIntl };
1475
1629
  }, [sizingResult, activeSize]);
1630
+ const [resultTab, setResultTab] = useState("fit");
1631
+ const [selectedSize, setSelectedSize] = useState(null);
1632
+ const [showFullChart, setShowFullChart] = useState(false);
1633
+ const [showVisualFit, setShowVisualFit] = useState(false);
1634
+ const [poseLines, setPoseLines] = useState(null);
1635
+ const [poseLoading, setPoseLoading] = useState(false);
1636
+ const displaySize = selectedSize || activeSize;
1637
+ const isRecommended = displaySize === origSize || displaySize === bestSize;
1638
+ const displayFitRows = useMemo(() => {
1639
+ if (!sizingResult?.matchDetails?.length) return [];
1640
+ return sizingResult.matchDetails.map((m) => {
1641
+ const origNum = pNum(m.userValue);
1642
+ const edited = editVals[m.measurement];
1643
+ const userNum = edited !== void 0 && edited !== "" ? parseFloat(edited) : origNum;
1644
+ let { min: rMin, max: rMax } = pRange(m.chartRange);
1645
+ let chartLabel = m.chartRange;
1646
+ if (displaySize !== origSize) {
1647
+ const alt = chartRangeFor(m.measurement, displaySize);
1648
+ if (alt) {
1649
+ chartLabel = alt.range;
1650
+ rMin = alt.min;
1651
+ rMax = alt.max;
1652
+ }
1653
+ }
1654
+ const range = rMax - rMin;
1655
+ const threshold = range > 0 ? range * 0.5 : rMin * 0.05 || 3;
1656
+ let fit;
1657
+ if (userNum >= rMin && userNum <= rMax) {
1658
+ fit = "good";
1659
+ } else if (userNum < rMin) {
1660
+ const diff = rMin - userNum;
1661
+ fit = diff > threshold * 2 ? "too-loose" : diff > threshold ? "loose" : "a-bit-loose";
1662
+ } else {
1663
+ const diff = userNum - rMax;
1664
+ fit = diff > threshold * 2 ? "too-tight" : diff > threshold ? "tight" : "a-bit-tight";
1665
+ }
1666
+ return { area: m.measurement, userNum, chartLabel: cleanNum(chartLabel), fit };
1667
+ });
1668
+ }, [sizingResult, editVals, chartRangeFor, displaySize, origSize]);
1669
+ const sizeGuideRow = useMemo(() => {
1670
+ if (!sizeGuide?.headers || !sizeGuide?.rows || sizeColIdx < 0) return null;
1671
+ const row = sizeGuide.rows.find((r) => cellVal(r, sizeColIdx, sizeHeader) === displaySize);
1672
+ if (!row) return null;
1673
+ const entries = [];
1674
+ for (let i = 0; i < sizeGuide.headers.length; i++) {
1675
+ const h = sizeGuide.headers[i] || "";
1676
+ if (i === sizeColIdx) continue;
1677
+ const val = cellVal(row, i, h);
1678
+ if (val) entries.push({ header: h, value: val });
1679
+ }
1680
+ return entries;
1681
+ }, [sizeGuide, sizeColIdx, sizeHeader, displaySize, cellVal]);
1682
+ const userMeasureValues = useMemo(() => {
1683
+ if (!sizingResult?.matchDetails) return [];
1684
+ return sizingResult.matchDetails.map((m) => ({
1685
+ area: m.measurement,
1686
+ value: editVals[m.measurement] !== void 0 ? parseFloat(editVals[m.measurement]) : pNum(m.userValue)
1687
+ }));
1688
+ }, [sizingResult, editVals]);
1476
1689
  return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr", children: [
1477
1690
  sizingLoading && !sizingResult && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-loading", children: [
1478
1691
  /* @__PURE__ */ jsx("div", { className: "ps-tryon-size-loading-spinner" }),
1479
1692
  /* @__PURE__ */ jsx("p", { children: t("Analyzing your size...") })
1480
1693
  ] }),
1481
1694
  sizingResult && /* @__PURE__ */ jsxs(Fragment, { children: [
1482
- /* @__PURE__ */ jsxs("button", { className: "ps-tryon-back", onClick: () => {
1483
- setView("sizing-form");
1484
- setEditVals({});
1485
- }, children: [
1486
- /* @__PURE__ */ jsx(ArrowLeftIcon, {}),
1487
- " ",
1488
- t("Back")
1489
- ] }),
1490
1695
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-split", children: [
1491
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-left", children: [
1492
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-hero", children: [
1493
- activeSize ? /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-hero-badge", children: activeSize }) : /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-hero-badge ps-tryon-sr-hero-badge-icon", children: /* @__PURE__ */ jsx(RulerIcon, { size: 22 }) }),
1494
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-hero-info", children: [
1495
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-hero-title", children: t("Your Size") }),
1496
- /* @__PURE__ */ jsx("div", { className: `ps-tryon-sr-hero-conf ps-conf-${sizingResult.confidence}`, children: sizingResult.confidence === "high" ? t("High Confidence") : sizingResult.confidence === "medium" ? t("Medium Confidence") : t("Low Confidence") })
1696
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-img-col", children: [
1697
+ /* @__PURE__ */ jsx("img", { src: resultImageUrl || productImage, alt: productTitle, className: "ps-tryon-sr-product-img" }),
1698
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-img-actions", children: [
1699
+ resultImageUrl && /* @__PURE__ */ jsx("button", { className: "ps-tryon-sr-img-icon", onClick: handleDownload, title: t("Download"), children: /* @__PURE__ */ jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
1700
+ /* @__PURE__ */ jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
1701
+ /* @__PURE__ */ jsx("polyline", { points: "7 10 12 15 17 10" }),
1702
+ /* @__PURE__ */ jsx("line", { x1: "12", y1: "15", x2: "12", y2: "3" })
1703
+ ] }) }),
1704
+ sizeGuide?.found && /* @__PURE__ */ jsx("button", { className: "ps-tryon-sr-img-icon", onClick: () => setShowFullChart(true), title: t("Size chart"), children: /* @__PURE__ */ jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
1705
+ /* @__PURE__ */ jsx("path", { d: "M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z" }),
1706
+ /* @__PURE__ */ jsx("path", { d: "m14.5 12.5 2-2" }),
1707
+ /* @__PURE__ */ jsx("path", { d: "m11.5 9.5 2-2" }),
1708
+ /* @__PURE__ */ jsx("path", { d: "m8.5 6.5 2-2" }),
1709
+ /* @__PURE__ */ jsx("path", { d: "m17.5 15.5 2-2" })
1710
+ ] }) })
1711
+ ] }),
1712
+ showVisualFit && poseLines && (() => {
1713
+ const lineMap = [
1714
+ { key: "chest", pattern: /chest|bust/i, poseLine: poseLines.chest },
1715
+ { key: "waist", pattern: /waist/i, poseLine: poseLines.waist },
1716
+ { key: "hips", pattern: /hip/i, poseLine: poseLines.hips }
1717
+ ];
1718
+ const visibleLines = lineMap.filter((m) => displayFitRows.some((r) => m.pattern.test(r.area)));
1719
+ const getFit = (pattern) => {
1720
+ const r = displayFitRows.find((row) => pattern.test(row.area));
1721
+ if (!r) return { color: "#888", label: "", name: "" };
1722
+ const color = r.fit === "good" ? "#4ade80" : /too/.test(r.fit) ? "#dc2626" : /^(loose|tight)$/.test(r.fit) ? "#e87040" : "#f59e0b";
1723
+ const label = r.fit === "good" ? t("perfect fit") : r.fit.replace(/-/g, " ");
1724
+ return { color, label, name: r.area };
1725
+ };
1726
+ const curvedPath = (x1, y, x2) => {
1727
+ const mid = (x1 + x2) / 2;
1728
+ const sag = 2;
1729
+ return `M ${x1} ${y} Q ${mid} ${y + sag}, ${x2} ${y}`;
1730
+ };
1731
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1732
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-pose-overlay" }),
1733
+ /* @__PURE__ */ jsx("svg", { className: "ps-tryon-pose-svg", viewBox: "0 0 100 100", preserveAspectRatio: "none", children: visibleLines.map((m, i) => {
1734
+ const { color } = getFit(m.pattern);
1735
+ const x1 = m.poseLine.x1 * 100;
1736
+ const x2 = m.poseLine.x2 * 100;
1737
+ const y = m.poseLine.y * 100;
1738
+ const d = curvedPath(x1, y, x2);
1739
+ return /* @__PURE__ */ jsx(
1740
+ "path",
1741
+ {
1742
+ d,
1743
+ fill: "none",
1744
+ stroke: color,
1745
+ strokeWidth: "0.5",
1746
+ strokeLinecap: "round",
1747
+ opacity: "0.9",
1748
+ className: "ps-tryon-pose-line",
1749
+ style: { animationDelay: `${i * 0.3}s` }
1750
+ },
1751
+ m.key
1752
+ );
1753
+ }) }),
1754
+ visibleLines.map((m, i) => {
1755
+ const { color, label, name } = getFit(m.pattern);
1756
+ const y = m.poseLine.y * 100;
1757
+ const x = m.poseLine.x2 * 100;
1758
+ return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-pose-pill", style: { top: `${y}%`, left: `${Math.min(x + 2, 65)}%`, animationDelay: `${i * 0.3 + 0.4}s` }, children: [
1759
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-pose-pill-dot", style: { background: color } }),
1760
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-pose-pill-text", children: [
1761
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-pose-pill-name", children: name }),
1762
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-pose-pill-fit", style: { color }, children: label })
1763
+ ] })
1764
+ ] }, m.key);
1765
+ })
1766
+ ] });
1767
+ })()
1768
+ ] }),
1769
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-right-col", children: [
1770
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-size-hero", children: [
1771
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-size-letter", children: displaySize }),
1772
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-size-meta", children: [
1773
+ /* @__PURE__ */ jsx("span", { className: `ps-tryon-sr-size-label${isRecommended ? "" : " ps-not-rec"}`, children: isRecommended ? t("RECOMMENDED SIZE") : t("NOT RECOMMENDED") }),
1774
+ /* @__PURE__ */ jsx("button", { className: "ps-tryon-sr-edit-link", onClick: () => {
1775
+ setView("sizing-choice");
1776
+ setEditVals({});
1777
+ setSelectedSize(null);
1778
+ }, children: t("Edit measurements") })
1497
1779
  ] })
1498
1780
  ] }),
1499
- sizeChanged && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-size-changed", children: [
1500
- /* @__PURE__ */ jsx(SparkleIcon, { size: 13 }),
1501
- " ",
1502
- t("Updated to"),
1503
- " ",
1504
- /* @__PURE__ */ jsx("strong", { children: activeSize })
1781
+ (displayFitRows.length > 0 || sizeGuideRow) && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-tabs", children: [
1782
+ /* @__PURE__ */ jsxs("button", { className: `ps-tryon-sr-tab${resultTab === "chart" ? " ps-active" : ""}`, onClick: () => setResultTab("chart"), children: [
1783
+ t("Size guide"),
1784
+ " ",
1785
+ displaySize
1786
+ ] }),
1787
+ /* @__PURE__ */ jsx("button", { className: `ps-tryon-sr-tab${resultTab === "fit" ? " ps-active" : ""}`, onClick: () => setResultTab("fit"), children: t("Your fit") })
1505
1788
  ] }),
1506
- Object.keys(allIntlSizes).length > 0 && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-intl", children: [
1507
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-section-title", children: t("Your size in other countries") }),
1508
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-intl-grid", children: Object.entries(allIntlSizes).map(([code, val]) => /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-intl-card", children: [
1509
- /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-intl-card-val", children: val }),
1510
- /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-intl-card-code", children: code })
1511
- ] }, code)) })
1512
- ] })
1513
- ] }),
1514
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-right", children: [
1515
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-section-title", children: t("Your Measurements") }),
1516
- fitRows.map((row, i) => /* @__PURE__ */ jsxs("div", { className: `ps-tryon-sr-meas ps-fit-${row.fit}`, children: [
1517
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-meas-head", children: [
1518
- /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-meas-area", children: row.area }),
1519
- /* @__PURE__ */ jsx("span", { className: `ps-tryon-sr-meas-badge ps-fit-${row.fit}`, children: row.fit === "good" ? `✓ ${t("within range")}` : row.fit === "tight" ? `↑ ${t("may be snug")}` : `↓ ${t("may be loose")}` })
1789
+ resultTab === "fit" && displayFitRows.length > 0 && /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-fit-list", children: displayFitRows.map((row, i) => /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-fit-item", children: /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-fit-row-grid", children: [
1790
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-fit-left", children: [
1791
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-fit-area", children: row.area }),
1792
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-fit-user-line", children: [
1793
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-fit-user-label", children: t("Your measure") }),
1794
+ /* @__PURE__ */ jsx("span", { className: `ps-tryon-sr-fit-status ps-fit-${row.fit}`, children: row.fit === "good" ? t("perfect fit") : row.fit === "too-tight" ? t("too tight") : row.fit === "tight" ? t("tight") : row.fit === "a-bit-tight" ? t("a bit tight") : row.fit === "too-loose" ? t("too loose") : row.fit === "loose" ? t("loose") : t("a bit loose") })
1795
+ ] })
1520
1796
  ] }),
1521
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-meas-row", children: [
1522
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-meas-input-wrap", children: [
1523
- /* @__PURE__ */ jsx(
1524
- "input",
1525
- {
1526
- type: "number",
1527
- className: "ps-tryon-sr-meas-input",
1528
- value: editVals[row.area] !== void 0 ? editVals[row.area] : row.userNum,
1529
- onChange: (e) => setEditVals((prev) => ({ ...prev, [row.area]: e.target.value }))
1530
- }
1531
- ),
1532
- /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-meas-unit", children: unitLbl })
1533
- ] }),
1534
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-meas-vs", children: "vs" }),
1535
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-meas-chart", children: [
1797
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-fit-right", children: [
1798
+ /* @__PURE__ */ jsxs("span", { className: "ps-tryon-sr-fit-range", children: [
1536
1799
  row.chartLabel,
1537
1800
  " ",
1538
1801
  unitLbl
1802
+ ] }),
1803
+ /* @__PURE__ */ jsxs("span", { className: "ps-tryon-sr-fit-user-val", children: [
1804
+ row.userNum,
1805
+ " ",
1806
+ unitLbl
1539
1807
  ] })
1540
1808
  ] })
1541
- ] }, i)),
1542
- fitRows.length === 0 && sizingResult.reasoning && /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-reasoning", children: /* @__PURE__ */ jsx("p", { children: sizingResult.reasoning }) })
1809
+ ] }) }, i)) }),
1810
+ resultTab === "chart" && sizeGuideRow && /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-fit-list", children: sizeGuideRow.map((entry, i) => /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-fit-item", children: /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-fit-head", children: [
1811
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-fit-area", children: entry.header }),
1812
+ /* @__PURE__ */ jsxs("span", { className: "ps-tryon-sr-fit-range", children: [
1813
+ cleanNum(entry.value),
1814
+ " ",
1815
+ unitLbl
1816
+ ] })
1817
+ ] }) }, i)) }),
1818
+ allSizes.length > 1 && /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-chips", children: allSizes.map((s) => /* @__PURE__ */ jsxs(
1819
+ "button",
1820
+ {
1821
+ className: `ps-tryon-sr-chip${s === displaySize ? " ps-active" : ""}${s === origSize && s !== displaySize ? " ps-recommended" : ""}`,
1822
+ onClick: () => setSelectedSize(s === origSize ? null : s),
1823
+ children: [
1824
+ s,
1825
+ s === origSize && /* @__PURE__ */ jsx("span", { className: "ps-tryon-sr-rec-dot" })
1826
+ ]
1827
+ },
1828
+ s
1829
+ )) }),
1830
+ displayFitRows.length === 0 && !sizeGuideRow && sizingResult.reasoning && /* @__PURE__ */ jsx("div", { className: "ps-tryon-sr-reasoning", children: /* @__PURE__ */ jsx("p", { children: sizingResult.reasoning }) }),
1831
+ resultImageUrl && /* @__PURE__ */ jsxs("button", { className: "ps-tryon-sr-visual-btn", onClick: async () => {
1832
+ if (showVisualFit) {
1833
+ setShowVisualFit(false);
1834
+ return;
1835
+ }
1836
+ if (poseLines) {
1837
+ setShowVisualFit(true);
1838
+ return;
1839
+ }
1840
+ setPoseLoading(true);
1841
+ const lines = await detectMeasurementLines(resultImageUrl);
1842
+ setPoseLines(lines);
1843
+ setPoseLoading(false);
1844
+ if (lines) setShowVisualFit(true);
1845
+ }, children: [
1846
+ /* @__PURE__ */ jsx(SparkleIcon, { size: 14 }),
1847
+ poseLoading ? t("Analyzing...") : showVisualFit ? t("Hide visual fit") : t("See fit on your photo")
1848
+ ] }),
1849
+ !resultImageUrl && /* @__PURE__ */ jsx("button", { className: "ps-tryon-sf-next", onClick: () => setView("upload"), children: t("Try it on") })
1543
1850
  ] })
1544
1851
  ] }),
1545
- /* @__PURE__ */ jsxs("button", { className: "ps-tryon-cta", onClick: () => setView("upload"), children: [
1546
- t("See how it looks on you"),
1547
- " ",
1548
- /* @__PURE__ */ jsx(ArrowRightIcon, {})
1549
- ] })
1852
+ showFullChart && sizeGuide?.headers && sizeGuide?.rows && /* @__PURE__ */ jsx("div", { className: "ps-tryon-fc-overlay", onClick: () => setShowFullChart(false), children: /* @__PURE__ */ jsxs("div", { className: "ps-tryon-fc-panel", onClick: (e) => e.stopPropagation(), children: [
1853
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-fc-header", children: [
1854
+ /* @__PURE__ */ jsx("h3", { className: "ps-tryon-fc-title", children: t("SIZE CHART") }),
1855
+ /* @__PURE__ */ jsx("button", { className: "ps-tryon-fc-close", onClick: () => setShowFullChart(false), children: "×" })
1856
+ ] }),
1857
+ userMeasureValues.length > 0 && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-fc-measures", children: [
1858
+ /* @__PURE__ */ jsxs("div", { className: "ps-tryon-fc-measures-label", children: [
1859
+ t("YOUR ESTIMATED MEASUREMENTS"),
1860
+ /* @__PURE__ */ jsx("button", { className: "ps-tryon-sr-edit-link", onClick: () => {
1861
+ setShowFullChart(false);
1862
+ setView("sizing-choice");
1863
+ }, children: t("Edit") })
1864
+ ] }),
1865
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-fc-measures-vals", children: userMeasureValues.map((v, i) => /* @__PURE__ */ jsxs("div", { className: "ps-tryon-fc-measures-val", children: [
1866
+ /* @__PURE__ */ jsx("strong", { children: v.value }),
1867
+ " ",
1868
+ /* @__PURE__ */ jsx("span", { children: unitLbl })
1869
+ ] }, i)) })
1870
+ ] }),
1871
+ /* @__PURE__ */ jsx("div", { className: "ps-tryon-fc-table-wrap", children: /* @__PURE__ */ jsxs("table", { className: "ps-tryon-fc-table", children: [
1872
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: sizeGuide.headers.map((h, i) => /* @__PURE__ */ jsx("th", { children: h }, i)) }) }),
1873
+ /* @__PURE__ */ jsx("tbody", { children: sizeGuide.rows.map((row, i) => {
1874
+ const sizeVal = cellVal(row, sizeColIdx, sizeHeader);
1875
+ const isRec = sizeVal === origSize;
1876
+ return /* @__PURE__ */ jsx("tr", { className: isRec ? "ps-tryon-fc-rec-row" : "", children: sizeGuide.headers.map((h, j) => {
1877
+ const cell = cellVal(row, j, h);
1878
+ return /* @__PURE__ */ jsx("td", { children: j === sizeColIdx && isRec ? /* @__PURE__ */ jsx("span", { className: "ps-tryon-fc-rec-pill", children: cell }) : cell }, j);
1879
+ }) }, i);
1880
+ }) })
1881
+ ] }) })
1882
+ ] }) })
1550
1883
  ] })
1551
1884
  ] });
1552
1885
  }
@@ -1580,19 +1913,10 @@ function PrimeStyleTryonInner({
1580
1913
  ] });
1581
1914
  }
1582
1915
  function ResultView() {
1583
- return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-result-layout", children: [
1584
- resultImageUrl && /* @__PURE__ */ jsx("div", { className: "ps-tryon-result-image-col", children: /* @__PURE__ */ jsx("img", { src: resultImageUrl, alt: t("Try-on result"), className: cn.resultImage }) }),
1585
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-result-info-col", children: [
1586
- sizingResult && /* @__PURE__ */ jsx("div", { className: "ps-tryon-size-recommend ps-tryon-size-compact", children: /* @__PURE__ */ jsxs("div", { className: "ps-tryon-size-hero-row", children: [
1587
- /* @__PURE__ */ jsx("span", { className: "ps-tryon-size-compact-label", children: t("Your size:") }),
1588
- /* @__PURE__ */ jsx("div", { className: "ps-tryon-size-badge", children: sizingResult.recommendedSize })
1589
- ] }) }),
1590
- /* @__PURE__ */ jsxs("div", { className: cx("ps-tryon-result-actions", cn.resultActions), children: [
1591
- /* @__PURE__ */ jsx("button", { onClick: handleDownload, className: cx("ps-tryon-btn-download", cn.downloadButton), children: t("Download") }),
1592
- /* @__PURE__ */ jsx("button", { onClick: handleRetry, className: cx("ps-tryon-btn-retry", cn.retryButton), children: t("Start Over") })
1593
- ] })
1594
- ] })
1595
- ] });
1916
+ useEffect(() => {
1917
+ setView("size-result");
1918
+ }, []);
1919
+ return null;
1596
1920
  }
1597
1921
  function ErrorView() {
1598
1922
  return /* @__PURE__ */ jsxs("div", { className: cx("ps-tryon-error", cn.error), children: [
@@ -1767,7 +2091,7 @@ function PrimeStyleTryonInner({
1767
2091
  if (e.target === e.currentTarget) handleClose();
1768
2092
  }, children: /* @__PURE__ */ jsxs("div", { className: cx(`ps-tryon-modal${view === "result" && resultImageUrl && sizingResult || view === "size-result" || view === "sizing-choice" ? " ps-tryon-modal-wide" : ""}`, cn.modal), onClick: (e) => e.stopPropagation(), children: [
1769
2093
  /* @__PURE__ */ jsxs("div", { className: cx("ps-tryon-header", cn.header), children: [
1770
- /* @__PURE__ */ jsx("span", { className: cx("ps-tryon-title", cn.title), children: t("Virtual Try-On") }),
2094
+ /* @__PURE__ */ jsx("span", { className: cx("ps-tryon-title", cn.title), children: /* @__PURE__ */ jsx("img", { src: LOGO_IMG, alt: "PrimeStyle AI", className: "ps-tryon-logo-img" }) }),
1771
2095
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-header-actions", children: [
1772
2096
  /* @__PURE__ */ jsx(LangSwitcher, { activeLocale, onSelect: setActiveLocale }),
1773
2097
  profiles.length > 0 && /* @__PURE__ */ jsx("button", { className: "ps-tryon-header-icon", title: t("Profiles"), onClick: () => setDrawer(drawer === "profiles" ? null : "profiles"), children: /* @__PURE__ */ jsx(UserIcon, {}) }),
@@ -1827,7 +2151,7 @@ const STYLES = `
1827
2151
  scrollbar-width: thin; scrollbar-color: #333 transparent;
1828
2152
  flex-shrink: 0;
1829
2153
  }
1830
- .ps-tryon-modal-wide { max-width: 52vw; }
2154
+ .ps-tryon-modal-wide { max-width: 56vw; }
1831
2155
  .ps-tryon-modal:has(.ps-tryon-drawer-open) { overflow: hidden; }
1832
2156
  @keyframes ps-slide-up { from { transform: translateY(1.04vw) scale(0.97); opacity: 0; } to { transform: translateY(0) scale(1); opacity: 1; } }
1833
2157
 
@@ -1838,7 +2162,8 @@ const STYLES = `
1838
2162
  border-bottom: 1px solid #333;
1839
2163
  border-radius: var(--ps-modal-radius, 0.83vw) var(--ps-modal-radius, 0.83vw) 0 0;
1840
2164
  }
1841
- .ps-tryon-title { font-size: 0.78vw; font-weight: 600; color: var(--ps-modal-header-color, #fff); }
2165
+ .ps-tryon-title { display: flex; align-items: center; }
2166
+ .ps-tryon-logo-img { height: 2vw; width: auto; }
1842
2167
  .ps-tryon-header-actions { display: flex; align-items: center; gap: 0.42vw; }
1843
2168
  .ps-tryon-header-icon {
1844
2169
  width: 1.77vw; height: 1.77vw; display: flex; align-items: center; justify-content: center;
@@ -1915,7 +2240,7 @@ const STYLES = `
1915
2240
 
1916
2241
  /* Stepper */
1917
2242
  /* Dots progress */
1918
- .ps-tryon-dots { display: flex; align-items: center; gap: 0.42vw; padding: 0.83vw 1.25vw; }
2243
+ .ps-tryon-dots { display: flex; align-items: center; justify-content: center; gap: 0.42vw; padding: 0.83vw 1.25vw; }
1919
2244
  .ps-tryon-dot {
1920
2245
  width: 0.47vw; height: 0.47vw; border-radius: 50%; background: #333;
1921
2246
  transition: all 0.3s ease;
@@ -2007,26 +2332,108 @@ const STYLES = `
2007
2332
 
2008
2333
  /* Sizing — split layout (product image left, form right) */
2009
2334
  .ps-tryon-sizing-split {
2010
- display: grid; grid-template-columns: 1fr 1.2fr; gap: 1.5vw;
2011
- min-height: 22vw;
2335
+ display: grid; grid-template-columns: 1.2fr 1fr; gap: 1.5vw;
2336
+ min-height: 24vw;
2012
2337
  }
2013
2338
  .ps-tryon-sizing-img-col {
2014
- display: flex; align-items: stretch; justify-content: center;
2339
+ display: grid; align-items: stretch; justify-content: center;
2015
2340
  background: #0e0e0f; border-radius: 0.8vw; overflow: hidden;
2341
+ position: relative;
2342
+ }
2343
+ .ps-tryon-sizing-img-col > img {
2344
+ grid-area: 1 / 1; width: 100%; height: 100%; object-fit: cover;
2345
+ transition: opacity 0.5s ease;
2346
+ }
2347
+ .ps-tryon-sizing-product-img { object-position: top; opacity: 1; }
2348
+ .ps-tryon-sizing-product-img.ps-tryon-img-hidden { opacity: 0; }
2349
+ .ps-tryon-sizing-measure-img { object-fit: cover; object-position: top; opacity: 0; }
2350
+ .ps-tryon-sizing-measure-img.ps-tryon-img-visible { opacity: 1; }
2351
+
2352
+ /* Model overlay — positioned on top of the image column */
2353
+ .ps-tryon-model-overlay {
2354
+ grid-area: 1 / 1; position: relative; opacity: 0; transition: opacity 0.5s ease;
2355
+ width: 100%; aspect-ratio: 896 / 1200; overflow: hidden;
2356
+ }
2357
+ .ps-tryon-model-overlay.ps-tryon-img-visible { opacity: 1; }
2358
+ .ps-tryon-model-raw { width: 100%; height: 100%; object-fit: contain; }
2359
+
2360
+ /* Measurement overlay group — each measurement is one group */
2361
+ .ps-tryon-mline-group { position: absolute; inset: 0; pointer-events: none; }
2362
+
2363
+ /* Horizontal dashed line */
2364
+ .ps-tryon-mline-h {
2365
+ position: absolute; height: 0;
2366
+ border-top: 2.5px dashed #333;
2367
+ animation: ps-dash-draw 0.5s ease 0.1s both;
2368
+ }
2369
+ /* Vertical dashed line (inseam, sleeve) */
2370
+ .ps-tryon-mline-v {
2371
+ position: absolute; width: 0;
2372
+ border-left: 2.5px dashed #333;
2373
+ animation: ps-vdash-draw 0.5s ease 0.1s both;
2374
+ }
2375
+ /* Tick marks at line endpoints — vertical ticks for horizontal lines */
2376
+ .ps-tryon-mline-tick {
2377
+ position: absolute; width: 0;
2378
+ border-left: 2.5px solid #333;
2379
+ animation: ps-label-pop 0.3s ease 0.2s both;
2380
+ }
2381
+ /* Horizontal ticks for vertical lines */
2382
+ .ps-tryon-mline-htick {
2383
+ position: absolute; height: 0;
2384
+ border-top: 2.5px solid #333;
2385
+ animation: ps-label-pop 0.3s ease 0.2s both;
2386
+ }
2387
+
2388
+ /* Label box — matches reference: black title box + left-bordered description */
2389
+ .ps-tryon-mline-label {
2390
+ position: absolute;
2391
+ animation: ps-label-pop 0.35s ease 0.25s both;
2392
+ max-width: 33%;
2393
+ }
2394
+ .ps-tryon-mline-title {
2395
+ display: inline-block; background: #222; color: #fff;
2396
+ font-size: 0.55vw; font-weight: 800; letter-spacing: 0.06em;
2397
+ padding: 0.12vw 0.35vw; margin-bottom: 0.2vw;
2398
+ }
2399
+ .ps-tryon-mline-desc {
2400
+ font-size: 0.42vw; color: #444; line-height: 1.4;
2401
+ font-style: italic;
2402
+ border-left: 1.5px solid #555; padding-left: 0.3vw;
2403
+ margin-top: 0.1vw;
2404
+ }
2405
+
2406
+ @keyframes ps-measure-in {
2407
+ from { opacity: 0; transform: translateY(4px); }
2408
+ to { opacity: 1; transform: translateY(0); }
2016
2409
  }
2017
- .ps-tryon-sizing-product-img {
2018
- width: 100%; height: 100%; object-fit: cover; object-position: top;
2410
+ @keyframes ps-dash-draw {
2411
+ from { clip-path: inset(0 100% 0 0); }
2412
+ to { clip-path: inset(0 0 0 0); }
2019
2413
  }
2414
+ @keyframes ps-vdash-draw {
2415
+ from { clip-path: inset(0 0 100% 0); }
2416
+ to { clip-path: inset(0 0 0 0); }
2417
+ }
2418
+ @keyframes ps-label-pop {
2419
+ from { opacity: 0; transform: scale(0.9); }
2420
+ to { opacity: 1; transform: scale(1); }
2421
+ }
2422
+
2423
+ /* Active field row highlight */
2424
+ .ps-tryon-sf-row-active { border-bottom-color: #bb945c; }
2425
+ .ps-tryon-sf-row-active .ps-tryon-sf-label { color: #bb945c; }
2020
2426
  .ps-tryon-sizing-form-col {
2021
2427
  display: flex; flex-direction: column; justify-content: center;
2022
- padding: 0.5vw 0;
2428
+ padding: 0.5vw 0; min-height: 22vw;
2429
+ transition: min-height 0.3s ease;
2023
2430
  }
2024
2431
  .ps-tryon-sf-title {
2025
2432
  font-size: 1.3vw; font-weight: 700; color: #fff;
2026
- margin: 0 0 1vw; letter-spacing: -0.01em;
2433
+ margin: 0 0 1vw; letter-spacing: -0.01em; text-align: center;
2027
2434
  }
2028
2435
  .ps-tryon-sf-unit-tabs {
2029
- display: flex; border-bottom: 1.5px solid #333; margin-bottom: 1vw;
2436
+ display: flex; justify-content: center; border-bottom: 1.5px solid #333; margin-bottom: 1vw;
2030
2437
  }
2031
2438
  .ps-tryon-sf-unit-tab {
2032
2439
  background: none; border: none; padding: 0.4vw 0.8vw;
@@ -2046,48 +2453,70 @@ const STYLES = `
2046
2453
 
2047
2454
  .ps-tryon-sf-fields {
2048
2455
  display: flex; flex-direction: column; gap: 1.1vw;
2049
- flex: 1;
2456
+ flex: 1; transition: all 0.3s ease;
2050
2457
  }
2051
2458
  .ps-tryon-sf-row {
2052
- display: flex; align-items: center; justify-content: space-between;
2053
- border-bottom: 1px solid #2a2a2a; padding-bottom: 0.7vw;
2459
+ display: flex; align-items: center; justify-content: center; gap: 1.2vw;
2460
+ padding: 1.3vw 0;
2461
+ max-width: 22vw; margin: 0 auto;
2054
2462
  }
2055
2463
  .ps-tryon-sf-label {
2056
- font-size: 0.85vw; font-weight: 600; color: #ccc;
2057
- letter-spacing: 0.04em; flex-shrink: 0;
2464
+ font-size: 0.78vw; font-weight: 700; color: #ccc;
2465
+ letter-spacing: 0.1em; text-transform: uppercase;
2466
+ flex-shrink: 0; min-width: 5vw;
2058
2467
  }
2059
- .ps-tryon-sf-input-wrap { flex: 1; display: flex; justify-content: flex-end; }
2060
- .ps-tryon-sf-inline { display: flex; align-items: center; gap: 0.4vw; }
2061
- .ps-tryon-sf-ft-group { display: flex; align-items: center; gap: 0.3vw; }
2468
+ .ps-tryon-sf-input-wrap { flex: 1; display: flex; align-items: center; gap: 0.4vw; }
2469
+ .ps-tryon-sf-inline { flex: 1; display: flex; align-items: center; gap: 0.4vw; }
2470
+ .ps-tryon-sf-ft-group { flex: 1; display: flex; align-items: center; gap: 0.4vw; }
2062
2471
  .ps-tryon-sf-input {
2063
- background: transparent; border: none; border-bottom: 1.5px solid #444;
2064
- color: #fff; font-size: 1vw; font-family: inherit;
2065
- padding: 0.3vw 0; width: 4vw;
2472
+ background: transparent; border: none; border-bottom: 1.5px solid #555;
2473
+ color: #fff; font-size: 1vw; font-weight: 500; font-family: inherit;
2474
+ padding: 0.36vw 0; flex: 1;
2066
2475
  text-align: center; outline: none; transition: border-color 0.2s;
2476
+ -moz-appearance: textfield;
2067
2477
  }
2068
2478
  .ps-tryon-sf-input:focus { border-bottom-color: #bb945c; }
2069
2479
  .ps-tryon-sf-input::placeholder { color: #555; }
2070
2480
  .ps-tryon-sf-input::-webkit-outer-spin-button,
2071
2481
  .ps-tryon-sf-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
2072
2482
  .ps-tryon-sf-unit {
2073
- font-size: 0.75vw; color: #666; font-weight: 500;
2483
+ font-size: 0.73vw; color: #ccc; font-weight: 500; flex-shrink: 0;
2074
2484
  }
2075
2485
 
2076
- .ps-tryon-sf-optional { margin-top: 0.3vw; }
2077
- .ps-tryon-sf-optional { border-top: 1px solid #282828; margin-top: 0.42vw; padding-top: 0.42vw; }
2486
+ .ps-tryon-sf-optional { border-top: 1px solid #222; margin-top: 0.52vw; padding-top: 0.52vw; }
2487
+ .ps-tryon-sf-optional-toggle {
2488
+ display: flex; align-items: center; justify-content: space-between;
2489
+ width: 100%; padding: 0.52vw 0.73vw;
2490
+ font-size: 0.83vw; font-weight: 600; color: #fff; cursor: pointer;
2491
+ font-family: inherit;
2492
+ border: 1px solid #333; border-radius: 0.52vw;
2493
+ background: #161616; transition: all 0.2s;
2494
+ }
2495
+ .ps-tryon-sf-optional-toggle:hover { border-color: #555; background: #1a1a1a; }
2496
+ .ps-tryon-sf-optional-arrow {
2497
+ font-size: 0.83vw; color: #999; transition: transform 0.3s ease; display: inline-block;
2498
+ }
2499
+ .ps-tryon-sf-optional-arrow.ps-open { transform: rotate(180deg); }
2078
2500
  .ps-tryon-sf-optional-fields {
2079
- display: flex; flex-direction: column; gap: 0.52vw; padding-top: 0.52vw;
2080
- animation: ps-fade-up 0.3s ease both;
2501
+ display: flex; flex-direction: column; gap: 0.8vw;
2502
+ max-height: 0; overflow: hidden; opacity: 0;
2503
+ transition: max-height 0.35s ease, opacity 0.25s ease, padding 0.35s ease;
2504
+ padding-top: 0;
2081
2505
  }
2082
- .ps-tryon-sf-optional-toggle {
2083
- font-size: 0.75vw; color: #666; cursor: pointer;
2084
- font-family: inherit; list-style: none;
2506
+ .ps-tryon-sf-optional-fields.ps-open {
2507
+ max-height: 30vw; opacity: 1; padding-top: 0.7vw;
2085
2508
  }
2086
- .ps-tryon-sf-optional-toggle:hover { color: #999; }
2087
- .ps-tryon-sf-optional-toggle::-webkit-details-marker { display: none; }
2088
- .ps-tryon-sf-optional-fields { display: flex; flex-direction: column; gap: 0.8vw; padding-top: 0.7vw; }
2089
2509
 
2090
- .ps-tryon-sf-switch { margin-top: 0.8vw; text-align: center; }
2510
+ .ps-tryon-sf-switch { margin-top: 0.8vw; display: flex; align-items: center; justify-content: center; gap: 1.2vw; flex-wrap: wrap; }
2511
+ .ps-tryon-sf-measure-btn {
2512
+ background: none; border: 1px solid #333; color: #999; font-size: 0.75vw;
2513
+ font-weight: 500; cursor: pointer; font-family: inherit;
2514
+ display: inline-flex; align-items: center; gap: 0.3vw;
2515
+ padding: 0.3vw 0.7vw; border-radius: 0.4vw; transition: all 0.2s;
2516
+ }
2517
+ .ps-tryon-sf-measure-btn:hover { border-color: #bb945c; color: #bb945c; }
2518
+ .ps-tryon-sf-measure-btn.ps-active { border-color: #bb945c; color: #bb945c; background: rgba(187,148,92,0.08); }
2519
+ .ps-tryon-sf-measure-btn svg { stroke: currentColor; }
2091
2520
  .ps-tryon-sf-switch-btn {
2092
2521
  background: none; border: none; color: #bb945c; font-size: 0.8vw;
2093
2522
  font-weight: 600; cursor: pointer; font-family: inherit;
@@ -2110,6 +2539,9 @@ const STYLES = `
2110
2539
  }
2111
2540
  .ps-tryon-sf-save-name:focus { border-color: #bb945c; }
2112
2541
 
2542
+ .ps-tryon-sf-error {
2543
+ color: #ef4444; font-size: 0.75vw; text-align: center; margin-top: 0.3vw;
2544
+ }
2113
2545
  .ps-tryon-sf-next {
2114
2546
  margin-top: 1vw; align-self: flex-end;
2115
2547
  padding: 0.7vw 2vw;
@@ -2267,13 +2699,48 @@ const STYLES = `
2267
2699
  .ps-tryon-processing-text { font-size: 0.73vw; color: #fff; margin: 0 0 0.21vw; }
2268
2700
  .ps-tryon-processing-sub { font-size: 0.63vw; color: #999; margin: 0; }
2269
2701
 
2270
- /* Result */
2702
+ /* Result — split layout */
2703
+ .ps-tryon-result-split {
2704
+ display: flex; gap: 1.5vw; text-align: left; align-items: flex-start;
2705
+ }
2706
+ .ps-tryon-result-img-col {
2707
+ flex: 0 0 48%; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 0.63vw;
2708
+ }
2709
+ .ps-tryon-result-img-col img {
2710
+ width: 100%; max-height: 24vw; object-fit: contain; border-radius: 0.73vw;
2711
+ box-shadow: 0 0.42vw 1.67vw rgba(0,0,0,0.3); animation: ps-scale-in 0.5s ease both;
2712
+ }
2713
+ .ps-tryon-result-dl-btn {
2714
+ display: inline-flex; align-items: center; gap: 0.31vw;
2715
+ padding: 0.36vw 0.83vw; background: transparent; border: 1px solid #444;
2716
+ border-radius: 0.42vw; color: #ccc; font-size: 0.68vw; font-weight: 600;
2717
+ cursor: pointer; font-family: inherit; transition: all 0.2s;
2718
+ }
2719
+ .ps-tryon-result-dl-btn:hover { border-color: #bb945c; color: #bb945c; }
2720
+ .ps-tryon-result-dl-btn svg { stroke: currentColor; }
2721
+ .ps-tryon-result-info-col {
2722
+ flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1vw;
2723
+ }
2724
+ .ps-tryon-result-fit {
2725
+ display: flex; flex-direction: column; gap: 0.36vw;
2726
+ }
2727
+ .ps-tryon-result-fit-row {
2728
+ display: flex; align-items: center; justify-content: space-between;
2729
+ padding: 0.42vw 0; border-bottom: 1px solid #1a1a1a;
2730
+ }
2731
+ .ps-tryon-result-fit-area { font-size: 0.78vw; font-weight: 600; color: #ccc; }
2732
+ .ps-tryon-result-actions-col {
2733
+ display: flex; flex-direction: column; gap: 0.42vw; margin-top: 0.52vw;
2734
+ }
2735
+ .ps-tryon-result-startover {
2736
+ background: none; border: none; color: #666; font-size: 0.68vw;
2737
+ font-weight: 600; cursor: pointer; font-family: inherit; transition: color 0.2s;
2738
+ text-align: center;
2739
+ }
2740
+ .ps-tryon-result-startover:hover { color: #999; }
2741
+ /* Legacy result layout */
2271
2742
  .ps-tryon-result-layout { text-align: center; }
2272
- .ps-tryon-result-split { display: flex; gap: 1.25vw; text-align: left; align-items: stretch; }
2273
- .ps-tryon-result-image-col { flex: 0 0 45%; min-width: 0; display: flex; align-items: center; justify-content: center; }
2274
- .ps-tryon-result-image-col img { width: 100%; max-height: 20.8vw; object-fit: contain; border-radius: 0.73vw; box-shadow: 0 0.42vw 1.67vw rgba(0,0,0,0.2); animation: ps-scale-in 0.5s ease both; }
2275
- .ps-tryon-result-info-col { flex: 1; min-width: 0; }
2276
- .ps-tryon-result-layout:not(.ps-tryon-result-split) img { width: 100%; border-radius: 0.63vw; margin-bottom: 0.83vw; }
2743
+ .ps-tryon-result-layout img { width: 100%; border-radius: 0.63vw; margin-bottom: 0.83vw; }
2277
2744
  .ps-tryon-result-actions { display: flex; gap: 0.42vw; margin-top: 0.83vw; }
2278
2745
  .ps-tryon-result-actions button {
2279
2746
  flex: 1; padding: 0.63vw; font-family: var(--ps-modal-font, system-ui, sans-serif);
@@ -2284,8 +2751,8 @@ const STYLES = `
2284
2751
  .ps-tryon-btn-retry { background: rgba(255,255,255,0.08); color: #fff; border: 1px solid #333 !important; }
2285
2752
  .ps-tryon-btn-retry:hover { background: rgba(255,255,255,0.12); }
2286
2753
 
2287
- /* ── Size Result (redesigned) ── */
2288
- .ps-tryon-sr { display: flex; flex-direction: column; gap: 1.25vw; }
2754
+ /* ── Size Result ── */
2755
+ .ps-tryon-sr { }
2289
2756
  .ps-tryon-sr-loading { text-align: center; padding: 3vw 0; }
2290
2757
  .ps-tryon-sr-loading p { font-size: 0.83vw; color: #666; margin-top: 0.6vw; }
2291
2758
  .ps-tryon-size-loading-spinner {
@@ -2295,142 +2762,285 @@ const STYLES = `
2295
2762
  }
2296
2763
  @keyframes ps-spin { to { transform: rotate(360deg); } }
2297
2764
 
2298
- /* Hero */
2299
- .ps-tryon-sr-hero {
2300
- display: flex; align-items: center; gap: 1vw; padding: 1.1vw 1.3vw;
2301
- background: linear-gradient(135deg, rgba(187,148,92,0.06), rgba(187,148,92,0.01));
2302
- border: 1px solid rgba(187,148,92,0.2); border-radius: 0.83vw;
2303
- }
2304
- .ps-tryon-sr-hero-badge {
2305
- min-width: 3.2vw; height: 3.2vw; display: flex; align-items: center; justify-content: center;
2306
- background: linear-gradient(135deg, #bb945c, #d6ba7d); color: #111;
2307
- font-size: 1.35vw; font-weight: 800; border-radius: 0.63vw; letter-spacing: -0.02em;
2308
- padding: 0 0.73vw; box-shadow: 0 0.3vw 1vw rgba(187,148,92,0.3);
2309
- }
2310
- .ps-tryon-sr-hero-info { flex: 1; }
2311
- .ps-tryon-sr-hero-title { font-size: 1vw; font-weight: 700; color: #fff; margin-bottom: 0.1vw; }
2312
- .ps-tryon-sr-hero-conf { font-size: 0.73vw; font-weight: 600; }
2313
- .ps-conf-high { color: #4ade80; } .ps-conf-medium { color: #bb945c; } .ps-conf-low { color: #ef4444; }
2765
+ .ps-tryon-sr-split { display: grid; grid-template-columns: 1fr 1.2fr; gap: 1.5vw; min-height: 22vw; }
2766
+
2767
+ /* Left: product image */
2768
+ .ps-tryon-sr-img-col {
2769
+ position: relative; border-radius: 0.8vw; overflow: hidden; background: #0e0e0f;
2770
+ }
2771
+ .ps-tryon-sr-product-img { width: 100%; height: 100%; object-fit: cover; object-position: top; }
2772
+ .ps-tryon-sr-chart-btn {
2773
+ position: absolute; bottom: 1vw; left: 1vw;
2774
+ background: rgba(255,255,255,0.95); color: #111; border: none;
2775
+ padding: 0.4vw 0.8vw; border-radius: 0.3vw; font-size: 0.7vw; font-weight: 600;
2776
+ cursor: pointer; font-family: inherit; transition: all 0.2s;
2777
+ }
2778
+ .ps-tryon-sr-chart-btn:hover { background: #fff; }
2314
2779
 
2315
- .ps-tryon-sr-hero-badge-icon { background: linear-gradient(135deg, #333, #444); }
2316
- .ps-tryon-sr-hero-badge-icon svg { stroke: #bb945c; }
2780
+ /* Right column */
2781
+ .ps-tryon-sr-right-col { display: flex; flex-direction: column; gap: 0.8vw; }
2317
2782
 
2318
- /* Size changed notice */
2783
+ /* Size hero big letter + label */
2784
+ .ps-tryon-sr-size-hero { display: flex; align-items: flex-start; gap: 0.8vw; }
2785
+ .ps-tryon-sr-size-letter {
2786
+ font-size: 3vw; font-weight: 800; color: #fff; line-height: 1; letter-spacing: -0.02em;
2787
+ }
2788
+ .ps-tryon-sr-size-meta { display: flex; flex-direction: column; gap: 0.15vw; padding-top: 0.3vw; }
2789
+ .ps-tryon-sr-size-label { font-size: 0.65vw; font-weight: 700; color: #888; text-transform: uppercase; letter-spacing: 0.1em; }
2790
+ .ps-tryon-sr-size-label.ps-not-rec { color: #ef4444; }
2791
+ .ps-tryon-sr-edit-link {
2792
+ background: none; border: none; color: #bb945c; font-size: 0.7vw; font-weight: 500;
2793
+ cursor: pointer; font-family: inherit; text-decoration: underline; padding: 0; text-align: left;
2794
+ }
2795
+ .ps-tryon-sr-edit-link:hover { color: #d6ba7d; }
2796
+
2797
+ /* Size changed */
2319
2798
  .ps-tryon-sr-size-changed {
2320
- display: flex; align-items: center; gap: 0.36vw;
2321
- padding: 0.42vw 0.68vw; border-radius: 0.42vw;
2799
+ display: inline-flex; align-items: center; gap: 0.3vw;
2800
+ padding: 0.3vw 0.6vw; border-radius: 0.3vw;
2322
2801
  background: rgba(187,148,92,0.08); border: 1px solid rgba(187,148,92,0.2);
2323
- font-size: 0.73vw; color: #d6ba7d; margin-top: 0.52vw;
2324
- animation: ps-fade-up 0.25s ease both;
2802
+ font-size: 0.7vw; color: #d6ba7d;
2325
2803
  }
2326
2804
  .ps-tryon-sr-size-changed svg { stroke: #bb945c; }
2327
2805
  .ps-tryon-sr-size-changed strong { color: #fff; }
2328
2806
 
2329
- /* Split layout */
2330
- .ps-tryon-sr-split { display: flex; gap: 1.5vw; min-height: 0; }
2331
- .ps-tryon-sr-left { flex: 0 0 45%; display: flex; flex-direction: column; gap: 1vw; }
2332
- .ps-tryon-sr-right { flex: 1; display: flex; flex-direction: column; gap: 0.52vw; }
2807
+ /* Tabs */
2808
+ .ps-tryon-sr-tabs { display: flex; border-bottom: 1.5px solid #333; }
2809
+ .ps-tryon-sr-tab {
2810
+ background: none; border: none; padding: 0.4vw 0.8vw; margin-bottom: -1.5px;
2811
+ font-size: 0.75vw; font-weight: 600; color: #666; cursor: pointer;
2812
+ font-family: inherit; border-bottom: 2px solid transparent; transition: all 0.2s;
2813
+ }
2814
+ .ps-tryon-sr-tab:hover { color: #999; }
2815
+ .ps-tryon-sr-tab.ps-active { color: #fff; border-bottom-color: #bb945c; }
2333
2816
 
2334
- /* Section titles */
2335
- .ps-tryon-sr-section-title { font-size: 0.73vw; font-weight: 700; color: #666; text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 0.52vw; }
2817
+ /* Fit list — "Your fit" tab */
2818
+ .ps-tryon-sr-fit-list { display: flex; flex-direction: column; gap: 0; }
2819
+ .ps-tryon-sr-fit-item {
2820
+ padding: 0.7vw 0; border-bottom: 1px solid #1e1e1e;
2821
+ }
2822
+ .ps-tryon-sr-fit-item:last-child { border-bottom: none; }
2823
+ .ps-tryon-sr-fit-row-grid {
2824
+ display: flex; justify-content: space-between; align-items: flex-start;
2825
+ }
2826
+ .ps-tryon-sr-fit-left { display: flex; flex-direction: column; gap: 0.2vw; }
2827
+ .ps-tryon-sr-fit-right { display: flex; flex-direction: column; align-items: flex-end; gap: 0.15vw; }
2828
+ .ps-tryon-sr-fit-head {
2829
+ display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 0.2vw;
2830
+ }
2831
+ .ps-tryon-sr-fit-area { font-size: 0.85vw; font-weight: 600; color: #fff; }
2832
+ .ps-tryon-sr-fit-range { font-size: 0.85vw; font-weight: 700; color: #888; }
2833
+ .ps-tryon-sr-fit-user-line {
2834
+ display: flex; align-items: center; gap: 0.3vw;
2835
+ }
2836
+ .ps-tryon-sr-fit-user-label { font-size: 0.65vw; color: #bb945c; font-weight: 500; }
2837
+ .ps-tryon-sr-fit-status {
2838
+ font-size: 0.6vw; font-weight: 600; padding: 0.1vw 0.35vw; border-radius: 0.25vw;
2839
+ }
2840
+ .ps-tryon-sr-fit-status.ps-fit-good { color: #4ade80; background: rgba(74,222,128,0.1); }
2841
+ .ps-tryon-sr-fit-status.ps-fit-a-bit-tight { color: #f59e0b; background: rgba(245,158,11,0.1); }
2842
+ .ps-tryon-sr-fit-status.ps-fit-tight { color: #e87040; background: rgba(232,112,64,0.1); }
2843
+ .ps-tryon-sr-fit-status.ps-fit-too-tight { color: #dc2626; background: rgba(220,38,38,0.1); }
2844
+ .ps-tryon-sr-fit-status.ps-fit-a-bit-loose { color: #f59e0b; background: rgba(245,158,11,0.1); }
2845
+ .ps-tryon-sr-fit-status.ps-fit-loose { color: #e87040; background: rgba(232,112,64,0.1); }
2846
+ .ps-tryon-sr-fit-status.ps-fit-too-loose { color: #dc2626; background: rgba(220,38,38,0.1); }
2847
+ .ps-tryon-sr-fit-user-val { font-size: 0.75vw; color: #ccc; font-weight: 600; }
2848
+ .ps-tryon-sr-fit-note { font-size: 0.6vw; color: #555; margin-top: 0.5vw; text-align: center; }
2849
+ .ps-tryon-sr-full-chart-btn {
2850
+ display: flex; align-items: center; justify-content: center; gap: 0.3vw;
2851
+ margin: 0.6vw auto 0; padding: 0.4vw 1vw;
2852
+ border: 1.5px solid #333; border-radius: 0.4vw; background: transparent;
2853
+ color: #ccc; font-size: 0.7vw; font-weight: 600; cursor: pointer;
2854
+ font-family: inherit; transition: all 0.2s;
2855
+ }
2856
+ .ps-tryon-sr-full-chart-btn:hover { border-color: #bb945c; color: #bb945c; }
2336
2857
 
2337
- /* International sizes */
2338
- .ps-tryon-sr-intl { }
2339
- .ps-tryon-sr-intl-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(3.8vw, 1fr)); gap: 0.42vw; }
2340
- .ps-tryon-sr-intl-card {
2341
- display: flex; flex-direction: column; align-items: center;
2342
- padding: 0.62vw 0.36vw; border: 1px solid #282828; border-radius: 0.52vw;
2343
- background: #161616; transition: all 0.2s;
2858
+ /* Chart table — "Size guide" tab */
2859
+ .ps-tryon-sr-chart-table-wrap { overflow-x: auto; max-height: 14vw; overflow-y: auto; }
2860
+ .ps-tryon-sr-chart-table { width: 100%; font-size: 0.7vw; border-collapse: collapse; }
2861
+ .ps-tryon-sr-chart-table th {
2862
+ text-align: left; padding: 0.35vw 0.5vw; color: #666; font-weight: 600;
2863
+ border-bottom: 1px solid #333; position: sticky; top: 0; background: #111211;
2864
+ }
2865
+ .ps-tryon-sr-chart-table td { padding: 0.3vw 0.5vw; color: #999; border-bottom: 1px solid #1a1a1a; }
2866
+ .ps-tryon-sr-chart-active td { color: #fff; background: rgba(187,148,92,0.08); }
2867
+
2868
+ /* Size chips */
2869
+ .ps-tryon-sr-chips { display: flex; flex-wrap: wrap; gap: 0.4vw; justify-content: center; }
2870
+ .ps-tryon-sr-chip {
2871
+ min-width: 2.2vw; height: 2.2vw; display: flex; align-items: center; justify-content: center;
2872
+ border: 1.5px solid #333; border-radius: 0.4vw; background: transparent;
2873
+ color: #999; font-size: 0.75vw; font-weight: 600; cursor: pointer;
2874
+ font-family: inherit; transition: all 0.2s; padding: 0 0.5vw;
2875
+ }
2876
+ .ps-tryon-sr-chip:hover { border-color: #555; color: #ccc; }
2877
+ .ps-tryon-sr-chip.ps-active { background: #111; border-color: #bb945c; color: #fff; }
2878
+
2879
+ /* Reasoning */
2880
+ .ps-tryon-sr-reasoning { padding: 0.8vw; border: 1px solid #333; border-radius: 0.6vw; background: #1a1b1a; }
2881
+ .ps-tryon-sr-reasoning p { font-size: 0.75vw; color: #ccc; line-height: 1.6; margin: 0; }
2882
+
2883
+ /* Result actions */
2884
+ /* Image action icons — bottom-left of image */
2885
+ .ps-tryon-sr-img-actions {
2886
+ position: absolute; bottom: 0.6vw; left: 0.6vw; z-index: 3;
2887
+ display: flex; flex-direction: column; gap: 0.3vw;
2888
+ }
2889
+ .ps-tryon-sr-img-icon {
2890
+ width: 1.8vw; height: 1.8vw; display: flex; align-items: center; justify-content: center;
2891
+ background: rgba(0,0,0,0.6); border: 1px solid rgba(255,255,255,0.15); border-radius: 0.4vw;
2892
+ color: #ccc; cursor: pointer; transition: all 0.2s; backdrop-filter: blur(4px);
2893
+ }
2894
+ .ps-tryon-sr-img-icon:hover { background: rgba(0,0,0,0.8); color: #fff; border-color: rgba(255,255,255,0.3); }
2895
+
2896
+ /* See fit visually — below size chips */
2897
+ .ps-tryon-sr-visual-btn {
2898
+ display: flex; align-items: center; justify-content: center; gap: 0.3vw;
2899
+ width: 100%; padding: 0.5vw; margin-top: 0.3vw;
2900
+ background: transparent; border: 1px solid #333; border-radius: 0.5vw;
2901
+ color: #999; font-size: 0.7vw; font-weight: 600; cursor: pointer;
2902
+ font-family: inherit; transition: all 0.2s;
2903
+ }
2904
+ .ps-tryon-sr-visual-btn:hover { border-color: #bb945c; color: #bb945c; }
2905
+ .ps-tryon-sr-visual-btn svg { stroke: currentColor; }
2906
+
2907
+ /* Dark overlay behind SVG lines */
2908
+ .ps-tryon-pose-overlay {
2909
+ position: absolute; inset: 0; z-index: 1;
2910
+ background: rgba(0,0,0,0.35);
2911
+ animation: ps-fade-in 0.4s ease both;
2912
+ border-radius: inherit;
2344
2913
  }
2345
- .ps-tryon-sr-intl-card:hover { border-color: #444; background: #1c1c1c; }
2346
- .ps-tryon-sr-intl-card-val { font-size: 1.1vw; font-weight: 800; color: #fff; line-height: 1.15; }
2347
- .ps-tryon-sr-intl-card-code { font-size: 0.52vw; font-weight: 700; color: #555; text-transform: uppercase; letter-spacing: 0.1em; margin-top: 0.15vw; }
2348
2914
 
2349
- /* (intl grid uses .ps-tryon-sr-intl-grid defined above) */
2915
+ /* SVG pose overlay */
2916
+ .ps-tryon-pose-svg {
2917
+ position: absolute; inset: 0; width: 100%; height: 100%;
2918
+ pointer-events: none; z-index: 2;
2919
+ }
2350
2920
 
2351
- /* Size selector */
2352
- .ps-tryon-sr-sizes { }
2353
- .ps-tryon-sr-size-row { display: flex; flex-wrap: wrap; gap: 0.36vw; }
2354
- .ps-tryon-sr-size-chip {
2355
- position: relative; min-width: 2.6vw; height: 2.4vw; padding: 0 0.73vw;
2356
- display: flex; align-items: center; justify-content: center;
2357
- border: 1.5px solid #333; border-radius: 0.52vw; background: transparent;
2358
- color: #999; font-size: 0.83vw; font-weight: 600; cursor: pointer;
2359
- transition: all 0.2s; font-family: inherit;
2921
+ /* Dotted curved line — draws in smoothly */
2922
+ .ps-tryon-pose-line {
2923
+ stroke-dashoffset: 80;
2924
+ animation: ps-pose-draw 1s cubic-bezier(0.4, 0, 0.2, 1) forwards;
2360
2925
  }
2361
- .ps-tryon-sr-size-chip:hover { border-color: #555; color: #ccc; }
2362
- .ps-tryon-sr-size-chip.ps-active {
2363
- border-color: #bb945c; background: #bb945c; color: #111;
2364
- box-shadow: 0 0.2vw 0.8vw rgba(187,148,92,0.2);
2926
+
2927
+ /* HTML pill labels — positioned absolutely on the image */
2928
+ .ps-tryon-pose-pill {
2929
+ position: absolute; z-index: 3; transform: translateY(-50%);
2930
+ display: flex; align-items: center; gap: 0.4vw;
2931
+ background: rgba(15,15,15,0.85); backdrop-filter: blur(6px);
2932
+ border-radius: 0.5vw; padding: 0.35vw 0.6vw;
2933
+ opacity: 0;
2934
+ animation: ps-pose-pill-in 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
2935
+ }
2936
+ .ps-tryon-pose-pill-dot {
2937
+ width: 0.5vw; height: 0.5vw; border-radius: 50%; flex-shrink: 0;
2938
+ }
2939
+ .ps-tryon-pose-pill-text { display: flex; flex-direction: column; gap: 0.05vw; }
2940
+ .ps-tryon-pose-pill-name {
2941
+ font-size: 0.75vw; font-weight: 700; color: #fff; line-height: 1.2;
2942
+ font-family: system-ui, -apple-system, sans-serif;
2943
+ }
2944
+ .ps-tryon-pose-pill-fit {
2945
+ font-size: 0.6vw; font-weight: 600; line-height: 1.2;
2946
+ font-family: system-ui, -apple-system, sans-serif;
2365
2947
  }
2366
- .ps-tryon-sr-size-chip.ps-recommended { border-color: rgba(187,148,92,0.4); }
2948
+
2949
+ @keyframes ps-pose-draw {
2950
+ from { stroke-dashoffset: 80; opacity: 0; }
2951
+ 10% { opacity: 1; }
2952
+ to { stroke-dashoffset: 0; opacity: 1; }
2953
+ }
2954
+ @keyframes ps-pose-pill-in {
2955
+ from { opacity: 0; transform: translateX(-2px); }
2956
+ to { opacity: 1; transform: translateX(0); }
2957
+ }
2958
+ .ps-tryon-sr-cta {
2959
+ width: 100%; padding: 0.8vw; background: #111; color: #fff; border: 1.5px solid #333;
2960
+ border-radius: 0.6vw; font-size: 0.85vw; font-weight: 700; cursor: pointer;
2961
+ font-family: inherit; transition: all 0.2s; margin-top: auto;
2962
+ }
2963
+ .ps-tryon-sr-cta:hover { background: #1a1a1a; border-color: #bb945c; }
2964
+
2965
+ /* Size chip recommended dot */
2966
+ .ps-tryon-sr-chip { position: relative; }
2367
2967
  .ps-tryon-sr-rec-dot {
2368
- position: absolute; bottom: -0.26vw; left: 50%; transform: translateX(-50%);
2369
- width: 0.31vw; height: 0.31vw; border-radius: 50%; background: #bb945c;
2968
+ position: absolute; bottom: -0.3vw; left: 50%; transform: translateX(-50%);
2969
+ width: 0.25vw; height: 0.25vw; border-radius: 50%; background: #bb945c;
2370
2970
  }
2371
- .ps-tryon-sr-size-chip.ps-active .ps-tryon-sr-rec-dot { background: #111; }
2372
- .ps-tryon-sr-comparing { font-size: 0.73vw; color: #bb945c; margin-top: 0.42vw; }
2373
- .ps-tryon-sr-comparing strong { color: #d6ba7d; }
2971
+ .ps-tryon-sr-chip.ps-active .ps-tryon-sr-rec-dot { background: #fff; }
2972
+ .ps-tryon-sr-chip.ps-recommended { border-color: rgba(187,148,92,0.4); }
2374
2973
 
2375
- /* Measurement rows (right column) */
2376
- .ps-tryon-sr-meas {
2377
- border: 1px solid #282828; border-radius: 0.57vw; overflow: hidden;
2378
- transition: border-color 0.2s;
2974
+ /* ── Full Size Chart Overlay ── */
2975
+ .ps-tryon-fc-overlay {
2976
+ position: absolute; inset: 0; z-index: 10;
2977
+ background: #111211;
2978
+ display: flex; flex-direction: column;
2979
+ animation: ps-fade-in 0.2s ease;
2980
+ }
2981
+ @keyframes ps-fade-in { from { opacity: 0; } to { opacity: 1; } }
2982
+ .ps-tryon-fc-panel {
2983
+ background: #111211;
2984
+ width: 100%; height: 100%; overflow: hidden;
2985
+ display: flex; flex-direction: column;
2379
2986
  }
2380
- .ps-tryon-sr-meas.ps-fit-good { border-left: 3px solid #4ade80; }
2381
- .ps-tryon-sr-meas.ps-fit-tight { border-left: 3px solid #f59e0b; }
2382
- .ps-tryon-sr-meas.ps-fit-loose { border-left: 3px solid #60a5fa; }
2383
- .ps-tryon-sr-meas-head {
2987
+ .ps-tryon-fc-header {
2384
2988
  display: flex; align-items: center; justify-content: space-between;
2385
- padding: 0.47vw 0.73vw; background: #161616;
2386
- }
2387
- .ps-tryon-sr-meas-area { font-size: 0.78vw; font-weight: 700; color: #fff; }
2388
- .ps-tryon-sr-meas-badge {
2389
- display: inline-flex; align-items: center; gap: 0.21vw; padding: 0.16vw 0.47vw;
2390
- border-radius: 0.26vw; font-size: 0.57vw; font-weight: 700; white-space: nowrap;
2391
- }
2392
- .ps-tryon-sr-meas-badge.ps-fit-good { background: rgba(74,222,128,0.08); color: #4ade80; }
2393
- .ps-tryon-sr-meas-badge.ps-fit-tight { background: rgba(245,158,11,0.08); color: #f59e0b; }
2394
- .ps-tryon-sr-meas-badge.ps-fit-loose { background: rgba(96,165,250,0.08); color: #60a5fa; }
2395
- .ps-tryon-sr-meas-row {
2396
- display: flex; align-items: center; gap: 0.52vw; padding: 0.47vw 0.73vw;
2397
- }
2398
- .ps-tryon-sr-meas-input-wrap { display: flex; align-items: center; gap: 0.21vw; }
2399
- .ps-tryon-sr-meas-input {
2400
- width: 3.8vw; padding: 0.26vw 0.36vw; border: 1.5px solid #444; border-radius: 0.31vw;
2401
- background: #0c0c0d; color: #fff; font-size: 0.83vw; font-weight: 600; font-family: inherit;
2402
- outline: none; text-align: center; -moz-appearance: textfield;
2403
- transition: border-color 0.2s, background 0.2s;
2404
- }
2405
- .ps-tryon-sr-meas-input::-webkit-outer-spin-button,
2406
- .ps-tryon-sr-meas-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
2407
- .ps-tryon-sr-meas-input:focus { border-color: #bb945c; background: #1a1a1a; }
2408
- .ps-tryon-sr-meas-unit { font-size: 0.63vw; color: #555; }
2409
- .ps-tryon-sr-meas-vs { font-size: 0.63vw; color: #444; font-weight: 700; }
2410
- .ps-tryon-sr-meas-chart { font-size: 0.83vw; font-weight: 600; color: #888; }
2411
-
2412
- /* (compare dropdown removed — recalculation is automatic) */
2413
-
2414
- .ps-tryon-sr-fit-badge {
2415
- display: inline-flex; align-items: center; gap: 0.26vw; padding: 0.21vw 0.52vw;
2416
- border-radius: 0.36vw; font-size: 0.63vw; font-weight: 700; white-space: nowrap;
2417
- }
2418
- .ps-tryon-sr-fit-badge.ps-fit-good { background: rgba(74,222,128,0.1); color: #4ade80; }
2419
- .ps-tryon-sr-fit-badge.ps-fit-tight { background: rgba(245,158,11,0.1); color: #f59e0b; }
2420
- .ps-tryon-sr-fit-badge.ps-fit-loose { background: rgba(96,165,250,0.1); color: #60a5fa; }
2421
-
2422
- /* Reasoning fallback */
2423
- .ps-tryon-sr-reasoning { padding: 0.83vw; border: 1px solid #333; border-radius: 0.63vw; background: #1a1b1a; }
2424
- .ps-tryon-sr-reasoning p { font-size: 0.78vw; color: #ccc; line-height: 1.6; margin: 0; }
2425
-
2426
- /* CTAs */
2427
- .ps-tryon-sr-ctas { display: flex; flex-direction: column; gap: 0.52vw; margin-top: 0.36vw; }
2428
- .ps-tryon-btn-secondary {
2429
- background: transparent; border: 1.5px solid #444; color: #999; font-size: 0.83vw;
2430
- font-weight: 600; padding: 0.73vw 1.3vw; border-radius: 0.52vw;
2431
- cursor: pointer; transition: all 0.2s; font-family: inherit;
2432
- }
2433
- .ps-tryon-btn-secondary:hover { border-color: #666; color: #ccc; }
2989
+ padding: 0.8vw 1.2vw; border-bottom: 1px solid #282828;
2990
+ }
2991
+ .ps-tryon-fc-title {
2992
+ font-size: 0.8vw; font-weight: 700; color: #fff;
2993
+ letter-spacing: 0.12em; margin: 0;
2994
+ }
2995
+ .ps-tryon-fc-close {
2996
+ background: none; border: none; color: #666; font-size: 1.4vw;
2997
+ cursor: pointer; line-height: 1; padding: 0; transition: color 0.2s;
2998
+ }
2999
+ .ps-tryon-fc-close:hover { color: #fff; }
3000
+
3001
+ /* Your measurements bar */
3002
+ .ps-tryon-fc-measures {
3003
+ padding: 0.7vw 1.2vw; background: #1a1a1a; border-bottom: 1px solid #282828;
3004
+ }
3005
+ .ps-tryon-fc-measures-label {
3006
+ display: flex; align-items: center; gap: 0.5vw;
3007
+ font-size: 0.6vw; font-weight: 700; color: #888;
3008
+ letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 0.4vw;
3009
+ }
3010
+ .ps-tryon-fc-measures-vals {
3011
+ display: flex; gap: 1.5vw;
3012
+ }
3013
+ .ps-tryon-fc-measures-val { font-size: 0.9vw; color: #ccc; }
3014
+ .ps-tryon-fc-measures-val strong { font-weight: 700; color: #fff; margin-right: 0.15vw; }
3015
+ .ps-tryon-fc-measures-val span { font-size: 0.65vw; color: #666; }
3016
+
3017
+ /* Full table */
3018
+ .ps-tryon-fc-table-wrap {
3019
+ flex: 1; overflow: auto; padding: 0.5vw 1.2vw 1.2vw;
3020
+ }
3021
+ .ps-tryon-fc-table {
3022
+ width: 100%; border-collapse: collapse; font-size: 0.75vw;
3023
+ }
3024
+ .ps-tryon-fc-table th {
3025
+ text-align: center; padding: 0.5vw 0.6vw;
3026
+ font-size: 0.6vw; font-weight: 700; color: #666;
3027
+ text-transform: uppercase; letter-spacing: 0.06em;
3028
+ border-bottom: 1.5px solid #333;
3029
+ }
3030
+ .ps-tryon-fc-table th:first-child { text-align: left; }
3031
+ .ps-tryon-fc-table td {
3032
+ text-align: center; padding: 0.45vw 0.6vw;
3033
+ color: #999; border-bottom: 1px solid #1e1e1e;
3034
+ }
3035
+ .ps-tryon-fc-table td:first-child { text-align: left; font-weight: 600; color: #ccc; }
3036
+ .ps-tryon-fc-rec-row td { color: #fff; font-weight: 600; background: rgba(187,148,92,0.05); }
3037
+ .ps-tryon-fc-rec-pill {
3038
+ display: inline-flex; align-items: center; justify-content: center;
3039
+ background: #fff; color: #111; padding: 0.15vw 0.5vw;
3040
+ border-radius: 1vw; font-weight: 800; font-size: 0.7vw;
3041
+ }
3042
+
3043
+ .ps-conf-high { color: #4ade80; } .ps-conf-medium { color: #bb945c; } .ps-conf-low { color: #ef4444; }
2434
3044
  .ps-tryon-size-compact { padding: 0.5vw 0; }
2435
3045
  .ps-tryon-size-compact-label { font-size: 0.78vw; color: #999; font-weight: 500; }
2436
3046