@primestyleai/tryon 5.6.5 → 5.6.6

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.
@@ -4148,6 +4148,22 @@ const STYLES = `
4148
4148
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
4149
4149
  gap: 24px;
4150
4150
  }
4151
+
4152
+ /* Two-column split: inputs stacked left, photo right */
4153
+ .ps-cpw-split {
4154
+ display: grid;
4155
+ grid-template-columns: 1fr 280px;
4156
+ gap: 28px;
4157
+ align-items: start;
4158
+ }
4159
+ .ps-cpw-split-left {
4160
+ display: flex; flex-direction: column; gap: 22px;
4161
+ min-width: 0;
4162
+ }
4163
+ .ps-cpw-split-right {
4164
+ display: flex; flex-direction: column; gap: 8px;
4165
+ min-width: 0;
4166
+ }
4151
4167
  .ps-cpw-error {
4152
4168
  font-size: 12px;
4153
4169
  color: var(--ps-error-color);
@@ -4185,14 +4201,17 @@ const STYLES = `
4185
4201
  }
4186
4202
  .ps-cpw-photo-preview {
4187
4203
  position: relative;
4188
- width: 100%; max-width: 220px;
4204
+ width: 100%;
4189
4205
  border-radius: 12px; overflow: hidden;
4190
4206
  background: var(--ps-bg-secondary);
4191
4207
  border: 1px solid var(--ps-border-subtle);
4192
- aspect-ratio: 1; display: flex; align-items: center; justify-content: center;
4208
+ aspect-ratio: 3 / 4;
4209
+ display: flex; align-items: center; justify-content: center;
4193
4210
  }
4194
4211
  .ps-cpw-photo-preview img {
4195
- width: 100%; height: 100%; object-fit: cover;
4212
+ max-width: 100%; max-height: 100%;
4213
+ width: auto; height: 100%;
4214
+ object-fit: contain;
4196
4215
  }
4197
4216
  .ps-cpw-photo-remove {
4198
4217
  position: absolute; top: 8px; right: 8px;
@@ -4301,6 +4320,8 @@ const STYLES = `
4301
4320
  .ps-cpw-progress { min-width: 0; width: 100%; align-items: flex-start; margin-top: 0; }
4302
4321
  .ps-cpw-step-title { font-size: 22px; }
4303
4322
  .ps-cpw-field-grid { grid-template-columns: 1fr; gap: 18px; }
4323
+ .ps-cpw-split { grid-template-columns: 1fr; gap: 18px; }
4324
+ .ps-cpw-photo-preview { max-width: 220px; }
4304
4325
  .ps-cpw-card-row { gap: 8px; }
4305
4326
  .ps-cpw-card { padding: 10px 6px 8px; }
4306
4327
  .ps-cpw-card-thumb { height: 80px; }
@@ -4385,6 +4406,29 @@ const STYLES = `
4385
4406
  letter-spacing: 0.14em; text-transform: uppercase;
4386
4407
  color: var(--ps-text-primary);
4387
4408
  }
