@tatchi-xyz/sdk 0.32.1 → 0.32.3

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.
Files changed (57) hide show
  1. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-D2eRb2-S.css → PasskeyAuthMenu-mMygL3xX.css} +137 -47
  2. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-mMygL3xX.css.map +1 -0
  3. package/dist/cjs/react/components/PasskeyAuthMenu/client.js +2 -3
  4. package/dist/cjs/react/components/PasskeyAuthMenu/client.js.map +1 -1
  5. package/dist/cjs/react/components/PasskeyAuthMenu/controller/mode.js +7 -2
  6. package/dist/cjs/react/components/PasskeyAuthMenu/controller/mode.js.map +1 -1
  7. package/dist/cjs/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js +4 -1
  8. package/dist/cjs/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js.map +1 -1
  9. package/dist/cjs/react/components/PasskeyAuthMenu/hydrationContext.js +20 -0
  10. package/dist/cjs/react/components/PasskeyAuthMenu/hydrationContext.js.map +1 -0
  11. package/dist/cjs/react/components/PasskeyAuthMenu/passkeyAuthMenuCompat.js +1 -1
  12. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js +64 -30
  13. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  14. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js +155 -101
  15. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  16. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +5 -1
  17. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  18. package/dist/cjs/react/index.js +2 -2
  19. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-qTHAv58Z.css → PasskeyAuthMenu-BihXvuII.css} +137 -47
  20. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-BihXvuII.css.map +1 -0
  21. package/dist/esm/react/components/PasskeyAuthMenu/client.js +2 -3
  22. package/dist/esm/react/components/PasskeyAuthMenu/client.js.map +1 -1
  23. package/dist/esm/react/components/PasskeyAuthMenu/controller/mode.js +7 -3
  24. package/dist/esm/react/components/PasskeyAuthMenu/controller/mode.js.map +1 -1
  25. package/dist/esm/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js +4 -1
  26. package/dist/esm/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js.map +1 -1
  27. package/dist/esm/react/components/PasskeyAuthMenu/hydrationContext.js +17 -0
  28. package/dist/esm/react/components/PasskeyAuthMenu/hydrationContext.js.map +1 -0
  29. package/dist/esm/react/components/PasskeyAuthMenu/passkeyAuthMenuCompat.js +1 -1
  30. package/dist/esm/react/components/PasskeyAuthMenu/shell.js +64 -30
  31. package/dist/esm/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  32. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js +155 -101
  33. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  34. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +5 -1
  35. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  36. package/dist/esm/react/index.js +2 -2
  37. package/dist/esm/react/styles/styles.css +136 -46
  38. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  39. package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts +0 -1
  40. package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts.map +1 -1
  41. package/dist/types/src/react/components/PasskeyAuthMenu/controller/mode.d.ts +6 -1
  42. package/dist/types/src/react/components/PasskeyAuthMenu/controller/mode.d.ts.map +1 -1
  43. package/dist/types/src/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.d.ts.map +1 -1
  44. package/dist/types/src/react/components/PasskeyAuthMenu/hydrationContext.d.ts +10 -0
  45. package/dist/types/src/react/components/PasskeyAuthMenu/hydrationContext.d.ts.map +1 -0
  46. package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts +2 -1
  47. package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts.map +1 -1
  48. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts +5 -1
  49. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts.map +1 -1
  50. package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts.map +1 -1
  51. package/dist/workers/offline-export-sw.js +156 -1
  52. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  53. package/dist/workers/web3authn-signer.worker.js +1360 -2
  54. package/dist/workers/web3authn-vrf.worker.js +2857 -2
  55. package/package.json +4 -2
  56. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2eRb2-S.css.map +0 -1
  57. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-qTHAv58Z.css.map +0 -1
@@ -1,8 +1,14 @@
1
1
  /* Root container */
2
+ .w3a-no-animation {
3
+ animation: none !important;
4
+ transition: none !important;
5
+ }
6
+
2
7
  .w3a-signup-menu-root {
3
- /* JS sentinel used to avoid FOUC when CSS is still loading */
8
+ /* CSS sentinel (used by tests/diagnostics to confirm stylesheet is applied) */
4
9
  --w3a-pam2-css-ready: 1;
5
- position: relative; /* relative position to anchor back button */
10
+ position: relative;
11
+ /* relative position to anchor back button */
6
12
  width: min(100dvw, 420px);
7
13
  max-width: 100dvw;
8
14
  min-width: 330px;
@@ -44,15 +50,18 @@
44
50
  pointer-events: none;
45
51
  filter: blur(0.2px);
46
52
  }
53
+
47
54
  .w3a-back-button.is-visible {
48
55
  opacity: 1;
49
56
  pointer-events: auto;
50
57
  filter: none;
51
58
  }
59
+
52
60
  .w3a-back-button:hover {
53
61
  transform: scale(1.02);
54
62
  background: var(--w3a-colors-surface);
55
63
  }
64
+
56
65
  .w3a-back-button:active {
57
66
  transform: scale(0.96);
58
67
  }
@@ -140,7 +149,8 @@
140
149
  .w3a-content-switcher {
141
150
  display: flex;
142
151
  flex-direction: column;
143
- overflow: hidden; /* ensure smooth height animations without spillover */
152
+ overflow: hidden;
153
+ /* ensure smooth height animations without spillover */
144
154
  transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);
145
155
  will-change: height;
146
156
  }
@@ -152,7 +162,6 @@
152
162
  flex: 0 1 auto;
153
163
  display: flex;
154
164
  flex-direction: column;
155
- animation: fade-in 240ms ease-out;
156
165
  transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);
157
166
  }
158
167
 
@@ -170,7 +179,6 @@
170
179
  gap: 0px;
171
180
  min-height: 250px;
172
181
  width: 100%;
173
- animation: content-enter 240ms ease-in-out;
174
182
  }
175
183
 
176
184
  @keyframes content-enter {
@@ -178,6 +186,7 @@
178
186
  opacity: 0;
179
187
  transform: scale(0.98) translateY(6px);
180
188
  }
189
+
181
190
  to {
182
191
  opacity: 1;
183
192
  transform: scale(1) translateY(0);
@@ -188,6 +197,7 @@
188
197
  from {
189
198
  opacity: 0;
190
199
  }
200
+
191
201
  to {
192
202
  opacity: 1;
193
203
  }
@@ -199,6 +209,7 @@
199
209
  gap: 8px;
200
210
  margin-bottom: var(--w3a-spacing-sm);
201
211
  }
212
+
202
213
  .w3a-social-btn {
203
214
  height: 48px;
204
215
  flex: 1 1 0;
@@ -214,13 +225,16 @@
214
225
  /* no shadow requested */
215
226
  box-shadow: none;
216
227
  }
228
+
217
229
  .w3a-social-btn svg {
218
230
  color: var(--w3a-colors-textSecondary, #64748b);
219
231
  }
232
+
220
233
  .w3a-social-btn:hover {
221
234
  background: var(--w3a-colors-surface2);
222
235
  box-shadow: var(--w3a-shadows-sm);
223
236
  }
237
+
224
238
  .w3a-social-btn:hover svg {
225
239
  color: var(--w3a-colors-textPrimary, #1e293b);
226
240
  }
@@ -248,6 +262,7 @@
248
262
  overflow-x: hidden;
249
263
  transition: border-radius 150ms ease-in-out;
250
264
  }
265
+
251
266
  .w3a-input-pill.is-enabled {
252
267
  border-radius: 2rem 0.25rem 0.25rem 2rem;
253
268
  transition: border-radius 150ms ease-in-out;
@@ -259,8 +274,10 @@
259
274
  height: 32px;
260
275
  display: flex;
261
276
  align-items: center;
262
- min-width: 0; /* allow input to shrink inside flex container without clipping */
277
+ min-width: 0;
278
+ /* allow input to shrink inside flex container without clipping */
263
279
  }
280
+
264
281
  .w3a-input {
265
282
  width: 100%;
266
283
  height: 32px;
@@ -270,7 +287,8 @@
270
287
  color: var(--w3a-colors-textPrimary);
271
288
  font-size: 16px;
272
289
  padding: 0;
273
- min-width: 0; /* prevent overflow clipping in flex layouts */
290
+ min-width: 0;
291
+ /* prevent overflow clipping in flex layouts */
274
292
  }
275
293
 
276
294
  /* Absolute status message anchored to bottom-right of the input area */
@@ -289,15 +307,18 @@
289
307
  font-size: 16px;
290
308
  white-space: nowrap;
291
309
  pointer-events: none;
292
- visibility: hidden; /* React enables once measured */
310
+ visibility: hidden;
311
+ /* React enables once measured */
293
312
  will-change: left;
294
313
  transition: left 32ms ease;
295
314
  }
