@ckb-ccc/connector 0.0.9-alpha.2 → 0.0.10-alpha.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 (76) hide show
  1. package/dist/assets/chains/index.d.ts +1 -0
  2. package/dist/assets/chains/index.d.ts.map +1 -1
  3. package/dist/assets/chains/index.js +1 -0
  4. package/dist/barrel.d.ts +2 -1
  5. package/dist/barrel.d.ts.map +1 -1
  6. package/dist/barrel.js +2 -1
  7. package/dist/components/button-pill.d.ts +7 -0
  8. package/dist/components/button-pill.d.ts.map +1 -0
  9. package/dist/components/button-pill.js +54 -0
  10. package/dist/components/button.d.ts +7 -0
  11. package/dist/components/button.d.ts.map +1 -0
  12. package/dist/components/button.js +60 -0
  13. package/dist/components/copy-button.d.ts +10 -0
  14. package/dist/components/copy-button.d.ts.map +1 -0
  15. package/dist/components/copy-button.js +76 -0
  16. package/dist/components/dialog.d.ts +8 -0
  17. package/dist/components/dialog.d.ts.map +1 -0
  18. package/dist/components/dialog.js +103 -0
  19. package/dist/components/index.d.ts +5 -0
  20. package/dist/components/index.d.ts.map +1 -0
  21. package/dist/components/index.js +4 -0
  22. package/dist/connector/index.d.ts +8 -21
  23. package/dist/connector/index.d.ts.map +1 -1
  24. package/dist/connector/index.js +59 -496
  25. package/dist/scenes/connected.d.ts +12 -1
  26. package/dist/scenes/connected.d.ts.map +1 -1
  27. package/dist/scenes/connected.js +204 -59
  28. package/dist/scenes/index.d.ts +2 -3
  29. package/dist/scenes/index.d.ts.map +1 -1
  30. package/dist/scenes/index.js +2 -3
  31. package/dist/scenes/{connecting.d.ts → selecting/connecting.d.ts} +1 -1
  32. package/dist/scenes/selecting/connecting.d.ts.map +1 -0
  33. package/dist/scenes/{connecting.js → selecting/connecting.js} +5 -5
  34. package/dist/scenes/selecting/index.d.ts +19 -0
  35. package/dist/scenes/selecting/index.d.ts.map +1 -0
  36. package/dist/scenes/selecting/index.js +164 -0
  37. package/dist/scenes/{signers.d.ts → selecting/signers.d.ts} +1 -1
  38. package/dist/scenes/selecting/signers.d.ts.map +1 -0
  39. package/dist/scenes/{signers.js → selecting/signers.js} +6 -7
  40. package/dist/scenes/{wallets.d.ts → selecting/wallets.d.ts} +1 -1
  41. package/dist/scenes/selecting/wallets.d.ts.map +1 -0
  42. package/dist/scenes/{wallets.js → selecting/wallets.js} +3 -3
  43. package/dist/signers/index.d.ts +28 -0
  44. package/dist/signers/index.d.ts.map +1 -0
  45. package/dist/signers/index.js +104 -0
  46. package/package.json +3 -3
  47. package/src/assets/chains/index.ts +1 -0
  48. package/src/barrel.ts +3 -1
  49. package/src/components/button-pill.ts +48 -0
  50. package/src/components/button.ts +54 -0
  51. package/src/components/copy-button.ts +69 -0
  52. package/src/components/dialog.ts +97 -0
  53. package/src/components/index.ts +4 -0
  54. package/src/connector/index.ts +67 -596
  55. package/src/scenes/connected.ts +197 -68
  56. package/src/scenes/index.ts +2 -3
  57. package/src/scenes/{connecting.ts → selecting/connecting.ts} +6 -6
  58. package/src/scenes/selecting/index.ts +181 -0
  59. package/src/scenes/{signers.ts → selecting/signers.ts} +7 -8
  60. package/src/scenes/{wallets.ts → selecting/wallets.ts} +4 -4
  61. package/src/signers/index.ts +186 -0
  62. package/dist/assets/chains/ckb.sm.svg.d.ts +0 -2
  63. package/dist/assets/chains/ckb.sm.svg.d.ts.map +0 -1
  64. package/dist/assets/chains/ckb.sm.svg.js +0 -2
  65. package/dist/assets/copy.svg.d.ts +0 -2
  66. package/dist/assets/copy.svg.d.ts.map +0 -1
  67. package/dist/assets/copy.svg.js +0 -2
  68. package/dist/events/index.d.ts +0 -7
  69. package/dist/events/index.d.ts.map +0 -1
  70. package/dist/events/index.js +0 -10
  71. package/dist/scenes/connecting.d.ts.map +0 -1
  72. package/dist/scenes/signers.d.ts.map +0 -1
  73. package/dist/scenes/wallets.d.ts.map +0 -1
  74. package/src/assets/chains/ckb.sm.svg.ts +0 -5
  75. package/src/assets/copy.svg.ts +0 -5
  76. package/src/events/index.ts +0 -11
