@coin-voyage/swapkit 0.4.0-beta.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +8 -8
  2. package/README.md +68 -68
  3. package/dist/components/currency-panel.d.ts +17 -0
  4. package/dist/components/currency-panel.js +22 -0
  5. package/dist/components/execution-modal.d.ts +1 -1
  6. package/dist/components/execution-modal.js +33 -6
  7. package/dist/components/execution-modal.test.d.ts +1 -0
  8. package/dist/components/execution-modal.test.js +92 -0
  9. package/dist/components/manual-wallet-modal.d.ts +8 -0
  10. package/dist/components/manual-wallet-modal.js +19 -0
  11. package/dist/components/output-wallet-selector.d.ts +7 -0
  12. package/dist/components/output-wallet-selector.js +10 -0
  13. package/dist/components/quote-breakdown.d.ts +5 -0
  14. package/dist/components/quote-breakdown.js +13 -0
  15. package/dist/components/styles.d.ts +2 -1
  16. package/dist/components/styles.js +1294 -1281
  17. package/dist/components/swap-recipient.test.js +61 -2
  18. package/dist/components/swap-settings.d.ts +9 -0
  19. package/dist/components/swap-settings.js +24 -0
  20. package/dist/components/swap.d.ts +2 -28
  21. package/dist/components/swap.js +27 -301
  22. package/dist/components/token-picker.test.js +11 -0
  23. package/dist/hooks/use-dismiss.d.ts +3 -0
  24. package/dist/hooks/use-dismiss.js +26 -0
  25. package/dist/hooks/use-swap-notifications.d.ts +10 -0
  26. package/dist/hooks/use-swap-notifications.js +53 -0
  27. package/dist/hooks/use-swap-quote.js +49 -51
  28. package/dist/hooks/use-swap.d.ts +47 -0
  29. package/dist/hooks/use-swap.js +189 -0
  30. package/dist/hooks/use-token-data.d.ts +2 -1
  31. package/dist/hooks/use-token-data.js +42 -13
  32. package/dist/hooks/use-token-data.test.js +78 -3
  33. package/dist/lib/currency-selection.js +6 -4
  34. package/dist/lib/currency-selection.test.d.ts +1 -0
  35. package/dist/lib/currency-selection.test.js +16 -0
  36. package/dist/lib/execution.d.ts +2 -0
  37. package/dist/lib/execution.js +6 -0
  38. package/dist/lib/execution.test.d.ts +1 -0
  39. package/dist/lib/execution.test.js +24 -0
  40. package/dist/lib/format.d.ts +5 -0
  41. package/dist/lib/format.js +20 -0
  42. package/dist/lib/quote.d.ts +10 -1
  43. package/dist/lib/quote.js +12 -0
  44. package/dist/lib/slippage.d.ts +11 -0
  45. package/dist/lib/slippage.js +17 -0
  46. package/dist/styles/root.js +59 -59
  47. package/package.json +4 -4
@@ -1,1205 +1,1218 @@
1
1
  import styled from "../styles/styled";