315
+
296
316
  .w3a-postfix.is-existing {
297
317
  color: var(--w3a-colors-success);
298
318
  }
319
+
299
320
  /* On focus, keep postfix subtle for readability */
300
- .w3a-input:focus ~ .w3a-postfix {
321
+ .w3a-input:focus~.w3a-postfix {
301
322
  color: var(--w3a-colors-textMuted);
302
323
  }
303
324
 
@@ -305,7 +326,8 @@
305
326
  display: flex;
306
327
  align-items: center;
307
328
  justify-content: center;
308
- width: 0; /* hidden footprint by default */
329
+ width: 0;
330
+ /* hidden footprint by default */
309
331
  padding: 0;
310
332
  background: transparent;
311
333
  border: 0;
@@ -321,13 +343,15 @@
321
343
  border: 6px solid var(--w3a-colors-colorBackground, #fff);
322
344
  height: 64px;
323
345
  transition: transform 150ms ease,
324
- background-color 150ms ease,
325
- border-radius 150ms ease,
326
- opacity 150ms ease,
327
- width 150ms ease-in-out;
346
+ background-color 150ms ease,
347
+ border-radius 150ms ease,
348
+ opacity 150ms ease,
349
+ width 150ms ease-in-out;
328
350
  }
351
+
329
352
  .w3a-arrow-btn.is-enabled {
330
- width: 100px; /* expand when enabled */
353
+ width: 100px;
354
+ /* expand when enabled */
331
355
  /* Prefer themed primary; fall back to legacy then a sane default */
332
356
  background: var(--w3a-colors-primary, #2563eb);
333
357
  border-radius: 2rem;
@@ -336,36 +360,42 @@
336
360
  visibility: visible;
337
361
  pointer-events: auto;
338
362
  transition: transform 150ms ease,
339
- background-color 150ms ease,
340
- border-radius 150ms ease,
341
- opacity 150ms ease,
342
- width 150ms ease-in-out;
363
+ background-color 150ms ease,
364
+ border-radius 150ms ease,
365
+ opacity 150ms ease,
366
+ width 150ms ease-in-out;
343
367
  }
368
+
344
369
  .w3a-arrow-btn.no-transition,
345
370
  .w3a-arrow-btn.no-transition.is-enabled {
346
371
  transition: none;
347
372
  }
373
+
348
374
  .w3a-arrow-btn .w3a-arrow-icon {
349
375
  color: #fff;
350
376
  }
377
+
351
378
  .w3a-arrow-btn.is-enabled:hover {
352
379
  /* transform: scale(1.02); */
353
380
  background: var(--w3a-colors-primaryHover, #1d4ed8);
354
381
  }
382
+
355
383
  .w3a-arrow-btn.is-enabled:active {
356
384
  transform: scale(0.96);
357
385
  }
386
+
358
387
  .w3a-arrow-btn:disabled {
359
388
  width: 0;
360
389
  cursor: not-allowed;
361
390
  opacity: 0.5;
362
391
  background: var(--w3a-colors-borderSecondary);
363
392
  transition: transform 150ms ease,
364
- background-color 150ms ease,
365
- border-radius 150ms ease,
366
- opacity 150ms ease,
367
- width 150ms ease-in-out;
393
+ background-color 150ms ease,
394
+ border-radius 150ms ease,
395
+ opacity 150ms ease,
396
+ width 150ms ease-in-out;
368
397
  }
398
+
369
399
  .w3a-arrow-btn .w3a-arrow-label {
370
400
  margin-left: 8px;
371
401
  font-weight: 600;
@@ -379,7 +409,7 @@
379
409
  justify-content: center;
380
410
  }
381
411
 
382
- .w3a-arrow-btn .stripe-arrow > .HoverArrow {
412
+ .w3a-arrow-btn .stripe-arrow>.HoverArrow {
383
413
  position: relative;
384
414
  margin-top: 0.1rem;
385
415
  margin-left: 8px;
@@ -389,23 +419,23 @@
389
419
  }
390
420
 
391
421
  /* Horizontal line: fades in on hover of the button */
392
- .w3a-arrow-btn .stripe-arrow > .HoverArrow .HoverArrow__linePath {
422
+ .w3a-arrow-btn .stripe-arrow>.HoverArrow .HoverArrow__linePath {
393
423
  opacity: 0;
394
424
  transition: opacity 120ms cubic-bezier(0.215, 0.61, 0.355, 1);
395
425
  }
396
426
 
397
427
  /* Chevron: nudges right and slightly scales on hover */
398
- .w3a-arrow-btn .stripe-arrow > .HoverArrow .HoverArrow__tipPath {
428
+ .w3a-arrow-btn .stripe-arrow>.HoverArrow .HoverArrow__tipPath {
399
429
  transition: transform 120ms cubic-bezier(0.215, 0.61, 0.355, 1);
400
430
  }
401
431
 
402
- .w3a-arrow-btn.is-enabled:hover .stripe-arrow > .HoverArrow .HoverArrow__linePath,
403
- .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow > .HoverArrow .HoverArrow__linePath {
432
+ .w3a-arrow-btn.is-enabled:hover .stripe-arrow>.HoverArrow .HoverArrow__linePath,
433
+ .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow>.HoverArrow .HoverArrow__linePath {
404
434
  opacity: 1;
405
435
  }
406
436
 
407
- .w3a-arrow-btn.is-enabled:hover .stripe-arrow > .HoverArrow .HoverArrow__tipPath,
408
- .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow > .HoverArrow .HoverArrow__tipPath {
437
+ .w3a-arrow-btn.is-enabled:hover .stripe-arrow>.HoverArrow .HoverArrow__tipPath,
438
+ .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow>.HoverArrow .HoverArrow__tipPath {
409
439
  transform: translateX(3px);
410
440
  }
411
441
 
@@ -419,6 +449,7 @@
419
449
  background: var(--w3a-colors-surface2);
420
450
  border-radius: var(--w3a-border-radius-xl);
421
451
  }
452
+
422
453
  .w3a-seg-active {
423
454
  position: absolute;
424
455
  top: 5px;
@@ -432,6 +463,7 @@
432
463
  will-change: transform, width;
433
464
  pointer-events: none;
434
465
  }
466
+
435
467
  .w3a-seg-grid {
436
468
  display: flex;
437
469
  gap: 4px;
@@ -439,6 +471,7 @@
439
471
  position: relative;
440
472
  z-index: 1;
441
473
  }
474
+
442
475
  .w3a-seg-btn {
443
476
  flex: 1 1 0;
444
477
  min-width: 0;
@@ -462,15 +495,19 @@
462
495
  padding: 0 14px;
463
496
  font-size: clamp(13px, 3.6vw, 15px);
464
497
  }
498
+
465
499
  .w3a-seg-btn:hover {
466
500
  transform: scale(1.02);
467
501
  }
502
+
468
503
  .w3a-seg-btn:active {
469
504
  transform: scale(0.98);
470
505
  }
506
+
471
507
  .w3a-seg-btn.is-active {
472
508
  color: var(--w3a-colors-textPrimary);
473
509
  }
510
+
474
511
  .w3a-seg-btn:focus-visible {
475
512
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--w3a-colors-focus), transparent 60%);
476
513
  }
@@ -484,7 +521,9 @@
484
521
  }
485
522
 
486
523
  @supports (width: 1dvw) {
487
- .w3a-signup-menu-root { max-width: calc(100dvw - 0.25rem); }
524
+ .w3a-signup-menu-root {
525
+ max-width: calc(100dvw - 0.25rem);
526
+ }
488
527
  }
489
528
 
490
529
  .w3a-title {
@@ -550,19 +589,26 @@
550
589
  animation-delay: var(--w3a-waiting-delay, 0ms);
551
590
  animation-fill-mode: both;
552
591
  }
592
+
553
593
  .w3a-waiting-message {
554
594
  display: flex;
555
595
  flex-direction: column;
556
596
  align-items: center;
557
597
  gap: 6px;
558
598
  }
559
- .w3a-waiting-text { font-size: 18px; font-weight: 600; }
599
+
600
+ .w3a-waiting-text {
601
+ font-size: 18px;
602
+ font-weight: 600;
603
+ }
604
+
560
605
  .w3a-waiting-subtext {
561
606
  font-size: 12px;
562
607
  font-weight: 500;
563
608
  line-height: 1.35;
564
609
  color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);
565
610
  }
611
+
566
612
  .w3a-waiting-sdk-events {
567
613
  font-size: 11px;
568
614
  font-weight: 500;
@@ -570,11 +616,12 @@
570
616
  white-space: pre-wrap;
571
617
  color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 15%);
572
618
  }
619
+
573
620
  .w3a-spinner {
574
621
  width: 36px;
575
622
  height: 36px;
576
623
  border-radius: 999px;
577
- border: 3px solid rgba(255,255,255,0.15);
624
+ border: 3px solid rgba(255, 255, 255, 0.15);
578
625
  border-top-color: var(--w3a-colors-primary);
579
626
  animation: w3a-spin 0.9s linear infinite;
580
627
  }
@@ -593,6 +640,7 @@
593
640
  width: 100%;
594
641
  overflow: hidden;
595
642
  animation: content-enter 240ms ease-out;
643
+ animation-fill-mode: both;
596
644
  }
597
645
 
598
646
  /* Ensure QR code content stays within bounds */
@@ -619,6 +667,7 @@
619
667
  align-items: center;
620
668
  justify-content: flex-end;
621
669
  }
