@rhinestone/deposit-modal 0.3.0-alpha.12 → 0.3.0-alpha.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.
Files changed (31) hide show
  1. package/README.md +59 -0
  2. package/dist/{DepositModalReown-EC4DJ3EC.cjs → DepositModalReown-4I47KSPN.cjs} +6 -6
  3. package/dist/{DepositModalReown-QOTUF4JC.mjs → DepositModalReown-DIUIB3MU.mjs} +3 -3
  4. package/dist/{QRCode-KG47KTGX.cjs → QRCode-5DXFNKI2.cjs} +1 -1
  5. package/dist/{QRCode-YJ3EGWQS.mjs → QRCode-WUC652SH.mjs} +1 -1
  6. package/dist/{WithdrawModalReown-QEQPCSWT.mjs → WithdrawModalReown-WRUEALDP.mjs} +3 -3
  7. package/dist/{WithdrawModalReown-Z5JVENP6.cjs → WithdrawModalReown-Y3NRAKXJ.cjs} +6 -6
  8. package/dist/{chunk-YI63OMXN.cjs → chunk-2NUXDEEO.cjs} +57 -57
  9. package/dist/{chunk-I5G5ULRP.cjs → chunk-3CYGTYMY.cjs} +1322 -320
  10. package/dist/{chunk-WVE3JN3C.mjs → chunk-4ZN726P5.mjs} +345 -54
  11. package/dist/{chunk-QXIJLRKC.mjs → chunk-JTMGFWXO.mjs} +1 -1
  12. package/dist/{chunk-FGVSNARE.cjs → chunk-JTULAFMU.cjs} +2 -2
  13. package/dist/{chunk-2TWQGPPB.cjs → chunk-N4XRQPVA.cjs} +374 -83
  14. package/dist/{chunk-7MZNQ4C2.mjs → chunk-VD4WTEHP.mjs} +2 -2
  15. package/dist/{chunk-HR6BABPX.mjs → chunk-XG474KUR.mjs} +1433 -431
  16. package/dist/deposit.cjs +3 -3
  17. package/dist/deposit.d.cts +2 -2
  18. package/dist/deposit.d.ts +2 -2
  19. package/dist/deposit.mjs +2 -2
  20. package/dist/index.cjs +4 -4
  21. package/dist/index.d.cts +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.mjs +3 -3
  24. package/dist/styles.css +525 -66
  25. package/dist/{types-D6wrO4Ow.d.cts → types-C8i2ebY1.d.cts} +25 -0
  26. package/dist/{types-D6wrO4Ow.d.ts → types-C8i2ebY1.d.ts} +25 -0
  27. package/dist/withdraw.cjs +3 -3
  28. package/dist/withdraw.d.cts +2 -2
  29. package/dist/withdraw.d.ts +2 -2
  30. package/dist/withdraw.mjs +2 -2
  31. package/package.json +3 -3
package/dist/styles.css CHANGED
@@ -284,6 +284,11 @@
284
284
  /* Cap the modal at 600px (or viewport-40 on tiny screens) so long lists
285
285
  scroll inside instead of growing the modal. */
286
286
  max-height: min(600px, calc(100vh - 40px));
287
+ /* Explicit 0 (not the `auto` default) so the min-height transition
288
+ below has a definite starting value when :has() rules later raise
289
+ it to the iframe-mounted height. Transitions from `auto` are
290
+ unreliable in browsers and tend to apply instantly. */
291
+ min-height: 0;
287
292
  display: flex;
288
293
  flex-direction: column;
289
294
  margin: 20px;
@@ -292,7 +297,18 @@
292
297
  border: 1px solid var(--rs-border);
293
298
  border-radius: var(--rs-radius-lg);
294
299
  transform: scale(0.95);
295
- transition: transform 0.2s ease;
300
+ transition:
301
+ transform 0.2s ease,
302
+ /* Smooth resize when the user moves between steps with different
303
+ widths (e.g. ConnectStep 400 → Connect-via-Swapped 469) instead of
304
+ a hard pop. */
305
+ max-width 240ms cubic-bezier(0.22, 1, 0.36, 1),
306
+ /* Same for height: when a flow starts that pre-reserves the iframe
307
+ size (via the min-height :has() rules below), grow smoothly from
308
+ the previous step's height instead of jumping. Min-height is on
309
+ modal-content rather than modal-body so the transitioned property
310
+ lives on an element that survives step swaps. */
311
+ min-height 280ms cubic-bezier(0.22, 1, 0.36, 1);
296
312
  }