4409
+ .ps-pmv-section-title-row {
4410
+ display: flex; align-items: center; justify-content: space-between;
4411
+ gap: 12px;
4412
+ }
4413
+ .ps-pmv-loading-pill {
4414
+ display: inline-flex; align-items: center; gap: 8px;
4415
+ padding: 6px 12px;
4416
+ background: rgba(33, 84, 239, 0.08);
4417
+ color: var(--ps-accent);
4418
+ border-radius: 999px;
4419
+ font-size: 10px; font-weight: 700;
4420
+ letter-spacing: 0.1em; text-transform: uppercase;
4421
+ }
4422
+ .ps-pmv-loading-spinner {
4423
+ width: 12px; height: 12px;
4424
+ border: 2px solid rgba(33, 84, 239, 0.25);
4425
+ border-top-color: var(--ps-accent);
4426
+ border-radius: 50%;
4427
+ animation: ps-pmv-spin 0.8s linear infinite;
4428
+ }
4429
+ @keyframes ps-pmv-spin {
4430
+ to { transform: rotate(360deg); }
4431
+ }
4388
4432
  .ps-pmv-section-sub {
4389
4433
  font-size: 12px; font-weight: 400;
4390
4434
  color: var(--ps-text-muted);
@@ -4417,10 +4461,24 @@ const STYLES = `
4417
4461
  color: var(--ps-border-color);
4418
4462
  animation: ps-pmv-shimmer 1.4s ease-in-out infinite;
4419
4463
  }
4464
+ .ps-pmv-measure.ps-loading {
4465
+ background: linear-gradient(
4466
+ 90deg,
4467
+ var(--ps-bg-primary) 0%,
4468
+ var(--ps-bg-secondary) 50%,
4469
+ var(--ps-bg-primary) 100%
4470
+ );
4471
+ background-size: 200% 100%;
4472
+ animation: ps-pmv-skeleton 1.6s ease-in-out infinite;
4473
+ }
4420
4474
  @keyframes ps-pmv-shimmer {
4421
4475
  0%, 100% { opacity: 0.5; }
4422
4476
  50% { opacity: 1; }
4423
4477
  }
4478
+ @keyframes ps-pmv-skeleton {
4479
+ 0% { background-position: 200% 0; }
4480
+ 100% { background-position: -200% 0; }
4481
+ }
4424
4482
 
4425
4483
  /* Saved sizes history (per-product cache) */
4426
4484
  .ps-pmv-history {
@@ -4501,11 +4559,26 @@ const STYLES = `
4501
4559
  font-family: inherit; font-size: 11px; font-weight: 700;
4502
4560
  letter-spacing: 0.12em; text-transform: uppercase;
4503
4561
  cursor: pointer;
4504
- transition: opacity 0.15s, transform 0.15s;
4562
+ transition: opacity 0.15s, transform 0.15s, background 0.2s;
4505
4563
  box-shadow: 0 4px 14px rgba(33, 84, 239, 0.18);
4564
+ display: inline-flex; align-items: center; gap: 8px;
4565
+ justify-content: center;
4566
+ }
4567
+ .ps-pmv-btn-primary:hover:not(:disabled) { opacity: 0.92; }
4568
+ .ps-pmv-btn-primary:active:not(:disabled) { transform: scale(0.98); }
4569
+ .ps-pmv-btn-primary:disabled {
4570
+ background: var(--ps-text-muted);
4571
+ cursor: not-allowed;
4572
+ box-shadow: none;
4573
+ opacity: 0.65;
4574
+ }
4575
+ .ps-pmv-btn-spinner {
4576
+ width: 12px; height: 12px;
4577
+ border: 2px solid rgba(255, 255, 255, 0.35);
4578
+ border-top-color: #FFFFFF;
4579
+ border-radius: 50%;
4580
+ animation: ps-pmv-spin 0.8s linear infinite;
4506
4581
  }
4507
- .ps-pmv-btn-primary:hover { opacity: 0.92; }
4508
- .ps-pmv-btn-primary:active { transform: scale(0.98); }
4509
4582
 
4510
4583
  @media (max-width: 768px) {
4511
4584
  .ps-pmv-hero { flex-direction: column; align-items: flex-start; gap: 12px; }
@@ -7758,116 +7831,118 @@ function CreateProfileWizard({ onSave, onCancel, t }) {
7758
7831
  /* @__PURE__ */ jsx("button", { type: "button", className: `ps-cpw-pill${unit === "in" ? " ps-active" : ""}`, onClick: () => setUnit("in"), children: "in" })
7759
7832
  ] })
7760
7833
  ] }),