670
+
622
671
  .w3a-status-message {
623
672
  font-size: 11px;
624
673
  font-weight: 500;
@@ -655,12 +704,14 @@
655
704
  margin: 6px 2px 6px;
656
705
  font-weight: 600;
657
706
  }
707
+
658
708
  .w3a-seg-help {
659
709
  font-size: 12px;
660
710
  color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);
661
711
  margin: 0;
662
712
  margin-left: 0.75rem;
663
713
  }
714
+
664
715
  .w3a-seg-help-row {
665
716
  display: flex;
666
717
  align-items: center;
@@ -668,6 +719,7 @@
668
719
  gap: 12px;
669
720
  margin-top: 8px;
670
721
  }
722
+
671
723
  /* Tooltip for account existence status */
672
724
  .w3a-input-wrap .w3a-tooltip {
673
725
  position: absolute;
@@ -683,15 +735,18 @@
683
735
  transition: opacity 180ms ease, transform 200ms ease;
684
736
  z-index: 2;
685
737
  }
738
+
686
739
  .w3a-input-wrap .w3a-tooltip.is-visible {
687
740
  opacity: 0.8;
688
741
  transform: translateX(0px) scale(1);
689
742
  }
743
+
690
744
  .w3a-input-wrap .w3a-tooltip.is-error {
691
745
  color: var(--w3a-colors-error);
692
746
  background: var(--w3a-colors-colorBackground);
693
747
  /* background: color-mix(in srgb, var(--w3a-colors-error), transparent 90%); */
694
748
  }
749
+
695
750
  .w3a-input-wrap .w3a-tooltip.is-success {
696
751
  color: var(--w3a-colors-blue400);
697
752
  background: var(--w3a-colors-colorBackground);
@@ -699,13 +754,26 @@
699
754
  }
700
755
 
701
756
  @keyframes w3a-spin {
702
- from { transform: rotate(0deg); }
703
- to { transform: rotate(360deg); }
757
+ from {
758
+ transform: rotate(0deg);
759
+ }
760
+
761
+ to {
762
+ transform: rotate(360deg);
763
+ }
704
764
  }
705
765
 
706
766
  @keyframes w3a-ellipsis-dot {
707
- 0%, 80%, 100% { opacity: 0; }
708
- 40% { opacity: 1; }
767
+
768
+ 0%,
769
+ 80%,
770
+ 100% {
771
+ opacity: 0;
772
+ }
773
+
774
+ 40% {
775
+ opacity: 1;
776
+ }
709
777
  }
710
778
 
711
779
  .w3a-ellipsis {
@@ -718,24 +786,45 @@
718
786
  animation: w3a-ellipsis-dot 1.2s infinite;
719
787
  }
720
788
 
721
- .w3a-ellipsis-dot:nth-child(2) { animation-delay: 0.15s; }
722
- .w3a-ellipsis-dot:nth-child(3) { animation-delay: 0.3s; }
789
+ .w3a-ellipsis-dot:nth-child(2) {
790
+ animation-delay: 0.15s;
791
+ }
792
+
793
+ .w3a-ellipsis-dot:nth-child(3) {
794
+ animation-delay: 0.3s;
795
+ }
723
796
 
724
797
  /* Pop/bounce-in animation (kept for legacy classes) */
725
798
  @keyframes w3a-input-msg-pop {
726
- 0% { opacity: 0; transform: translateY(8px) scale(0.98); }
727
- 60% { opacity: 1; transform: translateY(-2px) scale(1.02); }
728
- 100% { opacity: 1; transform: translateY(0) scale(1); }
799
+ 0% {
800
+ opacity: 0;
801
+ transform: translateY(8px) scale(0.98);
802
+ }
803
+
804
+ 60% {
805
+ opacity: 1;
806
+ transform: translateY(-2px) scale(1.02);
807
+ }
808
+
809
+ 100% {
810
+ opacity: 1;
811
+ transform: translateY(0) scale(1);
812
+ }
729
813
  }
730
814
 
731
815
  @media (prefers-reduced-motion: reduce) {
732
- .w3a-input-msg.is-error { animation: none; }
733
- .w3a-ellipsis-dot { animation: none; opacity: 1; }
816
+ .w3a-input-msg.is-error {
817
+ animation: none;
818
+ }
819
+
820
+ .w3a-ellipsis-dot {
821
+ animation: none;
822
+ opacity: 1;
823
+ }
734
824
  }
735
825
 
736
826
  /* Button System */
737
- .w3a-scan-device-row {
738
- }
827
+ .w3a-scan-device-row {}
739
828
 
740
829
  .w3a-secondary-actions {
741
830
  display: flex;
@@ -814,6 +903,7 @@
814
903
  gap: 12px;
815
904
  min-height: 260px;
816
905
  animation: content-enter 240ms ease-out;
906
+ animation-fill-mode: both;
817
907
  }
818
908
 
819
909
  .w3a-email-recovery-title {
@@ -1008,4 +1098,4 @@
1008
1098
  }
1009
1099
 
1010
1100
 