2
- export const FormStack = styled.div `
3
- display: flex;
4
- width: 100%;
5
- flex-direction: column;
6
- gap: 6px;
7
- `;
8
- export const Toolbar = styled.div `
9
- display: flex;
10
- align-items: center;
11
- justify-content: space-between;
12
- min-height: 36px;
13
- `;
14
- export const ToolbarGroup = styled.div `
15
- position: relative;
16
- display: flex;
17
- align-items: center;
18
- gap: 8px;
19
- margin-left: ${({ $pushRight }) => ($pushRight ? "auto" : "0")};
20
- `;
21
- export const IconButton = styled.button `
22
- display: inline-flex;
23
- min-width: 36px;
24
- height: 36px;
25
- align-items: center;
26
- justify-content: center;
27
- gap: 6px;
28
- margin: 0;
29
- padding: 0 10px;
30
- border: 1px solid var(--sk-border);
31
- border-radius: 10px;
32
- color: var(--sk-text);
33
- background: var(--sk-surface);
34
- cursor: pointer;
35
- font-size: 14px;
36
- font-weight: 500;
37
- line-height: 20px;
38
- transition:
39
- background 140ms ease,
40
- border-color 140ms ease;
41
-
42
- &:hover:not(:disabled) {
43
- background: var(--sk-surface-elevated);
44
- border-color: var(--sk-accent);
45
- }
46
-
47
- &:disabled {
48
- cursor: not-allowed;
49
- opacity: 0.5;
50
- }
51
- `;
52
- export const WalletLabel = styled.span `
53
- max-width: 150px;
54
- overflow: hidden;
55
- font-size: 12px;
56
- font-weight: 600;
57
- text-overflow: ellipsis;
58
- white-space: nowrap;
59
- `;
60
- export const FloatingPanel = styled.div `
61
- position: absolute;
62
- z-index: 20;
63
- top: calc(100% + 8px);
64
- right: 0;
65
- width: 250px;
66
- padding: 14px;
67
- border: 1px solid var(--sk-border);
68
- border-radius: var(--sk-radius);
69
- color: var(--sk-text);
70
- background: var(--sk-surface);
71
- box-shadow: var(--sk-shadow);
72
- `;
73
- export const SettingsPanel = styled(FloatingPanel) `
74
- width: min(320px, calc(100vw - 32px));
75
- padding: 16px;
76
- `;
77
- export const SettingsRow = styled.div `
78
- display: flex;
79
- align-items: center;
80
- justify-content: space-between;
81
- gap: 16px;
82
- `;
83
- export const SettingsLabel = styled.span `
84
- display: inline-flex;
85
- align-items: center;
86
- gap: 5px;
87
- color: var(--sk-text);
88
- font-size: 14px;
89
- font-weight: 500;
90
- white-space: nowrap;
91
- `;
92
- export const InfoWrap = styled.span `
93
- position: relative;
94
- display: inline-flex;
95
- `;
96
- export const InfoButton = styled.button `
97
- display: inline-flex;
98
- width: 18px;
99
- height: 18px;
100
- align-items: center;
101
- justify-content: center;
102
- padding: 0;
103
- border: 0;
104
- border-radius: 50%;
105
- color: var(--sk-text-muted);
106
- background: transparent;
107
- cursor: help;
108
- `;
109
- export const SettingsTooltip = styled.span `
110
- position: absolute;
111
- z-index: 2;
112
- top: calc(100% + 10px);
113
- left: -14px;
114
- width: 278px;
115
- padding: 12px;
116
- border: 1px solid var(--sk-border);
117
- border-radius: 10px;
118
- color: var(--sk-text-muted);
119
- background: var(--sk-surface);
120
- box-shadow: var(--sk-shadow);
121
- font-size: 12px;
122
- font-weight: 400;
123
- line-height: 1.45;
124
- white-space: normal;
125
- `;
126
- export const SlippageControl = styled.div `
127
- display: inline-flex;
128
- height: 36px;
129
- align-items: center;
130
- gap: 2px;
131
- padding: 3px;
132
- border: 1px solid var(--sk-border);
133
- border-radius: 999px;
134
- background: var(--sk-surface-elevated);
135
- `;
136
- export const SlippageModeButton = styled.button `
137
- height: 28px;
138
- padding: 0 10px;
139
- border: 0;
140
- border-radius: 999px;
141
- color: ${({ $active }) => ($active ? "var(--sk-accent)" : "var(--sk-text-muted)")};
142
- background: ${({ $active }) => ($active ? "color-mix(in srgb, var(--sk-accent) 14%, transparent)" : "transparent")};
143
- cursor: pointer;
144
- font-size: 14px;
145
- font-weight: 600;
146
- `;
147
- export const SlippageInputWrap = styled.label `
148
- display: inline-flex;
149
- height: 28px;
150
- align-items: center;
151
- padding: 0 9px;
152
- border-radius: 999px;
153
- color: ${({ $active }) => ($active ? "var(--sk-text)" : "var(--sk-text-muted)")};
154
- background: ${({ $active }) => ($active ? "color-mix(in srgb, var(--sk-accent) 10%, transparent)" : "transparent")};
155
- cursor: text;
156
- font-size: 14px;
157
- font-weight: 500;
158
- `;
159
- export const SlippageInput = styled.input `
160
- width: 38px;
161
- padding: 0;
162
- border: 0;
163
- color: inherit;
164
- background: transparent;
165
- font-size: inherit;
166
- font-weight: inherit;
167
- text-align: right;
168
- outline: none;
169
-
170
- &:focus,
171
- &&:focus-visible {
172
- outline: none;
173
- box-shadow: none;
174
- }
175
- `;
176
- export const FieldLabel = styled.label `
177
- display: block;
178
- margin-bottom: 8px;
179
- color: var(--sk-text-muted);
180
- font-size: 12px;
181
- font-weight: 600;
182
- `;
183
- export const CompactInput = styled.input `
184
- width: 100%;
185
- height: 38px;
186
- padding: 0 10px;
187
- border: 1px solid var(--sk-border);
188
- border-radius: 8px;
189
- color: var(--sk-text);
190
- background: var(--sk-surface-elevated);
191
- `;
192
- export const Hint = styled.p `
193
- margin: 8px 0 0;
194
- color: ${({ $tone }) => $tone === "danger" ? "var(--sk-danger)" : $tone === "warning" ? "var(--sk-warning)" : "var(--sk-text-muted)"};
195
- font-size: 12px;
196
- line-height: 1.4;
197
- `;
198
- export const CardWrap = styled.div `
199
- position: relative;
200
- `;
201
- export const CurrencyCard = styled.section `
202
- position: relative;
203
- width: 100%;
204
- min-height: 128px;
205
- padding: 14px 14px 8px;
206
- border: 0;
207
- border-style: none;
208
- border-radius: var(--sk-radius);
209
- color: var(--sk-text);
210
- background: var(--sk-surface);
211
-
212
- &:hover [data-quick-amounts],
213
- &:focus-within [data-quick-amounts] {
214
- opacity: 1;
215
- pointer-events: auto;
216
- transform: translateY(0);
217
- }
218
-
219
- @media (hover: none) {
220
- [data-quick-amounts] {
221
- opacity: 1;
222
- pointer-events: auto;
223
- transform: translateY(0);
224
- }
225
- }
226
- `;
227
- export const CardTitle = styled.div `
228
- margin-bottom: 12px;
229
- color: #6b7280;
230
- font-size: 12px;
231
- font-weight: 500;
232
- line-height: 16px;
233
- `;
234
- export const QuickAmountActions = styled.div `
235
- position: absolute;
236
- top: 10px;
237
- right: 12px;
238
- display: flex;
239
- align-items: center;
240
- gap: 4px;
241
- opacity: 0;
242
- pointer-events: none;
243
- transform: translateY(-2px);
244
- transition:
245
- opacity 120ms ease,
246
- transform 120ms ease;
247
-
248
- @media (prefers-reduced-motion: reduce) {
249
- transition: none;
250
- }
251
- `;
252
- export const QuickAmountButton = styled.button `
253
- min-width: 34px;
254
- height: 24px;
255
- padding: 0 7px;
256
- border: 1px solid var(--sk-border);
257
- border-radius: 999px;
258
- color: var(--sk-text);
259
- background: var(--sk-surface-elevated);
260
- cursor: pointer;
261
- font-size: 11px;
262
- font-weight: 600;
263
- line-height: 22px;
264
-
265
- &:hover:not(:disabled) {
266
- border-color: var(--sk-accent);
267
- color: var(--sk-accent);
268
- }
269
-
270
- &:disabled {
271
- cursor: not-allowed;
272
- opacity: 0.5;
273
- }
274
- `;
275
- export const AmountRow = styled.div `
276
- display: grid;
277
- grid-template-columns: minmax(0, 1fr) auto;
278
- align-items: center;
279
- gap: 12px;
280
- `;
281
- export const AmountInput = styled.input `
282
- min-width: 0;
283
- width: 100%;
284
- padding: 0;
285
- border: 0;
286
- color: var(--sk-text);
287
- caret-color: var(--sk-text);
288
- background: transparent;
289
- font-size: 24px;
290
- font-weight: 700;
291
- line-height: 32px;
292
- box-shadow: none;
293
-
294
- && {
295
- color: var(--sk-text);
296
- font-family: var(--sk-font-family);
297
- font-size: 24px;
298
- font-weight: 700;
299
- line-height: 32px;
300
- }
301
-
302
- &::placeholder {
303
- color: var(--sk-text);
304
- opacity: 1;
305
- }
306
-
307
- &:focus,
308
- &&:focus-visible {
309
- outline: none;
310
- box-shadow: none;
311
- }
312
-
313
- &:disabled {
314
- opacity: 0.7;
315
- }
316
- `;
317
- const Skeleton = styled.span `
318
- display: block;
319
- border-radius: 5px;
320
- background: var(--sk-surface-elevated);
321
- animation: sk-skeleton-pulse 1.4s ease-in-out infinite;
322
-
323
- @keyframes sk-skeleton-pulse {
324
- 0%,
325
- 100% {
326
- opacity: 0.58;
327
- }
328
-
329
- 50% {
330
- opacity: 1;
331
- }
332
- }
333
- `;
334
- export const AmountSkeleton = styled(Skeleton) `
335
- width: min(128px, 70%);
336
- height: 32px;
337
- `;
338
- export const QuoteValueSkeleton = styled(Skeleton) `
339
- width: 64px;
340
- height: 16px;
341
- `;
342
- export const TokenButton = styled.button `
343
- display: inline-flex;
344
- max-width: 170px;
345
- min-width: 124px;
346
- height: 40px;
347
- align-items: center;
348
- gap: 8px;
349
- padding: 8px;
350
- border: 1px solid var(--sk-border);
351
- border-radius: 8px;
352
- color: var(--sk-text);
353
- background: transparent;
354
- cursor: pointer;
355
- font-size: 14px;
356
- font-weight: 500;
357
- line-height: 20px;
358
-
359
- > svg:last-child {
360
- flex: 0 0 auto;
361
- margin-left: auto;
362
- }
363
- `;
364
- export const TokenIconWrap = styled.span `
365
- position: relative;
366
- display: inline-flex;
367
- width: ${({ $size }) => $size}px;
368
- height: ${({ $size }) => $size}px;
369
- flex: 0 0 ${({ $size }) => $size}px;
370
- `;
371
- export const TokenImage = styled.img `
372
- width: 100%;
373
- height: 100%;
374
- border-radius: 50%;
375
- object-fit: contain;
376
- `;
377
- export const TokenFallback = styled.span `
378
- display: inline-flex;
379
- width: 100%;
380
- height: 100%;
381
- align-items: center;
382
- justify-content: center;
383
- border-radius: 50%;
384
- color: var(--sk-accent-text);
385
- background: var(--sk-accent);
386
- font-size: 10px;
387
- font-weight: 800;
388
- `;
389
- export const ChainBadge = styled.span `
390
- position: absolute;
391
- right: 0;
392
- bottom: 0;
393
- display: inline-flex;
394
- width: ${({ $size }) => $size}px;
395
- height: ${({ $size }) => $size}px;
396
- flex: 0 0 ${({ $size }) => $size}px;
397
- align-items: center;
398
- justify-content: center;
399
- overflow: hidden;
400
- border: 0;
401
- border-radius: 22.5%;
402
- background: ${({ $fillBackground }) => ($fillBackground ? "#4ca3ff" : "var(--sk-surface-elevated)")};
403
- box-shadow: 0 0 0 1px #374151;
404
-
405
- svg,
406
- img {
407
- display: block;
408
- width: 100%;
409
- height: 100%;
410
- max-width: none;
411
- flex: 0 0 100%;
412
- }
413
- `;
414
- export const CardFooter = styled.div `
415
- display: flex;
416
- align-items: center;
417
- justify-content: space-between;
418
- gap: 12px;
419
- margin-top: 12px;
420
- color: #6b7280;
421
- font-size: 12px;
422
- font-weight: 400;
423
- line-height: 16px;
424
- `;
425
- export const InlineActions = styled.div `
426
- display: flex;
427
- min-width: 0;
428
- align-items: center;
429
- gap: 8px;
430
- `;
431
- export const OutputWalletControl = styled.span `
432
- position: relative;
433
- display: inline-flex;
434
- `;
435
- export const OutputWalletTrigger = styled.button `
436
- display: inline-flex;
437
- min-width: 0;
438
- align-items: center;
439
- gap: 4px;
440
- padding: 0;
441
- border: 0;
442
- color: var(--sk-accent);
443
- background: transparent;
444
- cursor: pointer;
445
- font-size: 12px;
446
- font-weight: 500;
447
- line-height: 16px;
448
- white-space: nowrap;
449
-
450
- > svg {
451
- flex: 0 0 16px;
452
- transition: transform 180ms ease;
453
- }
454
- `;
455
- export const OutputWalletMenu = styled.span `
456
- position: absolute;
457
- z-index: 20;
458
- top: calc(100% + 8px);
459
- right: 0;
460
- display: grid;
461
- width: 192px;
462
- gap: 4px;
463
- padding: 12px;
464
- border: 1px solid var(--sk-border);
465
- border-radius: 10px;
466
- background: var(--sk-surface);
467
- box-shadow: var(--sk-shadow);
468
- `;
469
- export const OutputWalletOption = styled.button `
470
- display: flex;
471
- width: 100%;
472
- min-height: 36px;
473
- align-items: center;
474
- justify-content: space-between;
475
- gap: 8px;
476
- padding: 8px;
477
- border: 1px solid transparent;
478
- border-radius: 7px;
479
- color: var(--sk-text);
480
- background: var(--sk-surface-elevated);
481
- cursor: pointer;
482
- font-size: 12px;
483
- font-weight: 400;
484
- line-height: 16px;
485
- text-align: left;
486
-
487
- &:first-child {
488
- color: var(--sk-accent);
489
- }
490
-
491
- &:hover {
492
- border-color: var(--sk-accent);
493
- }
494
- `;
495
- export const SwitchButton = styled(IconButton) `
496
- position: absolute;
497
- z-index: 5;
498
- left: 50%;
499
- bottom: -29px;
500
- width: 52px;
501
- height: 52px;
502
- transform: translateX(-50%);
503
- border: 6px solid var(--sk-background);
504
- border-radius: 50%;
505
- background: var(--sk-surface);
506
-
507
- &:hover:not(:disabled) {
508
- border-color: var(--sk-background);
509
- color: var(--sk-text-muted);
510
- background: var(--sk-surface);
511
- }
512
-
513
- &:hover:not(:disabled) > svg {
514
- transform: rotate(180deg);
515
- }
516
- `;
517
- export const BreakdownCard = styled.section `
518
- overflow: hidden;
519
- border: 1px solid var(--sk-border);
520
- border-radius: var(--sk-radius);
521
- background: var(--sk-surface);
522
- `;
523
- export const BreakdownToggle = styled.button `
524
- display: flex;
525
- width: 100%;
526
- align-items: center;
527
- justify-content: space-between;
528
- gap: 16px;
529
- padding: 13px 14px;
530
- border: 0;
531
- color: var(--sk-text);
532
- background: transparent;
533
- cursor: pointer;
534
- font-size: 12px;
535
- font-weight: 600;
536
- `;
537
- export const BreakdownMeta = styled.span `
538
- display: inline-flex;
539
- align-items: center;
540
- gap: 12px;
541
- margin-left: auto;
542
- color: var(--sk-text-muted);
543
- font-weight: 400;
544
- `;
545
- export const NetworkCost = styled.span `
546
- display: inline-flex;
547
- align-items: center;
548
- gap: 4px;
549
- white-space: nowrap;
550
- `;
551
- export const BreakdownBody = styled.div `
552
- display: grid;
553
- gap: 10px;
554
- padding: 0 14px 14px;
555
- border-top: 1px solid var(--sk-border);
556
- `;
557
- export const DetailRow = styled.div `
558
- display: flex;
559
- align-items: center;
560
- justify-content: space-between;
561
- gap: 18px;
562
- padding-top: 10px;
563
- color: var(--sk-text-muted);
564
- font-size: 12px;
565
-
566
- strong {
567
- color: var(--sk-text);
568
- font-weight: 600;
569
- }
570
- `;
571
- export const FreeFeeBadge = styled.span `
572
- display: inline-flex;
573
- align-items: center;
574
- padding: 3px 8px;
575
- border: 1px solid color-mix(in srgb, var(--sk-success) 35%, transparent);
576
- border-radius: 999px;
577
- color: var(--sk-success);
578
- background: color-mix(in srgb, var(--sk-success) 12%, transparent);
579
- font-size: 11px;
580
- font-weight: 700;
581
- letter-spacing: 0.01em;
582
- line-height: 1;
583
- `;
584
- export const ErrorBox = styled.div `
585
- padding: 11px 13px;
586
- border: 1px solid color-mix(in srgb, var(--sk-danger) 45%, transparent);
587
- border-radius: 9px;
588
- color: var(--sk-danger);
589
- background: color-mix(in srgb, var(--sk-danger) 10%, transparent);
590
- font-size: 12px;
591
- `;
592
- export const PrimaryButton = styled.button `
593
- display: inline-flex;
594
- width: 100%;
595
- min-height: 36px;
596
- align-items: center;
597
- justify-content: center;
598
- gap: 8px;
599
- padding: 0 18px;
600
- border: 0;
601
- border-radius: 8px;
602
- color: var(--sk-accent-text);
603
- background: var(--sk-accent);
604
- cursor: pointer;
605
- font-size: 14px;
606
- font-weight: 500;
607
- transition:
608
- background 140ms ease,
609
- opacity 140ms ease;
610
-
611
- &:hover:not(:disabled) {
612
- background: var(--sk-accent-hover);
613
- }
614
-
615
- &:disabled {
616
- cursor: not-allowed;
617
- opacity: 0.52;
618
- }
619
- `;
620
- export const WalletRequirementButton = styled(PrimaryButton) `
621
- font-weight: 600;
622
- `;
623
- export const Overlay = styled.div `
624
- position: fixed;
625
- z-index: 2147483000;
626
- inset: 0;
627
- display: flex;
628
- align-items: center;
629
- justify-content: center;
630
- padding: 16px;
631
- background: var(--sk-overlay);
632
- backdrop-filter: blur(5px);
633
- `;
634
- export const Dialog = styled.div `
635
- width: min(100%, ${({ $maxWidth }) => $maxWidth ?? 440}px);
636
- max-height: min(720px, calc(100vh - 32px));
637
- overflow: auto;
638
- padding: 20px;
639
- border: 1px solid var(--sk-border);
640
- border-radius: 16px;
641
- color: var(--sk-text);
642
- background: var(--sk-surface);
643
- box-shadow: var(--sk-shadow);
644
- scrollbar-color: #cdcdcd transparent;
645
- -ms-overflow-style: thin;
646
- scrollbar-width: thin;
647
- `;
648
- export const DialogHeader = styled.div `
649
- display: flex;
650
- align-items: center;
651
- justify-content: space-between;
652
- gap: 12px;
653
- margin-bottom: 16px;
654
-
655
- h2 {
656
- margin: 0;
657
- font-size: 18px;
658
- }
659
- `;
660
- export const DialogCloseButton = styled.button `
661
- display: inline-flex;
662
- width: 32px;
663
- height: 32px;
664
- flex: 0 0 32px;
665
- align-items: center;
666
- justify-content: center;
667
- padding: 0;
668
- border: 0;
669
- border-radius: 7px;
670
- color: var(--sk-text);
671
- background: transparent;
672
- cursor: pointer;
673
-
674
- &:hover {
675
- background: var(--sk-surface-elevated);
676
- }
677
- `;
678
- export const SearchInput = styled(CompactInput) `
679
- height: 36px;
680
- min-width: 0;
681
- padding: 0;
682
- border: 0;
683
- color: var(--sk-text);
684
- background: transparent;
685
- font-size: 14px;
686
- font-weight: 500;
687
- line-height: 20px;
688
- outline: none;
689
-
690
- &::placeholder {
691
- color: var(--sk-text-muted);
692
- opacity: 1;
693
- }
694
-
695
- &:focus,
696
- &:focus-visible {
697
- outline: none;
698
- box-shadow: none;
699
- }
700
- `;
701
- export const SearchField = styled.div `
702
- display: flex;
703
- width: 100%;
704
- height: 36px;
705
- min-width: 0;
706
- align-items: center;
707
- gap: 8px;
708
- padding: 0 12px;
709
- border: 1px solid var(--sk-border);
710
- border-radius: 8px;
711
- background: var(--sk-background);
712
-
713
- > svg {
714
- flex: 0 0 16px;
715
- color: var(--sk-text-muted);
716
- opacity: 0.5;
717
- pointer-events: none;
718
- }
719
- `;
720
- export const PickerBody = styled.div `
721
- position: relative;
722
- min-width: 0;
723
- `;
724
- export const PickerControls = styled.div `
725
- position: relative;
726
- display: grid;
727
- grid-template-columns: minmax(0, 1fr) auto;
728
- gap: 8px;
729
- margin-bottom: 12px;
730
- `;
731
- export const NetworkButton = styled(IconButton) `
732
- max-width: 150px;
733
- height: 38px;
734
- white-space: nowrap;
735
- `;
736
- export const NetworkMenu = styled.div `
737
- position: absolute;
738
- z-index: 4;
739
- top: 44px;
740
- right: 0;
741
- display: grid;
742
- width: min(202px, 100%);
743
- max-height: min(360px, calc(100vh - 160px));
744
- align-content: start;
745
- padding: 4px;
746
- overflow-y: auto;
747
- border: 1px solid var(--sk-border);
748
- border-radius: 6px;
749
- background: var(--sk-background);
750
- box-shadow: var(--sk-shadow);
751
- scrollbar-color: #cdcdcd transparent;
752
- -ms-overflow-style: thin;
753
- scrollbar-width: thin;
754
-
755
- &::-webkit-scrollbar {
756
- width: 6px;
757
- }
758
-
759
- &::-webkit-scrollbar-track {
760
- background: transparent;
761
- }
762
-
763
- &::-webkit-scrollbar-thumb {
764
- border-radius: 999px;
765
- background: #cdcdcd;
766
- }
767
- `;
768
- export const NetworkOption = styled.button `
769
- display: flex;
770
- width: 100%;
771
- align-items: center;
772
- gap: 8px;
773
- min-height: 32px;
774
- padding: 6px 8px;
775
- border: 0;
776
- border-radius: 4px;
777
- color: var(--sk-text-muted);
778
- background: transparent;
779
- cursor: pointer;
780
- font-size: 14px;
781
- font-weight: 400;
782
- line-height: 20px;
783
- text-align: left;
784
-
785
- &:hover {
786
- color: var(--sk-text);
787
- background: var(--sk-surface);
788
- }
789
-
790
- &[aria-selected="true"] {
791
- color: var(--sk-text);
792
- background: var(--sk-surface);
793
- }
794
- `;
795
- export const NetworkLogo = styled.span `
796
- display: inline-flex;
797
- width: 16px;
798
- height: 16px;
799
- align-items: center;
800
- justify-content: center;
801
- overflow: hidden;
802
- border-radius: 50%;
803
-
804
- svg,
805
- img {
806
- width: 100%;
807
- height: 100%;
808
- }
809
- `;
810
- export const AllNetworksLogo = styled.span `
811
- position: relative;
812
- display: inline-flex;
813
- width: 32px;
814
- height: 18px;
815
- flex: 0 0 32px;
816
-
817
- > span {
818
- position: absolute;
819
- top: 1px;
820
- display: inline-flex;
821
- width: 16px;
822
- height: 16px;
823
- overflow: hidden;
824
- border: 1px solid var(--sk-surface-elevated);
825
- border-radius: 50%;
826
- background: var(--sk-surface-elevated);
827
-
828
- &:nth-child(1) {
829
- left: 0;
830
- }
831
-
832
- &:nth-child(2) {
833
- left: 8px;
834
- }
835
-
836
- &:nth-child(3) {
837
- left: 16px;
838
- }
839
-
840
- svg,
841
- img {
842
- width: 100%;
843
- height: 100%;
844
- }
845
- }
846
- `;
847
- export const TokenList = styled.div `
848
- display: grid;
849
- max-height: min(390px, 55vh);
850
- gap: 7px;
851
- overflow-y: auto;
852
- padding-right: 3px;
853
- scrollbar-color: #cdcdcd transparent;
854
- -ms-overflow-style: thin;
855
- scrollbar-width: thin;
856
-
857
- &::-webkit-scrollbar {
858
- width: 6px;
859
- }
860
-
861
- &::-webkit-scrollbar-track {
862
- background: transparent;
863
- }
864
-
865
- &::-webkit-scrollbar-thumb {
866
- border-radius: 999px;
867
- background: #cdcdcd;
868
- }
869
- `;
870
- export const TokenOption = styled.button `
871
- display: grid;
872
- grid-template-columns: auto minmax(0, 1fr) auto;
873
- align-items: center;
874
- gap: 10px;
875
- width: 100%;
876
- min-height: 64px;
877
- padding: 9px 11px;
878
- border: 1px solid var(--sk-border);
879
- border-radius: 12px;
880
- color: var(--sk-text);
881
- background: transparent;
882
- cursor: pointer;
883
- text-align: left;
884
-
885
- &:hover {
886
- background: var(--sk-surface-elevated);
887
- }
888
- `;
889
- export const TokenMeta = styled.span `
890
- min-width: 0;
891
-
892
- strong,
893
- small {
894
- display: block;
895
- overflow: hidden;
896
- text-overflow: ellipsis;
897
- white-space: nowrap;
898
- }
899
-
900
- small {
901
- margin-top: 2px;
902
- color: var(--sk-text-muted);
903
- font-size: 11px;
904
- }
905
-
906
- strong {
907
- font-size: 14px;
908
- }
909
- `;
910
- export const TokenBalance = styled.span `
911
- text-align: right;
912
-
913
- strong,
914
- small {
915
- display: block;
916
- white-space: nowrap;
917
- }
918
-
919
- strong {
920
- color: var(--sk-text);
921
- font-size: 14px;
922
- }
923
-
924
- small {
925
- margin-top: 3px;
926
- color: var(--sk-text-muted);
927
- font-size: 11px;
928
- }
929
- `;
930
- export const EmptyState = styled.div `
931
- padding: 24px 8px;
932
- color: var(--sk-text-muted);
933
- font-size: 13px;
934
- text-align: center;
935
- `;
936
- export const WalletList = styled.div `
937
- display: grid;
938
- gap: 6px;
939
- `;
940
- export const WalletOption = styled.button `
941
- display: grid;
942
- grid-template-columns: auto minmax(0, 1fr);
943
- align-items: center;
944
- gap: 12px;
945
- width: 100%;
946
- min-height: 56px;
947
- padding: 10px 12px;
948
- border: 1px solid var(--sk-border);
949
- border-radius: 12px;
950
- color: var(--sk-text);
951
- background: transparent;
952
- cursor: pointer;
953
- text-align: left;
954
-
955
- &:hover {
956
- background: var(--sk-surface);
957
- }
958
-
959
- &:disabled {
960
- cursor: wait;
961
- opacity: 0.6;
962
- }
963
- `;
964
- export const WalletIconFrame = styled.span `
965
- display: inline-flex;
966
- width: ${({ $size = 32 }) => $size}px;
967
- height: ${({ $size = 32 }) => $size}px;
968
- flex: 0 0 ${({ $size = 32 }) => $size}px;
969
- align-items: center;
970
- justify-content: center;
971
- overflow: hidden;
972
- border-radius: 50%;
973
- `;
974
- export const WalletImage = styled.img `
975
- width: 100%;
976
- height: 100%;
977
- object-fit: contain;
978
- `;
979
- export const WalletFallback = styled.span `
980
- display: inline-flex;
981
- width: 100%;
982
- height: 100%;
983
- align-items: center;
984
- justify-content: center;
985
- border-radius: 50%;
986
- color: var(--sk-accent-text);
987
- background: var(--sk-accent);
988
- font-size: 10px;
989
- font-weight: 700;
990
- `;
991
- export const WalletOptionMeta = styled.span `
992
- min-width: 0;
993
-
994
- > span:first-child {
995
- display: flex;
996
- align-items: center;
997
- gap: 8px;
998
- }
999
-
1000
- strong {
1001
- overflow: hidden;
1002
- font-size: 14px;
1003
- font-weight: 600;
1004
- text-overflow: ellipsis;
1005
- white-space: nowrap;
1006
- }
1007
-
1008
- small {
1009
- display: block;
1010
- margin-top: 3px;
1011
- overflow: hidden;
1012
- color: var(--sk-text-muted);
1013
- font-size: 12px;
1014
- text-overflow: ellipsis;
1015
- white-space: nowrap;
1016
- }
1017
- `;
1018
- export const MultichainBadge = styled.span `
1019
- padding: 2px 6px;
1020
- border: 1px solid color-mix(in srgb, var(--sk-accent) 45%, transparent);
1021
- border-radius: 999px;
1022
- color: var(--sk-accent);
1023
- background: color-mix(in srgb, var(--sk-accent) 10%, transparent);
1024
- font-size: 10px;
1025
- font-weight: 600;
1026
- line-height: 14px;
1027
- `;
1028
- export const ConnectedWalletPanel = styled(FloatingPanel) `
1029
- right: auto;
1030
- left: 0;
1031
- width: 288px;
1032
- padding: 0;
1033
- overflow: hidden;
1034
- `;
1035
- export const WalletPanelHeader = styled.div `
1036
- padding: 12px 14px;
1037
- border-bottom: 1px solid var(--sk-border);
1038
- font-size: 14px;
1039
- font-weight: 600;
1040
- `;
1041
- export const ConnectedWalletRow = styled.div `
1042
- display: flex;
1043
- align-items: center;
1044
- justify-content: space-between;
1045
- gap: 12px;
1046
- padding: 10px 12px;
1047
- `;
1048
- export const WalletIdentity = styled.div `
1049
- display: flex;
1050
- min-width: 0;
1051
- align-items: center;
1052
- gap: 10px;
1053
- `;
1054
- export const WalletDetails = styled.div `
1055
- min-width: 0;
1056
-
1057
- strong,
1058
- small {
1059
- display: block;
1060
- overflow: hidden;
1061
- text-overflow: ellipsis;
1062
- white-space: nowrap;
1063
- }
1064
-
1065
- strong {
1066
- font-size: 14px;
1067
- font-weight: 500;
1068
- }
1069
-
1070
- small {
1071
- margin-top: 2px;
1072
- color: var(--sk-text-muted);
1073
- font-size: 12px;
1074
- }
1075
- `;
1076
- export const WalletActions = styled.div `
1077
- display: flex;
1078
- flex: 0 0 auto;
1079
- align-items: center;
1080
- gap: 4px;
1081
- `;
1082
- export const WalletSwitchButton = styled.button `
1083
- height: 28px;
1084
- padding: 0 8px;
1085
- border: 0;
1086
- border-radius: 6px;
1087
- color: var(--sk-text-muted);
1088
- background: transparent;
1089
- cursor: pointer;
1090
- font-size: 12px;
1091
- font-weight: 500;
1092
-
1093
- &:hover {
1094
- color: var(--sk-accent);
1095
- background: color-mix(in srgb, var(--sk-accent) 12%, transparent);
1096
- }
1097
- `;
1098
- export const WalletDisconnectButton = styled.button `
1099
- display: inline-flex;
1100
- width: 28px;
1101
- height: 28px;
1102
- flex: 0 0 28px;
1103
- align-items: center;
1104
- justify-content: center;
1105
- padding: 0;
1106
- border: 0;
1107
- border-radius: 50%;
1108
- color: var(--sk-text-muted);
1109
- background: transparent;
1110
- cursor: pointer;
1111
-
1112
- &:hover {
1113
- color: var(--sk-danger);
1114
- background: color-mix(in srgb, var(--sk-danger) 12%, transparent);
1115
- }
1116
- `;
1117
- export const DisconnectAllButton = styled.button `
1118
- display: flex;
1119
- width: calc(100% - 12px);
1120
- align-items: center;
1121
- gap: 8px;
1122
- margin: 6px;
1123
- padding: 9px 10px;
1124
- border: 0;
1125
- border-radius: 7px;
1126
- color: var(--sk-accent);
1127
- background: color-mix(in srgb, var(--sk-accent) 12%, transparent);
1128
- cursor: pointer;
1129
- font-size: 14px;
1130
- font-weight: 500;
1131
-
1132
- &:hover {
1133
- background: color-mix(in srgb, var(--sk-accent) 18%, transparent);
1134
- }
1135
- `;
1136
- export const TriggerWalletIcons = styled.span `
1137
- display: flex;
1138
- align-items: center;
1139
-
1140
- > span + span {
1141
- margin-left: -5px;
1142
- border: 1px solid var(--sk-surface);
1143
- }
1144
- `;
1145
- export const ExecutionContent = styled.div `
1146
- display: grid;
1147
- gap: 16px;
1148
- `;
1149
- export const TokenRoute = styled.div `
1150
- display: flex;
1151
- align-items: center;
1152
- justify-content: space-between;
1153
- gap: 16px;
1154
- `;
1155
- export const TokenAmount = styled.div `
1156
- display: flex;
1157
- min-width: 0;
1158
- flex: 1;
1159
- flex-direction: column;
1160
- align-items: ${({ $align }) => ($align === "end" ? "flex-end" : "flex-start")};
1161
- gap: 8px;
1162
-
1163
- strong {
1164
- max-width: 100%;
1165
- overflow: hidden;
1166
- color: var(--sk-text);
1167
- font-size: 14px;
1168
- font-weight: 600;
1169
- text-overflow: ellipsis;
1170
- white-space: nowrap;
1171
- }
1172
- `;
1173
- export const RouteArrow = styled.span `
1174
- display: inline-flex;
1175
- flex: 0 0 auto;
1176
- color: var(--sk-text-muted);
1177
- `;
1178
- export const ProgressList = styled.ol `
1179
- margin: 0;
1180
- padding: 16px;
1181
- border: 1px solid var(--sk-border);
1182
- border-radius: var(--sk-radius);
1183
- list-style: none;
1184
- `;
1185
- export const ProgressItem = styled.li `
1186
- display: grid;
1187
- grid-template-columns: 24px minmax(0, 1fr);
1188
- column-gap: 12px;
1189
- `;
1190
- export const ProgressMarkerColumn = styled.span `
1191
- display: flex;
1192
- align-items: center;
1193
- flex-direction: column;
1194
- `;
1195
- export const ProgressMarker = styled.span `
1196
- display: inline-flex;
1197
- width: 24px;
1198
- height: 24px;
1199
- flex: 0 0 24px;
1200
- align-items: center;
1201
- justify-content: center;
1202
- border: 1px solid
2
+ export const FormStack = styled.div `
3
+ display: flex;
4
+ width: 100%;
5
+ flex-direction: column;
6
+ gap: 6px;
7
+ `;
8
+ export const Toolbar = styled.div `
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: space-between;
12
+ min-height: 36px;
13
+ `;
14
+ export const ToolbarGroup = styled.div `
15
+ position: relative;
16
+ display: flex;
17
+ align-items: center;
18
+ gap: 8px;
19
+ margin-left: ${({ $pushRight }) => ($pushRight ? "auto" : "0")};
20
+ `;
21
+ export const IconButton = styled.button `
22
+ display: inline-flex;
23
+ min-width: 36px;
24
+ height: 36px;
25
+ align-items: center;
26
+ justify-content: center;
27
+ gap: 6px;
28
+ margin: 0;
29
+ padding: 0 10px;
30
+ border: 1px solid var(--sk-border);
31
+ border-radius: 10px;
32
+ color: var(--sk-text);
33
+ background: var(--sk-surface);
34
+ cursor: pointer;
35
+ font-size: 14px;
36
+ font-weight: 500;
37
+ line-height: 20px;
38
+ transition:
39
+ background 140ms ease,
40
+ border-color 140ms ease;
41
+
42
+ &:hover:not(:disabled) {
43
+ background: var(--sk-surface-elevated);
44
+ border-color: var(--sk-accent);
45
+ }
46
+
47
+ &:disabled {
48
+ cursor: not-allowed;
49
+ opacity: 0.5;
50
+ }
51
+ `;
52
+ export const WalletLabel = styled.span `
53
+ max-width: 150px;
54
+ overflow: hidden;
55
+ font-size: 12px;
56
+ font-weight: 600;
57
+ text-overflow: ellipsis;
58
+ white-space: nowrap;
59
+ `;
60
+ export const FloatingPanel = styled.div `
61
+ position: absolute;
62
+ z-index: 20;
63
+ top: calc(100% + 8px);
64
+ right: 0;
65
+ width: 250px;
66
+ padding: 14px;
67
+ border: 1px solid var(--sk-border);
68
+ border-radius: var(--sk-radius);
69
+ color: var(--sk-text);
70
+ background: var(--sk-surface);
71
+ box-shadow: var(--sk-shadow);
72
+ `;
73
+ export const SettingsPanel = styled(FloatingPanel) `
74
+ width: min(320px, calc(100vw - 32px));
75
+ padding: 16px;
76
+ `;
77
+ export const SettingsRow = styled.div `
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: space-between;
81
+ gap: 16px;
82
+ `;
83
+ export const SettingsLabel = styled.span `
84
+ display: inline-flex;
85
+ align-items: center;
86
+ gap: 5px;
87
+ color: var(--sk-text);
88
+ font-size: 14px;
89
+ font-weight: 500;
90
+ white-space: nowrap;
91
+ `;
92
+ export const InfoWrap = styled.span `
93
+ position: relative;
94
+ display: inline-flex;
95
+ `;
96
+ export const InfoButton = styled.button `
97
+ display: inline-flex;
98
+ width: 18px;
99
+ height: 18px;
100
+ align-items: center;
101
+ justify-content: center;
102
+ padding: 0;
103
+ border: 0;
104
+ border-radius: 50%;
105
+ color: var(--sk-text-muted);
106
+ background: transparent;
107
+ cursor: help;
108
+ `;
109
+ export const SettingsTooltip = styled.span `
110
+ position: absolute;
111
+ z-index: 2;
112
+ top: calc(100% + 10px);
113
+ left: -14px;
114
+ width: 278px;
115
+ padding: 12px;
116
+ border: 1px solid var(--sk-border);
117
+ border-radius: 10px;
118
+ color: var(--sk-text-muted);
119
+ background: var(--sk-surface);
120
+ box-shadow: var(--sk-shadow);
121
+ font-size: 12px;
122
+ font-weight: 400;
123
+ line-height: 1.45;
124
+ white-space: normal;
125
+ `;
126
+ export const SlippageControl = styled.div `
127
+ display: inline-flex;
128
+ height: 36px;
129
+ align-items: center;
130
+ gap: 2px;
131
+ padding: 3px;
132
+ border: 1px solid var(--sk-border);
133
+ border-radius: 999px;
134
+ background: var(--sk-surface-elevated);
135
+ `;
136
+ export const SlippageModeButton = styled.button `
137
+ height: 28px;
138
+ padding: 0 10px;
139
+ border: 0;
140
+ border-radius: 999px;
141
+ color: ${({ $active }) => ($active ? "var(--sk-accent)" : "var(--sk-text-muted)")};
142
+ background: ${({ $active }) => ($active ? "color-mix(in srgb, var(--sk-accent) 14%, transparent)" : "transparent")};
143
+ cursor: pointer;
144
+ font-size: 14px;
145
+ font-weight: 600;
146
+ `;
147
+ export const SlippageInputWrap = styled.label `
148
+ display: inline-flex;
149
+ height: 28px;
150
+ align-items: center;
151
+ padding: 0 9px;
152
+ border-radius: 999px;
153
+ color: ${({ $active }) => ($active ? "var(--sk-text)" : "var(--sk-text-muted)")};
154
+ background: ${({ $active }) => ($active ? "color-mix(in srgb, var(--sk-accent) 10%, transparent)" : "transparent")};
155
+ cursor: text;
156
+ font-size: 14px;
157
+ font-weight: 500;
158
+ `;
159
+ export const SlippageInput = styled.input `
160
+ width: 38px;
161
+ padding: 0;
162
+ border: 0;
163
+ color: inherit;
164
+ background: transparent;
165
+ font-size: inherit;
166
+ font-weight: inherit;
167
+ text-align: right;
168
+ outline: none;
169
+
170
+ &:focus,
171
+ &&:focus-visible {
172
+ outline: none;
173
+ box-shadow: none;
174
+ }
175
+ `;
176
+ export const FieldLabel = styled.label `
177
+ display: block;
178
+ margin-bottom: 8px;
179
+ color: var(--sk-text-muted);
180
+ font-size: 12px;
181
+ font-weight: 600;
182
+ `;
183
+ export const CompactInput = styled.input `
184
+ width: 100%;
185
+ height: 38px;
186
+ padding: 0 10px;
187
+ border: 1px solid var(--sk-border);
188
+ border-radius: 8px;
189
+ color: var(--sk-text);
190
+ background: var(--sk-surface-elevated);
191
+ `;
192
+ export const Hint = styled.p `
193
+ margin: 8px 0 0;
194
+ color: ${({ $tone }) => $tone === "danger" ? "var(--sk-danger)" : $tone === "warning" ? "var(--sk-warning)" : "var(--sk-text-muted)"};
195
+ font-size: 12px;
196
+ line-height: 1.4;
197
+ `;
198
+ export const CardWrap = styled.div `
199
+ position: relative;
200
+ `;
201
+ export const CurrencyCard = styled.section `
202
+ position: relative;
203
+ width: 100%;
204
+ min-height: 128px;
205
+ padding: 14px 14px 8px;
206
+ border: 0;
207
+ border-style: none;
208
+ border-radius: var(--sk-radius);
209
+ color: var(--sk-text);
210
+ background: var(--sk-surface);
211
+
212
+ &:hover [data-quick-amounts],
213
+ &:focus-within [data-quick-amounts] {
214
+ opacity: 1;
215
+ pointer-events: auto;
216
+ transform: translateY(0);
217
+ }
218
+
219
+ @media (hover: none) {
220
+ [data-quick-amounts] {
221
+ opacity: 1;
222
+ pointer-events: auto;
223
+ transform: translateY(0);
224
+ }
225
+ }
226
+ `;
227
+ export const CardTitle = styled.div `
228
+ margin-bottom: 12px;
229
+ color: #6b7280;
230
+ font-size: 12px;
231
+ font-weight: 500;
232
+ line-height: 16px;
233
+ `;
234
+ export const CardHeaderAction = styled.div `
235
+ position: absolute;
236
+ top: 14px;
237
+ right: 14px;
238
+ display: flex;
239
+ align-items: center;
240
+ `;
241
+ export const QuickAmountActions = styled.div `
242
+ position: absolute;
243
+ top: 10px;
244
+ right: 12px;
245
+ display: flex;
246
+ align-items: center;
247
+ gap: 4px;
248
+ opacity: 0;
249
+ pointer-events: none;
250
+ transform: translateY(-2px);
251
+ transition:
252
+ opacity 120ms ease,
253
+ transform 120ms ease;
254
+
255
+ @media (prefers-reduced-motion: reduce) {
256
+ transition: none;
257
+ }
258
+ `;
259
+ export const QuickAmountButton = styled.button `
260
+ min-width: 34px;
261
+ height: 24px;
262
+ padding: 0 7px;
263
+ border: 1px solid var(--sk-border);
264
+ border-radius: 999px;
265
+ color: var(--sk-text);
266
+ background: var(--sk-surface-elevated);
267
+ cursor: pointer;
268
+ font-size: 11px;
269
+ font-weight: 600;
270
+ line-height: 22px;
271
+
272
+ &:hover:not(:disabled) {
273
+ border-color: var(--sk-accent);
274
+ color: var(--sk-accent);
275
+ }
276
+
277
+ &:disabled {
278
+ cursor: not-allowed;
279
+ opacity: 0.5;
280
+ }
281
+ `;
282
+ export const AmountRow = styled.div `
283
+ display: grid;
284
+ grid-template-columns: minmax(0, 1fr) auto;
285
+ align-items: center;
286
+ gap: 12px;
287
+ `;
288
+ export const AmountInput = styled.input `
289
+ min-width: 0;
290
+ width: 100%;
291
+ padding: 0;
292
+ border: 0;
293
+ color: var(--sk-text);
294
+ caret-color: var(--sk-text);
295
+ background: transparent;
296
+ font-size: 24px;
297
+ font-weight: 700;
298
+ line-height: 32px;
299
+ box-shadow: none;
300
+
301
+ && {
302
+ color: var(--sk-text);
303
+ font-family: var(--sk-font-family);
304
+ font-size: 24px;
305
+ font-weight: 700;
306
+ line-height: 32px;
307
+ }
308
+
309
+ &::placeholder {
310
+ color: var(--sk-text);
311
+ opacity: 1;
312
+ }
313
+
314
+ &:focus,
315
+ &&:focus-visible {
316
+ outline: none;
317
+ box-shadow: none;
318
+ }
319
+
320
+ &:disabled {
321
+ opacity: 0.7;
322
+ }
323
+ `;
324
+ const Skeleton = styled.span `
325
+ display: block;
326
+ border-radius: 5px;
327
+ background: var(--sk-surface-elevated);
328
+ animation: sk-skeleton-pulse 1.4s ease-in-out infinite;
329
+
330
+ @keyframes sk-skeleton-pulse {
331
+ 0%,
332
+ 100% {
333
+ opacity: 0.58;
334
+ }
335
+
336
+ 50% {
337
+ opacity: 1;
338
+ }
339
+ }
340
+ `;
341
+ export const AmountSkeleton = styled(Skeleton) `
342
+ width: min(128px, 70%);
343
+ height: 32px;
344
+ `;
345
+ export const QuoteValueSkeleton = styled(Skeleton) `
346
+ width: 64px;
347
+ height: 16px;
348
+ `;
349
+ export const TokenButton = styled.button `
350
+ display: inline-flex;
351
+ max-width: 170px;
352
+ min-width: 124px;
353
+ height: 40px;
354
+ align-items: center;
355
+ gap: 8px;
356
+ padding: 8px;
357
+ border: 1px solid var(--sk-border);
358
+ border-radius: 8px;
359
+ color: var(--sk-text);
360
+ background: transparent;
361
+ cursor: pointer;
362
+ font-size: 14px;
363
+ font-weight: 500;
364
+ line-height: 20px;
365
+
366
+ > svg:last-child {
367
+ flex: 0 0 auto;
368
+ margin-left: auto;
369
+ }
370
+ `;
371
+ export const TokenIconWrap = styled.span `
372
+ position: relative;
373
+ display: inline-flex;
374
+ width: ${({ $size }) => $size}px;
375
+ height: ${({ $size }) => $size}px;
376
+ flex: 0 0 ${({ $size }) => $size}px;
377
+ `;
378
+ export const TokenImage = styled.img `
379
+ width: 100%;
380
+ height: 100%;
381
+ border-radius: 50%;
382
+ object-fit: contain;
383
+ `;
384
+ export const TokenFallback = styled.span `
385
+ display: inline-flex;
386
+ width: 100%;
387
+ height: 100%;
388
+ align-items: center;
389
+ justify-content: center;
390
+ border-radius: 50%;
391
+ color: var(--sk-accent-text);
392
+ background: var(--sk-accent);
393
+ font-size: 10px;
394
+ font-weight: 800;
395
+ `;
396
+ export const ChainBadge = styled.span `
397
+ position: absolute;
398
+ right: 0;
399
+ bottom: 0;
400
+ display: inline-flex;
401
+ width: ${({ $size }) => $size}px;
402
+ height: ${({ $size }) => $size}px;
403
+ flex: 0 0 ${({ $size }) => $size}px;
404
+ align-items: center;
405
+ justify-content: center;
406
+ overflow: hidden;
407
+ border: 0;
408
+ border-radius: 22.5%;
409
+ background: ${({ $fillBackground }) => ($fillBackground ? "#4ca3ff" : "var(--sk-surface-elevated)")};
410
+ box-shadow: 0 0 0 1px #374151;
411
+
412
+ svg,
413
+ img {
414
+ display: block;
415
+ width: 100%;
416
+ height: 100%;
417
+ max-width: none;
418
+ flex: 0 0 100%;
419
+ }
420
+ `;
421
+ export const CardFooter = styled.div `
422
+ display: flex;
423
+ align-items: center;
424
+ justify-content: space-between;
425
+ gap: 12px;
426
+ margin-top: 12px;
427
+ color: #6b7280;
428
+ font-size: 12px;
429
+ font-weight: 400;
430
+ line-height: 16px;
431
+ `;
432
+ export const OutputWalletControl = styled.span `
433
+ position: relative;
434
+ display: inline-flex;
435
+ `;
436
+ export const OutputWalletTrigger = styled.button `
437
+ display: inline-flex;
438
+ min-width: 0;
439
+ align-items: center;
440
+ gap: 4px;
441
+ padding: 0;
442
+ border: 0;
443
+ color: var(--sk-accent);
444
+ background: transparent;
445
+ cursor: pointer;
446
+ font-size: 12px;
447
+ font-weight: 500;
448
+ line-height: 16px;
449
+ white-space: nowrap;
450
+
451
+ > svg {
452
+ flex: 0 0 16px;
453
+ transition: transform 180ms ease;
454
+ }
455
+ `;
456
+ export const OutputWalletMenu = styled.span `
457
+ position: absolute;
458
+ z-index: 20;
459
+ top: calc(100% + 8px);
460
+ right: 0;
461
+ display: grid;
462
+ width: 192px;
463
+ gap: 4px;
464
+ padding: 12px;
465
+ border: 1px solid var(--sk-border);
466
+ border-radius: 10px;
467
+ background: var(--sk-surface);
468
+ box-shadow: var(--sk-shadow);
469
+ `;
470
+ export const OutputWalletOption = styled.button `
471
+ display: flex;
472
+ width: 100%;
473
+ min-height: 36px;
474
+ align-items: center;
475
+ justify-content: space-between;
476
+ gap: 8px;
477
+ padding: 8px;
478
+ border: 1px solid transparent;
479
+ border-radius: 7px;
480
+ color: var(--sk-text);
481
+ background: var(--sk-surface-elevated);
482
+ cursor: pointer;
483
+ font-size: 12px;
484
+ font-weight: 400;
485
+ line-height: 16px;
486
+ text-align: left;
487
+
488
+ &:first-child {
489
+ color: var(--sk-accent);
490
+ }
491
+
492
+ &:hover {
493
+ border-color: var(--sk-accent);
494
+ }
495
+ `;
496
+ export const SwitchButton = styled(IconButton) `
497
+ position: absolute;
498
+ z-index: 5;
499
+ left: 50%;
500
+ bottom: -29px;
501
+ width: 52px;
502
+ height: 52px;
503
+ transform: translateX(-50%);
504
+ border: 6px solid var(--sk-background);
505
+ border-radius: 50%;
506
+ background: var(--sk-surface);
507
+
508
+ &:hover:not(:disabled) {
509
+ border-color: var(--sk-background);
510
+ color: var(--sk-text-muted);
511
+ background: var(--sk-surface);
512
+ }
513
+
514
+ &:hover:not(:disabled) > svg {
515
+ transform: rotate(180deg);
516
+ }
517
+ `;
518
+ export const BreakdownCard = styled.section `
519
+ overflow: hidden;
520
+ border: 1px solid var(--sk-border);
521
+ border-radius: var(--sk-radius);
522
+ background: var(--sk-surface);
523
+ `;
524
+ export const BreakdownToggle = styled.button `
525
+ display: flex;
526
+ width: 100%;
527
+ align-items: center;
528
+ justify-content: space-between;
529
+ gap: 16px;
530
+ padding: 13px 14px;
531
+ border: 0;
532
+ color: var(--sk-text);
533
+ background: transparent;
534
+ cursor: pointer;
535
+ font-size: 12px;
536
+ font-weight: 600;
537
+ `;
538
+ export const BreakdownMeta = styled.span `
539
+ display: inline-flex;
540
+ align-items: center;
541
+ gap: 12px;
542
+ margin-left: auto;
543
+ color: var(--sk-text-muted);
544
+ font-weight: 400;
545
+ `;
546
+ export const NetworkCost = styled.span `
547
+ display: inline-flex;
548
+ align-items: center;
549
+ gap: 4px;
550
+ white-space: nowrap;
551
+ `;
552
+ export const BreakdownBody = styled.div `
553
+ display: grid;
554
+ gap: 10px;
555
+ padding: 0 14px 14px;
556
+ border-top: 1px solid var(--sk-border);
557
+ `;
558
+ export const DetailRow = styled.div `
559
+ display: flex;
560
+ align-items: center;
561
+ justify-content: space-between;
562
+ gap: 18px;
563
+ padding-top: 10px;
564
+ color: var(--sk-text-muted);
565
+ font-size: 12px;
566
+
567
+ strong {
568
+ color: var(--sk-text);
569
+ font-weight: 600;
570
+ }
571
+ `;
572
+ export const FreeFeeBadge = styled.span `
573
+ display: inline-flex;
574
+ align-items: center;
575
+ padding: 3px 8px;
576
+ border: 1px solid color-mix(in srgb, var(--sk-success) 35%, transparent);
577
+ border-radius: 999px;
578
+ color: var(--sk-success);
579
+ background: color-mix(in srgb, var(--sk-success) 12%, transparent);
580
+ font-size: 11px;
581
+ font-weight: 700;
582
+ letter-spacing: 0.01em;
583
+ line-height: 1;
584
+ `;
585
+ export const ErrorBox = styled.div `
586
+ padding: 11px 13px;
587
+ border: 1px solid color-mix(in srgb, var(--sk-danger) 45%, transparent);
588
+ border-radius: 9px;
589
+ color: var(--sk-danger);
590
+ background: color-mix(in srgb, var(--sk-danger) 10%, transparent);
591
+ font-size: 12px;
592
+ `;
593
+ export const PrimaryButton = styled.button `
594
+ display: inline-flex;
595
+ width: 100%;
596
+ min-height: 36px;
597
+ align-items: center;
598
+ justify-content: center;
599
+ gap: 8px;
600
+ padding: 0 18px;
601
+ border: 0;
602
+ border-radius: 8px;
603
+ color: var(--sk-accent-text);
604
+ background: var(--sk-accent);
605
+ cursor: pointer;
606
+ font-size: 14px;
607
+ font-weight: 500;
608
+ transition:
609
+ background 140ms ease,
610
+ opacity 140ms ease;
611
+
612
+ &:hover:not(:disabled) {
613
+ background: var(--sk-accent-hover);
614
+ }
615
+
616
+ &:disabled {
617
+ cursor: not-allowed;
618
+ opacity: 0.52;
619
+ }
620
+ `;
621
+ export const WalletRequirementButton = styled(PrimaryButton) `
622
+ font-weight: 600;
623
+ `;
624
+ export const Overlay = styled.div `
625
+ position: fixed;
626
+ z-index: 2147483000;
627
+ inset: 0;
628
+ display: flex;
629
+ align-items: center;
630
+ justify-content: center;
631
+ padding: 16px;
632
+ background: var(--sk-overlay);
633
+ backdrop-filter: blur(5px);
634
+ `;
635
+ export const Dialog = styled.div `
636
+ width: min(100%, ${({ $maxWidth }) => $maxWidth ?? 440}px);
637
+ max-height: min(720px, calc(100vh - 32px));
638
+ overflow: auto;
639
+ padding: 20px;
640
+ border: 1px solid var(--sk-border);
641
+ border-radius: 16px;
642
+ color: var(--sk-text);
643
+ background: var(--sk-surface);
644
+ box-shadow: var(--sk-shadow);
645
+ scrollbar-color: #cdcdcd transparent;
646
+ -ms-overflow-style: thin;
647
+ scrollbar-width: thin;
648
+ `;
649
+ export const DialogHeader = styled.div `
650
+ display: flex;
651
+ align-items: center;
652
+ justify-content: space-between;
653
+ gap: 12px;
654
+ margin-bottom: 16px;
655
+
656
+ h2 {
657
+ margin: 0;
658
+ font-size: 18px;
659
+ }
660
+ `;
661
+ export const DialogCloseButton = styled.button `
662
+ display: inline-flex;
663
+ width: 32px;
664
+ height: 32px;
665
+ flex: 0 0 32px;
666
+ align-items: center;
667
+ justify-content: center;
668
+ padding: 0;
669
+ border: 0;
670
+ border-radius: 7px;
671
+ color: var(--sk-text);
672
+ background: transparent;
673
+ cursor: pointer;
674
+
675
+ &:hover {
676
+ background: var(--sk-surface-elevated);
677
+ }
678
+ `;
679
+ export const SearchInput = styled(CompactInput) `
680
+ height: 36px;
681
+ min-width: 0;
682
+ padding: 0;
683
+ border: 0;
684
+ color: var(--sk-text);
685
+ background: transparent;
686
+ font-size: 14px;
687
+ font-weight: 500;
688
+ line-height: 20px;
689
+ outline: none;
690
+
691
+ &::placeholder {
692
+ color: var(--sk-text-muted);
693
+ opacity: 1;
694
+ }
695
+
696
+ &&:focus,
697
+ &&:focus-visible {
698
+ outline: none;
699
+ box-shadow: none;
700
+ }
701
+ `;
702
+ export const SearchField = styled.div `
703
+ display: flex;
704
+ width: 100%;
705
+ height: 36px;
706
+ min-width: 0;
707
+ align-items: center;
708
+ gap: 8px;
709
+ padding: 0 12px;
710
+ border: 1px solid var(--sk-border);
711
+ border-radius: 8px;
712
+ background: var(--sk-background);
713
+
714
+ &:focus-within {
715
+ outline: 2px solid var(--sk-accent);
716
+ outline-offset: -1px;
717
+ }
718
+
719
+ > svg {
720
+ flex: 0 0 16px;
721
+ color: var(--sk-text-muted);
722
+ opacity: 0.5;
723
+ pointer-events: none;
724
+ }
725
+ `;
726
+ export const PickerBody = styled.div `
727
+ position: relative;
728
+ min-width: 0;
729
+ `;
730
+ export const PickerControls = styled.div `
731
+ position: relative;
732
+ display: grid;
733
+ grid-template-columns: minmax(0, 1fr) auto;
734
+ gap: 8px;
735
+ margin-bottom: 12px;
736
+ `;
737
+ export const NetworkButton = styled(IconButton) `
738
+ max-width: 150px;
739
+ height: 38px;
740
+ white-space: nowrap;
741
+ `;
742
+ export const NetworkMenu = styled.div `
743
+ position: absolute;
744
+ z-index: 4;
745
+ top: 44px;
746
+ right: 0;
747
+ display: grid;
748
+ width: min(202px, 100%);
749
+ max-height: min(360px, calc(100vh - 160px));
750
+ align-content: start;
751
+ padding: 4px;
752
+ overflow-y: auto;
753
+ border: 1px solid var(--sk-border);
754
+ border-radius: 6px;
755
+ background: var(--sk-background);
756
+ box-shadow: var(--sk-shadow);
757
+ scrollbar-color: #cdcdcd transparent;
758
+ -ms-overflow-style: thin;
759
+ scrollbar-width: thin;
760
+
761
+ &::-webkit-scrollbar {
762
+ width: 6px;
763
+ }
764
+
765
+ &::-webkit-scrollbar-track {
766
+ background: transparent;
767
+ }
768
+
769
+ &::-webkit-scrollbar-thumb {
770
+ border-radius: 999px;
771
+ background: #cdcdcd;
772
+ }
773
+ `;
774
+ export const NetworkOption = styled.button `
775
+ display: flex;
776
+ width: 100%;
777
+ align-items: center;
778
+ gap: 8px;
779
+ min-height: 32px;
780
+ padding: 6px 8px;
781
+ border: 0;
782
+ border-radius: 4px;
783
+ color: var(--sk-text-muted);
784
+ background: transparent;
785
+ cursor: pointer;
786
+ font-size: 14px;
787
+ font-weight: 400;
788
+ line-height: 20px;
789
+ text-align: left;
790
+
791
+ &:hover {
792
+ color: var(--sk-text);
793
+ background: var(--sk-surface);
794
+ }
795
+
796
+ &[aria-selected="true"] {
797
+ color: var(--sk-text);
798
+ background: var(--sk-surface);
799
+ }
800
+ `;
801
+ export const NetworkLogo = styled.span `
802
+ display: inline-flex;
803
+ width: 16px;
804
+ height: 16px;
805
+ align-items: center;
806
+ justify-content: center;
807
+ overflow: hidden;
808
+ border-radius: 50%;
809
+
810
+ svg,
811
+ img {
812
+ width: 100%;
813
+ height: 100%;
814
+ }
815
+ `;
816
+ export const AllNetworksLogo = styled.span `
817
+ position: relative;
818
+ display: inline-flex;
819
+ width: 32px;
820
+ height: 18px;
821
+ flex: 0 0 32px;
822
+
823
+ > span {
824
+ position: absolute;
825
+ top: 1px;
826
+ display: inline-flex;
827
+ width: 16px;
828
+ height: 16px;
829
+ overflow: hidden;
830
+ border: 1px solid var(--sk-surface-elevated);
831
+ border-radius: 50%;
832
+ background: var(--sk-surface-elevated);
833
+
834
+ &:nth-child(1) {
835
+ left: 0;
836
+ }
837
+
838
+ &:nth-child(2) {
839
+ left: 8px;
840
+ }
841
+
842
+ &:nth-child(3) {
843
+ left: 16px;
844
+ }
845
+
846
+ svg,
847
+ img {
848
+ width: 100%;
849
+ height: 100%;
850
+ }
851
+ }
852
+ `;
853
+ export const TokenList = styled.div `
854
+ display: grid;
855
+ max-height: min(390px, 55vh);
856
+ gap: 7px;
857
+ overflow-y: auto;
858
+ padding-right: 3px;
859
+ scrollbar-color: #cdcdcd transparent;
860
+ -ms-overflow-style: thin;
861
+ scrollbar-width: thin;
862
+
863
+ &::-webkit-scrollbar {
864
+ width: 6px;
865
+ }
866
+
867
+ &::-webkit-scrollbar-track {
868
+ background: transparent;
869
+ }
870
+
871
+ &::-webkit-scrollbar-thumb {
872
+ border-radius: 999px;
873
+ background: #cdcdcd;
874
+ }
875
+ `;
876
+ export const TokenOption = styled.button `
877
+ display: grid;
878
+ grid-template-columns: auto minmax(0, 1fr) auto;
879
+ align-items: center;
880
+ gap: 10px;
881
+ width: 100%;
882
+ min-height: 64px;
883
+ padding: 9px 11px;
884
+ border: 1px solid var(--sk-border);
885
+ border-radius: 12px;
886
+ color: var(--sk-text);
887
+ background: transparent;
888
+ cursor: pointer;
889
+ text-align: left;
890
+
891
+ &:hover {
892
+ background: var(--sk-surface-elevated);
893
+ }
894
+ `;
895
+ export const TokenMeta = styled.span `
896
+ min-width: 0;
897
+
898
+ strong,
899
+ small {
900
+ display: block;
901
+ overflow: hidden;
902
+ text-overflow: ellipsis;
903
+ white-space: nowrap;
904
+ }
905
+
906
+ small {
907
+ margin-top: 2px;
908
+ color: var(--sk-text-muted);
909
+ font-size: 11px;
910
+ }
911
+
912
+ strong {
913
+ font-size: 14px;
914
+ }
915
+ `;
916
+ export const TokenBalance = styled.span `
917
+ text-align: right;
918
+
919
+ strong,
920
+ small {
921
+ display: block;
922
+ white-space: nowrap;
923
+ }
924
+
925
+ strong {
926
+ color: var(--sk-text);
927
+ font-size: 14px;
928
+ }
929
+
930
+ small {
931
+ margin-top: 3px;
932
+ color: var(--sk-text-muted);
933
+ font-size: 11px;
934
+ }
935
+ `;
936
+ export const EmptyState = styled.div `
937
+ padding: 24px 8px;
938
+ color: var(--sk-text-muted);
939
+ font-size: 13px;
940
+ text-align: center;
941
+ `;
942
+ export const WalletList = styled.div `
943
+ display: grid;
944
+ gap: 6px;
945
+ `;
946
+ export const WalletOption = styled.button `
947
+ display: grid;
948
+ grid-template-columns: auto minmax(0, 1fr);
949
+ align-items: center;
950
+ gap: 12px;
951
+ width: 100%;
952
+ min-height: 56px;
953
+ padding: 10px 12px;
954
+ border: 1px solid var(--sk-border);
955
+ border-radius: 12px;
956
+ color: var(--sk-text);
957
+ background: transparent;
958
+ cursor: pointer;
959
+ text-align: left;
960
+
961
+ &:hover {
962
+ background: var(--sk-surface);
963
+ }
964
+
965
+ &:disabled {
966
+ cursor: wait;
967
+ opacity: 0.6;
968
+ }
969
+ `;
970
+ export const WalletIconFrame = styled.span `
971
+ display: inline-flex;
972
+ width: ${({ $size = 32 }) => $size}px;
973
+ height: ${({ $size = 32 }) => $size}px;
974
+ flex: 0 0 ${({ $size = 32 }) => $size}px;
975
+ align-items: center;
976
+ justify-content: center;
977
+ overflow: hidden;
978
+ border-radius: 50%;
979
+ `;
980
+ export const WalletImage = styled.img `
981
+ width: 100%;
982
+ height: 100%;
983
+ object-fit: contain;
984
+ `;
985
+ export const WalletFallback = styled.span `
986
+ display: inline-flex;
987
+ width: 100%;
988
+ height: 100%;
989
+ align-items: center;
990
+ justify-content: center;
991
+ border-radius: 50%;
992
+ color: var(--sk-accent-text);
993
+ background: var(--sk-accent);
994
+ font-size: 10px;
995
+ font-weight: 700;
996
+ `;
997
+ export const WalletOptionMeta = styled.span `
998
+ min-width: 0;
999
+
1000
+ > span:first-child {
1001
+ display: flex;
1002
+ align-items: center;
1003
+ gap: 8px;
1004
+ }
1005
+
1006
+ strong {
1007
+ overflow: hidden;
1008
+ font-size: 14px;
1009
+ font-weight: 600;
1010
+ text-overflow: ellipsis;
1011
+ white-space: nowrap;
1012
+ }
1013
+
1014
+ small {
1015
+ display: block;
1016
+ margin-top: 3px;
1017
+ overflow: hidden;
1018
+ color: var(--sk-text-muted);
1019
+ font-size: 12px;
1020
+ text-overflow: ellipsis;
1021
+ white-space: nowrap;
1022
+ }
1023
+ `;
1024
+ export const MultichainBadge = styled.span `
1025
+ padding: 2px 6px;
1026
+ border: 1px solid color-mix(in srgb, var(--sk-accent) 45%, transparent);
1027
+ border-radius: 999px;
1028
+ color: var(--sk-accent);
1029
+ background: color-mix(in srgb, var(--sk-accent) 10%, transparent);
1030
+ font-size: 10px;
1031
+ font-weight: 600;
1032
+ line-height: 14px;
1033
+ `;
1034
+ export const ConnectedWalletPanel = styled(FloatingPanel) `
1035
+ right: auto;
1036
+ left: 0;
1037
+ width: 288px;
1038
+ padding: 0;
1039
+ overflow: hidden;
1040
+ `;
1041
+ export const WalletPanelHeader = styled.div `
1042
+ padding: 12px 14px;
1043
+ border-bottom: 1px solid var(--sk-border);
1044
+ font-size: 14px;
1045
+ font-weight: 600;
1046
+ `;
1047
+ export const ConnectedWalletRow = styled.div `
1048
+ display: flex;
1049
+ align-items: center;
1050
+ justify-content: space-between;
1051
+ gap: 12px;
1052
+ padding: 10px 12px;
1053
+ `;
1054
+ export const WalletIdentity = styled.div `
1055
+ display: flex;
1056
+ min-width: 0;
1057
+ align-items: center;
1058
+ gap: 10px;
1059
+ `;
1060
+ export const WalletDetails = styled.div `
1061
+ min-width: 0;
1062
+
1063
+ strong,
1064
+ small {
1065
+ display: block;
1066
+ overflow: hidden;
1067
+ text-overflow: ellipsis;
1068
+ white-space: nowrap;
1069
+ }
1070
+
1071
+ strong {
1072
+ font-size: 14px;
1073
+ font-weight: 500;
1074
+ }
1075
+
1076
+ small {
1077
+ margin-top: 2px;
1078
+ color: var(--sk-text-muted);
1079
+ font-size: 12px;
1080
+ }
1081
+ `;
1082
+ export const WalletActions = styled.div `
1083
+ display: flex;
1084
+ flex: 0 0 auto;
1085
+ align-items: center;
1086
+ gap: 4px;
1087
+ `;
1088
+ export const WalletSwitchButton = styled.button `
1089
+ height: 28px;
1090
+ padding: 0 8px;
1091
+ border: 0;
1092
+ border-radius: 6px;
1093
+ color: var(--sk-text-muted);
1094
+ background: transparent;
1095
+ cursor: pointer;
1096
+ font-size: 12px;
1097
+ font-weight: 500;
1098
+
1099
+ &:hover {
1100
+ color: var(--sk-accent);
1101
+ background: color-mix(in srgb, var(--sk-accent) 12%, transparent);
1102
+ }
1103
+ `;
1104
+ export const WalletDisconnectButton = styled.button `
1105
+ display: inline-flex;
1106
+ width: 28px;
1107
+ height: 28px;
1108
+ flex: 0 0 28px;
1109
+ align-items: center;
1110
+ justify-content: center;
1111
+ padding: 0;
1112
+ border: 0;
1113
+ border-radius: 50%;
1114
+ color: var(--sk-text-muted);
1115
+ background: transparent;
1116
+ cursor: pointer;
1117
+
1118
+ &:hover {
1119
+ color: var(--sk-danger);
1120
+ background: color-mix(in srgb, var(--sk-danger) 12%, transparent);
1121
+ }
1122
+ `;
1123
+ export const DisconnectAllButton = styled.button `
1124
+ display: flex;
1125
+ width: calc(100% - 12px);
1126
+ align-items: center;
1127
+ gap: 8px;
1128
+ margin: 6px;
1129
+ padding: 9px 10px;
1130
+ border: 0;
1131
+ border-radius: 7px;
1132
+ color: var(--sk-accent);
1133
+ background: color-mix(in srgb, var(--sk-accent) 12%, transparent);
1134
+ cursor: pointer;
1135
+ font-size: 14px;
1136
+ font-weight: 500;
1137
+
1138
+ &:hover {
1139
+ background: color-mix(in srgb, var(--sk-accent) 18%, transparent);
1140
+ }
1141
+ `;
1142
+ export const TriggerWalletIcons = styled.span `
1143
+ display: flex;
1144
+ align-items: center;
1145
+
1146
+ > span + span {
1147
+ margin-left: -5px;
1148
+ border: 1px solid var(--sk-surface);
1149
+ }
1150
+ `;
1151
+ export const ExecutionContent = styled.div `
1152
+ display: grid;
1153
+ gap: 16px;
1154
+ `;
1155
+ export const ExecutionEstimate = styled.p `
1156
+ margin: 0;
1157
+ color: var(--sk-text-muted);
1158
+ font-size: 12px;
1159
+ line-height: 16px;
1160
+ text-align: center;
1161
+ `;
1162
+ export const TokenRoute = styled.div `
1163
+ display: flex;
1164
+ align-items: center;
1165
+ justify-content: space-between;
1166
+ gap: 16px;
1167
+ `;
1168
+ export const TokenAmount = styled.div `
1169
+ display: flex;
1170
+ min-width: 0;
1171
+ flex: 1;
1172
+ flex-direction: column;
1173
+ align-items: ${({ $align }) => ($align === "end" ? "flex-end" : "flex-start")};
1174
+ gap: 8px;
1175
+
1176
+ strong {
1177
+ max-width: 100%;
1178
+ overflow: hidden;
1179
+ color: var(--sk-text);
1180
+ font-size: 14px;
1181
+ font-weight: 600;
1182
+ text-overflow: ellipsis;
1183
+ white-space: nowrap;
1184
+ }
1185
+ `;
1186
+ export const RouteArrow = styled.span `
1187
+ display: inline-flex;
1188
+ flex: 0 0 auto;
1189
+ color: var(--sk-text-muted);
1190
+ `;
1191
+ export const ProgressList = styled.ol `
1192
+ margin: 0;
1193
+ padding: 16px;
1194
+ border: 1px solid var(--sk-border);
1195
+ border-radius: var(--sk-radius);
1196
+ list-style: none;
1197
+ `;
1198
+ export const ProgressItem = styled.li `
1199
+ display: grid;
1200
+ grid-template-columns: 24px minmax(0, 1fr);
1201
+ column-gap: 12px;
1202
+ `;
1203
+ export const ProgressMarkerColumn = styled.span `
1204
+ display: flex;
1205
+ align-items: center;
1206
+ flex-direction: column;
1207
+ `;
1208
+ export const ProgressMarker = styled.span `
1209
+ display: inline-flex;
1210
+ width: 24px;
1211
+ height: 24px;
1212
+ flex: 0 0 24px;
1213
+ align-items: center;
1214
+ justify-content: center;
1215
+ border: 1px solid
1203
1216
  ${({ $tone }) => $tone === "active"
1204
1217
  ? "var(--sk-accent)"
1205
1218
  : $tone === "complete"
@@ -1208,52 +1221,52 @@ export const ProgressMarker = styled.span `
1208
1221
  ? "var(--sk-danger)"
1209
1222
  : $tone === "warning"
1210
1223
  ? "var(--sk-warning)"
1211
- : "var(--sk-border)"};
1212
- border-radius: 50%;
1224
+ : "var(--sk-border)"};
1225
+ border-radius: 50%;
1213
1226
  color: ${({ $tone }) => $tone === "muted"
1214
1227
  ? "var(--sk-text-muted)"
1215
1228
  : $tone === "danger"
1216
1229
  ? "var(--sk-danger)"
1217
1230
  : $tone === "warning"
1218
1231
  ? "var(--sk-warning)"
1219
- : "var(--sk-accent-text)"};
1232
+ : "var(--sk-accent-text)"};
1220
1233
  background: ${({ $tone }) => $tone === "active"
1221
1234
  ? "var(--sk-accent)"
1222
1235
  : $tone === "complete"
1223
1236
  ? "var(--sk-success)"
1224
- : "var(--sk-surface-elevated)"};
1225
- `;
1226
- export const ProgressConnector = styled.span `
1227
- width: 1px;
1228
- min-height: 20px;
1229
- flex: 1;
1230
- margin: 8px 0;
1231
- background: var(--sk-border);
1232
- `;
1233
- export const ProgressText = styled.span `
1234
- min-width: 0;
1235
- padding-bottom: ${({ $connected }) => ($connected ? "20px" : 0)};
1236
-
1237
- strong,
1238
- small {
1239
- display: block;
1240
- }
1241
-
1242
- strong {
1243
- color: var(--sk-text);
1244
- font-size: 14px;
1245
- font-weight: 500;
1246
- line-height: 20px;
1247
- }
1248
-
1249
- small {
1250
- margin-top: 2px;
1251
- color: var(--sk-text-muted);
1252
- font-size: 12px;
1253
- line-height: 16px;
1254
- }
1255
- `;
1256
- export const ProgressLabel = styled.small `
1237
+ : "var(--sk-surface-elevated)"};
1238
+ `;
1239
+ export const ProgressConnector = styled.span `
1240
+ width: 1px;
1241
+ min-height: 20px;
1242
+ flex: 1;
1243
+ margin: 8px 0;
1244
+ background: var(--sk-border);
1245
+ `;
1246
+ export const ProgressText = styled.span `
1247
+ min-width: 0;
1248
+ padding-bottom: ${({ $connected }) => ($connected ? "20px" : 0)};
1249
+
1250
+ strong,
1251
+ small {
1252
+ display: block;
1253
+ }
1254
+
1255
+ strong {
1256
+ color: var(--sk-text);
1257
+ font-size: 14px;
1258
+ font-weight: 500;
1259
+ line-height: 20px;
1260
+ }
1261
+
1262
+ small {
1263
+ margin-top: 2px;
1264
+ color: var(--sk-text-muted);
1265
+ font-size: 12px;
1266
+ line-height: 16px;
1267
+ }
1268
+ `;
1269
+ export const ProgressLabel = styled.small `
1257
1270
  color: ${({ $tone }) => $tone === "active"
1258
1271
  ? "var(--sk-accent)"
1259
1272
  : $tone === "complete"
@@ -1262,48 +1275,48 @@ export const ProgressLabel = styled.small `
1262
1275
  ? "var(--sk-danger)"
1263
1276
  : $tone === "warning"
1264
1277
  ? "var(--sk-warning)"
1265
- : "var(--sk-text-muted)"} !important;
1266
- `;
1267
- export const ExplorerLink = styled.a `
1268
- color: var(--sk-accent);
1269
- font-size: 12px;
1270
- text-decoration: underline;
1271
- text-underline-offset: 2px;
1272
- `;
1273
- export const ExecutionState = styled.div `
1274
- display: flex;
1275
- min-height: 112px;
1276
- align-items: center;
1277
- justify-content: center;
1278
- flex-direction: column;
1279
- gap: 10px;
1280
- color: ${({ $tone }) => ($tone === "danger" ? "var(--sk-danger)" : "var(--sk-text-muted)")};
1281
- text-align: center;
1282
-
1283
- p {
1284
- margin: 0;
1285
- font-size: 14px;
1286
- }
1287
- `;
1288
- export const Spinner = styled.span `
1289
- width: 16px;
1290
- height: 16px;
1291
- border: 2px solid currentColor;
1292
- border-right-color: transparent;
1293
- border-radius: 50%;
1294
- animation: sk-spin 700ms linear infinite;
1295
-
1296
- @keyframes sk-spin {
1297
- to {
1298
- transform: rotate(360deg);
1299
- }
1300
- }
1301
- `;
1302
- export const SrOnly = styled.span `
1303
- position: absolute;
1304
- width: 1px;
1305
- height: 1px;
1306
- overflow: hidden;
1307
- clip: rect(0, 0, 0, 0);
1308
- white-space: nowrap;
1278
+ : "var(--sk-text-muted)"} !important;
1279
+ `;
1280
+ export const ExplorerLink = styled.a `
1281
+ color: var(--sk-accent);
1282
+ font-size: 12px;
1283
+ text-decoration: underline;
1284
+ text-underline-offset: 2px;
1285
+ `;
1286
+ export const ExecutionState = styled.div `
1287
+ display: flex;
1288
+ min-height: 112px;
1289
+ align-items: center;
1290
+ justify-content: center;
1291
+ flex-direction: column;
1292
+ gap: 10px;
1293
+ color: ${({ $tone }) => ($tone === "danger" ? "var(--sk-danger)" : "var(--sk-text-muted)")};
1294
+ text-align: center;
1295
+
1296
+ p {
1297
+ margin: 0;
1298
+ font-size: 14px;
1299
+ }
1300
+ `;
1301
+ export const Spinner = styled.span `
1302
+ width: 16px;
1303
+ height: 16px;
1304
+ border: 2px solid currentColor;
1305
+ border-right-color: transparent;
1306
+ border-radius: 50%;
1307
+ animation: sk-spin 700ms linear infinite;
1308
+
1309
+ @keyframes sk-spin {
1310
+ to {
1311
+ transform: rotate(360deg);
1312
+ }
1313
+ }
1314
+ `;
1315
+ export const SrOnly = styled.span `
1316
+ position: absolute;
1317
+ width: 1px;
1318
+ height: 1px;
1319
+ overflow: hidden;
1320
+ clip: rect(0, 0, 0, 0);
1321
+ white-space: nowrap;
1309
1322
  `;