@@ -2,63 +2,30 @@ import { ccc } from "@ckb-ccc/ccc";
2
2
  import { LitElement, PropertyValues, css, html } from "lit";
3
3
  import { customElement, property, state } from "lit/decorators.js";
4
4
  import { Ref, createRef, ref } from "lit/directives/ref.js";
5
- import { NOSTR_SVG } from "../assets/chains/nostr.svg";
6
- import { CLOSE_SVG } from "../assets/close.svg";
7
- import { JOY_ID_SVG } from "../assets/joy-id.svg";
8
- import { LEFT_SVG } from "../assets/left.svg";
9
- import { METAMASK_SVG } from "../assets/metamask.svg";
10
- import { OKX_SVG } from "../assets/okx.svg";
11
- import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
12
- import { ClosedEvent, WillUpdateEvent } from "../events";
13
- import {
14
- generateConnectingScene,
15
- generateSignersScene,
16
- generateWalletsScene,
17
- } from "../scenes";
18
- import { generateConnectedScene } from "../scenes/connected";
19
- import { WalletWithSigners } from "../types";
20
-
21
- enum Scene {
22
- SelectingWallets = "SelectingWallets",
23
- SelectingSigners = "SelectingSigners",
24
- Connecting = "Connecting",
25
- Connected = "Connected",
26
- }
5
+ import { ConnectedEvent } from "../scenes/selecting";
6
+ import { SignersController } from "../signers";
27
7
 
28
8
  @customElement("ccc-connector")