1011
- /*# sourceMappingURL=PasskeyAuthMenu-D2eRb2-S.css.map*/
1101
+ /*# sourceMappingURL=PasskeyAuthMenu-mMygL3xX.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasskeyAuthMenu-mMygL3xX.css","names":[],"sources":["../../../../../src/react/components/PasskeyAuthMenu/PasskeyAuthMenu.css"],"sourcesContent":["/* Root container */\n.w3a-no-animation {\n animation: none !important;\n transition: none !important;\n}\n\n.w3a-signup-menu-root {\n /* CSS sentinel (used by tests/diagnostics to confirm stylesheet is applied) */\n --w3a-pam2-css-ready: 1;\n position: relative;\n /* relative position to anchor back button */\n width: min(100dvw, 420px);\n max-width: 100dvw;\n min-width: 330px;\n min-height: 250px;\n color: var(--w3a-colors-textPrimary);\n background: var(--w3a-colors-colorBackground);\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 3rem;\n box-shadow: var(--w3a-shadows-lg);\n padding: var(--w3a-spacing-lg);\n padding-top: calc(var(--w3a-spacing-lg) + 4px);\n position: relative;\n display: flex;\n flex-direction: column;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1), min-height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n will-change: height, min-height;\n}\n\n/* Back button */\n.w3a-back-button {\n position: absolute;\n top: 1rem;\n left: 1rem;\n width: 48px;\n height: 48px;\n padding: 0;\n aspect-ratio: 1 / 1;\n display: grid;\n place-items: center;\n line-height: 0;\n border-radius: 50%;\n color: var(--w3a-colors-textPrimary);\n background: transparent;\n cursor: pointer;\n border: none;\n z-index: 3;\n transition: transform 120ms ease, background-color 160ms ease, opacity 220ms ease;\n opacity: 0;\n pointer-events: none;\n filter: blur(0.2px);\n}\n\n.w3a-back-button.is-visible {\n opacity: 1;\n pointer-events: auto;\n filter: none;\n}\n\n.w3a-back-button:hover {\n transform: scale(1.02);\n background: var(--w3a-colors-surface);\n}\n\n.w3a-back-button:active {\n transform: scale(0.96);\n}\n\n/* Header */\n.w3a-header {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n opacity: 1;\n height: auto;\n overflow: hidden;\n transition: opacity 240ms ease-out, height 260ms cubic-bezier(0.2, 0.8, 0.2, 1), padding 260ms cubic-bezier(0.2, 0.8, 0.2, 1), margin 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n pointer-events: auto;\n position: relative;\n will-change: height, opacity;\n}\n\n/* Hide header when waiting or scan device is active */\n.w3a-signup-menu-root[data-waiting=\"true\"] .w3a-header,\n.w3a-signup-menu-root[data-scan-device=\"true\"] .w3a-header {\n opacity: 0;\n height: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n margin-top: 0px;\n margin-bottom: 0px;\n pointer-events: none;\n}\n\n/* Hide header when email recovery is active */\n.w3a-signup-menu-root[data-email-recovery=\"true\"] .w3a-header {\n opacity: 0;\n height: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n margin-top: 0px;\n margin-bottom: 0px;\n pointer-events: none;\n}\n\n/* Adjust content area when header is hidden */\n.w3a-signup-menu-root[data-waiting=\"true\"] .w3a-content-area,\n.w3a-signup-menu-root[data-scan-device=\"true\"] .w3a-content-area {\n flex: 1 1 auto;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n/* Adjust content area when email recovery is active */\n.w3a-signup-menu-root[data-email-recovery=\"true\"] .w3a-content-area {\n flex: 1 1 auto;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n/* Specific height adjustments for different states */\n.w3a-signup-menu-root[data-waiting=\"true\"] {\n min-height: 200px;\n}\n\n.w3a-signup-menu-root[data-scan-device=\"true\"] {\n min-height: 300px;\n}\n\n.w3a-signup-menu-root[data-email-recovery=\"true\"] {\n min-height: 320px;\n}\n\n.w3a-title {\n font-size: 24px;\n font-weight: 700;\n margin: 0.5rem 0.75rem;\n}\n\n.w3a-subhead {\n font-size: 1rem;\n font-weight: 500;\n line-height: 1;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 20%);\n margin: 0;\n margin-bottom: 1rem;\n margin-left: 0.75rem;\n}\n\n/* Content switcher container */\n.w3a-content-switcher {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n /* ensure smooth height animations without spillover */\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n will-change: height;\n}\n\n/* Content area container */\n.w3a-content-area {\n position: relative;\n /* do not force-stretch; let content define intrinsic height */\n flex: 0 1 auto;\n display: flex;\n flex-direction: column;\n transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n/* Intrinsic sizer wrapper inside content area used for height measurement */\n.w3a-content-sizer {\n display: block;\n width: 100%;\n}\n\n/* Default content */\n.w3a-signin-menu {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0px;\n min-height: 250px;\n width: 100%;\n}\n\n@keyframes content-enter {\n from {\n opacity: 0;\n transform: scale(0.98) translateY(6px);\n }\n\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n/* Social providers row */\n.w3a-social-row {\n display: flex;\n gap: 8px;\n margin-bottom: var(--w3a-spacing-sm);\n}\n\n.w3a-social-btn {\n height: 48px;\n flex: 1 1 0;\n min-width: 0;\n display: grid;\n place-items: center;\n cursor: pointer;\n color: var(--w3a-colors-textSecondary, #64748b);\n overflow: hidden;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n border-radius: var(--w3a-border-radius-xl);\n /* no shadow requested */\n box-shadow: none;\n}\n\n.w3a-social-btn svg {\n color: var(--w3a-colors-textSecondary, #64748b);\n}\n\n.w3a-social-btn:hover {\n background: var(--w3a-colors-surface2);\n box-shadow: var(--w3a-shadows-sm);\n}\n\n.w3a-social-btn:hover svg {\n color: var(--w3a-colors-textPrimary, #1e293b);\n}\n\n/* Passkey row */\n.w3a-passkey-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.w3a-input-pill {\n position: relative;\n display: flex;\n flex: 1;\n align-items: center;\n padding: 0rem 1rem;\n height: 54px;\n gap: 8px;\n border: none;\n background: var(--w3a-colors-surface);\n border-radius: 2rem 2rem 2rem 2rem;\n box-shadow: none;\n overflow-x: hidden;\n transition: border-radius 150ms ease-in-out;\n}\n\n.w3a-input-pill.is-enabled {\n border-radius: 2rem 0.25rem 0.25rem 2rem;\n transition: border-radius 150ms ease-in-out;\n}\n\n.w3a-input-wrap {\n position: relative;\n flex: 1;\n height: 32px;\n display: flex;\n align-items: center;\n min-width: 0;\n /* allow input to shrink inside flex container without clipping */\n}\n\n.w3a-input {\n width: 100%;\n height: 32px;\n border: none;\n outline: none;\n background: transparent;\n color: var(--w3a-colors-textPrimary);\n font-size: 16px;\n padding: 0;\n min-width: 0;\n /* prevent overflow clipping in flex layouts */\n}\n\n/* Absolute status message anchored to bottom-right of the input area */\n.w3a-input::placeholder {\n /* Improve contrast for placeholders on dark */\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 35%);\n opacity: 0.95;\n}\n\n.w3a-postfix {\n position: absolute;\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n color: var(--w3a-colors-textSecondary);\n font-size: 16px;\n white-space: nowrap;\n pointer-events: none;\n visibility: hidden;\n /* React enables once measured */\n will-change: left;\n transition: left 32ms ease;\n}\n\n.w3a-postfix.is-existing {\n color: var(--w3a-colors-success);\n}\n\n/* On focus, keep postfix subtle for readability */\n.w3a-input:focus~.w3a-postfix {\n color: var(--w3a-colors-textMuted);\n}\n\n.w3a-arrow-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 0;\n /* hidden footprint by default */\n padding: 0;\n background: transparent;\n border: 0;\n border-radius: 2rem 0.25rem 0.25rem 2rem;\n color: #fff;\n line-height: 0;\n cursor: pointer;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n margin-left: -1rem;\n z-index: 1;\n border: 6px solid var(--w3a-colors-colorBackground, #fff);\n height: 64px;\n transition: transform 150ms ease,\n background-color 150ms ease,\n border-radius 150ms ease,\n opacity 150ms ease,\n width 150ms ease-in-out;\n}\n\n.w3a-arrow-btn.is-enabled {\n width: 100px;\n /* expand when enabled */\n /* Prefer themed primary; fall back to legacy then a sane default */\n background: var(--w3a-colors-primary, #2563eb);\n border-radius: 2rem;\n /* border-radius: 2rem; */\n opacity: 1;\n visibility: visible;\n pointer-events: auto;\n transition: transform 150ms ease,\n background-color 150ms ease,\n border-radius 150ms ease,\n opacity 150ms ease,\n width 150ms ease-in-out;\n}\n\n.w3a-arrow-btn.no-transition,\n.w3a-arrow-btn.no-transition.is-enabled {\n transition: none;\n}\n\n.w3a-arrow-btn .w3a-arrow-icon {\n color: #fff;\n}\n\n.w3a-arrow-btn.is-enabled:hover {\n /* transform: scale(1.02); */\n background: var(--w3a-colors-primaryHover, #1d4ed8);\n}\n\n.w3a-arrow-btn.is-enabled:active {\n transform: scale(0.96);\n}\n\n.w3a-arrow-btn:disabled {\n width: 0;\n cursor: not-allowed;\n opacity: 0.5;\n background: var(--w3a-colors-borderSecondary);\n transition: transform 150ms ease,\n background-color 150ms ease,\n border-radius 150ms ease,\n opacity 150ms ease,\n width 150ms ease-in-out;\n}\n\n.w3a-arrow-btn .w3a-arrow-label {\n margin-left: 8px;\n font-weight: 600;\n line-height: 1;\n}\n\n/* Animated arrow inside the continue button */\n.w3a-arrow-btn .stripe-arrow {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.w3a-arrow-btn .stripe-arrow>.HoverArrow {\n position: relative;\n margin-top: 0.1rem;\n margin-left: 8px;\n stroke-width: 2;\n fill: none;\n stroke: currentColor;\n}\n\n/* Horizontal line: fades in on hover of the button */\n.w3a-arrow-btn .stripe-arrow>.HoverArrow .HoverArrow__linePath {\n opacity: 0;\n transition: opacity 120ms cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n/* Chevron: nudges right and slightly scales on hover */\n.w3a-arrow-btn .stripe-arrow>.HoverArrow .HoverArrow__tipPath {\n transition: transform 120ms cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.w3a-arrow-btn.is-enabled:hover .stripe-arrow>.HoverArrow .HoverArrow__linePath,\n.w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow>.HoverArrow .HoverArrow__linePath {\n opacity: 1;\n}\n\n.w3a-arrow-btn.is-enabled:hover .stripe-arrow>.HoverArrow .HoverArrow__tipPath,\n.w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow>.HoverArrow .HoverArrow__tipPath {\n transform: translateX(3px);\n}\n\n/* Segmented control */\n.w3a-seg {\n position: relative;\n min-height: 54px;\n overflow: hidden;\n padding: 5px;\n border: none;\n background: var(--w3a-colors-surface2);\n border-radius: var(--w3a-border-radius-xl);\n}\n\n.w3a-seg-active {\n position: absolute;\n top: 5px;\n bottom: 5px;\n left: 0;\n border-radius: var(--w3a-border-radius-xl);\n transition:\n transform 320ms cubic-bezier(0.2, 0.8, 0.2, 1),\n width 220ms ease,\n opacity 150ms ease;\n will-change: transform, width;\n pointer-events: none;\n}\n\n.w3a-seg-grid {\n display: flex;\n gap: 4px;\n height: 100%;\n position: relative;\n z-index: 1;\n}\n\n.w3a-seg-btn {\n flex: 1 1 0;\n min-width: 0;\n min-height: 44px;\n border-radius: 12px;\n background: transparent;\n /* Make inactive tabs more legible and clearly tappable */\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 45%);\n font-weight: 600;\n cursor: pointer;\n border: none;\n /* Immediate taps on mobile; opt-out of double-tap zoom heuristics */\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n transition: color 200ms ease, transform 120ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n white-space: normal;\n padding: 0 14px;\n font-size: clamp(13px, 3.6vw, 15px);\n}\n\n.w3a-seg-btn:hover {\n transform: scale(1.02);\n}\n\n.w3a-seg-btn:active {\n transform: scale(0.98);\n}\n\n.w3a-seg-btn.is-active {\n color: var(--w3a-colors-textPrimary);\n}\n\n.w3a-seg-btn:focus-visible {\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--w3a-colors-focus), transparent 60%);\n}\n\n@media (max-width: 420px) {\n .w3a-signup-menu-root {\n padding: 1rem;\n padding-top: calc(1rem + 4px);\n border-radius: 2rem;\n max-width: calc(100dvw - 0.25rem);\n }\n\n @supports (width: 1dvw) {\n .w3a-signup-menu-root {\n max-width: calc(100dvw - 0.25rem);\n }\n }\n\n .w3a-title {\n font-size: 20px;\n }\n\n .w3a-subhead {\n font-size: 0.9rem;\n margin-bottom: 0.75rem;\n }\n\n .w3a-input-pill {\n height: 48px;\n }\n\n .w3a-arrow-btn {\n height: 60px;\n }\n\n .w3a-arrow-btn.is-enabled {\n width: 60px;\n }\n\n .w3a-seg {\n min-height: 48px;\n padding: 4px;\n }\n\n .w3a-seg-grid {\n gap: 3px;\n }\n\n .w3a-seg-active {\n top: 4px;\n bottom: 4px;\n }\n\n .w3a-seg-btn {\n min-height: 42px;\n padding: 0 12px;\n font-size: clamp(12px, 3.4vw, 14px);\n }\n\n .w3a-back-button {\n top: -0.5rem;\n left: -0.5rem;\n }\n}\n\n/* Waiting state */\n.w3a-waiting {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: transparent;\n text-align: center;\n min-height: 200px;\n /* Quick fade with configurable delay for smoother handoff */\n animation: content-enter 200ms ease-out;\n animation-delay: var(--w3a-waiting-delay, 0ms);\n animation-fill-mode: both;\n}\n\n.w3a-waiting-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.w3a-waiting-text {\n font-size: 18px;\n font-weight: 600;\n}\n\n.w3a-waiting-subtext {\n font-size: 12px;\n font-weight: 500;\n line-height: 1.35;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);\n}\n\n.w3a-waiting-sdk-events {\n font-size: 11px;\n font-weight: 500;\n line-height: 1.35;\n white-space: pre-wrap;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 15%);\n}\n\n.w3a-spinner {\n width: 36px;\n height: 36px;\n border-radius: 999px;\n border: 3px solid rgba(255, 255, 255, 0.15);\n border-top-color: var(--w3a-colors-primary);\n animation: w3a-spin 0.9s linear infinite;\n}\n\n/* Scan device content wrapper */\n.w3a-scan-device-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: transparent;\n text-align: center;\n min-height: 300px;\n width: 100%;\n overflow: hidden;\n animation: content-enter 240ms ease-out;\n animation-fill-mode: both;\n}\n\n/* Ensure QR code content stays within bounds */\n.w3a-scan-device-content .qr-code-container,\n.w3a-scan-device-content .qr-modal-backdrop,\n.w3a-scan-device-content .qr-modal-content {\n max-width: 100%;\n max-height: 100%;\n overflow: hidden;\n}\n\n.w3a-scan-device-content .qr-code-display {\n max-width: 280px;\n width: 100%;\n}\n\n/* Status message row */\n.w3a-status-row {\n position: absolute;\n font-size: 0.75rem;\n bottom: -10px;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.w3a-status-message {\n font-size: 11px;\n font-weight: 500;\n}\n\n/* Section divider */\n.w3a-section-divider {\n display: flex;\n align-items: center;\n margin: var(--w3a-spacing-md) 0;\n position: relative;\n}\n\n.w3a-section-divider::before,\n.w3a-section-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--w3a-colors-borderSecondary);\n}\n\n.w3a-section-divider-text {\n padding: 0 var(--w3a-spacing-sm);\n font-size: 12px;\n color: var(--w3a-colors-textSecondary);\n font-weight: 500;\n background: var(--w3a-colors-colorBackground);\n}\n\n/* Labels and helper text */\n.w3a-field-label {\n font-size: 12px;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 35%);\n margin: 6px 2px 6px;\n font-weight: 600;\n}\n\n.w3a-seg-help {\n font-size: 12px;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);\n margin: 0;\n margin-left: 0.75rem;\n}\n\n.w3a-seg-help-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 8px;\n}\n\n/* Tooltip for account existence status */\n.w3a-input-wrap .w3a-tooltip {\n position: absolute;\n right: 0;\n padding: 4px 8px;\n border-radius: 1rem;\n font-size: 0.7rem;\n background: var(--w3a-colors-surface2);\n color: var(--w3a-colors-textPrimary);\n opacity: 0;\n transform: translateX(50px) scale(0.9);\n pointer-events: none;\n transition: opacity 180ms ease, transform 200ms ease;\n z-index: 2;\n}\n\n.w3a-input-wrap .w3a-tooltip.is-visible {\n opacity: 0.8;\n transform: translateX(0px) scale(1);\n}\n\n.w3a-input-wrap .w3a-tooltip.is-error {\n color: var(--w3a-colors-error);\n background: var(--w3a-colors-colorBackground);\n /* background: color-mix(in srgb, var(--w3a-colors-error), transparent 90%); */\n}\n\n.w3a-input-wrap .w3a-tooltip.is-success {\n color: var(--w3a-colors-blue400);\n background: var(--w3a-colors-colorBackground);\n /* background: color-mix(in srgb, var(--w3a-colors-blue400), transparent 90%); */\n}\n\n@keyframes w3a-spin {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes w3a-ellipsis-dot {\n\n 0%,\n 80%,\n 100% {\n opacity: 0;\n }\n\n 40% {\n opacity: 1;\n }\n}\n\n.w3a-ellipsis {\n display: inline-block;\n}\n\n.w3a-ellipsis-dot {\n display: inline-block;\n opacity: 0;\n animation: w3a-ellipsis-dot 1.2s infinite;\n}\n\n.w3a-ellipsis-dot:nth-child(2) {\n animation-delay: 0.15s;\n}\n\n.w3a-ellipsis-dot:nth-child(3) {\n animation-delay: 0.3s;\n}\n\n/* Pop/bounce-in animation (kept for legacy classes) */\n@keyframes w3a-input-msg-pop {\n 0% {\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n }\n\n 60% {\n opacity: 1;\n transform: translateY(-2px) scale(1.02);\n }\n\n 100% {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .w3a-input-msg.is-error {\n animation: none;\n }\n\n .w3a-ellipsis-dot {\n animation: none;\n opacity: 1;\n }\n}\n\n/* Button System */\n.w3a-scan-device-row {}\n\n.w3a-secondary-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.w3a-link-device-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n overflow: hidden;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n height: 48px;\n width: 100%;\n max-width: 100%;\n background: var(--w3a-colors-surface) !important;\n border: 1px solid var(--w3a-colors-borderPrimary);\n border-radius: 2rem;\n cursor: pointer;\n color: var(--w3a-colors-textPrimary);\n font-family: var(--w3a-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);\n font-weight: 500;\n font-size: 0.875rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Hover/focus elevated state (theme-reactive via CSS vars) */\n.w3a-link-device-btn:hover:not(:disabled),\n.w3a-link-device-btn:focus-visible {\n background: var(--w3a-colors-surface2) !important;\n}\n\n.w3a-link-device-btn-primary {\n background: var(--w3a-colors-buttonBackground, var(--w3a-colors-primary, #3b82f6)) !important;\n border-color: transparent;\n border-radius: 2rem;\n color: var(--w3a-colors-textButton, white);\n}\n\n.w3a-link-device-btn-primary:hover:not(:disabled),\n.w3a-link-device-btn-primary:focus-visible {\n background: var(--w3a-colors-buttonHoverBackground, var(--w3a-colors-primaryHover, #2563eb)) !important;\n color: var(--w3a-colors-textButton, white);\n}\n\n.w3a-link-device-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* Button-local spinner: match text size inside buttons */\n.w3a-link-device-btn .w3a-spinner {\n width: 1em;\n height: 1em;\n border-width: 2px;\n}\n\n.w3a-link-device-btn-primary .w3a-spinner {\n border-color: rgba(255, 255, 255, 0.35);\n border-top-color: #ffffff;\n}\n\n/* Email recovery slide */\n.w3a-email-recovery-content {\n width: 100%;\n padding-top: 1rem;\n}\n\n.w3a-email-recovery-slide {\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 260px;\n animation: content-enter 240ms ease-out;\n animation-fill-mode: both;\n}\n\n.w3a-email-recovery-title {\n font-size: 20px;\n font-weight: 700;\n margin: 0.5rem 0.5rem;\n display: flex;\n justify-content: center;\n}\n\n.w3a-email-recovery-help {\n font-size: 0.95rem;\n line-height: 1.2;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 20%);\n margin: 0 0.25rem;\n}\n\n.w3a-email-recovery-meta {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n padding: 0 0.25rem;\n font-size: 0.85rem;\n}\n\n.w3a-email-recovery-meta-label {\n opacity: 0.85;\n}\n\n.w3a-email-recovery-meta-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 0.85rem;\n opacity: 0.9;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 70%;\n text-align: right;\n}\n\n.w3a-email-recovery-input-pill {\n height: 54px;\n padding: 0 1rem;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n transition: box-shadow 160ms ease, border-color 160ms ease;\n}\n\n.w3a-email-recovery-input-pill:focus-within {\n border-color: var(--w3a-colors-primary, #3b82f6);\n}\n\n.w3a-email-recovery-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 4px;\n}\n\n.w3a-email-recovery-summary {\n font-size: 0.875rem;\n line-height: 1.2;\n padding: 0 0.25rem;\n color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 20%);\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.w3a-email-recovery-warning {\n color: color-mix(in srgb, var(--w3a-colors-error), var(--w3a-colors-textPrimary) 30%);\n}\n\n.w3a-email-recovery-from-warning {\n margin-top: 1rem;\n font-weight: 600;\n}\n\n[data-w3a-theme=\"light\"] .w3a-email-recovery-from-warning {\n color: #d80;\n}\n\n[data-w3a-theme=\"dark\"] .w3a-email-recovery-from-warning {\n color: #ea5;\n}\n\n.w3a-email-recovery-link {\n font-size: 0.875rem;\n color: var(--w3a-colors-primary, #3b82f6);\n text-decoration: none;\n padding: 0;\n}\n\n.w3a-email-recovery-link:hover {\n text-decoration: underline;\n}\n\n.w3a-email-recovery-status {\n font-size: 0.875rem;\n padding: 0.75rem 0.875rem;\n border-radius: 1rem;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface2);\n color: var(--w3a-colors-textPrimary);\n margin-bottom: 4px;\n}\n\n.w3a-email-recovery-status.is-error {\n border-color: color-mix(in srgb, var(--w3a-colors-error), var(--w3a-colors-borderPrimary) 60%);\n color: var(--w3a-colors-error);\n}\n\n.w3a-email-recovery-elapsed {\n margin-left: 6px;\n opacity: 0.75;\n}\n\n.w3a-email-recovery-saved-emails {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.w3a-email-recovery-email-chip {\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n color: var(--w3a-colors-textPrimary);\n padding: 6px 10px;\n border-radius: 999px;\n font-size: 0.85rem;\n cursor: pointer;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.w3a-email-recovery-email-chip-static {\n cursor: default;\n}\n\n.w3a-email-recovery-email-chip:hover:not(:disabled) {\n background: var(--w3a-colors-surface2);\n}\n\n.w3a-email-recovery-email-chip:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.w3a-email-recovery-toast {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0.75rem 0.875rem;\n border-radius: 1rem;\n border: 1px solid var(--w3a-colors-borderPrimary);\n background: var(--w3a-colors-surface);\n font-size: 0.875rem;\n color: var(--w3a-colors-textPrimary);\n}\n\n.w3a-email-recovery-toast a {\n color: var(--w3a-colors-primary, #3b82f6);\n text-decoration: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n}\n\n.w3a-email-recovery-toast a:hover {\n text-decoration: underline;\n}\n\n.w3a-email-recovery-toast-close {\n margin-left: auto;\n width: 28px;\n height: 28px;\n border-radius: 999px;\n border: none;\n background: transparent;\n color: var(--w3a-colors-textSecondary);\n cursor: pointer;\n display: grid;\n place-items: center;\n}\n\n.w3a-email-recovery-toast-close:hover {\n background: var(--w3a-colors-surface2);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA"}
@@ -1,14 +1,13 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
  const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.js');