297
313
 
298
314
  .rs-modal-content[data-theme="dark"] {
@@ -375,21 +391,17 @@
375
391
  padding-inline: 16px;
376
392
  }
377
393
 
378
- .rs-modal-body::-webkit-scrollbar {
379
- width: 6px;
380
- }
381
-
382
- .rs-modal-body::-webkit-scrollbar-track {
383
- background: transparent;
384
- }
385
-
386
- .rs-modal-body::-webkit-scrollbar-thumb {
387
- background-color: var(--rs-surface-hover);
388
- border-radius: var(--rs-radius-full);
394
+ /* Scrollbars are hidden throughout the modal UI. The portfolio list
395
+ (.rs-asset-list) is the sole exception — it keeps a visible scrollbar since
396
+ it's a long, independently-scrolling list. The :not() exemption also keeps
397
+ this rule's specificity above the per-container scrollbar rules elsewhere. */
398
+ .rs-modal *:not(.rs-asset-list) {
399
+ scrollbar-width: none;
389
400
  }
390
401
 
391
- .rs-modal-body::-webkit-scrollbar-thumb:hover {
392
- background-color: var(--rs-muted-foreground);
402
+ .rs-modal *:not(.rs-asset-list)::-webkit-scrollbar {
403
+ width: 0;
404
+ height: 0;
393
405
  }
394
406
 
395
407
  /* =============================================================================
@@ -1095,7 +1107,10 @@
1095
1107
  display: flex;
1096
1108
  flex-direction: column;
1097
1109
  gap: 4px;
1098
- max-height: 320px;
1110
+ /* Figma's asset list is 284px — exactly 4 rows (4×68 + 3×4 gaps). Cap here
1111
+ so wallets with many assets scroll inside instead of growing the modal
1112
+ past the design's height. */
1113
+ max-height: 284px;
1099
1114
  overflow-y: auto;
1100
1115
  overscroll-behavior: contain;
1101
1116
  /* Pull rows back to the row's natural left edge inside a scrollable
@@ -1300,6 +1315,11 @@
1300
1315
  justify-content: center;
1301
1316
  gap: 4px;
1302
1317
  width: 100%;
1318
+ /* `border-box` so the 16px side padding counts INTO the 100% width
1319
+ instead of adding 32px on top of it (which otherwise pushes the
1320
+ footer past containers with their own horizontal padding — e.g.
1321
+ the tracker — and paints a phantom horizontal scrollbar). */
1322
+ box-sizing: border-box;
1303
1323
  padding: 0 16px 16px;
1304
1324
  font-size: 11px;
1305
1325
  font-weight: 500;
@@ -1660,6 +1680,21 @@
1660
1680
  manages the vertical rhythm between body slot and powered-by. */
1661
1681
  padding: 0;
1662
1682
  gap: 16px;
1683
+ /* Each screen fades in on mount so step-to-step transitions feel
1684
+ progressive instead of a hard swap. Short enough that the user
1685
+ doesn't perceive a delay; long enough to look intentional. */
1686
+ animation: rs-screen-enter 180ms ease-out;
1687
+ }
1688
+
1689
+ @keyframes rs-screen-enter {
1690
+ from {
1691
+ opacity: 0;
1692
+ transform: translateY(4px);
1693
+ }
1694
+ to {
1695
+ opacity: 1;
1696
+ transform: translateY(0);
1697
+ }
1663
1698
  }
1664
1699
 
1665
1700
  /* Body slot — direct child of .rs-screen. Always uses a 16px internal
@@ -2968,11 +3003,13 @@
2968
3003
  align-items: center;
2969
3004
  justify-content: space-between;
2970
3005
  gap: 6px;
3006
+ white-space: nowrap;
2971
3007
  }
2972
3008
 
2973
3009
  .rs-deposit-address-min {
2974
3010
  display: inline-flex;
2975
3011
  align-items: center;
3012
+ flex-shrink: 0;
2976
3013
  gap: 4px;
2977
3014
  font-size: 11px;
2978
3015
  font-weight: 500;
@@ -2980,8 +3017,8 @@
2980
3017
  }
2981
3018
 
2982
3019
  .rs-deposit-address-min-icon {
2983
- width: 16px;
2984
- height: 16px;
3020
+ width: 12px;
3021
+ height: 12px;
2985
3022
  flex-shrink: 0;
2986
3023
  color: var(--rs-icon-secondary);
2987
3024
  }
@@ -3005,6 +3042,7 @@
3005
3042
  border: none;
3006
3043
  cursor: pointer;
3007
3044
  font-family: inherit;
3045
+ line-height: normal;
3008
3046
  color: var(--rs-muted);
3009
3047
  text-align: left;
3010
3048
  }
@@ -3166,7 +3204,10 @@
3166
3204
  align-items: center;
3167
3205
  gap: 8px;
3168
3206
  width: 100%;
3169
- padding: 12px;
3207
+ /* 11px vertical (not 12) so the 1px border lands the input at Figma's
3208
+ 48px total height — Figma draws the stroke inside the box, CSS adds it
3209
+ outside. Horizontal stays 12px to match the design. */
3210
+ padding: 11px 12px;
3170
3211
  background: var(--rs-surface-subtle);
3171
3212
  border-radius: 8px;
3172
3213
  border: 1px solid var(--rs-surface-subtle);
@@ -3274,39 +3315,18 @@
3274
3315
  border-radius: 8px;
3275
3316
  }