29
9
  export class WebComponentConnector extends LitElement {
30
- @state()
31
- private wallets: WalletWithSigners[] = [];
10
+ @property()
11
+ public name?: string;
12
+ @property()
13
+ public icon?: string;
14
+ @property()
15
+ public preferredNetworks?: ccc.NetworkPreference[];
32
16
  @property()
33
17
  public signerFilter?: (
34
18
  signerInfo: ccc.SignerInfo,
35
19
  wallet: ccc.Wallet,
36
20
  ) => Promise<boolean>;
37
21
 
38
- private resetListeners: (() => void)[] = [];
39
-
40
- @property()
41
- public preferredNetworks?: ccc.NetworkPreference[];
42
-
43
- @property()
44
- public name?: string;
45
- @property()
46
- public icon?: string;
47
-
48
22
  @state()
49
23
  public client: ccc.Client = new ccc.ClientPublicTestnet();
50
24
  public setClient(client: ccc.Client) {
51
25
  this.client = client;
52
26
  }
53
27
 
54
- @state()
55
- private scene: Scene = Scene.SelectingWallets;
56
- @state()
57
- private selectedWallet?: WalletWithSigners;
58
- @state()
59
- private selectedSigner?: ccc.SignerInfo;
60
- @state()
61
- private connectingError?: string;
28
+ private signersController = new SignersController(this);
62
29
 
63
30
  @state()
64
31
  private walletName?: string;
@@ -68,41 +35,14 @@ export class WebComponentConnector extends LitElement {
68
35
  public wallet?: ccc.Wallet;
69
36
  @state()
70
37
  public signer?: ccc.SignerInfo;
71
-
72
38
  @state()
73
- private recommendAddress?: string;
74
- @state()
75
- private internalAddress?: string;
76
- @state()
77
- private balance?: ccc.Num;
78
-
79
- private async updateSignerInfo() {
80
- const signer = this.signer?.signer;
81
- if (!signer) {
82
- return;
83
- }
84
- this.recommendAddress = await signer.getRecommendedAddress();
85
- this.internalAddress = await signer.getInternalAddress();
86
- this.balance = await signer.getBalance();
87
- }
88
-
89
- private async prepareSigner() {
90
- if (this.signer && (await this.signer.signer.isConnected())) {
91
- await this.updateSignerInfo();
92
- this.scene = Scene.Connected;
93
- return;
94
- }
95
-
96
- this.wallet = undefined;
97
- this.signer = undefined;
98
- this.scene = Scene.SelectingWallets;
99
- }
39
+ private unregisterSignerReplacer?: () => void;
100
40
 
101
41
  public disconnect() {
102
42
  this.walletName = undefined;
103
43
  this.signerName = undefined;
104
44
  this.saveConnection();
105
- this.closedHandler();
45
+ this.dispatchEvent(new Event("close", { bubbles: true, composed: true }));
106
46
  this.signer?.signer.disconnect();
107
47
  }
108
48
 
@@ -131,291 +71,99 @@ export class WebComponentConnector extends LitElement {
131
71
  connectedCallback(): void {
132
72
  super.connectedCallback();
133
73
  this.loadConnection();
134
- this.reloadSigners();
135
- // Delay for extensions to load
136
- setTimeout(() => this.reloadSigners(), 100);
137
74
  }
138
75
 
139
76
  willUpdate(changedProperties: PropertyValues): void {
140
77
  if (
78
+ changedProperties.has("name") ||
79
+ changedProperties.has("icon") ||
141
80
  changedProperties.has("client") ||
142
81
  changedProperties.has("signerFilter") ||
143
82
  changedProperties.has("preferredNetworks")
144
83
  ) {
145
- this.reloadSigners();
84
+ this.signersController.refresh();
146
85
  }
147
86
  if (
148
- (changedProperties.has("scene") && this.scene === Scene.Connected) ||
149
- changedProperties.has("wallets") ||
150
87
  changedProperties.has("walletName") ||
151
88
  changedProperties.has("signerName")
152
89
  ) {
153
- (async () => {
154
- const wallet = this.wallets.find(
155
- ({ name }) => name === this.walletName,
156
- );
157
- const signer = wallet?.signers.find(
158
- ({ name }) => name === this.signerName,
159
- );
160
- if (signer && (await signer.signer.isConnected())) {
161
- this.wallet = wallet;
162
- this.signer = signer;
163
- } else {
164
- this.wallet = undefined;
165
- this.signer = undefined;
166
- }
167
- })();
168
- }
169
- if (changedProperties.has("signer")) {
170
- this.prepareSigner();
90
+ this.refreshSigner();
171
91
  }
172
92
 
173
- this.dispatchEvent(new WillUpdateEvent());
93
+ this.dispatchEvent(new Event("willUpdate"));
174
94
  }
175
95
 
176
- private reloadSigners() {
177
- this.wallets = [];
178
-
179
- (async () => {
180
- const signer = this.signer;
181
- if (!signer) {
182
- return;
183
- }
184
-
185
- if (await signer.signer.replaceClient(this.client)) {
186
- this.signer = {
187
- ...signer,
188
- };
189
- } else {
190
- this.signer = undefined;
191
- }
192
- })();
193
-
194
- this.resetListeners.forEach((listener) => listener());
195
- this.resetListeners = [];
196
- const name =
197
- this.name ??
198
- (document.querySelector("head title") as HTMLTitleElement).text;
199
- const icon =
200
- this.icon ??
201
- (document.querySelector('link[rel="icon"]') as HTMLLinkElement).href;
202
- const preferredNetworks = [
203
- ...(this.preferredNetworks ?? []),
204
- {
205
- addressPrefix: "ckb",
206
- signerType: ccc.SignerType.BTC,
207
- network: "btc",
208
- },
209
- {
210
- addressPrefix: "ckt",
211
- signerType: ccc.SignerType.BTC,
212
- network: "btcTestnet",
213
- },
214
- ];
215
-
216
- ccc.JoyId.getJoyIdSigners(
217
- this.client,
218
- name,
219
- icon,
220
- preferredNetworks,
221
- ).forEach(({ signer, name }) => {
222
- this.addSigner("JoyID", name, JOY_ID_SVG, signer);
223
- });
224
-
225
- const uniSatSigner = ccc.UniSat.getUniSatSigner(
226
- this.client,
227
- preferredNetworks,
228
- );
229
- if (uniSatSigner) {
230
- this.addSigner("UniSat", "BTC", UNI_SAT_SVG, uniSatSigner);
231
- }
232
-
233
- ccc.Okx.getOKXBitcoinSigner(this.client, preferredNetworks).forEach(
234
- (signer) => {
235
- this.addSigner("OKX Wallet", signer.type, OKX_SVG, signer);
236
- },
237
- );
238
-
239
- const nip07Signer = ccc.Nip07.getNip07Signer(this.client);
240
- if (nip07Signer) {
241
- this.addSigner("Nostr", "Nostr", NOSTR_SVG, nip07Signer);
242
- }
243
-
244
- const eip6963Manager = new ccc.Eip6963.SignerFactory(this.client);
245
- this.resetListeners.push(
246
- eip6963Manager.subscribeSigners((signer) => {
247
- this.addSigner(
248
- `${signer.detail.info.name}`,
249
- "EVM",
250
- signer.detail.info.icon,
251
- signer,
252
- );
253
- }),
96
+ async refreshSigner() {
97
+ const wallet = this.signersController.wallets.find(
98
+ ({ name }) => name === this.walletName,
254
99
  );
255
-
256
- // === Dummy signers ===
257
- this.addSigner(
258
- "MetaMask",
259
- "EVM",
260
- METAMASK_SVG,
261
- new ccc.SignerOpenLink(
262
- this.client,
263
- ccc.SignerType.EVM,
264
- `https://metamask.app.link/dapp/${window.location.href}`,
265
- ),
266
- );
267
- [ccc.SignerType.EVM, ccc.SignerType.BTC].forEach((type) => {
268
- this.addSigner(
269
- "OKX Wallet",
270
- type,
271
- OKX_SVG,
272
- new ccc.SignerOpenLink(
273
- this.client,
274
- type,
275
- "https://www.okx.com/download?deeplink=" +
276
- encodeURIComponent(
277
- "okx://wallet/dapp/url?dappUrl=" +
278
- encodeURIComponent(window.location.href),
279
- ),
280
- ),
281
- );
282
- });
283
- this.addSigner(
284
- "UniSat",
285
- ccc.SignerType.BTC,
286
- UNI_SAT_SVG,
287
- new ccc.SignerOpenLink(
288
- this.client,
289
- ccc.SignerType.BTC,
290
- "https://unisat.io/download",
291
- ),
292
- );
293
- // ===
100
+ const signer = wallet?.signers.find(({ name }) => name === this.signerName);
101
+ this.updateSigner(wallet, signer);
294
102
  }
295
103
 
296
- private async addSigner(
297
- walletName: string,
298
- signerName: string,
299
- icon: string,
300
- signer: ccc.Signer,
104
+ async updateSigner(
105
+ wallet: ccc.Wallet | undefined,
106
+ signerInfo: ccc.SignerInfo | undefined,
301
107
  ) {
302
- const signerInfo = { name: signerName, signer };
303
- if (
304
- this.signerFilter &&
305
- !(await this.signerFilter(signerInfo, { name: walletName, icon }))
306
- ) {
108
+ if (signerInfo?.signer === this.signer?.signer) {
307
109
  return;
308
110
  }
309
- let updated = false;
310
- const wallets = this.wallets.map((wallet) => {
311
- if (wallet.name !== walletName) {
312
- return wallet;
313
- }
314
111
 
315
- updated = true;
316
- const allSigners = [...wallet.signers, signerInfo];
317
- const signers = allSigners.filter(
318
- ({ signer }) => !(signer instanceof ccc.SignerDummy),
319
- );
320
- return {
321
- ...wallet,
322
- signers: signers.length !== 0 ? signers : [signerInfo],
323
- };
324
- });
112
+ this.unregisterSignerReplacer?.();
113
+ this.unregisterSignerReplacer = undefined;
325
114
 
326
- if (!updated) {
327
- wallets.push({
328
- name: walletName,
329
- icon,
330
- signers: [signerInfo],
115
+ if (signerInfo && (await signerInfo.signer.isConnected())) {
116
+ this.wallet = wallet;
117
+ this.signer = signerInfo;
118
+ (this.unregisterSignerReplacer as unknown as () => void)?.();
119
+ this.unregisterSignerReplacer = signerInfo.signer.onReplaced(() => {
120
+ this.signersController.refresh();
331
121
  });
122
+ } else {
123
+ this.wallet = undefined;
124
+ this.signer = undefined;
332
125
  }
333
-
334
- this.wallets = wallets;
335
126
  }
336
127
 
337
- mainRef: Ref<HTMLDivElement> = createRef();
338
- headerRef: Ref<HTMLDivElement> = createRef();
339
- bodyRef: Ref<HTMLDivElement> = createRef();
128
+ private readonly mainRef: Ref<HTMLDivElement> = createRef();
129
+ private readonly bodyRef: Ref<HTMLDivElement & { onClose?: () => void }> =
130
+ createRef();
340
131
 
341
132
  render() {
342
- const [title, body] = (() => {
343
- if (this.scene === Scene.Connected && this.wallet && this.signer) {
344
- return generateConnectedScene(
345
- this.wallet,
346
- this.signer,
347
- this.recommendAddress,
348
- this.internalAddress,
349
- this.balance,
350
- this.disconnect.bind(this),
351
- );
352
- }
353
- if (this.scene === Scene.SelectingWallets || !this.selectedWallet) {
354
- return generateWalletsScene(
355
- this.wallets,
356
- (wallet) => {
357
- this.selectedWallet = wallet;
358
- this.scene = Scene.SelectingSigners;
359
- },
360
- this.signerSelectedHandler,
361
- );
362
- }
363
- if (this.scene === Scene.SelectingSigners || !this.selectedSigner) {
364
- return generateSignersScene(
365
- this.selectedWallet,
366
- this.signerSelectedHandler,
367
- );
368
- }
369
- return generateConnectingScene(
370
- this.selectedWallet,
371
- this.selectedSigner,
372
- this.connectingError,
373
- this.signerSelectedHandler,
374
- );
375
- })();
376
-
377
- const canBack = [Scene.SelectingSigners, Scene.Connecting].includes(
378
- this.scene,
379
- );
380
-
381
- return html` <div
133
+ return html`<div
382
134
  class="background"
383
135
  @click=${(event: Event) => {
384
136
  if (event.target === event.currentTarget) {
385
- this.closedHandler();
137
+ this.dispatchEvent(
138
+ new Event("close", { bubbles: true, composed: true }),
139
+ );
140
+ this.bodyRef.value?.onClose?.();
386
141
  }
387
142
  }}
143
+ @updated=${() => this.updated()}
388
144
  >
389
145
  <div class="main" ${ref(this.mainRef)}>
390
- <div
391
- class="header text-bold fs-lg ${title == null
392
- ? ""
393
- : "header-divider"}"
394
- ${ref(this.headerRef)}
395
- >
396
- <img
397
- class="back ${canBack ? "active" : ""}"
398
- src=${LEFT_SVG}
399
- @click=${() => {
400
- if (this.scene === Scene.Connecting) {
401
- if ((this.selectedWallet?.signers.length ?? 0) <= 1) {
402
- this.scene = Scene.SelectingWallets;
403
- } else {
404
- this.scene = Scene.SelectingSigners;
405
- }
406
- } else if (this.scene === Scene.SelectingSigners) {
407
- this.scene = Scene.SelectingWallets;
408
- }
409
- }}
410
- />
411
- ${title}
412
- <img
413
- class="close active"
414
- src=${CLOSE_SVG}
415
- @click=${this.closedHandler}
416
- />
417
- </div>
418
- <div class="body" ${ref(this.bodyRef)}>${body}</div>
146
+ ${this.wallet && this.signer
147
+ ? html`
148
+ <ccc-connected-scene
149
+ .wallet=${this.wallet}
150
+ .signer=${this.signer.signer}
151
+ @disconnect=${() => this.disconnect()}
152
+ ${ref(this.bodyRef)}
153
+ ></ccc-connected-scene>
154
+ `
155
+ : html`
156
+ <ccc-selecting-scene
157
+ .wallets=${this.signersController.wallets}
158
+ @connected=${({ walletName, signerName }: ConnectedEvent) => {
159
+ this.walletName = walletName;
160
+ this.signerName = signerName;
161
+ this.refreshSigner();
162
+ this.saveConnection();
163
+ }}
164
+ ${ref(this.bodyRef)}
165
+ ></ccc-selecting-scene>
166
+ `}
419
167
  </div>
420
168
  </div>`;
421
169
  }
@@ -425,66 +173,10 @@ export class WebComponentConnector extends LitElement {
425
173
  return;
426
174
  }
427
175
  this.mainRef.value.style.height = `${
428
- (this.bodyRef.value?.clientHeight ?? 0) +
429
- (this.headerRef.value?.clientHeight ?? 0)
176
+ this.bodyRef.value?.clientHeight ?? 0
430
177
  }px`;
431
178
  }
432
179
 
433
- private closedHandler = () => {
434
- if (
435
- [
436
- Scene.SelectingSigners,
437
- Scene.SelectingWallets,
438
- Scene.Connecting,
439
- ].includes(this.scene)
440
- ) {
441
- this.scene = Scene.SelectingWallets;
442
- this.selectedSigner = undefined;
443
- this.selectedWallet = undefined;
444
- }
445
-
446
- this.dispatchEvent(new ClosedEvent());
447
- };
448
-
449
- private signerSelectedHandler = (
450
- wallet: WalletWithSigners,
451
- signerInfo: ccc.SignerInfo,
452
- ) => {
453
- this.scene = Scene.Connecting;
454
- this.connectingError = undefined;
455
- this.selectedWallet = wallet;
456
- this.selectedSigner = signerInfo;
457
- (async () => {
458
- const { signer } = signerInfo;
459
- try {
460
- await signer.connect();
461
- } catch (error) {
462
- if (typeof error === "object") {
463
- const message = (error as { message: unknown })?.message;
464
- if (typeof message === "string") {
465
- this.connectingError = message;
466
- } else {
467
- this.connectingError = JSON.stringify(message);
468
- }
469
- return;
470
- }
471
-
472
- this.connectingError = JSON.stringify(error);
473
- }
474
- if (!(await signer.isConnected())) {
475
- return;
476
- }
477
- this.scene = Scene.Connected;
478
- this.walletName = wallet.name;
479
- this.signerName = signerInfo.name;
480
- this.saveConnection();
481
- this.closedHandler();
482
- this.internalAddress = await signer.getInternalAddress();
483
- this.recommendAddress = await signer.getRecommendedAddress();
484
- this.balance = await signer.getBalance();
485
- })();
486
- };
487
-
488
180
  static styles = css`
489
181
  :host {
490
182
  width: 100vw;
@@ -494,62 +186,6 @@ export class WebComponentConnector extends LitElement {
494
186
  top: 0;
495
187
  }
496
188
 
497
- button {
498
- background: none;
499
- color: inherit;
500
- border: none;
501
- padding: 0;
502
- font: inherit;
503
- cursor: pointer;
504
- outline: inherit;
505
- }
506
-
507
- .text-bold {
508
- font-weight: bold;
509
- }
510
-
511
- .text-tip {
512
- color: var(--tip-color);
513
- }
514
-
515
- .fs-sm {
516
- font-size: 0.8rem;
517
- }
518
- .fs-md {
519
- font-size: 1rem;
520
- }
521
- .fs-lg {
522
- font-size: 1.2rem;
523
- }
524
- .fs-xl {
525
- font-size: 1.5rem;
526
- }
527
-
528
- .mb-1 {
529
- margin-bottom: 0.7rem;
530
- }
531
- .mb-2 {
532
- margin-bottom: 1rem;
533
- }
534
- .mt-1 {
535
- margin-top: 0.7rem;
536
- }
537
- .mt-2 {
538
- margin-top: 1rem;
539
- }
540
- .ml-1 {
541
- margin-left: 0.7rem;
542
- }
543
- .ml-2 {
544
- margin-left: 1em;
545
- }
546
- .mr-1 {
547
- margin-right: 0.7rem;
548
- }
549
- .mr-2 {
550
- margin-right: 1rem;
551
- }
552
-
553
189
  .background {
554
190
  width: 100%;
555
191
  height: 100%;
@@ -566,170 +202,5 @@ export class WebComponentConnector extends LitElement {
566
202
  overflow: hidden;
567
203
  transition: height 0.15s ease-out;
568
204
  }
569
-
570
- .header {
571
- display: flex;
572
- justify-content: space-between;
573
- align-items: center;
574
- padding: 1rem 1.3rem 0.5rem;
575
- }
576
-
577
- .header-divider {
578
- padding-bottom: 1rem;
579
- border-bottom: 1px solid var(--divider);
580
- margin-bottom: 1rem;
581
- }
582
-
583
- .close,
584
- .back {
585
- width: 0.8rem;
586
- height: 0.8rem;
587
- opacity: 0;
588
- transition: opacity 0.15s ease-in-out;
589
- }
590
-
591
- .close.active,
592
- .back.active {
593
- opacity: 1;
594
- cursor: pointer;
595
- }
596
-
597
- .body {
598
- padding: 0 1.3rem 1.4rem;
599
- min-width: 20rem;
600
- display: flex;
601
- flex-direction: column;
602
- align-items: center;
603
- }
604
-
605
- .btn-primary {
606
- width: 100%;
607
- display: flex;
608
- align-items: center;
609
- justify-content: start;
610
- padding: 0.75rem 1rem;
611
- background: var(--btn-primary);
612
- border-radius: 0.4rem;
613
- transition: background 0.15s ease-in-out;
614
- }
615
- .btn-primary img {
616
- width: 2rem;
617
- height: 2rem;
618
- margin-right: 1rem;
619
- border-radius: 0.4rem;
620
- }
621
- .btn-primary:hover {
622
- background: var(--btn-primary-hover);
623
- }
624
- .btn-primary:disabled {
625
- cursor: not-allowed;
626
- }
627
- .btn-primary:disabled:hover {
628
- background: var(--btn-primary);
629
- }
630
-
631
- .btn-secondary {
632
- display: flex;
633
- align-items: center;
634
- padding: 0.25rem 1rem;
635
- background: var(--btn-secondary);
636
- border-radius: 9999px;
637
- transition: background 0.15s ease-in-out;
638
- }
639
- .btn-secondary img {
640
- width: 0.8rem;
641
- height: 0.8rem;
642
- margin-right: 0.5rem;
643
- }
644
- .btn-secondary:hover {
645
- background: var(--btn-secondary-hover);
646
- }
647
- .btn-secondary:disabled {
648
- cursor: not-allowed;
649
- }
650
- .btn-secondary:disabled:hover {
651
- background: var(--btn-secondary);
652
- }
653
-
654
- .wallet-icon {
655
- width: 4rem;
656
- height: 4rem;
657
- margin-bottom: 0.5rem;
658
- border-radius: 0.8rem;
659
- }
660
-
661
- .connecting-wallet-icon {
662
- width: 5rem;
663
- height: 5rem;
664
- border-radius: 1rem;
665
- }
666
-
667
- .position-relative {
668
- position: relative;
669
- }
670
- .position-absolute {
671
- position: absolute;
672
- }
673
-
674
- .connected-type-icon {
675
- position: absolute;
676
- width: 1.5rem;
677
- height: 1.5rem;
678
- right: -0.5rem;
679
- bottom: -0.5rem;
680
- }
681
-
682
- .text-center {
683
- text-align: center;
684
- }
685
-
686
- .cursor-pointer {
687
- cursor: pointer;
688
- }
689
-
690
- .flex {
691
- display: flex;
692
- }
693
- .justify-center {
694
- justify-content: center;
695
- }
696
- .justify-between {
697
- justify-content: space-between;
698
- }
699
- .align-center {
700
- align-items: center;
701
- }
702
-
703
- .switch-btn-container {
704
- width: 100%;
705
- padding: 1rem;
706
- }
707
-
708
- .switch-line {
709
- flex: 1;
710
- height: 1px;
711
- background-color: var(--divider);
712
- }
713
-
714
- .switching-status-dot {
715
- width: 0.5rem;
716
- height: 0.5rem;
717
- background: #0f0;
718
- border-radius: 50%;
719
- }
720
-
721
- .copy-btn {
722
- width: 1.5rem;
723
- height: 1.5rem;
724
- }
725
-
726
- .copy-btn-sm {
727
- width: 1rem;
728
- height: 1rem;
729
- }
730
-
731
- .sm-chain-logo {
732
- width: 1.125rem;
733
- }
734
205
  `;
735
206
  }