3
3
  const require_SegmentedControl = require('./ui/SegmentedControl.js');
4
- require('./PasskeyAuthMenu.js');
5
- const require_authMenuTypes = require('./authMenuTypes.js');
6
4
  const require_ArrowLeft = require('./ui/icons/ArrowLeft.js');
7
5
  const require_Mail = require('./ui/icons/Mail.js');
6
+ const require_QRCodeIcon = require('../QRCodeIcon.js');
7
+ const require_authMenuTypes = require('./authMenuTypes.js');
8
8
  const require_PasskeyInput = require('./ui/PasskeyInput.js');
9
9
  const require_ContentSwitcher = require('./ui/ContentSwitcher.js');
10
10
  const require_EmailRecoverySlide = require('./ui/EmailRecoverySlide.js');
11
- const require_QRCodeIcon = require('../QRCodeIcon.js');
12
11
  const require_tatchi = require('./adapters/tatchi.js');
13
12
  const require_usePasskeyAuthMenuController = require('./controller/usePasskeyAuthMenuController.js');
14
13
  const require_useSDKEvents = require('./controller/useSDKEvents.js');
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["React","PasskeyAuthMenuClient: React.FC<PasskeyAuthMenuProps>","usePasskeyAuthMenuRuntime","useSDKEvents","usePasskeyAuthMenuController","AuthMenuMode","ContentSwitcher","ArrowLeftIcon","EmailRecoverySlide","PasskeyInput","SegmentedControl","QRCodeIcon","MailIcon"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/client.tsx"],"sourcesContent":["import React from 'react';\nimport { ArrowLeftIcon, MailIcon } from './ui/icons';\nimport { SegmentedControl } from './ui/SegmentedControl';\nimport { PasskeyInput } from './ui/PasskeyInput';\nimport { ContentSwitcher } from './ui/ContentSwitcher';\nimport { EmailRecoverySlide } from './ui/EmailRecoverySlide';\nimport QRCodeIcon from '../QRCodeIcon';\nimport { AuthMenuMode, type PasskeyAuthMenuProps } from './types';\nimport './PasskeyAuthMenu.css';\nimport { usePasskeyAuthMenuRuntime } from './adapters/tatchi';\nimport { usePasskeyAuthMenuController } from './controller/usePasskeyAuthMenuController';\nimport { useSDKEvents } from './controller/useSDKEvents';\n\ntype CSSVarStyle = React.CSSProperties & {\n [key: `--${string}`]: string | number | undefined;\n};\n\nconst LazyShowQRCode = React.lazy(() =>\n import('../ShowQRCode').then((m) => ({ default: m.ShowQRCode })),\n);\n\nconst preloadShowQRCode = () => import('../ShowQRCode').then(() => undefined);\n\nexport const PasskeyAuthMenuClient: React.FC<PasskeyAuthMenuProps> = ({\n onLogin,\n onRegister,\n onSyncAccount,\n linkDeviceOptions,\n emailRecoveryOptions,\n header,\n defaultMode,\n style,\n className,\n socialLogin,\n loadingScreenDelayMs,\n headings,\n showSDKEvents = false,\n}) => {\n const runtime = usePasskeyAuthMenuRuntime();\n const { withSdkEventsHandler } = useSDKEvents({ sdkFlow: runtime.sdkFlow });\n\n const onLoginWithSDKEvents = React.useMemo(\n () => withSdkEventsHandler('login', onLogin, 60_000),\n [onLogin, withSdkEventsHandler],\n );\n const onRegisterWithSDKEvents = React.useMemo(\n () => withSdkEventsHandler('register', onRegister, 90_000),\n [onRegister, withSdkEventsHandler],\n );\n const onSyncWithSDKEvents = React.useMemo(\n () => withSdkEventsHandler('sync', onSyncAccount, 120_000),\n [onSyncAccount, withSdkEventsHandler],\n );\n\n const controller = usePasskeyAuthMenuController(\n {\n onLogin: onLoginWithSDKEvents,\n onRegister: onRegisterWithSDKEvents,\n onSyncAccount: onSyncWithSDKEvents,\n defaultMode,\n headings,\n linkDeviceOptions,\n },\n runtime,\n );\n\n const prefetchQRCode = React.useCallback(() => {\n void preloadShowQRCode().catch(() => {});\n }, []);\n\n const segActiveBg = 'var(--w3a-passkey-auth-menu2-seg-active-bg)';\n\n const rootStyle = React.useMemo<CSSVarStyle>(\n () => ({\n ...style,\n ...(loadingScreenDelayMs != null ? { '--w3a-waiting-delay': `${loadingScreenDelayMs}ms` } : null),\n }),\n [loadingScreenDelayMs, style],\n );\n\n const waitingSDKEventsText = React.useMemo(() => {\n if (!showSDKEvents) return '';\n if (\n controller.mode !== AuthMenuMode.Register &&\n controller.mode !== AuthMenuMode.Login &&\n controller.mode !== AuthMenuMode.Sync\n ) {\n return '';\n }\n const text = runtime.sdkFlow.eventsText?.trim() ?? '';\n if (text.length > 0) {\n const lastLine = text.split('\\n').filter(Boolean).slice(-1)[0] ?? '';\n return lastLine;\n }\n return controller.waiting ? 'Awaiting SDK events…' : '';\n }, [controller.mode, controller.waiting, runtime.sdkFlow.eventsText, showSDKEvents]);\n\n return (\n <div\n className={`w3a-signup-menu-root${className ? ` ${className}` : ''}`}\n data-mode={controller.mode}\n data-waiting={controller.waiting}\n data-scan-device={controller.showScanDevice}\n data-email-recovery={controller.showEmailRecovery}\n style={rootStyle}\n >\n <ContentSwitcher\n waiting={controller.waiting}\n waitingText={\n controller.mode === AuthMenuMode.Register\n ? 'Registering passkey…'\n : controller.mode === AuthMenuMode.Sync\n ? 'Syncing account…'\n : 'Waiting for Passkey…'\n }\n waitingSDKEventsText={waitingSDKEventsText}\n backButton={\n <button\n aria-label=\"Back\"\n onClick={() => {\n if (controller.showEmailRecovery) {\n controller.closeEmailRecovery();\n return;\n }\n controller.onResetToStart();\n }}\n className={`w3a-back-button${controller.waiting || controller.showScanDevice || controller.showEmailRecovery ? ' is-visible' : ''}`}\n >\n <ArrowLeftIcon size={18} strokeWidth={2.25} style={{ display: 'block' }} />\n </button>\n }\n showScanDevice={controller.showScanDevice}\n showQRCodeElement={\n <React.Suspense fallback={<div className=\"qr-loading\"><p>Loading QR…</p></div>}>\n <LazyShowQRCode\n isOpen={controller.linkDevice.isOpen}\n onClose={controller.linkDevice.onClose}\n onEvent={controller.linkDevice.onEvent}\n onError={controller.linkDevice.onError}\n />\n </React.Suspense>\n }\n showEmailRecovery={controller.showEmailRecovery}\n emailRecoveryElement={\n <EmailRecoverySlide\n tatchiPasskey={runtime.tatchiPasskey}\n accountId={runtime.targetAccountId}\n refreshLoginState={runtime.refreshLoginState}\n emailRecoveryOptions={emailRecoveryOptions}\n />\n }\n >\n <div className=\"w3a-header\">\n {header ?? (\n <div>\n <div className=\"w3a-title\">{controller.title.title}</div>\n <div className=\"w3a-subhead\">{controller.title.subtitle}</div>\n </div>\n )}\n </div>\n\n <PasskeyInput\n value={controller.currentValue}\n onChange={controller.onInputChange}\n placeholder={\n controller.mode === AuthMenuMode.Register\n ? 'Pick a username'\n : controller.mode === AuthMenuMode.Sync\n ? 'Leave blank to discover accounts'\n : 'Enter your username'\n }\n postfixText={controller.postfixText}\n isUsingExistingAccount={controller.isUsingExistingAccount}\n canProceed={controller.canShowContinue}\n onProceed={controller.onProceed}\n mode={controller.mode}\n secure={controller.secure}\n waiting={controller.waiting}\n />\n\n <SegmentedControl\n items={[\n { value: AuthMenuMode.Register, label: 'Register', className: 'register' },\n { value: AuthMenuMode.Login, label: 'Login', className: 'login' },\n { value: AuthMenuMode.Sync, label: 'Sync', className: 'sync' },\n ]}\n value={controller.mode}\n onValueChange={(v) => controller.onSegmentChange(v as AuthMenuMode)}\n activeBg={segActiveBg}\n />\n\n <div className=\"w3a-seg-help-row\">\n <div className=\"w3a-seg-help\" aria-live=\"polite\">\n {controller.mode === AuthMenuMode.Login && 'Sign in with your passkey'}\n {controller.mode === AuthMenuMode.Register && 'Create a new account'}\n {controller.mode === AuthMenuMode.Sync && 'Sync account (iCloud/Chrome sync)'}\n </div>\n </div>\n\n <div className=\"w3a-scan-device-row\">\n <div className=\"w3a-section-divider\">\n <span className=\"w3a-section-divider-text\">Already have an account?</span>\n </div>\n <div className=\"w3a-secondary-actions\">\n <button\n onClick={controller.openScanDevice}\n onPointerEnter={prefetchQRCode}\n onFocus={prefetchQRCode}\n onTouchStart={prefetchQRCode}\n className=\"w3a-link-device-btn\"\n >\n <QRCodeIcon width={18} height={18} strokeWidth={2} />\n Scan and Link Device\n </button>\n <button\n onClick={controller.openEmailRecovery}\n className=\"w3a-link-device-btn\"\n >\n <MailIcon size={18} strokeWidth={2} style={{ display: 'block' }} />\n Recover Account with Email\n </button>\n </div>\n </div>\n </ContentSwitcher>\n </div>\n );\n};\n\nexport default PasskeyAuthMenuClient;\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["React","PasskeyAuthMenuClient: React.FC<PasskeyAuthMenuProps>","usePasskeyAuthMenuRuntime","useSDKEvents","usePasskeyAuthMenuController","AuthMenuMode","ContentSwitcher","ArrowLeftIcon","EmailRecoverySlide","PasskeyInput","SegmentedControl","QRCodeIcon","MailIcon"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/client.tsx"],"sourcesContent":["import React from 'react';\nimport { ArrowLeftIcon, MailIcon } from './ui/icons';\nimport { SegmentedControl } from './ui/SegmentedControl';\nimport { PasskeyInput } from './ui/PasskeyInput';\nimport { ContentSwitcher } from './ui/ContentSwitcher';\nimport { EmailRecoverySlide } from './ui/EmailRecoverySlide';\nimport QRCodeIcon from '../QRCodeIcon';\nimport { AuthMenuMode, type PasskeyAuthMenuProps } from './types';\nimport { usePasskeyAuthMenuRuntime } from './adapters/tatchi';\nimport { usePasskeyAuthMenuController } from './controller/usePasskeyAuthMenuController';\nimport { useSDKEvents } from './controller/useSDKEvents';\n\ntype CSSVarStyle = React.CSSProperties & {\n [key: `--${string}`]: string | number | undefined;\n};\n\nconst LazyShowQRCode = React.lazy(() =>\n import('../ShowQRCode').then((m) => ({ default: m.ShowQRCode })),\n);\n\nconst preloadShowQRCode = () => import('../ShowQRCode').then(() => undefined);\n\nexport const PasskeyAuthMenuClient: React.FC<PasskeyAuthMenuProps> = ({\n onLogin,\n onRegister,\n onSyncAccount,\n linkDeviceOptions,\n emailRecoveryOptions,\n header,\n defaultMode,\n style,\n className,\n socialLogin,\n loadingScreenDelayMs,\n headings,\n showSDKEvents = false,\n}) => {\n const runtime = usePasskeyAuthMenuRuntime();\n const { withSdkEventsHandler } = useSDKEvents({ sdkFlow: runtime.sdkFlow });\n\n const onLoginWithSDKEvents = React.useMemo(\n () => withSdkEventsHandler('login', onLogin, 60_000),\n [onLogin, withSdkEventsHandler],\n );\n const onRegisterWithSDKEvents = React.useMemo(\n () => withSdkEventsHandler('register', onRegister, 90_000),\n [onRegister, withSdkEventsHandler],\n );\n const onSyncWithSDKEvents = React.useMemo(\n () => withSdkEventsHandler('sync', onSyncAccount, 120_000),\n [onSyncAccount, withSdkEventsHandler],\n );\n\n const controller = usePasskeyAuthMenuController(\n {\n onLogin: onLoginWithSDKEvents,\n onRegister: onRegisterWithSDKEvents,\n onSyncAccount: onSyncWithSDKEvents,\n defaultMode,\n headings,\n linkDeviceOptions,\n },\n runtime,\n );\n\n const prefetchQRCode = React.useCallback(() => {\n void preloadShowQRCode().catch(() => { });\n }, []);\n\n const segActiveBg = 'var(--w3a-passkey-auth-menu2-seg-active-bg)';\n\n const rootStyle = React.useMemo<CSSVarStyle>(\n () => ({\n ...style,\n ...(loadingScreenDelayMs != null ? { '--w3a-waiting-delay': `${loadingScreenDelayMs}ms` } : null),\n }),\n [loadingScreenDelayMs, style],\n );\n\n const waitingSDKEventsText = React.useMemo(() => {\n if (!showSDKEvents) return '';\n if (\n controller.mode !== AuthMenuMode.Register &&\n controller.mode !== AuthMenuMode.Login &&\n controller.mode !== AuthMenuMode.Sync\n ) {\n return '';\n }\n const text = runtime.sdkFlow.eventsText?.trim() ?? '';\n if (text.length > 0) {\n const lastLine = text.split('\\n').filter(Boolean).slice(-1)[0] ?? '';\n return lastLine;\n }\n return controller.waiting ? 'Awaiting SDK events…' : '';\n }, [controller.mode, controller.waiting, runtime.sdkFlow.eventsText, showSDKEvents]);\n\n return (\n <div\n className={`w3a-signup-menu-root${className ? ` ${className}` : ''}`}\n data-mode={controller.mode}\n data-waiting={controller.waiting}\n data-scan-device={controller.showScanDevice}\n data-email-recovery={controller.showEmailRecovery}\n style={rootStyle}\n >\n <ContentSwitcher\n waiting={controller.waiting}\n waitingText={\n controller.mode === AuthMenuMode.Register\n ? 'Registering passkey…'\n : controller.mode === AuthMenuMode.Sync\n ? 'Syncing account…'\n : 'Waiting for Passkey…'\n }\n waitingSDKEventsText={waitingSDKEventsText}\n backButton={\n <button\n aria-label=\"Back\"\n onClick={() => {\n if (controller.showEmailRecovery) {\n controller.closeEmailRecovery();\n return;\n }\n controller.onResetToStart();\n }}\n className={`w3a-back-button${controller.waiting || controller.showScanDevice || controller.showEmailRecovery ? ' is-visible' : ''}`}\n >\n <ArrowLeftIcon size={18} strokeWidth={2.25} style={{ display: 'block' }} />\n </button>\n }\n showScanDevice={controller.showScanDevice}\n showQRCodeElement={\n <React.Suspense fallback={<div className=\"qr-loading\"><p>Loading QR…</p></div>}>\n <LazyShowQRCode\n isOpen={controller.linkDevice.isOpen}\n onClose={controller.linkDevice.onClose}\n onEvent={controller.linkDevice.onEvent}\n onError={controller.linkDevice.onError}\n />\n </React.Suspense>\n }\n showEmailRecovery={controller.showEmailRecovery}\n emailRecoveryElement={\n <EmailRecoverySlide\n tatchiPasskey={runtime.tatchiPasskey}\n accountId={runtime.targetAccountId}\n refreshLoginState={runtime.refreshLoginState}\n emailRecoveryOptions={emailRecoveryOptions}\n />\n }\n >\n <div className=\"w3a-header\">\n {header ?? (\n <div>\n <div className=\"w3a-title\">{controller.title.title}</div>\n <div className=\"w3a-subhead\">{controller.title.subtitle}</div>\n </div>\n )}\n </div>\n\n <PasskeyInput\n value={controller.currentValue}\n onChange={controller.onInputChange}\n placeholder={\n controller.mode === AuthMenuMode.Register\n ? 'Pick a username'\n : controller.mode === AuthMenuMode.Sync\n ? 'Leave blank to discover accounts'\n : 'Enter your username'\n }\n postfixText={controller.postfixText}\n isUsingExistingAccount={controller.isUsingExistingAccount}\n canProceed={controller.canShowContinue}\n onProceed={controller.onProceed}\n mode={controller.mode}\n secure={controller.secure}\n waiting={controller.waiting}\n />\n\n <SegmentedControl\n items={[\n { value: AuthMenuMode.Register, label: 'Register', className: 'register' },\n { value: AuthMenuMode.Login, label: 'Login', className: 'login' },\n { value: AuthMenuMode.Sync, label: 'Sync', className: 'sync' },\n ]}\n value={controller.mode}\n onValueChange={(v) => controller.onSegmentChange(v as AuthMenuMode)}\n activeBg={segActiveBg}\n />\n\n <div className=\"w3a-seg-help-row\">\n <div className=\"w3a-seg-help\" aria-live=\"polite\">\n {controller.mode === AuthMenuMode.Login && 'Sign in with your passkey'}\n {controller.mode === AuthMenuMode.Register && 'Create a new account'}\n {controller.mode === AuthMenuMode.Sync && 'Sync account (iCloud/Chrome sync)'}\n </div>\n </div>\n\n <div className=\"w3a-scan-device-row\">\n <div className=\"w3a-section-divider\">\n <span className=\"w3a-section-divider-text\">Already have an account?</span>\n </div>\n <div className=\"w3a-secondary-actions\">\n <button\n onClick={controller.openScanDevice}\n onPointerEnter={prefetchQRCode}\n onFocus={prefetchQRCode}\n onTouchStart={prefetchQRCode}\n className=\"w3a-link-device-btn\"\n >\n <QRCodeIcon width={18} height={18} strokeWidth={2} />\n Scan and Link Device\n </button>\n <button\n onClick={controller.openEmailRecovery}\n className=\"w3a-link-device-btn\"\n >\n <MailIcon size={18} strokeWidth={2} style={{ display: 'block' }} />\n Recover Account with Email\n </button>\n </div>\n </div>\n </ContentSwitcher>\n </div>\n );\n};\n\nexport default PasskeyAuthMenuClient;\n"],"mappings":"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"}