3276
3317
 
3277
- /* Mid-refetch: dim the address/QR and block interaction so a stale
3278
- registration can't be copied or scanned until setup is ready again. */
3279
- .rs-deposit-address-well--updating {
3280
- opacity: 0.4;
3281
- pointer-events: none;
3282
- filter: grayscale(0.3);
3283
- transition: opacity 0.15s;
3284
- }
3285
-
3286
- .rs-deposit-address-updating {
3287
- display: flex;
3288
- align-items: center;
3289
- justify-content: center;
3290
- gap: 8px;
3291
- width: 100%;
3292
- padding: 10px 12px;
3293
- font-size: 14px;
3294
- font-weight: 500;
3295
- color: var(--rs-muted);
3296
- }
3297
-
3298
3318
  .rs-deposit-address-qr {
3299
3319
  display: flex;
3300
3320
  align-items: center;
3301
3321
  justify-content: center;
3302
- padding: 12px;
3322
+ padding: 16px;
3303
3323
  }
3304
3324
 
3305
3325
  .rs-deposit-address-qr canvas,
3306
3326
  .rs-deposit-address-qr svg {
3307
3327
  display: block;
3308
- width: 200px;
3309
- height: 200px;
3328
+ width: 190px;
3329
+ height: 190px;
3310
3330
  }
3311
3331
 
3312
3332
  .rs-deposit-address-value {
@@ -3348,8 +3368,8 @@
3348
3368
  }
3349
3369
 
3350
3370
  .rs-skeleton-qr {
3351
- width: 200px;
3352
- height: 200px;
3371
+ width: 190px;
3372
+ height: 190px;
3353
3373
  }
3354
3374
 
