@primestyleai/tryon 3.10.0 → 3.12.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.
@@ -207,6 +207,7 @@ const en = {
207
207
  "Looking for size chart data for this product": "Looking for size chart data for this product",
208
208
  "How would you like to find your size?": "How would you like to find your size?",
209
209
  "Size guide is not available for this product — sizing will use standard measurements": "Size guide is not available for this product — sizing will use standard measurements",
210
+ "This product doesn't have a size guide — you can still see how it looks on you!": "This product doesn't have a size guide — you can still see how it looks on you!",
210
211
  "Size guide found for this product": "Size guide found for this product",
211
212
  "Enter my measurements": "Enter my measurements",
212
213
  "Chest, waist, hips, shoes & more": "Chest, waist, hips, shoes & more",
@@ -1,5 +1,5 @@
1
- import { c as createT, A as ApiClient, S as SseClient, i as isValidImageFile, a as compressImage } from "./index-71-uiSXC.js";
2
- import { P, b, T, d, r } from "./index-71-uiSXC.js";
1
+ import { c as createT, A as ApiClient, S as SseClient, i as isValidImageFile, a as compressImage } from "./index-25Bm_pob.js";
2
+ import { P, b, T, d, r } from "./index-25Bm_pob.js";
3
3
  function detectProductImage() {
4
4
  const ogImage = document.querySelector(
5
5
  'meta[property="og:image"]'
@@ -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, b as SUPPORTED_LOCALES, L as LOCALE_LABELS } from "../index-71-uiSXC.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-25Bm_pob.js";
5
5
  const HEADER_ALIASES = {
6
6
  // ── Size label columns (skipped during field derivation) ──
7
7
  size: "__size__",
@@ -406,20 +406,6 @@ const FALLBACK_FIELDS_MALE = [
406
406
  { key: "inseam", label: "Inseam", required: false, unit: "cm", placeholder: "e.g. 81", category: "body" },
407
407
  { key: "footLengthCm", label: "Foot length", required: false, unit: "cm", placeholder: "e.g. 27", category: "shoe" }
408
408
  ];
409
- const SIZING_COUNTRIES = [
410
- { code: "US", label: "United States" },
411
- { code: "UK", label: "United Kingdom" },
412
- { code: "EU", label: "Europe (EU)" },
413
- { code: "FR", label: "France" },
414
- { code: "IT", label: "Italy" },
415
- { code: "DE", label: "Germany" },
416
- { code: "ES", label: "Spain" },
417
- { code: "JP", label: "Japan" },
418
- { code: "CN", label: "China" },
419
- { code: "KR", label: "South Korea" },
420
- { code: "AU", label: "Australia" },
421
- { code: "BR", label: "Brazil" }
422
- ];
423
409
  const STEP_LABELS = ["", "Welcome", "Size", "Your Fit", "Try On"];
424
410
  const TOTAL_STEPS = 4;
425
411
  function detectLocale() {
@@ -1268,11 +1254,16 @@ function PrimeStyleTryonInner({
1268
1254
  }
1269
1255
  return /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sizing-choice", children: [
1270
1256
  /* @__PURE__ */ jsx("h3", { className: "ps-tryon-section-title", children: t("How would you like to find your size?") }),
1271
- sgChecked && !sgAvailable && /* @__PURE__ */ jsx("div", { className: "ps-tryon-sg-notice", children: t("Size guide is not available for this product — sizing will use standard measurements") }),
1272
- sgChecked && sgAvailable && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sg-notice ps-tryon-sg-found", children: [
1273
- /* @__PURE__ */ jsx(CheckIcon, { size: 14 }),
1274
- " ",
1275
- t("Size guide found for this product")
1257
+ sgChecked && !sgAvailable && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sg-notice", children: [
1258
+ t("This product doesn't have a size guide you can still see how it looks on you!"),
1259
+ /* @__PURE__ */ jsxs("button", { className: "ps-tryon-sg-notice-cta", onClick: () => {
1260
+ setSizingMethod(null);
1261
+ setView("upload");
1262
+ }, children: [
1263
+ t("Try It On"),
1264
+ " ",
1265
+ /* @__PURE__ */ jsx(ArrowRightIcon, {})
1266
+ ] })
1276
1267
  ] }),
1277
1268
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-choice-cards", children: [
1278
1269
  /* @__PURE__ */ jsxs("button", { className: "ps-tryon-choice-card", onClick: () => {
@@ -1331,28 +1322,24 @@ function PrimeStyleTryonInner({
1331
1322
  ")"
1332
1323
  ] }, p.id))
1333
1324
  ] }) }),
