@shapeshiftoss/swap-widget 0.0.2

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 (157) hide show
  1. package/Dockerfile +87 -0
  2. package/README.md +519 -0
  3. package/dist/assets/PhArrowCircleDown-B305t-Sh.js +14 -0
  4. package/dist/assets/PhArrowClockwise-CJPxQhr_.js +14 -0
  5. package/dist/assets/PhArrowDown-C4hT9BVu.js +14 -0
  6. package/dist/assets/PhArrowLeft-Way4Cu-r.js +14 -0
  7. package/dist/assets/PhArrowRight-Cp5ZME0F.js +14 -0
  8. package/dist/assets/PhArrowSquareOut-NnrK69c5.js +14 -0
  9. package/dist/assets/PhArrowUp-Dph6j8rm.js +14 -0
  10. package/dist/assets/PhArrowUpRight-BpJjRRRh.js +14 -0
  11. package/dist/assets/PhArrowsClockwise-CFUT8X7R.js +14 -0
  12. package/dist/assets/PhArrowsDownUp-BjBI4ckC.js +14 -0
  13. package/dist/assets/PhArrowsLeftRight-CuLpbKRk.js +14 -0
  14. package/dist/assets/PhBank-Dchr4XQJ.js +14 -0
  15. package/dist/assets/PhBrowser-dUu2TrC1.js +14 -0
  16. package/dist/assets/PhCaretDown-78IuKU3V.js +14 -0
  17. package/dist/assets/PhCaretLeft-_aiyH7n1.js +14 -0
  18. package/dist/assets/PhCaretRight-8zJQEuDX.js +14 -0
  19. package/dist/assets/PhCaretUp-CiCxKWwN.js +14 -0
  20. package/dist/assets/PhCheck-CcADx8br.js +14 -0
  21. package/dist/assets/PhCircleHalf-BYzSzd2h.js +14 -0
  22. package/dist/assets/PhClock-UItiXeJq.js +14 -0
  23. package/dist/assets/PhCompass-CUy3uA7t.js +14 -0
  24. package/dist/assets/PhCopy-C-PDgSlZ.js +14 -0
  25. package/dist/assets/PhCreditCard-CWRaUT6F.js +14 -0
  26. package/dist/assets/PhCurrencyDollar-Cqla3AXT.js +14 -0
  27. package/dist/assets/PhDesktop-BBIPrYLl.js +14 -0
  28. package/dist/assets/PhDeviceMobile-BdsPaATg.js +14 -0
  29. package/dist/assets/PhDotsThree-BMXCQl-0.js +14 -0
  30. package/dist/assets/PhEnvelope-yUsis6yU.js +14 -0
  31. package/dist/assets/PhFunnelSimple-Ba7BbWTp.js +14 -0
  32. package/dist/assets/PhGlobe-DgLxBk5U.js +14 -0
  33. package/dist/assets/PhIdentificationCard-Czjmq9Z3.js +14 -0
  34. package/dist/assets/PhImage-BAJ_erz6.js +14 -0
  35. package/dist/assets/PhInfo-Cr4DhVUE.js +14 -0
  36. package/dist/assets/PhLightbulb-BX_7duTr.js +14 -0
  37. package/dist/assets/PhMagnifyingGlass-Mygfryvz.js +14 -0
  38. package/dist/assets/PhPaperPlaneRight-BeuCA660.js +14 -0
  39. package/dist/assets/PhPlus-BMjcHjsT.js +14 -0
  40. package/dist/assets/PhPower-CGffGmdb.js +14 -0
  41. package/dist/assets/PhPuzzlePiece-wm_GpVSi.js +14 -0
  42. package/dist/assets/PhQrCode-DRwRzXCH.js +14 -0
  43. package/dist/assets/PhQuestion-M09j2U0T.js +14 -0
  44. package/dist/assets/PhQuestionMark-BP9EMB6h.js +14 -0
  45. package/dist/assets/PhSealCheck-BfG80yKn.js +14 -0
  46. package/dist/assets/PhSignOut-C5YOWlPT.js +14 -0
  47. package/dist/assets/PhSpinner-BXooDYzU.js +14 -0
  48. package/dist/assets/PhTrash-Biq6rmmL.js +14 -0
  49. package/dist/assets/PhUser-CAgZSpGe.js +14 -0
  50. package/dist/assets/PhVault-l2PHF38a.js +14 -0
  51. package/dist/assets/PhWallet-w25D16It.js +14 -0
  52. package/dist/assets/PhWarning-DPEydIPw.js +14 -0
  53. package/dist/assets/PhWarningCircle-BqjT745H.js +14 -0
  54. package/dist/assets/PhX-s-SmVExa.js +14 -0
  55. package/dist/assets/SwapController-If0bFrNc.js +1 -0
  56. package/dist/assets/ccip-BBB7uCdL.js +1 -0
  57. package/dist/assets/ccip-CkkdfKKI.js +1 -0
  58. package/dist/assets/data-capture-D4gAy-Yc.js +242 -0
  59. package/dist/assets/email-B1AJehis.js +90 -0
  60. package/dist/assets/embedded-wallet-Q6DQopDk.js +410 -0
  61. package/dist/assets/features-B6JAPAFb.js +5 -0
  62. package/dist/assets/index-5jd8RPN9.js +7428 -0
  63. package/dist/assets/index-B4kNtSTk.js +1080 -0
  64. package/dist/assets/index-B753eAob.js +1 -0
  65. package/dist/assets/index-BZoLTv77.js +3 -0
  66. package/dist/assets/index-Bcw9UURX.js +3 -0
  67. package/dist/assets/index-BkrV-ahK.js +2 -0
  68. package/dist/assets/index-CRQzQ_up.js +9 -0
  69. package/dist/assets/index-CSW0Gt5y.js +132 -0
  70. package/dist/assets/index-CZ4jTIsk.js +138 -0
  71. package/dist/assets/index-Cwa8SB3h.js +61 -0
  72. package/dist/assets/index-DEwQgT4r.js +78 -0
  73. package/dist/assets/index-DVfQiQ1d.js +1 -0
  74. package/dist/assets/index-cV3UdaMs.css +1 -0
  75. package/dist/assets/index-hAmu622O.js +43 -0
  76. package/dist/assets/onramp-XcPNCLRU.js +422 -0
  77. package/dist/assets/pay-with-exchange-BeHt4OF4.js +280 -0
  78. package/dist/assets/property-C9JG5tag.js +27 -0
  79. package/dist/assets/receive-7ff4he2S.js +131 -0
  80. package/dist/assets/send-CkMBIRXT.js +554 -0
  81. package/dist/assets/socials-DmmxuLrP.js +250 -0
  82. package/dist/assets/swaps-IHAYRQ0x.js +1050 -0
  83. package/dist/assets/transactions-9Cxdk7o9.js +16 -0
  84. package/dist/assets/v4-BOvFkHkt.js +1 -0
  85. package/dist/assets/w3m-modal-kJzFnBfB.js +891 -0
  86. package/dist/assets/wallet-standard-Dv8LMoUB.js +1 -0
  87. package/dist/favicon.png +0 -0
  88. package/dist/favicon.svg +11 -0
  89. package/dist/icon-192x192.png +0 -0
  90. package/dist/icon-512x512.png +0 -0
  91. package/dist/index.html +33 -0
  92. package/index.html +32 -0
  93. package/package.json +59 -0
  94. package/public/favicon.png +0 -0
  95. package/public/favicon.svg +11 -0
  96. package/public/icon-192x192.png +0 -0
  97. package/public/icon-512x512.png +0 -0
  98. package/railway.toml +10 -0
  99. package/src/api/client.ts +95 -0
  100. package/src/components/AddressInputModal.css +173 -0
  101. package/src/components/AddressInputModal.tsx +250 -0
  102. package/src/components/ApprovalStep.tsx +92 -0
  103. package/src/components/ExecutionStep.tsx +27 -0
  104. package/src/components/InputStep.tsx +431 -0
  105. package/src/components/QuoteSelector.css +146 -0
  106. package/src/components/QuoteSelector.tsx +137 -0
  107. package/src/components/QuotesModal.css +250 -0
  108. package/src/components/QuotesModal.tsx +182 -0
  109. package/src/components/SettingsModal.css +145 -0
  110. package/src/components/SettingsModal.tsx +180 -0
  111. package/src/components/StatusStep.tsx +139 -0
  112. package/src/components/SwapWidget.css +713 -0
  113. package/src/components/SwapWidget.tsx +607 -0
  114. package/src/components/TokenSelectModal.css +438 -0
  115. package/src/components/TokenSelectModal.tsx +487 -0
  116. package/src/components/WalletProvider.tsx +92 -0
  117. package/src/config/appkit.ts +104 -0
  118. package/src/config/wagmi.ts +27 -0
  119. package/src/constants/chains.ts +72 -0
  120. package/src/constants/defaults.ts +28 -0
  121. package/src/constants/swappers.ts +48 -0
  122. package/src/constants/viemChains.ts +69 -0
  123. package/src/contexts/SwapWalletContext.tsx +25 -0
  124. package/src/demo/App.css +458 -0
  125. package/src/demo/App.tsx +481 -0
  126. package/src/demo/main.tsx +25 -0
  127. package/src/hooks/useAssets.ts +180 -0
  128. package/src/hooks/useBalances.ts +822 -0
  129. package/src/hooks/useBitcoinSigning.ts +276 -0
  130. package/src/hooks/useMarketData.ts +169 -0
  131. package/src/hooks/useSolanaSigning.ts +275 -0
  132. package/src/hooks/useStatusPolling.ts +137 -0
  133. package/src/hooks/useSwapApproval.ts +106 -0
  134. package/src/hooks/useSwapDisplayValues.ts +157 -0
  135. package/src/hooks/useSwapExecution.ts +199 -0
  136. package/src/hooks/useSwapHandlers.ts +119 -0
  137. package/src/hooks/useSwapQuote.ts +71 -0
  138. package/src/hooks/useSwapQuoting.ts +102 -0
  139. package/src/hooks/useSwapRates.ts +61 -0
  140. package/src/index.ts +43 -0
  141. package/src/machines/SwapMachineContext.ts +5 -0
  142. package/src/machines/__tests__/guards.test.ts +228 -0
  143. package/src/machines/__tests__/setup.test.ts +7 -0
  144. package/src/machines/__tests__/swapMachine.test.ts +544 -0
  145. package/src/machines/__tests__/types.test.ts +124 -0
  146. package/src/machines/guards.ts +33 -0
  147. package/src/machines/swapMachine.ts +288 -0
  148. package/src/machines/types.ts +54 -0
  149. package/src/services/transactionStatus.ts +322 -0
  150. package/src/types/index.ts +361 -0
  151. package/src/utils/addressValidation.ts +201 -0
  152. package/src/utils/redirect.ts +45 -0
  153. package/src/vite-env.d.ts +10 -0
  154. package/tsconfig.json +23 -0
  155. package/tsconfig.node.json +10 -0
  156. package/vite.config.ts +101 -0
  157. package/vitest.config.ts +18 -0
