@primestyleai/tryon 5.5.12 → 5.5.14

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.
@@ -3107,7 +3107,9 @@ const STYLES = `
3107
3107
  flex-shrink: 0;
3108
3108
  }
3109
3109
  .ps-pm-preview-img {
3110
- width: 100%; height: 100%; object-fit: cover; display: block;
3110
+ max-width: 100%; max-height: 100%;
3111
+ width: auto; height: 100%;
3112
+ object-fit: contain; display: block;
3111
3113
  }
3112
3114
  .ps-pm-preview-empty {
3113
3115
  display: flex; flex-direction: column; align-items: center;
@@ -3169,10 +3171,10 @@ const STYLES = `
3169
3171
  color: var(--ps-text-muted);
3170
3172
  }
3171
3173
 
3172
- /* Primary dark CTA: ANALYZE MY SIZE */
3174
+ /* Primary CTA: ANALYZE MY SIZE — uses the user's brand accent */
3173
3175
  .ps-pm-primary-btn {
3174
3176
  margin: 0 16px; width: calc(100% - 32px);
3175
- background: var(--ps-text-primary); color: #FFFFFF;
3177
+ background: var(--ps-accent); color: #FFFFFF;
3176
3178
  border: none; border-radius: 8px;
3177
3179
  padding: 16px 18px;
3178
3180
  font-family: inherit; font-size: 13px; font-weight: 700;
@@ -3201,6 +3203,166 @@ const STYLES = `
3201
3203
  baked in via .ps-bpm-next-btn). Both share .ps-bpm-bottom container. */
3202
3204
  .ps-bpm-bottom .ps-pm-primary-btn { margin: 14px 16px 0; }
3203
3205
 
3206
+ /* ════════════════════════════════════════════════════════════════
3207
+ MobileScanningView (.ps-msc-*) — AI scan processing screen.
3208
+ Dark photo viewfinder with corner brackets, scanning line, pose
3209
+ skeleton overlay, cycling stage text below with slide-fade.
3210
+ ════════════════════════════════════════════════════════════════ */
3211
+ .ps-msc-root {
3212
+ display: flex; flex-direction: column;
3213
+ gap: 18px; padding: 8px 4px 0;
3214
+ flex: 1; min-height: 0;
3215
+ }
3216
+
3217
+ /* The dark viewfinder containing the photo + overlays */
3218
+ .ps-msc-viewfinder {
3219
+ position: relative; flex-shrink: 0;
3220
+ background: #0E0F11; border-radius: 12px; overflow: hidden;
3221
+ height: 64vh; max-height: 540px; min-height: 360px;
3222
+ display: flex; align-items: center; justify-content: center;
3223
+ }
3224
+ .ps-msc-photo {
3225
+ max-width: 100%; max-height: 100%;
3226
+ width: auto; height: 100%;
3227
+ object-fit: contain; display: block;
3228
+ filter: brightness(0.9) contrast(1.05);
3229
+ }
3230
+
3231
+ /* Live feed badge top-left */
3232
+ .ps-msc-feed-badge {
3233
+ position: absolute; top: 12px; left: 14px; z-index: 4;
3234
+ display: flex; align-items: center; gap: 6px;
3235
+ color: rgba(255,255,255,0.85);
3236
+ font-size: 10px; font-weight: 600;
3237
+ letter-spacing: 0.12em;
3238
+ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
3239
+ }
3240
+ .ps-msc-feed-dot {
3241
+ width: 7px; height: 7px; border-radius: 50%;
3242
+ background: #ef4444;
3243
+ box-shadow: 0 0 0 0 rgba(239,68,68,0.6);
3244
+ animation: ps-msc-rec 1.4s ease-in-out infinite;
3245
+ }
3246
+ @keyframes ps-msc-rec {
3247
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(239,68,68,0.6); }
3248
+ 50% { opacity: 0.6; box-shadow: 0 0 0 5px rgba(239,68,68,0); }
3249
+ }
3250
+
3251
+ /* Corner brackets — four absolutely positioned L-shapes */
3252
+ .ps-msc-corners {
3253
+ position: absolute; inset: 28px;
3254
+ pointer-events: none; z-index: 3;
3255
+ }
3256
+ .ps-msc-corner {
3257
+ position: absolute;
3258
+ width: 22px; height: 22px;
3259
+ border: 1.5px solid rgba(255,255,255,0.7);
3260
+ }
3261
+ .ps-msc-corner.ps-tl { top: 0; left: 0; border-right: none; border-bottom: none; }
3262
+ .ps-msc-corner.ps-tr { top: 0; right: 0; border-left: none; border-bottom: none; }
3263
+ .ps-msc-corner.ps-bl { bottom: 0; left: 0; border-right: none; border-top: none; }
3264
+ .ps-msc-corner.ps-br { bottom: 0; right: 0; border-left: none; border-top: none; }
3265
+
3266
+ /* Scanning line that sweeps top-to-bottom */
3267
+ .ps-msc-scanline {
3268
+ position: absolute; left: 28px; right: 28px;
3269
+ height: 1.5px; z-index: 3;
3270
+ background: linear-gradient(
3271
+ to right,
3272
+ transparent,
3273
+ rgba(180,220,255,0.85),
3274
+ rgba(180,220,255,0.85),
3275
+ transparent
3276
+ );
3277
+ box-shadow: 0 0 8px rgba(180,220,255,0.5);
3278
+ animation: ps-msc-scan 2.6s ease-in-out infinite;
3279
+ }
3280
+ @keyframes ps-msc-scan {
3281
+ 0% { top: 28px; opacity: 0; }
3282
+ 10% { opacity: 1; }
3283
+ 90% { opacity: 1; }
3284
+ 100% { top: calc(100% - 28px); opacity: 0; }
3285
+ }
3286
+
3287
+ /* Pose skeleton overlay — sits over the photo */
3288
+ .ps-msc-pose-wrap {
3289
+ position: absolute; inset: 0; z-index: 2;
3290
+ display: flex; align-items: center; justify-content: center;
3291
+ pointer-events: none;
3292
+ }
3293
+ .ps-msc-pose-overlay {
3294
+ width: 100%; height: 100%;
3295
+ }
3296
+ @keyframes ps-msc-fade {
3297
+ from { opacity: 0; }
3298
+ to { opacity: 1; }
3299
+ }
3300
+ @keyframes ps-msc-pulse {
3301
+ 0%, 100% { transform: scale(1); opacity: 1; }
3302
+ 50% { transform: scale(1.4); opacity: 0.5; }
3303
+ }
3304
+
3305
+ /* Bottom of viewfinder: stage label + progress bar + sub */
3306
+ .ps-msc-vf-bottom {
3307
+ position: absolute; left: 28px; right: 28px; bottom: 28px;
3308
+ z-index: 4; text-align: center;
3309
+ color: #FFFFFF;
3310
+ }
3311
+ .ps-msc-vf-text {
3312
+ font-size: 10px; font-weight: 700;
3313
+ letter-spacing: 0.16em;
3314
+ color: rgba(255,255,255,0.9);
3315
+ margin-bottom: 6px;
3316
+ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
3317
+ }
3318
+ .ps-msc-vf-bar {
3319
+ height: 2px; width: 100%;
3320
+ background: rgba(255,255,255,0.18);
3321
+ border-radius: 2px; overflow: hidden;
3322
+ }
3323
+ .ps-msc-vf-bar-fill {
3324
+ height: 100%; width: 30%;
3325
+ background: linear-gradient(to right, rgba(180,220,255,0.6), rgba(255,255,255,0.95));
3326
+ border-radius: 2px;
3327
+ animation: ps-msc-bar 2.2s ease-in-out infinite;
3328
+ }
3329
+ @keyframes ps-msc-bar {
3330
+ 0% { transform: translateX(-100%); }
3331
+ 50% { transform: translateX(150%); }
3332
+ 100% { transform: translateX(350%); }
3333
+ }
3334
+ .ps-msc-vf-sub {
3335
+ margin-top: 8px;
3336
+ font-size: 9px; font-weight: 600;
3337
+ letter-spacing: 0.18em;
3338
+ color: rgba(255,255,255,0.55);
3339
+ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
3340
+ }
3341
+
3342
+ /* Cycling stage text below the viewfinder — slides + fades on change */
3343
+ .ps-msc-stage {
3344
+ text-align: center; padding: 4px 12px;
3345
+ min-height: 64px;
3346
+ overflow: hidden;
3347
+ }
3348
+ .ps-msc-stage-slot {
3349
+ animation: ps-msc-stage-in 0.5s cubic-bezier(0.32, 0.72, 0, 1);
3350
+ }
3351
+ @keyframes ps-msc-stage-in {
3352
+ from { opacity: 0; transform: translateY(14px); }
3353
+ to { opacity: 1; transform: translateY(0); }
3354
+ }
3355
+ .ps-msc-stage-title {
3356
+ font-size: 16px; font-weight: 700;
3357
+ letter-spacing: 0.06em;
3358
+ color: var(--ps-text-primary);
3359
+ margin-bottom: 6px;
3360
+ }
3361
+ .ps-msc-stage-desc {
3362
+ font-size: 12px; color: var(--ps-text-muted);
3363
+ line-height: 1.5; max-width: 300px; margin: 0 auto;
3364
+ }
3365
+
3204
3366
  /* Bottom action area — Next button + tab bar grouped together,
3205
3367
  pushed to the bottom of the modal body by .ps-bpm-spacer above. */
3206
3368
  .ps-bpm-bottom {
@@ -4185,6 +4347,216 @@ function EstimationReviewView({
4185
4347
  ] })
4186
4348
  ] });
4187
4349
  }
4350
+ const MOBILE_BREAKPOINT = 768;
4351
+ function useIsMobile() {
4352
+ const [isMobile, setIsMobile] = useState(false);
4353
+ useEffect(() => {
4354
+ if (typeof window === "undefined") return;
4355
+ const check = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
4356
+ check();
4357
+ window.addEventListener("resize", check);
4358
+ return () => window.removeEventListener("resize", check);
4359
+ }, []);
4360
+ return isMobile;
4361
+ }
4362
+ function RulerIcon() {
4363
+ return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", width: "13", height: "13", children: [
4364
+ /* @__PURE__ */ jsx("path", { d: "M3 17l6 6 12-12-6-6z" }),
4365
+ /* @__PURE__ */ jsx("path", { d: "M9 11l2 2M11 9l2 2M13 7l2 2M7 13l2 2" })
4366
+ ] });
4367
+ }
4368
+ function ScanIcon() {
4369
+ return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", width: "13", height: "13", children: [
4370
+ /* @__PURE__ */ jsx("path", { d: "M3 7V5a2 2 0 0 1 2-2h2M17 3h2a2 2 0 0 1 2 2v2M21 17v2a2 2 0 0 1-2 2h-2M7 21H5a2 2 0 0 1-2-2v-2" }),
4371
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3" })
4372
+ ] });
4373
+ }
4374
+ function MobileBottomTabs({ mode, onSwitchToManual, onSwitchToScan, t }) {
4375
+ return /* @__PURE__ */ jsxs("div", { className: "ps-bpm-bottom-tabs", children: [
4376
+ /* @__PURE__ */ jsxs(
4377
+ "button",
4378
+ {
4379
+ type: "button",
4380
+ className: `ps-bpm-bottom-tab${mode === "manual" ? " ps-active" : ""}`,
4381
+ onClick: onSwitchToManual,
4382
+ children: [
4383
+ /* @__PURE__ */ jsx(RulerIcon, {}),
4384
+ t("MANUAL FIT")
4385
+ ]
4386
+ }
4387
+ ),
4388
+ /* @__PURE__ */ jsxs(
4389
+ "button",
4390
+ {
4391
+ type: "button",
4392
+ className: `ps-bpm-bottom-tab${mode === "scan" ? " ps-active" : ""}`,
4393
+ onClick: onSwitchToScan,
4394
+ children: [
4395
+ /* @__PURE__ */ jsx(ScanIcon, {}),
4396
+ t("AI SCAN")
4397
+ ]
4398
+ }
4399
+ )
4400
+ ] });
4401
+ }
4402
+ const SKELETON_CONNECTIONS$1 = [
4403
+ ["leftShoulder", "rightShoulder"],
4404
+ ["leftShoulder", "leftElbow"],
4405
+ ["leftElbow", "leftWrist"],
4406
+ ["rightShoulder", "rightElbow"],
4407
+ ["rightElbow", "rightWrist"],
4408
+ ["leftShoulder", "leftHip"],
4409
+ ["rightShoulder", "rightHip"],
4410
+ ["leftHip", "rightHip"],
4411
+ ["leftHip", "leftKnee"],
4412
+ ["leftKnee", "leftAnkle"],
4413
+ ["rightHip", "rightKnee"],
4414
+ ["rightKnee", "rightAnkle"]
4415
+ ];
4416
+ function MobileSkeleton({ landmarks, w, h }) {
4417
+ return /* @__PURE__ */ jsxs(
4418
+ "svg",
4419
+ {
4420
+ className: "ps-msc-pose-overlay",
4421
+ viewBox: `0 0 ${w} ${h}`,
4422
+ preserveAspectRatio: "xMidYMid meet",
4423
+ children: [
4424
+ SKELETON_CONNECTIONS$1.map(([a, b], i) => {
4425
+ const pa = landmarks[a];
4426
+ const pb = landmarks[b];
4427
+ if (!pa || !pb) return null;
4428
+ return /* @__PURE__ */ jsx(
4429
+ "line",
4430
+ {
4431
+ x1: pa.x * w,
4432
+ y1: pa.y * h,
4433
+ x2: pb.x * w,
4434
+ y2: pb.y * h,
4435
+ stroke: "rgba(255,255,255,0.85)",
4436
+ strokeWidth: "3",
4437
+ strokeLinecap: "round",
4438
+ opacity: 0,
4439
+ style: { animation: `ps-msc-fade 0.4s ease ${i * 0.05}s forwards` }
4440
+ },
4441
+ `l-${i}`
4442
+ );
4443
+ }),
4444
+ Object.entries(landmarks).map(([key, v], i) => /* @__PURE__ */ jsxs("g", { children: [
4445
+ /* @__PURE__ */ jsx(
4446
+ "circle",
4447
+ {
4448
+ cx: v.x * w,
4449
+ cy: v.y * h,
4450
+ r: 9,
4451
+ fill: "rgba(255,255,255,0.18)",
4452
+ opacity: 0,
4453
+ style: { animation: `ps-msc-fade 0.3s ease ${i * 0.04}s forwards` }
4454
+ }
4455
+ ),
4456
+ /* @__PURE__ */ jsx(
4457
+ "circle",
4458
+ {
4459
+ cx: v.x * w,
4460
+ cy: v.y * h,
4461
+ r: 5,
4462
+ fill: "#FFFFFF",
4463
+ opacity: 0,
4464
+ style: { animation: `ps-msc-fade 0.3s ease ${i * 0.04}s forwards, ps-msc-pulse 1.6s ease-in-out ${0.5 + i * 0.04}s infinite` }
4465
+ }
4466
+ )
4467
+ ] }, key))
4468
+ ]
4469
+ }
4470
+ );
4471
+ }
4472
+ function MobileScanningView({
4473
+ previewUrl,
4474
+ bodyLandmarks,
4475
+ sizingDone,
4476
+ onSwitchToManual,
4477
+ t
4478
+ }) {
4479
+ const stages = [
4480
+ { title: t("DETECTING POSE"), desc: t("Identifying body landmarks from your photo."), viewfinderText: t("DETECTING POSE") },
4481
+ { title: t("SCANNING FRAME"), desc: t("Our AI is mapping your proportions to calculate the perfect fit."), viewfinderText: t("SCANNING FRAME") },
4482
+ { title: t("ANALYZING BODY"), desc: t("Measuring shoulders, chest, waist and hips."), viewfinderText: t("ANALYZING") },
4483
+ { title: t("MATCHING SIZE"), desc: t("Comparing your measurements to the size guide."), viewfinderText: t("MATCHING SIZE") },
4484
+ { title: t("FINALIZING RESULT"), desc: t("Almost done — preparing your recommendation."), viewfinderText: t("FINALIZING") }
4485
+ ];
4486
+ const [dims, setDims] = useState({ w: 800, h: 1200 });
4487
+ const handleImgLoad = (e) => {
4488
+ const img = e.currentTarget;
4489
+ setDims({ w: img.naturalWidth || img.offsetWidth, h: img.naturalHeight || img.offsetHeight });
4490
+ };
4491
+ const [stageIdx, setStageIdx] = useState(0);
4492
+ useEffect(() => {
4493
+ if (sizingDone) return;
4494
+ if (bodyLandmarks && stageIdx === 0) {
4495
+ setStageIdx(1);
4496
+ return;
4497
+ }
4498
+ const id = setInterval(() => {
4499
+ setStageIdx((i) => Math.min(i + 1, stages.length - 1));
4500
+ }, 1600);
4501
+ return () => clearInterval(id);
4502
+ }, [bodyLandmarks, sizingDone, stageIdx, stages.length]);
4503
+ const current = stages[stageIdx] ?? stages[0];
4504
+ const [feedTick, setFeedTick] = useState(1);
4505
+ useEffect(() => {
4506
+ if (sizingDone) return;
4507
+ const id = setInterval(() => setFeedTick((n) => n + 1), 850);
4508
+ return () => clearInterval(id);
4509
+ }, [sizingDone]);
4510
+ return /* @__PURE__ */ jsxs("div", { className: "ps-msc-root", children: [
4511
+ /* @__PURE__ */ jsxs("div", { className: "ps-msc-viewfinder", children: [
4512
+ /* @__PURE__ */ jsxs("div", { className: "ps-msc-feed-badge", children: [
4513
+ /* @__PURE__ */ jsx("span", { className: "ps-msc-feed-dot" }),
4514
+ "LIVE_FEED:",
4515
+ String(feedTick).padStart(2, "0")
4516
+ ] }),
4517
+ /* @__PURE__ */ jsx(
4518
+ "img",
4519
+ {
4520
+ src: previewUrl,
4521
+ alt: t("Your photo"),
4522
+ className: "ps-msc-photo",
4523
+ onLoad: handleImgLoad
4524
+ }
4525
+ ),
4526
+ /* @__PURE__ */ jsxs("div", { className: "ps-msc-corners", children: [
4527
+ /* @__PURE__ */ jsx("span", { className: "ps-msc-corner ps-tl" }),
4528
+ /* @__PURE__ */ jsx("span", { className: "ps-msc-corner ps-tr" }),
4529
+ /* @__PURE__ */ jsx("span", { className: "ps-msc-corner ps-bl" }),
4530
+ /* @__PURE__ */ jsx("span", { className: "ps-msc-corner ps-br" })
4531
+ ] }),
4532
+ /* @__PURE__ */ jsx("div", { className: "ps-msc-scanline" }),
4533
+ bodyLandmarks && /* @__PURE__ */ jsx("div", { className: "ps-msc-pose-wrap", children: /* @__PURE__ */ jsx(MobileSkeleton, { landmarks: bodyLandmarks, w: dims.w, h: dims.h }) }),
4534
+ /* @__PURE__ */ jsxs("div", { className: "ps-msc-vf-bottom", children: [
4535
+ /* @__PURE__ */ jsxs("div", { className: "ps-msc-vf-text", children: [
4536
+ current.viewfinderText,
4537
+ "..."
4538
+ ] }),
4539
+ /* @__PURE__ */ jsx("div", { className: "ps-msc-vf-bar", children: /* @__PURE__ */ jsx("div", { className: "ps-msc-vf-bar-fill" }) }),
4540
+ /* @__PURE__ */ jsx("div", { className: "ps-msc-vf-sub", children: t("PLEASE STAND STILL") })
4541
+ ] })
4542
+ ] }),
4543
+ /* @__PURE__ */ jsx("div", { className: "ps-msc-stage", children: /* @__PURE__ */ jsxs("div", { className: "ps-msc-stage-slot", children: [
4544
+ /* @__PURE__ */ jsx("div", { className: "ps-msc-stage-title", children: current.title }),
4545
+ /* @__PURE__ */ jsx("div", { className: "ps-msc-stage-desc", children: current.desc })
4546
+ ] }, stageIdx) }),
4547
+ /* @__PURE__ */ jsx("div", { className: "ps-bpm-spacer" }),
4548
+ /* @__PURE__ */ jsx("div", { className: "ps-bpm-bottom", children: /* @__PURE__ */ jsx(
4549
+ MobileBottomTabs,
4550
+ {
4551
+ mode: "scan",
4552
+ onSwitchToManual,
4553
+ onSwitchToScan: () => {
4554
+ },
4555
+ t
4556
+ }
4557
+ ) })
4558
+ ] });
4559
+ }
4188
4560
  const SKELETON_CONNECTIONS = [
4189
4561
  ["nose", "leftShoulder"],
4190
4562
  ["nose", "rightShoulder"],
@@ -4901,6 +5273,7 @@ function SizeResultView({
4901
5273
  const sizingDone = !!sizingResult;
4902
5274
  const tryOnDone = !!resultImageUrl && !tryOnProcessing;
4903
5275
  const allDone = hasPhoto ? sizingDone && tryOnDone : sizingDone;
5276
+ const isMobile = useIsMobile();
4904
5277
  console.log("[PS-SDK] SizeResultView render:", {
4905
5278
  hasPhoto,
4906
5279
  isSnapProcessing,
@@ -4922,7 +5295,17 @@ function SizeResultView({
4922
5295
  /* @__PURE__ */ jsx("p", { style: { color: "var(--ps-text-muted)", fontSize: "0.8vw" }, children: t("Generating your size recommendation...") })
4923
5296
  ] })
4924
5297
  ] }),
4925
- isSnapProcessing && !allDone && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-split", children: [
5298
+ isMobile && isSnapProcessing && !allDone && previewUrl && /* @__PURE__ */ jsx(
5299
+ MobileScanningView,
5300
+ {
5301
+ previewUrl,
5302
+ bodyLandmarks: bodyLandmarks ?? null,
5303
+ sizingDone,
5304
+ onSwitchToManual: () => setView("body-profile"),
5305
+ t
5306
+ }
5307
+ ),
5308
+ !isMobile && isSnapProcessing && !allDone && /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-split", children: [
4926
5309
  /* @__PURE__ */ jsxs("div", { className: "ps-tryon-sr-img-col", style: { position: "relative" }, children: [
4927
5310
  /* @__PURE__ */ jsx(
4928
5311
  "img",
@@ -5515,58 +5898,6 @@ function ResultView({ setView }) {
5515
5898
  }, []);
5516
5899
  return null;
5517
5900
  }
5518
- const MOBILE_BREAKPOINT = 768;
5519
- function useIsMobile() {
5520
- const [isMobile, setIsMobile] = useState(false);
5521
- useEffect(() => {
5522
- if (typeof window === "undefined") return;
5523
- const check = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
5524
- check();
5525
- window.addEventListener("resize", check);
5526
- return () => window.removeEventListener("resize", check);
5527
- }, []);
5528
- return isMobile;
5529
- }
5530
- function RulerIcon() {
5531
- return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", width: "13", height: "13", children: [
5532
- /* @__PURE__ */ jsx("path", { d: "M3 17l6 6 12-12-6-6z" }),
5533
- /* @__PURE__ */ jsx("path", { d: "M9 11l2 2M11 9l2 2M13 7l2 2M7 13l2 2" })
5534
- ] });
5535
- }
5536
- function ScanIcon() {
5537
- return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", width: "13", height: "13", children: [
5538
- /* @__PURE__ */ jsx("path", { d: "M3 7V5a2 2 0 0 1 2-2h2M17 3h2a2 2 0 0 1 2 2v2M21 17v2a2 2 0 0 1-2 2h-2M7 21H5a2 2 0 0 1-2-2v-2" }),
5539
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3" })
5540
- ] });
5541
- }
5542
- function MobileBottomTabs({ mode, onSwitchToManual, onSwitchToScan, t }) {
5543
- return /* @__PURE__ */ jsxs("div", { className: "ps-bpm-bottom-tabs", children: [
5544
- /* @__PURE__ */ jsxs(
5545
- "button",
5546
- {
5547
- type: "button",
5548
- className: `ps-bpm-bottom-tab${mode === "manual" ? " ps-active" : ""}`,
5549
- onClick: onSwitchToManual,
5550
- children: [
5551
- /* @__PURE__ */ jsx(RulerIcon, {}),
5552
- t("MANUAL FIT")
5553
- ]
5554
- }
5555
- ),
5556
- /* @__PURE__ */ jsxs(
5557
- "button",
5558
- {
5559
- type: "button",
5560
- className: `ps-bpm-bottom-tab${mode === "scan" ? " ps-active" : ""}`,
5561
- onClick: onSwitchToScan,
5562
- children: [
5563
- /* @__PURE__ */ jsx(ScanIcon, {}),
5564
- t("AI SCAN")
5565
- ]
5566
- }
5567
- )
5568
- ] });
5569
- }
5570
5901
  function CameraSmallIcon({ size = 16 }) {
5571
5902
  return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round", width: size, height: size, children: [
5572
5903
  /* @__PURE__ */ jsx("path", { d: "M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z" }),