1334
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-input-row", children: [
1335
- /* @__PURE__ */ jsx("label", { children: t("I'm shopping for") }),
1336
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-unit-toggle", children: [
1337
- /* @__PURE__ */ jsx("button", { className: `ps-tryon-unit-btn${!isFemale ? " ps-active" : ""}`, onClick: () => {
1338
- updateField("gender", "male");
1339
- setFormGender("male");
1340
- }, children: t("Men's") }),
1341
- /* @__PURE__ */ jsx("button", { className: `ps-tryon-unit-btn${isFemale ? " ps-active" : ""}`, onClick: () => {
1342
- updateField("gender", "female");
1343
- setFormGender("female");
1344
- }, children: t("Women's") })
1325
+ sizingMethod === "exact" && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-unit-switch", children: [
1326
+ /* @__PURE__ */ jsxs("button", { className: `ps-tryon-unit-switch-btn${isCm ? " ps-active" : ""}`, onClick: () => {
1327
+ setSizingUnit("cm");
1328
+ setHeightUnit("cm");
1329
+ setWeightUnit("kg");
1330
+ }, children: [
1331
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-unit-switch-label", children: t("cm") }),
1332
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-unit-switch-sub", children: "cm / kg" })
1333
+ ] }),
1334
+ /* @__PURE__ */ jsxs("button", { className: `ps-tryon-unit-switch-btn${!isCm ? " ps-active" : ""}`, onClick: () => {
1335
+ setSizingUnit("in");
1336
+ setHeightUnit("ft");
1337
+ setWeightUnit("lbs");
1338
+ }, children: [
1339
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-unit-switch-label", children: t("in") }),
1340
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-unit-switch-sub", children: "in / lbs" })
1345
1341
  ] })
1346
1342
  ] }),
1347
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-input-row", children: [
1348
- /* @__PURE__ */ jsx("label", { children: t("Sizing region") }),
1349
- /* @__PURE__ */ jsx("select", { className: "ps-tryon-country-select", value: sizingCountry, onChange: (e) => setSizingCountry(e.target.value), children: SIZING_COUNTRIES.map((c) => /* @__PURE__ */ jsx("option", { value: c.code, children: t(c.label) }, c.code)) })
1350
- ] }),
1351
- sizingMethod === "exact" && /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(UnitToggle, { options: [{ label: t("cm"), value: "cm" }, { label: t("in"), value: "in" }], value: sizingUnit, onChange: (v) => {
1352
- setSizingUnit(v);
1353
- setHeightUnit(v === "cm" ? "cm" : "ft");
1354
- setWeightUnit(v === "cm" ? "kg" : "lbs");
1355
- } }) }),
1356
1343
  sizingMethod === "exact" ? /* @__PURE__ */ jsx(Fragment, { children: (() => {
1357
1344
  const reqFields = dynamicFields.filter((f) => f.required);
1358
1345
  const optFields = dynamicFields.filter((f) => !f.required);
@@ -1707,6 +1694,42 @@ function PrimeStyleTryonInner({
1707
1694
  ] })
1708
1695
  ] }) });
1709
1696
  }