3355
3375
  .rs-skeleton-address {
@@ -3381,6 +3401,7 @@
3381
3401
  color: var(--rs-foreground);
3382
3402
  font-size: 14px;
3383
3403
  font-weight: 500;
3404
+ line-height: normal;
3384
3405
  font-family: inherit;
3385
3406
  cursor: pointer;
3386
3407
  transition: background-color 0.15s;
@@ -3485,8 +3506,8 @@
3485
3506
  .rs-deposit-notifications {
3486
3507
  position: absolute;
3487
3508
  bottom: 12px;
3488
- left: 12px;
3489
- right: 12px;
3509
+ left: 0;
3510
+ right: 0;
3490
3511
  z-index: 10;
3491
3512
  display: flex;
3492
3513
  flex-direction: column;
@@ -3543,7 +3564,8 @@
3543
3564
  justify-content: center;
3544
3565
  }
3545
3566
 
3546
- .rs-deposit-notification-badge svg {
3567
+ .rs-deposit-notification-badge--complete svg,
3568
+ .rs-deposit-notification-badge--failed svg {
3547
3569
  width: 20px;
3548
3570
  height: 20px;
3549
3571
  }
@@ -3563,9 +3585,29 @@
3563
3585
  color: var(--rs-icon-secondary);
3564
3586
  }
3565
3587
 
3566
- .rs-deposit-notification-badge--processing .rs-spinner {
3588
+ .rs-deposit-notification-spinner {
3567
3589
  width: 42px;
3568
3590
  height: 42px;
3591
+ animation: rs-spin 1s linear infinite;
3592
+ }
3593
+
3594
+ /* Spinner ring/arc colors flip with the theme. Light: a faint zinc-200 ring
3595
+ with a zinc-600 arc on the near-white card. Dark: the Figma values — a
3596
+ zinc-300 ring with a zinc-600 arc on the #18181b card. */
3597
+ .rs-deposit-notification-spinner-track {
3598
+ stroke: #e4e4e7;
3599
+ }
3600
+
3601
+ .rs-deposit-notification-spinner-head {
3602
+ stroke: #52525c;
3603
+ }
3604
+
3605
+ .rs-modal[data-theme="dark"] .rs-deposit-notification-spinner-track {
3606
+ stroke: #d4d4d8;
3607
+ }
3608
+
3609
+ .rs-modal[data-theme="dark"] .rs-deposit-notification-spinner-head {
3610
+ stroke: #52525c;
3569
3611
  }
3570
3612
 
3571
3613
  .rs-deposit-notification-content {
@@ -4013,23 +4055,6 @@
4013
4055
  padding-right: 2px;
4014
4056
  }
4015
4057
 
4016
- .rs-history-list::-webkit-scrollbar {
4017
- width: 6px;
4018
- }
4019
-
4020
- .rs-history-list::-webkit-scrollbar-thumb {
4021
- background-color: var(--rs-surface-hover);
4022
- border-radius: var(--rs-radius-full);
4023
- }
4024
-
4025
- .rs-history-list::-webkit-scrollbar-thumb:hover {
4026
- background-color: var(--rs-muted-foreground);
4027
- }
4028
-
4029
- .rs-history-list::-webkit-scrollbar-track {
4030
- background: transparent;
4031
- }
4032
-
4033
4058
  /* Card */
4034
4059
  .rs-history-card {
4035
4060
  width: 100%;
@@ -4372,6 +4397,12 @@
4372
4397
  gap: 8px;
4373
4398
  }
4374
4399
 
4400
+ /* Figma gives subtitle headers a 12px icon→title gap (vs 8px for title-only
4401
+ headers like the QR screen). */
4402
+ .rs-body-header:has(.rs-body-header-subtitle) {
4403
+ gap: 12px;
4404
+ }
4405
+
4375
4406
  .rs-body-header-icon {
4376
4407
  display: inline-flex;
4377
4408
  align-items: center;
@@ -4420,7 +4451,7 @@
4420
4451
  .rs-body-header-subtitle {
4421
4452
  font-size: 14px;
4422
4453
  font-weight: 500;
4423
- line-height: 1.4;
4454
+ line-height: normal;
4424
4455
  color: var(--rs-muted);
4425
4456
  margin: 0;
4426
4457
  }
@@ -4672,3 +4703,431 @@
4672
4703
  border: 1px solid var(--rs-border);
4673
4704
  background-color: var(--rs-background);
4674
4705
  }
4706
+
4707
+ /* =============================================================================
4708
+ Fiat On-Ramp (Swapped iframe flow)
4709
+ ============================================================================= */
4710
+
4711
+ /* `.rs-fiat-onramp` is a marker class on the .rs-screen root so the
4712
+ modal-content `:has()` rules below can size correctly. Layout (padding,
4713
+ gap, flex direction) comes from .rs-screen itself, identical to
4714
+ ConnectStep — keeps the top of the page visually unchanged across the
4715
+ payment-method picker → Swapped iframe transition. */
4716
+
4717
+ .rs-fiat-onramp-banner {
4718
+ display: flex;
4719
+ flex-direction: column;
4720
+ gap: 2px;
4721
+ padding: 8px 12px;
4722
+ border-radius: var(--rs-radius-sm);
4723
+ font-size: 12px;
4724
+ line-height: 1.35;
4725
+ border: 1px solid var(--rs-border);
4726
+ }
4727
+
4728
+ .rs-fiat-onramp-banner--info {
4729
+ background: var(--rs-background-secondary);
4730
+ color: var(--rs-foreground);
4731
+ }
4732
+
4733
+ .rs-fiat-onramp-banner--success {
4734
+ background: rgba(34, 197, 94, 0.08);
4735
+ border-color: rgba(34, 197, 94, 0.35);
4736
+ color: var(--rs-foreground);
4737
+ }
4738
+
4739
+ .rs-fiat-onramp-banner--warning {
4740
+ background: rgba(234, 179, 8, 0.08);
4741
+ border-color: rgba(234, 179, 8, 0.4);
4742
+ color: var(--rs-foreground);
4743
+ }
4744
+
4745
+ .rs-fiat-onramp-banner-title {
4746
+ font-weight: 600;
4747
+ }
4748
+
4749
+ .rs-fiat-onramp-banner-detail {
4750
+ color: var(--rs-muted);
4751
+ }
4752
+
4753
+ /* Iframe wrap sized to Swapped's documented dimensions — 400×482 for the
4754
+ fiat on-ramp, 445×585 for Connect (overrides below). Centered horizontally
4755
+ inside the modal so the step body can have header padding. */
4756
+ .rs-fiat-onramp-iframe-wrap {
4757
+ position: relative;
4758
+ width: 100%;
4759
+ max-width: 400px;
4760
+ min-height: 482px;
4761
+ margin: 0 auto;
4762
+ border-radius: var(--rs-radius);
4763
+ overflow: hidden;
4764
+ }
4765
+
4766
+ .rs-fiat-onramp[data-variant="connect"] .rs-fiat-onramp-iframe-wrap {
4767
+ max-width: 445px;
4768
+ min-height: 585px;
4769
+ }
4770
+
4771
+ .rs-fiat-onramp-iframe {
4772
+ display: block;
4773
+ width: 100%;
4774
+ height: 482px;
4775
+ min-height: 482px;
4776
+ border: 0;
4777
+ background: var(--rs-background);
4778
+ }
4779
+
4780
+ .rs-fiat-onramp[data-variant="connect"] .rs-fiat-onramp-iframe {
4781
+ height: 585px;
4782
+ min-height: 585px;
4783
+ }
4784
+
4785
+ .rs-fiat-onramp-loading,
4786
+ .rs-fiat-onramp-error {
4787
+ position: absolute;
4788
+ inset: 0;
4789
+ display: flex;
4790
+ flex-direction: column;
4791
+ align-items: center;
4792
+ justify-content: center;
4793
+ gap: 12px;
4794
+ text-align: center;
4795
+ background: var(--rs-background);
4796
+ color: var(--rs-foreground);
4797
+ padding: 16px;
4798
+ }
4799
+
4800
+ .rs-fiat-onramp-retry {
4801
+ padding: 6px 14px;
4802
+ border: 1px solid var(--rs-border);
4803
+ border-radius: var(--rs-radius-sm);
4804
+ background: var(--rs-background-secondary);
4805
+ color: var(--rs-foreground);
4806
+ font-size: 12px;
4807
+ font-weight: 500;
4808
+ font-family: inherit;
4809
+ cursor: pointer;
4810
+ }
4811
+
4812
+ .rs-fiat-onramp-retry:hover {
4813
+ background: var(--rs-border);
4814
+ }
4815
+
4816
+ /* =============================================================================
4817
+ Exchange picker (Swapped Connect)
4818
+ ============================================================================= */
4819
+
4820
+ .rs-exchange-grid {
4821
+ display: grid;
4822
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4823
+ gap: 8px;
4824
+ }
4825
+
4826
+ .rs-exchange-card {
4827
+ display: flex;
4828
+ min-width: 0;
4829
+ min-height: 104px;
4830
+ flex-direction: column;
4831
+ align-items: center;
4832
+ justify-content: center;
4833
+ gap: 10px;
4834
+ padding: 12px 8px;
4835
+ border: 1px solid var(--rs-background-secondary);
4836
+ border-radius: 8px;
4837
+ background: var(--rs-background-secondary);
4838
+ color: var(--rs-foreground);
4839
+ font-family: inherit;
4840
+ cursor: pointer;
4841
+ transition:
4842
+ background-color 0.15s,
4843
+ border-color 0.15s;
4844
+ }
4845
+
4846
+ .rs-exchange-card:hover:not(:disabled) {
4847
+ background: var(--rs-surface-hover);
4848
+ border-color: var(--rs-surface-hover);
4849
+ }
4850
+
4851
+ .rs-exchange-card:focus-visible {
4852
+ outline: 2px solid var(--rs-border-accent);
4853
+ outline-offset: 2px;
4854
+ }
4855
+
4856
+ .rs-exchange-card-logo {
4857
+ display: inline-flex;
4858
+ align-items: center;
4859
+ justify-content: center;
4860
+ width: 44px;
4861
+ height: 44px;
4862
+ border-radius: 10px;
4863
+ background: var(--rs-surface);
4864
+ color: #71717b;
4865
+ overflow: hidden;
4866
+ }
4867
+
4868
+ .rs-exchange-card-logo img,
4869
+ .rs-exchange-card-logo svg {
4870
+ width: 28px;
4871
+ height: 28px;
4872
+ display: block;
4873
+ object-fit: contain;
4874
+ }
4875
+
4876
+ .rs-exchange-card-name {
4877
+ width: 100%;
4878
+ min-width: 0;
4879
+ font-size: 14px;
4880
+ font-weight: 500;
4881
+ line-height: 1.25;
4882
+ color: var(--rs-foreground);
4883
+ text-align: center;
4884
+ overflow: hidden;
4885
+ text-overflow: ellipsis;
4886
+ white-space: nowrap;
4887
+ }
4888
+
4889
+ .rs-exchange-select-state {
4890
+ min-height: 184px;
4891
+ display: flex;
4892
+ flex-direction: column;
4893
+ align-items: center;
4894
+ justify-content: center;
4895
+ gap: 12px;
4896
+ text-align: center;
4897
+ color: var(--rs-foreground);
4898
+ }
4899
+
4900
+ .rs-exchange-select-state-title {
4901
+ font-size: 14px;
4902
+ font-weight: 600;
4903
+ line-height: 1.35;
4904
+ }
4905
+
4906
+ /* =============================================================================
4907
+ Modal sizing for the Swapped iframe step
4908
+ =============================================================================
4909
+ Modal stays at the default 400px width for the fiat variant (matches
4910
+ Swapped's 400×482 iframe edge-to-edge). Connect needs 445px because its
4911
+ iframe is 445×585. Height grows with the Rhinestone chrome (header
4912
+ icon/title/subtitle + iframe + PoweredBy); cap to viewport so smaller
4913
+ laptops get a scrollable modal-body instead of overflowing the screen. */
4914
+
4915
+ /* Connect's iframe is 445×585 (vs fiat's 400×482). To preserve the same
4916
+ 12px horizontal padding as ConnectStep while still giving Swapped's
4917
+ Connect iframe its documented width, widen the modal by 24px (12 each
4918
+ side) → 469px. Applied from the moment the user enters exchange-connect
4919
+ mode (`data-flow-mode` on rs-modal-body) — not just the iframe step —
4920
+ so the modal width is stable across SetupStep → SwappedIframeStep.
4921
+ Fiat keeps the default 400px modal; its iframe renders at 376px
4922
+ content-width, matching the visual width of ConnectStep's list rows. */
4923
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="exchange-connect"]) {
4924
+ max-width: 469px;
4925
+ }
4926
+
4927
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="fiat-onramp"]),
4928
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="exchange-connect"]) {
4929
+ max-height: calc(100vh - 40px);
4930
+ }
4931
+
4932
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="fiat-onramp"]) .rs-modal-body,
4933
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="exchange-connect"]) .rs-modal-body {
4934
+ /* `overflow-x: hidden` is explicit because a `visible` x-axis with an
4935
+ `auto` y-axis gets promoted to `auto` on both axes, which paints a
4936
+ phantom horizontal scrollbar even when content fits horizontally. */
4937
+ overflow: hidden auto;
4938
+ }
4939
+
4940
+ /* Pre-size the modal-content to the eventual iframe-mounted height for
4941
+ the iframe-phase only:
4942
+ - `[data-step-type="setup"]` — brief pre-flight before SwappedIframeStep mounts
4943
+ - `:has(...) .rs-fiat-onramp` — SwappedIframeStep's iframe phase is in DOM
4944
+ The tracker phase (.rs-swapped-tracker) is naturally shorter and is
4945
+ excluded so the modal shrinks down to its content instead of leaving
4946
+ a tall empty area below the tracker. Applied on modal-content (not
4947
+ modal-body) so the transition on its min-height animates smoothly
4948
+ when the iframe→tracker phase swap fires. */
4949
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="fiat-onramp"][data-step-type="setup"]),
4950
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="fiat-onramp"] .rs-fiat-onramp) {
4951
+ min-height: 691px;
4952
+ }
4953
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="exchange-connect"][data-step-type="setup"]),
4954
+ .rs-modal-content:has(.rs-modal-body[data-flow-mode="exchange-connect"] .rs-fiat-onramp) {
4955
+ min-height: 794px;
4956
+ }
4957
+
4958
+ /* =============================================================================
4959
+ Custom order tracker
4960
+ =============================================================================
4961
+ Shown after the user creates an order with Swapped — replaces the iframe
4962
+ until the deposit-processor reports bridge-complete. */
4963
+ /* Layout lives in rs-screen now — tracker just contributes the entrance
4964
+ animation and a marker class for any future tracker-only tweaks. The
4965
+ icon + title come from the shared BodyHeader so the header position
4966
+ matches ConnectStep and SwappedIframeStep exactly. */
4967
+ .rs-swapped-tracker {
4968
+ animation: rs-swapped-tracker-enter 250ms ease-out;
4969
+ }
4970
+
4971
+ @keyframes rs-swapped-tracker-enter {
4972
+ from {
4973
+ opacity: 0;
4974
+ }
4975
+ to {
4976
+ opacity: 1;
4977
+ }
4978
+ }
4979
+
4980
+ @keyframes rs-tracker-step-complete {
4981
+ 0% {
4982
+ transform: scale(0.72);
4983
+ }
4984
+ 60% {
4985
+ transform: scale(1.08);
4986
+ }
4987
+ 100% {
4988
+ transform: scale(1);
4989
+ }
4990
+ }
4991
+
4992
+ .rs-swapped-tracker-steps {
4993
+ list-style: none;
4994
+ padding: 0;
4995
+ margin: 0;
4996
+ display: flex;
4997
+ flex-direction: column;
4998
+ flex-grow: 1;
4999
+ }
5000
+
5001
+ .rs-swapped-tracker-step {
5002
+ position: relative;
5003
+ display: flex;
5004
+ align-items: center;
5005
+ justify-content: space-between;
5006
+ gap: 12px;
5007
+ padding: 16px 0;
5008
+ }
5009
+
5010
+ /* Dotted vertical connector between adjacent step markers. */
5011
+ .rs-swapped-tracker-step + .rs-swapped-tracker-step::before {
5012
+ content: "";
5013
+ position: absolute;
5014
+ top: -14px;
5015
+ right: 11px;
5016
+ width: 0;
5017
+ height: 28px;
5018
+ border-left: 1.5px dotted #d4d4d8;
5019
+ }
5020
+
5021
+ .rs-swapped-tracker-step-label {
5022
+ font-size: 15px;
5023
+ color: var(--rs-foreground);
5024
+ flex-grow: 1;
5025
+ }
5026
+
5027
+ .rs-swapped-tracker-step-marker {
5028
+ width: 24px;
5029
+ height: 24px;
5030
+ border-radius: 50%;
5031
+ flex-shrink: 0;
5032
+ display: flex;
5033
+ align-items: center;
5034
+ justify-content: center;
5035
+ background: transparent;
5036
+ border: 1.5px solid #d4d4d8;
5037
+ color: transparent;
5038
+ transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
5039
+ }
5040
+
5041
+ .rs-swapped-tracker-step--active .rs-swapped-tracker-step-marker {
5042
+ border-color: #d4d4d8;
5043
+ background: transparent;
5044
+ /* Spinner SVG uses currentColor; base marker class sets color:transparent
5045
+ for the (hidden) ring glyph — re-establish a visible color here so the
5046
+ active-state spinner actually paints. */
5047
+ color: #18181b;
5048
+ }
5049
+
5050
+ .rs-swapped-tracker-step--active .rs-swapped-tracker-step-marker .rs-spinner {
5051
+ width: 14px;
5052
+ height: 14px;
5053
+ }
5054
+
5055
+ /* Satisfying scale-pop when a step ticks complete — the color transition
5056
+ alone is too subtle to register as "that just happened". */
5057
+ .rs-swapped-tracker-step--complete .rs-swapped-tracker-step-marker {
5058
+ animation: rs-tracker-step-complete 320ms cubic-bezier(0.34, 1.56, 0.64, 1);
5059
+ background: #18181b;
5060
+ border-color: #18181b;
5061
+ color: #fff;
5062
+ }
5063
+
5064
+ .rs-swapped-tracker-step--complete .rs-swapped-tracker-step-marker svg {
5065
+ width: 14px;
5066
+ height: 14px;
5067
+ stroke-width: 3;
5068
+ }
5069
+
5070
+ /* Failed step marker — terminal processor failure or cancellation. Red in
5071
+ both themes (the failure color reads on light and dark). */
5072
+ .rs-swapped-tracker-step--failed .rs-swapped-tracker-step-marker {
5073
+ background: #fb2c36;
5074
+ border-color: #fb2c36;
5075
+ color: #fff;
5076
+ }
5077
+
5078
+ .rs-swapped-tracker-step--failed .rs-swapped-tracker-step-marker svg {
5079
+ width: 14px;
5080
+ height: 14px;
5081
+ stroke-width: 3;
5082
+ }
5083
+
5084
+ /* Terminal message block shown below the steps on failure / cancellation. */
5085
+ .rs-swapped-tracker-terminal {
5086
+ display: flex;
5087
+ flex-direction: column;
5088
+ align-items: center;
5089
+ gap: 12px;
5090
+ text-align: center;
5091
+ }
5092
+
5093
+ .rs-swapped-tracker-terminal-message {
5094
+ margin: 0;
5095
+ font-size: 14px;
5096
+ line-height: 1.4;
5097
+ color: var(--rs-foreground-secondary, #71717a);
5098
+ }
5099
+
5100
+ .rs-swapped-tracker-terminal--failed .rs-swapped-tracker-terminal-message {
5101
+ color: #fb2c36;
5102
+ }
5103
+
5104
+ .rs-swapped-tracker-retry {
5105
+ padding: 8px 16px;
5106
+ border: 1px solid var(--rs-border);
5107
+ border-radius: var(--rs-radius-sm);
5108
+ background: var(--rs-background-secondary);
5109
+ color: var(--rs-foreground);
5110
+ font-size: 13px;
5111
+ font-weight: 500;
5112
+ font-family: inherit;
5113
+ cursor: pointer;
5114
+ }
5115
+
5116
+ .rs-swapped-tracker-retry:hover {
5117
+ background: var(--rs-border);
5118
+ }
5119
+
5120
+ .rs-modal[data-theme="dark"] .rs-swapped-tracker-step + .rs-swapped-tracker-step::before {
5121
+ border-left-color: #3f3f46;
5122
+ }
5123
+
5124
+ .rs-modal[data-theme="dark"] .rs-swapped-tracker-step--pending .rs-swapped-tracker-step-marker,
5125
+ .rs-modal[data-theme="dark"] .rs-swapped-tracker-step--active .rs-swapped-tracker-step-marker {
5126
+ border-color: #3f3f46;
5127
+ }
5128
+
5129
+ .rs-modal[data-theme="dark"] .rs-swapped-tracker-step--complete .rs-swapped-tracker-step-marker {
5130
+ background: #fafafa;
5131
+ border-color: #fafafa;
5132
+ color: #18181b;
5133
+ }