7761
- /* @__PURE__ */ jsxs("div", { className: "ps-cpw-field-grid", children: [
7762
- /* @__PURE__ */ jsxs("div", { className: "ps-cpw-field", children: [
7763
- /* @__PURE__ */ jsxs("label", { className: "ps-cpw-field-label", children: [
7764
- t("HEIGHT"),
7765
- " (",
7766
- unit,
7767
- ")"
7834
+ /* @__PURE__ */ jsxs("div", { className: "ps-cpw-split", children: [
7835
+ /* @__PURE__ */ jsxs("div", { className: "ps-cpw-split-left", children: [
7836
+ /* @__PURE__ */ jsxs("div", { className: "ps-cpw-field", children: [
7837
+ /* @__PURE__ */ jsxs("label", { className: "ps-cpw-field-label", children: [
7838
+ t("HEIGHT"),
7839
+ " (",
7840
+ unit,
7841
+ ")"
7842
+ ] }),
7843
+ /* @__PURE__ */ jsx(
7844
+ "input",
7845
+ {
7846
+ type: "number",
7847
+ inputMode: "numeric",
7848
+ className: "ps-cpw-input",
7849
+ value: heightVal,
7850
+ placeholder: unit === "cm" ? t("e.g. 173") : t("e.g. 68 in"),
7851
+ onChange: (e) => {
7852
+ setHeightVal(e.target.value);
7853
+ setError("");
7854
+ }
7855
+ }
7856
+ )
7768
7857
  ] }),
7769
- /* @__PURE__ */ jsx(
7770
- "input",
7771
- {
7772
- type: "number",
7773
- inputMode: "numeric",
7774
- className: "ps-cpw-input",
7775
- value: heightVal,
7776
- placeholder: unit === "cm" ? t("e.g. 173") : t("e.g. 68 in"),
7777
- onChange: (e) => {
7778
- setHeightVal(e.target.value);
7779
- setError("");
7858
+ /* @__PURE__ */ jsxs("div", { className: "ps-cpw-field", children: [
7859
+ /* @__PURE__ */ jsxs("label", { className: "ps-cpw-field-label", children: [
7860
+ t("WEIGHT"),
7861
+ " (",
7862
+ unit === "in" ? "lbs" : "kg",
7863
+ ")"
7864
+ ] }),
7865
+ /* @__PURE__ */ jsx(
7866
+ "input",
7867
+ {
7868
+ type: "number",
7869
+ inputMode: "numeric",
7870
+ className: "ps-cpw-input",
7871
+ value: weightVal,
7872
+ placeholder: unit === "in" ? t("e.g. 154") : t("e.g. 70"),
7873
+ onChange: (e) => {
7874
+ setWeightVal(e.target.value);
7875
+ setError("");
7876
+ }
7780
7877
  }
7781
- }
7782
- )
7783
- ] }),
7784
- /* @__PURE__ */ jsxs("div", { className: "ps-cpw-field", children: [
7785
- /* @__PURE__ */ jsxs("label", { className: "ps-cpw-field-label", children: [
7786
- t("WEIGHT"),
7787
- " (",
7788
- unit === "in" ? "lbs" : "kg",
7789
- ")"
7878
+ )
7790
7879
  ] }),
7791
- /* @__PURE__ */ jsx(
7792
- "input",
7793
- {
7794
- type: "number",
7795
- inputMode: "numeric",
7796
- className: "ps-cpw-input",
7797
- value: weightVal,
7798
- placeholder: unit === "in" ? t("e.g. 154") : t("e.g. 70"),
7799
- onChange: (e) => {
7800
- setWeightVal(e.target.value);
7801
- setError("");
7880
+ /* @__PURE__ */ jsxs("div", { className: "ps-cpw-field", children: [
7881
+ /* @__PURE__ */ jsxs("label", { className: "ps-cpw-field-label", children: [
7882
+ t("AGE"),
7883
+ " (",
7884
+ t("years"),
7885
+ ")"
7886
+ ] }),
7887
+ /* @__PURE__ */ jsx(
7888
+ "input",
7889
+ {
7890
+ type: "number",
7891
+ inputMode: "numeric",
7892
+ className: "ps-cpw-input",
7893
+ value: ageVal,
7894
+ placeholder: t("e.g. 30"),
7895
+ onChange: (e) => {
7896
+ setAgeVal(e.target.value);
7897
+ setError("");
7898
+ }
7802
7899
  }
7803
- }
7804
- )
7900
+ )
7901
+ ] })
7805
7902
  ] }),
7806
- /* @__PURE__ */ jsxs("div", { className: "ps-cpw-field", children: [
7807
- /* @__PURE__ */ jsxs("label", { className: "ps-cpw-field-label", children: [
7808
- t("AGE"),
7809
- " (",
7810
- t("years"),
7811
- ")"
7812
- ] }),
7903
+ /* @__PURE__ */ jsxs("div", { className: "ps-cpw-split-right", children: [
7904
+ /* @__PURE__ */ jsx("div", { className: "ps-cpw-field-label", children: t("PROFILE PHOTO (OPTIONAL)") }),
7813
7905
  /* @__PURE__ */ jsx(
7814
7906
  "input",
7815
7907
  {
7816
- type: "number",
7817
- inputMode: "numeric",
7818
- className: "ps-cpw-input",
7819
- value: ageVal,
7820
- placeholder: t("e.g. 30"),
7821
- onChange: (e) => {
7822
- setAgeVal(e.target.value);
7823
- setError("");
7824
- }
7908
+ ref: photoInputRef,
7909
+ type: "file",
7910
+ accept: "image/*",
7911
+ onChange: handlePhotoSelect,
7912
+ style: { display: "none" }
7825
7913
  }
7826
- )
7827
- ] })
7828
- ] }),
7829
- /* @__PURE__ */ jsxs("div", { className: "ps-cpw-photo", children: [
7830
- /* @__PURE__ */ jsx("div", { className: "ps-cpw-field-label", children: t("PROFILE PHOTO (OPTIONAL)") }),
7831
- /* @__PURE__ */ jsx(
7832
- "input",
7833
- {
7834
- ref: photoInputRef,
7835
- type: "file",
7836
- accept: "image/*",
7837
- onChange: handlePhotoSelect,
7838
- style: { display: "none" }
7839
- }
7840
- ),
7841
- photoBase64 ? /* @__PURE__ */ jsxs("div", { className: "ps-cpw-photo-preview", children: [
7842
- /* @__PURE__ */ jsx("img", { src: photoBase64, alt: t("Profile photo") }),
7843
- /* @__PURE__ */ jsx(
7914
+ ),
7915
+ photoBase64 ? /* @__PURE__ */ jsxs("div", { className: "ps-cpw-photo-preview", children: [
7916
+ /* @__PURE__ */ jsx("img", { src: photoBase64, alt: t("Profile photo") }),
7917
+ /* @__PURE__ */ jsx(
7918
+ "button",
7919
+ {
7920
+ type: "button",
7921
+ className: "ps-cpw-photo-remove",
7922
+ onClick: handleRemovePhoto,
7923
+ "aria-label": t("Remove photo"),
7924
+ children: "×"
7925
+ }
7926
+ )
7927
+ ] }) : /* @__PURE__ */ jsxs(
7844
7928
  "button",
7845
7929
  {
7846
7930
  type: "button",
7847
- className: "ps-cpw-photo-remove",
7848
- onClick: handleRemovePhoto,
7849
- "aria-label": t("Remove photo"),
7850
- children: "×"
7931
+ className: "ps-cpw-photo-upload",
7932
+ onClick: () => photoInputRef.current?.click(),
7933
+ disabled: photoUploading,
7934
+ children: [
7935
+ /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", width: "22", height: "22", children: [
7936
+ /* @__PURE__ */ jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
7937
+ /* @__PURE__ */ jsx("polyline", { points: "17 8 12 3 7 8" }),
7938
+ /* @__PURE__ */ jsx("line", { x1: "12", y1: "3", x2: "12", y2: "15" })
7939
+ ] }),
7940
+ /* @__PURE__ */ jsx("span", { className: "ps-cpw-photo-upload-title", children: photoUploading ? t("Uploading...") : t("Upload a photo") }),
7941
+ /* @__PURE__ */ jsx("span", { className: "ps-cpw-photo-upload-hint", children: t("Helps refine your AI sizing — JPEG, PNG up to 10MB") })
7942
+ ]
7851
7943
  }
7852
7944
  )
7853
- ] }) : /* @__PURE__ */ jsxs(
7854
- "button",
7855
- {
7856
- type: "button",
7857
- className: "ps-cpw-photo-upload",
7858
- onClick: () => photoInputRef.current?.click(),
7859
- disabled: photoUploading,
7860
- children: [
7861
- /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", width: "22", height: "22", children: [
7862
- /* @__PURE__ */ jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
7863
- /* @__PURE__ */ jsx("polyline", { points: "17 8 12 3 7 8" }),
7864
- /* @__PURE__ */ jsx("line", { x1: "12", y1: "3", x2: "12", y2: "15" })
7865
- ] }),
7866
- /* @__PURE__ */ jsx("span", { className: "ps-cpw-photo-upload-title", children: photoUploading ? t("Uploading...") : t("Upload a photo") }),
7867
- /* @__PURE__ */ jsx("span", { className: "ps-cpw-photo-upload-hint", children: t("Helps refine your AI sizing — JPEG, PNG up to 10MB") })
7868
- ]
7869
- }
7870
- )
7945
+ ] })
7871
7946
  ] }),
7872
7947
  error && /* @__PURE__ */ jsx("div", { className: "ps-cpw-error", children: error })
7873
7948
  ] }) : /* @__PURE__ */ jsxs("div", { className: "ps-cpw-silhouette", children: [
@@ -7953,6 +8028,7 @@ function ProfileMeasurementsView({
7953
8028
  onEdit,
7954
8029
  onDelete,
7955
8030
  onBack,
8031
+ onSave,
7956
8032
  t
7957
8033
  }) {
7958
8034
  const fields = profile.gender === "female" ? FIELDS_WOMEN : FIELDS_MEN;
@@ -8002,12 +8078,18 @@ function ProfileMeasurementsView({
8002
8078
  ] }),
8003
8079
  /* @__PURE__ */ jsxs("div", { className: "ps-pmv-section", children: [
8004
8080
  /* @__PURE__ */ jsxs("div", { className: "ps-pmv-section-head", children: [
8005
- /* @__PURE__ */ jsx("div", { className: "ps-pmv-section-title", children: t("BODY MEASUREMENTS") }),
8006
- /* @__PURE__ */ jsx("div", { className: "ps-pmv-section-sub", children: hasMeasurements ? t("Calculated from your basics. Used to recommend the perfect size for any product.") : t("Calculating your full body measurements...") })
8081
+ /* @__PURE__ */ jsxs("div", { className: "ps-pmv-section-title-row", children: [
8082
+ /* @__PURE__ */ jsx("div", { className: "ps-pmv-section-title", children: t("BODY MEASUREMENTS") }),
8083
+ !hasMeasurements && /* @__PURE__ */ jsxs("div", { className: "ps-pmv-loading-pill", children: [
8084
+ /* @__PURE__ */ jsx("span", { className: "ps-pmv-loading-spinner" }),
8085
+ /* @__PURE__ */ jsx("span", { children: t("Calculating...") })
8086
+ ] })
8087
+ ] }),
8088
+ /* @__PURE__ */ jsx("div", { className: "ps-pmv-section-sub", children: hasMeasurements ? t("Calculated from your basics. Used to recommend the perfect size for any product.") : t("Our AI is computing your full body proportions — this usually takes a few seconds.") })
8007
8089
  ] }),
8008
8090
  /* @__PURE__ */ jsx("div", { className: "ps-pmv-measure-grid", children: fields.map((f) => {
8009
8091
  const v = measurements[f.key];
8010
- return /* @__PURE__ */ jsxs("div", { className: "ps-pmv-measure", children: [
8092
+ return /* @__PURE__ */ jsxs("div", { className: `ps-pmv-measure${v == null ? " ps-loading" : ""}`, children: [
8011
8093
  /* @__PURE__ */ jsx("div", { className: "ps-pmv-measure-label", children: t(f.label) }),
8012
8094
  /* @__PURE__ */ jsx("div", { className: `ps-pmv-measure-value${v == null ? " ps-loading" : ""}`, children: v != null ? `${Math.round(v * 10) / 10} ${unit}` : "—" })
8013
8095
  ] }, f.key);
@@ -8032,7 +8114,20 @@ function ProfileMeasurementsView({
8032
8114
  /* @__PURE__ */ jsxs("div", { className: "ps-pmv-actions-right", children: [
8033
8115
  /* @__PURE__ */ jsx("button", { type: "button", className: "ps-pmv-btn-edit", onClick: onEdit, children: t("Edit") }),
8034
8116
  /* @__PURE__ */ jsx("button", { type: "button", className: "ps-pmv-btn-delete", onClick: onDelete, children: t("Delete") }),
8035
- !isActive && /* @__PURE__ */ jsx("button", { type: "button", className: "ps-pmv-btn-primary", onClick: onSelect, children: t("USE THIS PROFILE") })
8117
+ !isActive && /* @__PURE__ */ jsx("button", { type: "button", className: "ps-pmv-btn-secondary", onClick: onSelect, children: t("USE THIS PROFILE") }),
8118
+ /* @__PURE__ */ jsx(
8119
+ "button",
8120
+ {
8121
+ type: "button",
8122
+ className: "ps-pmv-btn-primary",
8123
+ onClick: onSave,
8124
+ disabled: !hasMeasurements,
8125
+ children: hasMeasurements ? t("SAVE") : /* @__PURE__ */ jsxs(Fragment, { children: [
8126
+ /* @__PURE__ */ jsx("span", { className: "ps-pmv-btn-spinner" }),
8127
+ t("CALCULATING")
8128
+ ] })
8129
+ }
8130
+ )
8036
8131
  ] })
8037
8132
  ] })
8038
8133
  ] });
@@ -8189,6 +8284,7 @@ function MySizingProfilesView({
8189
8284
  setViewingId(null);
8190
8285
  },
8191
8286
  onBack: () => setViewingId(null),
8287
+ onSave: () => setViewingId(null),
8192
8288
  t
8193
8289
  }
8194
8290
  )