1697
+ function LangSwitcher({ activeLocale: current, onSelect }) {
1698
+ const [open, setOpen] = useState(false);
1699
+ const ref = useRef(null);
1700
+ const currentLabel = LOCALE_LABELS[current] || "English";
1701
+ useEffect(() => {
1702
+ if (!open) return;
1703
+ const handler = (e) => {
1704
+ if (ref.current && !ref.current.contains(e.target)) setOpen(false);
1705
+ };
1706
+ document.addEventListener("mousedown", handler);
1707
+ return () => document.removeEventListener("mousedown", handler);
1708
+ }, [open]);
1709
+ return /* @__PURE__ */ jsxs("div", { ref, className: "ps-tryon-lang-wrap", children: [
1710
+ /* @__PURE__ */ jsxs("button", { className: `ps-tryon-lang-trigger${open ? " ps-active" : ""}`, onClick: () => setOpen(!open), children: [
1711
+ /* @__PURE__ */ jsx(GlobeIcon, { size: 15 }),
1712
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-lang-current", children: currentLabel }),
1713
+ /* @__PURE__ */ jsx("span", { className: `ps-tryon-lang-arrow${open ? " ps-open" : ""}`, children: "▾" })
1714
+ ] }),
1715
+ open && /* @__PURE__ */ jsx("div", { className: "ps-tryon-lang-dropdown", children: /* @__PURE__ */ jsx("div", { className: "ps-tryon-lang-list", children: SUPPORTED_LOCALES.map((code) => /* @__PURE__ */ jsxs(
1716
+ "button",
1717
+ {
1718
+ className: `ps-tryon-lang-item${code === current ? " ps-selected" : ""}`,
1719
+ onClick: () => {
1720
+ onSelect(code);
1721
+ setOpen(false);
1722
+ },
1723
+ children: [
1724
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-lang-name", children: LOCALE_LABELS[code] || code }),
1725
+ /* @__PURE__ */ jsx("span", { className: "ps-tryon-lang-code", children: code.toUpperCase() }),
1726
+ code === current && /* @__PURE__ */ jsx("span", { className: "ps-tryon-lang-check", children: /* @__PURE__ */ jsx(CheckIcon, { size: 12 }) })
1727
+ ]
1728
+ },
1729
+ code
1730
+ )) }) })
1731
+ ] });
1732
+ }
1710
1733
  function renderBody() {
1711
1734
  switch (view) {
1712
1735
  case "welcome":
@@ -1740,18 +1763,7 @@ function PrimeStyleTryonInner({
1740
1763
  /* @__PURE__ */ jsxs("div", { className: cx("ps-tryon-header", cn.header), children: [
1741
1764
  /* @__PURE__ */ jsx("span", { className: cx("ps-tryon-title", cn.title), children: t("Virtual Try-On") }),
1742
1765
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-header-actions", children: [
1743
- /* @__PURE__ */ jsxs("div", { className: "ps-tryon-lang-switcher", children: [
1744
- /* @__PURE__ */ jsx(GlobeIcon, {}),
1745
- /* @__PURE__ */ jsx(
1746
- "select",
1747
- {
1748
- value: activeLocale,
1749
- onChange: (e) => setActiveLocale(e.target.value),
1750
- className: "ps-tryon-lang-select",
1751
- children: SUPPORTED_LOCALES.map((code) => /* @__PURE__ */ jsx("option", { value: code, children: LOCALE_LABELS[code] || code }, code))
1752
- }
1753
- )
1754
- ] }),
1766
+ /* @__PURE__ */ jsx(LangSwitcher, { activeLocale, onSelect: setActiveLocale }),
1755
1767
  profiles.length > 0 && /* @__PURE__ */ jsx("button", { className: "ps-tryon-header-icon", title: t("Profiles"), onClick: () => setDrawer(drawer === "profiles" ? null : "profiles"), children: /* @__PURE__ */ jsx(UserIcon, {}) }),
1756
1768
  history.length > 0 && /* @__PURE__ */ jsx("button", { className: "ps-tryon-header-icon", title: t("History"), onClick: () => setDrawer(drawer === "history" ? null : "history"), children: /* @__PURE__ */ jsx(ClockIcon, {}) }),
1757
1769
  /* @__PURE__ */ jsx("button", { onClick: handleClose, className: cx("ps-tryon-close", cn.closeButton), children: /* @__PURE__ */ jsx(XIcon, {}) })
@@ -1837,21 +1849,63 @@ const STYLES = `
1837
1849
  .ps-tryon-close:hover { background: rgba(255,255,255,0.1); }
1838
1850
 
1839
1851
  /* Language switcher */
1840
- .ps-tryon-lang-switcher {
1841
- position: relative; display: flex; align-items: center; gap: clamp(3px, 0.21vw, 4px);
1842
- padding: clamp(3px, 0.26vw, 5px) clamp(6px, 0.52vw, 10px);
1843
- border: 1.5px solid #333; border-radius: clamp(6px, 0.52vw, 10px);
1844
- background: transparent; cursor: pointer; color: #999; transition: all 0.2s;
1845
- }
1846
- .ps-tryon-lang-switcher:hover { border-color: #bb945c; color: #bb945c; }
1847
- .ps-tryon-lang-switcher svg { stroke: currentColor; fill: none; flex-shrink: 0; }
1848
- .ps-tryon-lang-select {
1849
- appearance: none; -webkit-appearance: none; background: transparent; border: none;
1850
- color: inherit; font-size: clamp(9px, 0.57vw, 11px); font-family: inherit;
1851
- cursor: pointer; outline: none; padding-right: clamp(8px, 0.52vw, 10px);
1852
- max-width: clamp(70px, 5.2vw, 100px);
1853
- }
1854
- .ps-tryon-lang-select option { background: #1a1b1a; color: #fff; }
1852
+ .ps-tryon-lang-wrap { position: relative; z-index: 10; }
1853
+ .ps-tryon-lang-trigger {
1854
+ display: flex; align-items: center; gap: clamp(5px, 0.36vw, 7px);
1855
+ padding: clamp(5px, 0.36vw, 7px) clamp(10px, 0.73vw, 14px);
1856
+ border: 1.5px solid #333; border-radius: clamp(8px, 0.57vw, 11px);
1857
+ background: transparent; cursor: pointer; color: #999;
1858
+ transition: all 0.25s ease; font-family: inherit; white-space: nowrap;
1859
+ }
1860
+ .ps-tryon-lang-trigger:hover, .ps-tryon-lang-trigger.ps-active {
1861
+ border-color: #bb945c; color: #bb945c; background: rgba(187,148,92,0.06);
1862
+ }
1863
+ .ps-tryon-lang-trigger svg { stroke: currentColor; fill: none; flex-shrink: 0; }
1864
+ .ps-tryon-lang-current {
1865
+ font-size: clamp(11px, 0.68vw, 13px); font-weight: 500; letter-spacing: 0.01em;
1866
+ }
1867
+ .ps-tryon-lang-arrow {
1868
+ font-size: clamp(10px, 0.57vw, 12px); transition: transform 0.25s ease; display: inline-block;
1869
+ }
1870
+ .ps-tryon-lang-arrow.ps-open { transform: rotate(180deg); }
1871
+
1872
+ .ps-tryon-lang-dropdown {
1873
+ position: absolute; top: calc(100% + clamp(6px, 0.42vw, 8px)); right: 0;
1874
+ min-width: clamp(180px, 13vw, 240px);
1875
+ background: #1a1b1a; border: 1.5px solid #333;
1876
+ border-radius: clamp(10px, 0.73vw, 14px);
1877
+ box-shadow: 0 clamp(12px, 1vw, 20px) clamp(40px, 3vw, 60px) rgba(0,0,0,0.5),
1878
+ 0 0 0 1px rgba(255,255,255,0.03);
1879
+ overflow: hidden;
1880
+ animation: ps-lang-open 0.2s ease both;
1881
+ }
1882
+ @keyframes ps-lang-open {
1883
+ from { opacity: 0; transform: translateY(clamp(-6px, -0.42vw, -8px)) scale(0.96); }
1884
+ to { opacity: 1; transform: translateY(0) scale(1); }
1885
+ }
1886
+
1887
+ .ps-tryon-lang-list {
1888
+ max-height: clamp(240px, 18vw, 340px); overflow-y: auto; padding: clamp(4px, 0.31vw, 6px);
1889
+ scrollbar-width: thin; scrollbar-color: #333 transparent;
1890
+ }
1891
+ .ps-tryon-lang-item {
1892
+ display: flex; align-items: center; gap: clamp(8px, 0.57vw, 12px);
1893
+ width: 100%; padding: clamp(8px, 0.57vw, 11px) clamp(12px, 0.83vw, 16px);
1894
+ border: none; background: transparent; color: #ccc; cursor: pointer;
1895
+ border-radius: clamp(6px, 0.47vw, 9px); transition: all 0.15s ease;
1896
+ font-family: inherit; text-align: left;
1897
+ }
1898
+ .ps-tryon-lang-item:hover { background: rgba(255,255,255,0.06); color: #fff; }
1899
+ .ps-tryon-lang-item.ps-selected { background: rgba(187,148,92,0.1); color: #bb945c; }
1900
+ .ps-tryon-lang-name {
1901
+ flex: 1; font-size: clamp(12px, 0.73vw, 14px); font-weight: 500;
1902
+ }
1903
+ .ps-tryon-lang-code {
1904
+ font-size: clamp(9px, 0.52vw, 11px); color: #666; font-weight: 600;
1905
+ letter-spacing: 0.05em; font-family: ui-monospace, monospace;
1906
+ }
1907
+ .ps-tryon-lang-item.ps-selected .ps-tryon-lang-code { color: #bb945c; opacity: 0.7; }
1908
+ .ps-tryon-lang-check { color: #bb945c; display: flex; align-items: center; }
1855
1909
 
1856
1910
  /* Stepper */
1857
1911
  .ps-tryon-stepper { padding: clamp(12px, 1.04vw, 20px) clamp(14px, 1.25vw, 24px) clamp(7px, 0.63vw, 12px); }
@@ -1977,13 +2031,19 @@ const STYLES = `
1977
2031
  background: rgba(187,148,92,0.12); color: #bb945c; font-size: clamp(8px, 0.52vw, 10px); font-weight: 600;
1978
2032
  }
1979
2033
  .ps-tryon-sg-notice {
1980
- font-size: clamp(9px, 0.63vw, 12px); color: #999; text-align: center; padding: clamp(6px, 0.52vw, 10px) clamp(8px, 0.73vw, 14px);
1981
- margin-bottom: clamp(7px, 0.63vw, 12px); border: 1px solid #333; border-radius: clamp(6px, 0.52vw, 10px); background: #1a1b1a;
1982
- }
1983
- .ps-tryon-sg-found {
1984
- color: #4ade80; border-color: rgba(74,222,128,0.2); background: rgba(74,222,128,0.05);
1985
- display: flex; align-items: center; justify-content: center; gap: clamp(4px, 0.31vw, 6px);
1986
- }
2034
+ font-size: clamp(10px, 0.68vw, 13px); color: #999; text-align: center; padding: clamp(10px, 0.73vw, 14px) clamp(12px, 0.83vw, 16px);
2035
+ margin-bottom: clamp(10px, 0.73vw, 14px); border: 1px solid #333; border-radius: clamp(8px, 0.63vw, 12px); background: #1a1b1a;
2036
+ display: flex; flex-direction: column; align-items: center; gap: clamp(8px, 0.57vw, 12px);
2037
+ }
2038
+ .ps-tryon-sg-notice-cta {
2039
+ display: inline-flex; align-items: center; gap: clamp(4px, 0.31vw, 6px);
2040
+ padding: clamp(6px, 0.42vw, 8px) clamp(14px, 1vw, 18px);
2041
+ background: #bb945c; color: #111; border: none; border-radius: clamp(6px, 0.42vw, 8px);
2042
+ font-size: clamp(10px, 0.68vw, 13px); font-weight: 700; cursor: pointer;
2043
+ transition: all 0.2s; font-family: inherit;
2044
+ }
2045
+ .ps-tryon-sg-notice-cta:hover { background: #a07d4e; }
2046
+ .ps-tryon-sg-notice-cta svg { stroke: #111; }
1987
2047
  .ps-tryon-sg-found svg { stroke: #4ade80; }
1988
2048
  .ps-tryon-sg-checking { display: flex; flex-direction: column; align-items: center; padding: clamp(24px, 2.08vw, 40px) clamp(12px, 1.04vw, 20px); text-align: center; }
1989
2049
  .ps-tryon-sg-checking-icon { color: #bb945c; margin-bottom: clamp(10px, 0.83vw, 16px); animation: ps-pulse-ruler 1.5s ease-in-out infinite; }
@@ -2032,6 +2092,29 @@ const STYLES = `
2032
2092
  font-size: clamp(9px, 0.63vw, 12px); font-weight: 600; cursor: pointer; transition: all 0.2s; font-family: inherit;
2033
2093
  }
2034
2094
  .ps-tryon-unit-btn.ps-active { background: #bb945c; color: #111; }
2095
+
2096
+ /* Prominent unit switch (cm/in) */
2097
+ .ps-tryon-unit-switch {
2098
+ display: flex; gap: clamp(6px, 0.42vw, 8px); margin-bottom: clamp(10px, 0.83vw, 16px);
2099
+ }
2100
+ .ps-tryon-unit-switch-btn {
2101
+ flex: 1; display: flex; flex-direction: column; align-items: center; gap: clamp(2px, 0.16vw, 3px);
2102
+ padding: clamp(10px, 0.73vw, 14px) clamp(8px, 0.57vw, 12px);
2103
+ border: 2px solid #333; border-radius: clamp(10px, 0.73vw, 14px);
2104
+ background: transparent; color: #666; cursor: pointer;
2105
+ transition: all 0.25s ease; font-family: inherit;
2106
+ }
2107
+ .ps-tryon-unit-switch-btn:hover { border-color: #555; color: #999; }
2108
+ .ps-tryon-unit-switch-btn.ps-active {
2109
+ border-color: #bb945c; background: rgba(187,148,92,0.08); color: #bb945c;
2110
+ box-shadow: 0 0 0 clamp(3px, 0.21vw, 4px) rgba(187,148,92,0.08);
2111
+ }
2112
+ .ps-tryon-unit-switch-label {
2113
+ font-size: clamp(16px, 1.04vw, 20px); font-weight: 700; letter-spacing: 0.02em;
2114
+ }
2115
+ .ps-tryon-unit-switch-sub {
2116
+ font-size: clamp(9px, 0.52vw, 11px); font-weight: 500; opacity: 0.6;
2117
+ }
2035
2118
  .ps-tryon-section-label { font-size: clamp(8px, 0.57vw, 11px); font-weight: 700; color: #bb945c; text-transform: uppercase; letter-spacing: 0.08em; margin: clamp(2px, 0.21vw, 4px) 0 clamp(1px, 0.1vw, 2px); }
2036
2119
  .ps-tryon-optional-section { border-top: 1px solid #333; padding-top: clamp(6px, 0.52vw, 10px); margin-top: clamp(4px, 0.31vw, 6px); }
2037
2120
  .ps-tryon-optional-toggle { display: flex; align-items: center; justify-content: space-between; width: 100%; background: none; border: 1px solid #333; border-radius: clamp(6px, 0.52vw, 10px); padding: clamp(6px, 0.52vw, 10px) clamp(8px, 0.73vw, 14px); color: #999; font-size: clamp(10px, 0.68vw, 13px); font-weight: 600; cursor: pointer; font-family: inherit; transition: all 0.2s; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primestyleai/tryon",
3
- "version": "3.10.0",
3
+ "version": "3.12.0",
4
4
  "description": "PrimeStyle Virtual Try-On SDK — React component & Web Component",
5
5
  "type": "module",
6
6
  "main": "dist/primestyle-tryon.js",