@@ -0,0 +1,713 @@
1
+ .ssw-widget {
2
+ --ssw-accent: #3861fb;
3
+ --ssw-accent-light: rgba(56, 97, 251, 0.1);
4
+ --ssw-success: #00d395;
5
+ --ssw-error: #f44336;
6
+ --ssw-warning: #ffc107;
7
+ --ssw-radius-widget: 20px;
8
+ --ssw-radius-lg: 16px;
9
+ --ssw-radius-md: 14px;
10
+ --ssw-radius-sm: 10px;
11
+ --ssw-radius-xs: 6px;
12
+ --ssw-radius-2xs: 4px;
13
+
14
+ font-family: var(--ssw-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);
15
+ width: 100%;
16
+ min-width: 420px;
17
+ max-width: 420px;
18
+ border-radius: var(--ssw-radius-widget);
19
+ overflow: hidden;
20
+ }
21
+
22
+ .ssw-widget *,
23
+ .ssw-widget *::before,
24
+ .ssw-widget *::after {
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ .ssw-widget.ssw-dark {
29
+ --ssw-bg-primary: #0a0a14;
30
+ --ssw-bg-secondary: #12121c;
31
+ --ssw-bg-tertiary: #1a1a2e;
32
+ --ssw-bg-input: #0d0d16;
33
+ --ssw-bg-hover: rgba(255, 255, 255, 0.05);
34
+ --ssw-border: rgba(255, 255, 255, 0.08);
35
+ --ssw-border-hover: rgba(255, 255, 255, 0.15);
36
+ --ssw-text-primary: #ffffff;
37
+ --ssw-text-secondary: #a0a0b0;
38
+ --ssw-text-muted: #6b6b80;
39
+
40
+ background: var(--ssw-bg-secondary);
41
+ color: var(--ssw-text-primary);
42
+ }
43
+
44
+ .ssw-widget.ssw-light {
45
+ --ssw-bg-primary: #ffffff;
46
+ --ssw-bg-secondary: #f8f9fc;
47
+ --ssw-bg-tertiary: #ffffff;
48
+ --ssw-bg-input: #f0f2f5;
49
+ --ssw-bg-hover: rgba(0, 0, 0, 0.04);
50
+ --ssw-border: rgba(0, 0, 0, 0.08);
51
+ --ssw-border-hover: rgba(0, 0, 0, 0.15);
52
+ --ssw-text-primary: #1a1a2e;
53
+ --ssw-text-secondary: #5c5c70;
54
+ --ssw-text-muted: #9090a0;
55
+
56
+ background: var(--ssw-bg-secondary);
57
+ color: var(--ssw-text-primary);
58
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
59
+ }
60
+
61
+ .ssw-header {
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: space-between;
65
+ padding: 16px 20px;
66
+ border-bottom: 1px solid var(--ssw-border);
67
+ }
68
+
69
+ .ssw-header-title {
70
+ font-size: 16px;
71
+ font-weight: 600;
72
+ color: var(--ssw-text-primary);
73
+ }
74
+
75
+ .ssw-header-actions {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 8px;
79
+ }
80
+
81
+ .ssw-connect-btn {
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 6px;
85
+ padding: 8px 12px;
86
+ border: 1px solid var(--ssw-border);
87
+ background: var(--ssw-bg-tertiary);
88
+ border-radius: var(--ssw-radius-sm);
89
+ color: var(--ssw-text-primary);
90
+ font-size: 13px;
91
+ font-weight: 500;
92
+ cursor: pointer;
93
+ transition: all 0.15s ease;
94
+ }
95
+
96
+ .ssw-connect-btn:hover {
97
+ background: var(--ssw-bg-hover);
98
+ border-color: var(--ssw-accent);
99
+ }
100
+
101
+ .ssw-connect-btn.ssw-connected {
102
+ background: color-mix(in srgb, var(--ssw-accent) 15%, var(--ssw-bg-tertiary));
103
+ border-color: color-mix(in srgb, var(--ssw-accent) 40%, transparent);
104
+ }
105
+
106
+ .ssw-connect-btn.ssw-wrong-network {
107
+ background: color-mix(in srgb, var(--ssw-error) 15%, var(--ssw-bg-tertiary));
108
+ border-color: var(--ssw-error);
109
+ color: var(--ssw-error);
110
+ }
111
+
112
+ .ssw-settings-btn {
113
+ padding: 8px;
114
+ border: none;
115
+ background: none;
116
+ border-radius: var(--ssw-radius-sm);
117
+ color: var(--ssw-text-secondary);
118
+ cursor: pointer;
119
+ transition: all 0.15s ease;
120
+ }
121
+
122
+ .ssw-settings-btn:hover {
123
+ color: var(--ssw-text-primary);
124
+ background: var(--ssw-bg-hover);
125
+ }
126
+
127
+ .ssw-swap-container {
128
+ padding: 16px;
129
+ display: flex;
130
+ flex-direction: column;
131
+ gap: 4px;
132
+ position: relative;
133
+ }
134
+
135
+ .ssw-token-section {
136
+ background: var(--ssw-bg-tertiary);
137
+ border-radius: var(--ssw-radius-lg);
138
+ padding: 16px;
139
+ border: 1px solid var(--ssw-border);
140
+ transition: border-color 0.15s ease;
141
+ }
142
+
143
+ .ssw-token-section:focus-within {
144
+ border-color: var(--ssw-accent);
145
+ }
146
+
147
+ .ssw-section-header {
148
+ display: flex;
149
+ align-items: center;
150
+ justify-content: space-between;
151
+ margin-bottom: 8px;
152
+ }
153
+
154
+ .ssw-section-label {
155
+ font-size: 13px;
156
+ font-weight: 500;
157
+ color: var(--ssw-text-secondary);
158
+ }
159
+
160
+ .ssw-wallet-badge {
161
+ font-size: 12px;
162
+ color: var(--ssw-accent);
163
+ padding: 2px 8px;
164
+ background: var(--ssw-accent-light);
165
+ border-radius: var(--ssw-radius-xs);
166
+ }
167
+
168
+ .ssw-input-row {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: 12px;
172
+ }
173
+
174
+ .ssw-amount-input {
175
+ flex: 1;
176
+ background: none;
177
+ border: none;
178
+ font-size: 32px;
179
+ font-weight: 500;
180
+ color: var(--ssw-text-primary);
181
+ outline: none;
182
+ min-width: 0;
183
+ }
184
+
185
+ .ssw-amount-input::placeholder {
186
+ color: var(--ssw-text-muted);
187
+ }
188
+
189
+ .ssw-token-btn {
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 10px;
193
+ padding: 8px 12px;
194
+ border: none;
195
+ background: var(--ssw-bg-secondary);
196
+ border-radius: var(--ssw-radius-sm);
197
+ cursor: pointer;
198
+ transition: all 0.15s ease;
199
+ flex-shrink: 0;
200
+ }
201
+
202
+ .ssw-token-btn:hover {
203
+ background: var(--ssw-bg-hover);
204
+ }
205
+
206
+ .ssw-token-icon {
207
+ width: 32px;
208
+ height: 32px;
209
+ border-radius: 50%;
210
+ object-fit: contain;
211
+ }
212
+
213
+ .ssw-token-icon-placeholder {
214
+ width: 32px;
215
+ height: 32px;
216
+ border-radius: 50%;
217
+ background: var(--ssw-accent);
218
+ display: flex;
219
+ align-items: center;
220
+ justify-content: center;
221
+ font-size: 14px;
222
+ font-weight: 600;
223
+ color: white;
224
+ }
225
+
226
+ .ssw-token-info {
227
+ display: flex;
228
+ flex-direction: column;
229
+ align-items: flex-start;
230
+ gap: 2px;
231
+ }
232
+
233
+ .ssw-token-symbol {
234
+ font-size: 15px;
235
+ font-weight: 600;
236
+ color: var(--ssw-text-primary);
237
+ }
238
+
239
+ .ssw-token-chain {
240
+ font-size: 12px;
241
+ color: var(--ssw-text-secondary);
242
+ }
243
+
244
+ .ssw-token-btn svg {
245
+ color: var(--ssw-text-muted);
246
+ }
247
+
248
+ .ssw-token-btn-locked {
249
+ cursor: default;
250
+ }
251
+
252
+ .ssw-token-btn-locked:hover {
253
+ background: var(--ssw-bg-secondary);
254
+ }
255
+
256
+ .ssw-section-footer {
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: space-between;
260
+ margin-top: 8px;
261
+ }
262
+
263
+ .ssw-balance {
264
+ font-size: 12px;
265
+ color: var(--ssw-text-muted);
266
+ }
267
+
268
+ .ssw-balance-skeleton {
269
+ width: 80px;
270
+ height: 14px;
271
+ border-radius: var(--ssw-radius-2xs);
272
+ background: linear-gradient(
273
+ 90deg,
274
+ var(--ssw-bg-hover) 25%,
275
+ var(--ssw-border) 50%,
276
+ var(--ssw-bg-hover) 75%
277
+ );
278
+ background-size: 200% 100%;
279
+ animation: ssw-skeleton-shimmer 1.5s infinite;
280
+ }
281
+
282
+ @keyframes ssw-skeleton-shimmer {
283
+ 0% {
284
+ background-position: 200% 0;
285
+ }
286
+ 100% {
287
+ background-position: -200% 0;
288
+ }
289
+ }
290
+
291
+ .ssw-usd-value {
292
+ font-size: 13px;
293
+ color: var(--ssw-text-muted);
294
+ }
295
+
296
+ .ssw-swap-divider {
297
+ display: flex;
298
+ justify-content: center;
299
+ margin: -12px 0;
300
+ position: relative;
301
+ z-index: 10;
302
+ }
303
+
304
+ .ssw-swap-btn {
305
+ width: 36px;
306
+ height: 36px;
307
+ border: 4px solid var(--ssw-bg-secondary);
308
+ background: var(--ssw-bg-tertiary);
309
+ border-radius: var(--ssw-radius-sm);
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ cursor: pointer;
314
+ color: var(--ssw-text-secondary);
315
+ transition: color 0.15s ease, background 0.15s ease, transform 0.3s ease;
316
+ }
317
+
318
+ .ssw-swap-btn:hover {
319
+ color: var(--ssw-text-primary);
320
+ background: var(--ssw-bg-hover);
321
+ }
322
+
323
+ .ssw-swap-btn:active {
324
+ transform: rotate(180deg);
325
+ }
326
+
327
+ .ssw-swap-btn:disabled {
328
+ opacity: 0.4;
329
+ cursor: not-allowed;
330
+ }
331
+
332
+ .ssw-swap-btn:disabled:hover {
333
+ color: var(--ssw-text-secondary);
334
+ background: var(--ssw-bg-tertiary);
335
+ }
336
+
337
+ .ssw-swap-btn:disabled:active {
338
+ transform: none;
339
+ }
340
+
341
+ .ssw-receive-address-btn {
342
+ display: flex;
343
+ align-items: center;
344
+ gap: 6px;
345
+ padding: 4px 10px;
346
+ background: var(--ssw-bg-tertiary);
347
+ border: 1px solid var(--ssw-border);
348
+ border-radius: var(--ssw-radius-xs);
349
+ cursor: pointer;
350
+ transition: all 0.15s ease;
351
+ }
352
+
353
+ .ssw-receive-address-btn:hover {
354
+ background: var(--ssw-bg-hover);
355
+ border-color: var(--ssw-accent);
356
+ }
357
+
358
+ .ssw-receive-address-btn.ssw-custom {
359
+ border-color: var(--ssw-accent);
360
+ background: color-mix(in srgb, var(--ssw-accent) 10%, var(--ssw-bg-tertiary));
361
+ }
362
+
363
+ .ssw-receive-address-text {
364
+ font-size: 12px;
365
+ font-family: monospace;
366
+ color: var(--ssw-accent);
367
+ }
368
+
369
+ .ssw-receive-address-btn svg {
370
+ color: var(--ssw-text-muted);
371
+ flex-shrink: 0;
372
+ }
373
+
374
+ .ssw-receive-address-btn:hover svg {
375
+ color: var(--ssw-accent);
376
+ }
377
+
378
+ .ssw-quotes {
379
+ padding: 0 16px 16px;
380
+ }
381
+
382
+ .ssw-network-fee {
383
+ display: flex;
384
+ align-items: center;
385
+ justify-content: space-between;
386
+ padding: 0 20px;
387
+ margin-bottom: 8px;
388
+ }
389
+
390
+ .ssw-network-fee-label {
391
+ font-size: 13px;
392
+ color: var(--ssw-text-muted);
393
+ }
394
+
395
+ .ssw-network-fee-value {
396
+ font-size: 13px;
397
+ font-weight: 500;
398
+ color: var(--ssw-text-secondary);
399
+ }
400
+
401
+ .ssw-action-btn {
402
+ width: calc(100% - 32px);
403
+ margin: 0 16px 16px;
404
+ padding: 16px;
405
+ border: none;
406
+ border-radius: var(--ssw-radius-md);
407
+ background: var(--ssw-accent);
408
+ color: white;
409
+ font-size: 16px;
410
+ font-weight: 600;
411
+ cursor: pointer;
412
+ transition: all 0.15s ease;
413
+ }
414
+
415
+ .ssw-action-btn:hover:not(:disabled) {
416
+ filter: brightness(1.1);
417
+ }
418
+
419
+ .ssw-action-btn:disabled {
420
+ background: var(--ssw-bg-tertiary);
421
+ color: var(--ssw-text-muted);
422
+ cursor: not-allowed;
423
+ }
424
+
425
+ .ssw-action-btn.ssw-secondary {
426
+ background: color-mix(in srgb, var(--ssw-accent) 15%, var(--ssw-bg-tertiary));
427
+ color: var(--ssw-text-primary);
428
+ border: 1px solid color-mix(in srgb, var(--ssw-accent) 40%, transparent);
429
+ }
430
+
431
+ .ssw-action-btn.ssw-secondary:hover:not(:disabled) {
432
+ background: color-mix(in srgb, var(--ssw-accent) 25%, var(--ssw-bg-tertiary));
433
+ filter: none;
434
+ }
435
+
436
+ .ssw-powered-by {
437
+ padding: 12px 16px;
438
+ display: flex;
439
+ align-items: center;
440
+ justify-content: center;
441
+ gap: 4px;
442
+ font-size: 12px;
443
+ color: var(--ssw-text-muted);
444
+ border-top: 1px solid var(--ssw-border);
445
+ }
446
+
447
+ .ssw-powered-by a {
448
+ color: var(--ssw-accent);
449
+ text-decoration: none;
450
+ font-weight: 500;
451
+ }
452
+
453
+ .ssw-powered-by-link {
454
+ display: inline-flex;
455
+ align-items: center;
456
+ gap: 4px;
457
+ }
458
+
459
+ .ssw-powered-by a:hover {
460
+ opacity: 0.8;
461
+ }
462
+
463
+ /* Transaction Status */
464
+ .ssw-tx-status {
465
+ display: flex;
466
+ align-items: center;
467
+ gap: 12px;
468
+ padding: 12px 16px;
469
+ margin: 0 16px 16px;
470
+ border-radius: var(--ssw-radius-sm);
471
+ background: var(--ssw-bg-tertiary);
472
+ border: 1px solid var(--ssw-border);
473
+ }
474
+
475
+ .ssw-tx-status-pending {
476
+ border-color: var(--ssw-accent);
477
+ background: var(--ssw-accent-light);
478
+ }
479
+
480
+ .ssw-tx-status-success {
481
+ border-color: var(--ssw-success);
482
+ background: rgba(0, 211, 149, 0.1);
483
+ }
484
+
485
+ .ssw-tx-status-error {
486
+ border-color: var(--ssw-error);
487
+ background: rgba(244, 67, 54, 0.1);
488
+ }
489
+
490
+ .ssw-tx-status-icon {
491
+ flex-shrink: 0;
492
+ display: flex;
493
+ align-items: center;
494
+ justify-content: center;
495
+ width: 24px;
496
+ height: 24px;
497
+ }
498
+
499
+ .ssw-tx-status-pending .ssw-tx-status-icon {
500
+ color: var(--ssw-accent);
501
+ }
502
+
503
+ .ssw-tx-status-success .ssw-tx-status-icon {
504
+ color: var(--ssw-success);
505
+ }
506
+
507
+ .ssw-tx-status-error .ssw-tx-status-icon {
508
+ color: var(--ssw-error);
509
+ }
510
+
511
+ .ssw-tx-status-content {
512
+ flex: 1;
513
+ display: flex;
514
+ flex-direction: row;
515
+ align-items: center;
516
+ gap: 8px;
517
+ min-width: 0;
518
+ flex-wrap: wrap;
519
+ }
520
+
521
+ .ssw-tx-status-message {
522
+ font-size: 14px;
523
+ font-weight: 500;
524
+ color: var(--ssw-text-primary);
525
+ word-break: break-word;
526
+ }
527
+
528
+ .ssw-tx-status-link {
529
+ font-size: 13px;
530
+ color: var(--ssw-accent);
531
+ text-decoration: none;
532
+ }
533
+
534
+ .ssw-tx-status-link:hover {
535
+ text-decoration: underline;
536
+ }
537
+
538
+ .ssw-tx-status-close {
539
+ flex-shrink: 0;
540
+ background: none;
541
+ border: none;
542
+ padding: 4px;
543
+ cursor: pointer;
544
+ color: var(--ssw-text-muted);
545
+ transition: color 0.15s ease;
546
+ }
547
+
548
+ .ssw-tx-status-close:hover {
549
+ color: var(--ssw-text-primary);
550
+ }
551
+
552
+ /* Spinner animation */
553
+ @keyframes ssw-spin {
554
+ from {
555
+ transform: rotate(0deg);
556
+ }
557
+ to {
558
+ transform: rotate(360deg);
559
+ }
560
+ }
561
+
562
+ .ssw-spinner {
563
+ animation: ssw-spin 1s linear infinite;
564
+ }
565
+
566
+ /* Step Screens — shared layout for all non-input steps */
567
+ .ssw-step-container {
568
+ min-height: 320px;
569
+ display: flex;
570
+ flex-direction: column;
571
+ }
572
+
573
+ .ssw-step-screen {
574
+ display: flex;
575
+ flex-direction: column;
576
+ align-items: center;
577
+ justify-content: center;
578
+ padding: 40px 32px;
579
+ flex: 1;
580
+ text-align: center;
581
+ animation: ssw-step-enter 0.25s ease;
582
+ }
583
+
584
+ @keyframes ssw-step-enter {
585
+ from {
586
+ opacity: 0;
587
+ transform: translateY(6px);
588
+ }
589
+ to {
590
+ opacity: 1;
591
+ transform: translateY(0);
592
+ }
593
+ }
594
+
595
+ .ssw-step-icon-circle {
596
+ width: 72px;
597
+ height: 72px;
598
+ border-radius: 50%;
599
+ display: flex;
600
+ align-items: center;
601
+ justify-content: center;
602
+ border-width: 2px;
603
+ border-style: solid;
604
+ flex-shrink: 0;
605
+ }
606
+
607
+ .ssw-step-icon-circle.ssw-ic-accent {
608
+ background: var(--ssw-accent-light);
609
+ border-color: var(--ssw-accent);
610
+ color: var(--ssw-accent);
611
+ }
612
+
613
+ .ssw-step-icon-circle.ssw-ic-success {
614
+ background: rgba(0, 211, 149, 0.1);
615
+ border-color: var(--ssw-success);
616
+ color: var(--ssw-success);
617
+ }
618
+
619
+ .ssw-step-icon-circle.ssw-ic-error {
620
+ background: rgba(244, 67, 54, 0.1);
621
+ border-color: var(--ssw-error);
622
+ color: var(--ssw-error);
623
+ }
624
+
625
+ .ssw-step-title {
626
+ font-size: 20px;
627
+ font-weight: 600;
628
+ color: var(--ssw-text-primary);
629
+ margin-top: 20px;
630
+ }
631
+
632
+ .ssw-step-subtitle {
633
+ font-size: 14px;
634
+ color: var(--ssw-text-secondary);
635
+ margin-top: 8px;
636
+ max-width: 280px;
637
+ line-height: 1.5;
638
+ }
639
+
640
+ .ssw-step-explorer-link {
641
+ display: inline-flex;
642
+ align-items: center;
643
+ gap: 4px;
644
+ font-size: 13px;
645
+ color: var(--ssw-accent);
646
+ text-decoration: none;
647
+ margin-top: 16px;
648
+ padding: 6px 12px;
649
+ border-radius: var(--ssw-radius-xs);
650
+ background: var(--ssw-accent-light);
651
+ transition: opacity 0.15s ease;
652
+ }
653
+
654
+ .ssw-step-explorer-link:hover {
655
+ opacity: 0.8;
656
+ }
657
+
658
+ .ssw-step-actions {
659
+ display: flex;
660
+ gap: 10px;
661
+ margin-top: 24px;
662
+ width: 100%;
663
+ max-width: 320px;
664
+ }
665
+
666
+ .ssw-step-actions .ssw-action-btn {
667
+ flex: 1;
668
+ width: auto;
669
+ margin: 0;
670
+ white-space: nowrap;
671
+ }
672
+
673
+ .ssw-step-actions .ssw-secondary {
674
+ background: var(--ssw-bg-tertiary);
675
+ border: 1px solid var(--ssw-border);
676
+ color: var(--ssw-text-secondary);
677
+ }
678
+
679
+ .ssw-step-actions .ssw-secondary:hover {
680
+ border-color: var(--ssw-border-hover);
681
+ color: var(--ssw-text-primary);
682
+ }
683
+
684
+ /* Outline button variant */
685
+ .ssw-btn-outline .ssw-action-btn {
686
+ background: transparent;
687
+ border: 1px solid var(--ssw-border);
688
+ color: var(--ssw-text-primary);
689
+ }
690
+
691
+ .ssw-btn-outline .ssw-action-btn:hover:not(:disabled) {
692
+ border-color: var(--ssw-accent);
693
+ background: var(--ssw-accent-light);
694
+ filter: none;
695
+ }
696
+
697
+ .ssw-btn-outline .ssw-action-btn:disabled {
698
+ background: transparent;
699
+ border-color: var(--ssw-border);
700
+ color: var(--ssw-text-muted);
701
+ }
702
+
703
+ .ssw-btn-outline .ssw-action-btn.ssw-secondary {
704
+ background: transparent;
705
+ border: 1px solid var(--ssw-border);
706
+ color: var(--ssw-text-secondary);
707
+ }
708
+
709
+ .ssw-btn-outline .ssw-action-btn.ssw-secondary:hover:not(:disabled) {
710
+ border-color: var(--ssw-border-hover);
711
+ color: var(--ssw-text-primary);
712
+ background: var(--ssw-bg-hover);
713
+ }