@ckb-ccc/connector 0.0.3-alpha.1 → 0.0.4-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 (81) hide show
  1. package/dist/advancedBarrel.d.ts +1 -0
  2. package/dist/advancedBarrel.d.ts.map +1 -1
  3. package/dist/advancedBarrel.js +1 -0
  4. package/dist/assets/chains/btc.svg.d.ts +2 -0
  5. package/dist/assets/chains/btc.svg.d.ts.map +1 -0
  6. package/dist/assets/chains/btc.svg.js +2 -0
  7. package/dist/assets/chains/eth.svg.d.ts +2 -0
  8. package/dist/assets/chains/eth.svg.d.ts.map +1 -0
  9. package/dist/assets/chains/eth.svg.js +2 -0
  10. package/dist/assets/chains/index.d.ts +3 -0
  11. package/dist/assets/chains/index.d.ts.map +1 -0
  12. package/dist/assets/chains/index.js +2 -0
  13. package/dist/assets/close.svg.d.ts +2 -0
  14. package/dist/assets/close.svg.d.ts.map +1 -0
  15. package/dist/assets/close.svg.js +2 -0
  16. package/dist/assets/okx.svg.d.ts +2 -0
  17. package/dist/assets/okx.svg.d.ts.map +1 -0
  18. package/dist/assets/okx.svg.js +2 -0
  19. package/dist/assets/retry.svg.d.ts +2 -0
  20. package/dist/assets/retry.svg.d.ts.map +1 -0
  21. package/dist/assets/retry.svg.js +2 -0
  22. package/dist/assets/uni-sat.svg.d.ts +2 -0
  23. package/dist/assets/uni-sat.svg.d.ts.map +1 -0
  24. package/dist/assets/uni-sat.svg.js +2 -0
  25. package/dist/assets/utils.d.ts +2 -0
  26. package/dist/assets/utils.d.ts.map +1 -0
  27. package/dist/assets/utils.js +3 -0
  28. package/dist/barrel.d.ts +1 -1
  29. package/dist/barrel.d.ts.map +1 -1
  30. package/dist/barrel.js +1 -1
  31. package/dist/connector/index.d.ts +19 -0
  32. package/dist/connector/index.d.ts.map +1 -0
  33. package/dist/connector/index.js +271 -0
  34. package/dist/events/index.d.ts +15 -0
  35. package/dist/events/index.d.ts.map +1 -0
  36. package/dist/events/index.js +18 -0
  37. package/dist/scenes/connecting.d.ts +3 -0
  38. package/dist/scenes/connecting.d.ts.map +1 -0
  39. package/dist/scenes/connecting.js +23 -0
  40. package/dist/scenes/index.d.ts +4 -0
  41. package/dist/scenes/index.d.ts.map +1 -0
  42. package/dist/scenes/index.js +3 -0
  43. package/dist/scenes/signers.d.ts +4 -0
  44. package/dist/scenes/signers.d.ts.map +1 -0
  45. package/dist/scenes/signers.js +30 -0
  46. package/dist/scenes/wallets.d.ts +3 -0
  47. package/dist/scenes/wallets.d.ts.map +1 -0
  48. package/dist/scenes/wallets.js +23 -0
  49. package/dist/status/index.d.ts +6 -0
  50. package/dist/status/index.d.ts.map +1 -0
  51. package/dist/status/index.js +6 -0
  52. package/package.json +3 -3
  53. package/src/advancedBarrel.ts +1 -0
  54. package/src/assets/chains/btc.svg.ts +5 -0
  55. package/src/assets/chains/eth.svg.ts +5 -0
  56. package/src/assets/chains/index.ts +2 -0
  57. package/src/assets/close.svg.ts +5 -0
  58. package/src/assets/okx.svg.ts +5 -0
  59. package/src/assets/retry.svg.ts +5 -0
  60. package/src/assets/uni-sat.svg.ts +5 -0
  61. package/src/assets/utils.ts +3 -0
  62. package/src/barrel.ts +1 -1
  63. package/src/connector/index.ts +292 -0
  64. package/src/events/index.ts +23 -0
  65. package/src/scenes/connecting.ts +29 -0
  66. package/src/scenes/index.ts +3 -0
  67. package/src/scenes/signers.ts +40 -0
  68. package/src/scenes/wallets.ts +32 -0
  69. package/src/status/index.ts +5 -0
  70. package/dist/connector.d.ts +0 -9
  71. package/dist/connector.d.ts.map +0 -1
  72. package/dist/connector.js +0 -129
  73. package/dist/events.d.ts +0 -9
  74. package/dist/events.d.ts.map +0 -1
  75. package/dist/events.js +0 -11
  76. package/dist/signers.d.ts +0 -13
  77. package/dist/signers.d.ts.map +0 -1
  78. package/dist/signers.js +0 -13
  79. package/src/connector.ts +0 -123
  80. package/src/events.ts +0 -13
  81. package/src/signers.ts +0 -15
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckb-ccc/connector",
3
- "version": "0.0.3-alpha.1",
3
+ "version": "0.0.4-alpha.0",
4
4
  "description": "Common Chains Connector UI",
5
5
  "author": "Hanssen0 <hanssen0@hanssen0.com>",
6
6
  "license": "MIT",
@@ -37,8 +37,8 @@
37
37
  "access": "public"
38
38
  },
39
39
  "dependencies": {
40
- "@ckb-ccc/ccc": "0.0.3-alpha.0",
40
+ "@ckb-ccc/ccc": "0.0.4-alpha.0",
41
41
  "lit": "^3.1.3"
42
42
  },
43
- "gitHead": "6a5c042c79baa5d9f473dbdaacf0b09ebf3e6826"
43
+ "gitHead": "e49045ed4b2778c92d6f49b79c17125245141a21"
44
44
  }
@@ -1 +1,2 @@
1
1
  export * from "@ckb-ccc/ccc/advancedBarrel";
2
+ export * from "./scenes";
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "../utils";
2
+
3
+ export const BTC_SVG = encodeSvgToImgSrc(
4
+ '<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" height="64" width="64" version="1.1"><link xmlns="" type="text/css" rel="stylesheet" id="dark-mode-custom-link"/><link xmlns="" type="text/css" rel="stylesheet" id="dark-mode-general-link"/><style xmlns="" lang="en" type="text/css" id="dark-mode-custom-style"/><style xmlns="" lang="en" type="text/css" id="dark-mode-native-style"/><style xmlns="" lang="en" type="text/css" id="dark-mode-native-sheet"/><script xmlns=""/><g transform="translate(0.00630876,-0.00301984)"><path fill="#f7931a" d="m63.033,39.744c-4.274,17.143-21.637,27.576-38.782,23.301-17.138-4.274-27.571-21.638-23.295-38.78,4.272-17.145,21.635-27.579,38.775-23.305,17.144,4.274,27.576,21.64,23.302,38.784z"/><path fill="#FFF" d="m46.103,27.444c0.637-4.258-2.605-6.547-7.038-8.074l1.438-5.768-3.511-0.875-1.4,5.616c-0.923-0.23-1.871-0.447-2.813-0.662l1.41-5.653-3.509-0.875-1.439,5.766c-0.764-0.174-1.514-0.346-2.242-0.527l0.004-0.018-4.842-1.209-0.934,3.75s2.605,0.597,2.55,0.634c1.422,0.355,1.679,1.296,1.636,2.042l-1.638,6.571c0.098,0.025,0.225,0.061,0.365,0.117-0.117-0.029-0.242-0.061-0.371-0.092l-2.296,9.205c-0.174,0.432-0.615,1.08-1.609,0.834,0.035,0.051-2.552-0.637-2.552-0.637l-1.743,4.019,4.569,1.139c0.85,0.213,1.683,0.436,2.503,0.646l-1.453,5.834,3.507,0.875,1.439-5.772c0.958,0.26,1.888,0.5,2.798,0.726l-1.434,5.745,3.511,0.875,1.453-5.823c5.987,1.133,10.489,0.676,12.384-4.739,1.527-4.36-0.076-6.875-3.226-8.515,2.294-0.529,4.022-2.038,4.483-5.155zm-8.022,11.249c-1.085,4.36-8.426,2.003-10.806,1.412l1.928-7.729c2.38,0.594,10.012,1.77,8.878,6.317zm1.086-11.312c-0.99,3.966-7.1,1.951-9.082,1.457l1.748-7.01c1.982,0.494,8.365,1.416,7.334,5.553z"/></g><script xmlns=""/></svg>',
5
+ );
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "../utils";
2
+
3
+ export const ETH_SVG = encodeSvgToImgSrc(
4
+ '<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_46_558)"><circle cx="16" cy="16" r="16" fill="#627EEA"/><path d="M15.9957 20.4203L9.14282 16.3876L15.9957 5.14258V20.4203Z" fill="white"/><path d="M15.9957 26.8573L9.30029 17.396L15.9957 21.3511V26.8573Z" fill="white"/><path d="M16.2319 20.4203L23.0849 16.3876L16.2319 5.14258V20.4203Z" fill="#C1CCF7"/><path d="M16.3107 26.8573L23.0848 17.396L16.3107 21.3511V26.8573Z" fill="#C1CCF7"/></g><defs><clipPath id="clip0_46_558"><rect width="32" height="32" fill="white"/></clipPath></defs></svg>',
5
+ );
@@ -0,0 +1,2 @@
1
+ export * from "./btc.svg";
2
+ export * from "./eth.svg";
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+
3
+ export const CLOSE_SVG = encodeSvgToImgSrc(
4
+ '<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"><path d="M10.8989 1.0512C10.5085 0.660741 9.87543 0.660703 9.48493 1.05111L5.94897 4.58624L2.41397 1.05124C2.0235 0.660772 1.39043 0.660773 0.999968 1.05124C0.609503 1.4417 0.609503 2.07477 0.999969 2.46524L4.53497 6.00024L0.999968 9.53524C0.609503 9.9257 0.609503 10.5588 0.999968 10.9492C1.39043 11.3397 2.0235 11.3397 2.41397 10.9492L5.94897 7.41424L9.48493 10.9494C9.87543 11.3398 10.5085 11.3397 10.8989 10.9493C11.2894 10.5588 11.2894 9.92568 10.8989 9.5352L7.36397 6.00024L10.8989 2.46528C11.2894 2.07479 11.2894 1.44168 10.8989 1.0512Z"/></svg>',
5
+ );
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+
3
+ export const OKX_SVG = encodeSvgToImgSrc(
4
+ '<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="1000" height="1000" fill="black"/><path fill-rule="evenodd" clip-rule="evenodd" d="M393.949 218.518H231.049C224.129 218.518 218.519 224.128 218.519 231.048V393.948C218.519 400.869 224.129 406.479 231.049 406.479H393.949C400.87 406.479 406.48 400.869 406.48 393.948V231.048C406.48 224.128 400.87 218.518 393.949 218.518ZM581.992 406.479H419.092C412.172 406.479 406.561 412.09 406.561 419.01V581.91C406.561 588.831 412.172 594.441 419.092 594.441H581.992C588.913 594.441 594.523 588.831 594.523 581.91V419.01C594.523 412.09 588.913 406.479 581.992 406.479ZM606.974 218.518H769.874C776.794 218.518 782.405 224.128 782.405 231.048V393.948C782.405 400.869 776.794 406.479 769.874 406.479H606.974C600.053 406.479 594.443 400.869 594.443 393.948V231.048C594.443 224.128 600.053 218.518 606.974 218.518ZM393.95 594.442H231.049C224.129 594.442 218.519 600.052 218.519 606.973V769.873C218.519 776.793 224.129 782.404 231.049 782.404H393.95C400.87 782.404 406.48 776.793 406.48 769.873V606.973C406.48 600.052 400.87 594.442 393.95 594.442ZM606.974 594.442H769.874C776.794 594.442 782.405 600.052 782.405 606.973V769.873C782.405 776.793 776.794 782.404 769.874 782.404H606.974C600.053 782.404 594.443 776.793 594.443 769.873V606.973C594.443 600.052 600.053 594.442 606.974 594.442Z" fill="white"/></svg>',
5
+ );
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+
3
+ export const RETRY_SVG = encodeSvgToImgSrc(
4
+ '<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.398 1.16864C11.0369 1.16864 10.7961 1.41021 10.7961 1.77256V2.37648C10.1941 1.531 9.35141 0.866684 8.38828 0.504333C5.37851 -0.82429 1.82699 0.564725 0.502691 3.58432C-0.821607 6.60392 0.562886 10.167 3.57265 11.4957C6.58242 12.8243 10.1339 11.4353 11.4582 8.41568H11.398C11.398 8.05333 11.1573 7.81176 10.7961 7.81176C10.4349 7.81176 10.1941 8.05333 10.1941 8.41568H10.1339C9.59219 9.32156 8.80965 10.0463 7.78633 10.469C5.31832 11.4957 2.54933 10.2878 1.52601 7.81176C0.502691 5.33569 1.7066 2.49727 4.17461 1.531C6.40183 0.564725 8.93004 1.531 10.1339 3.58432H8.99023C8.62906 3.58432 8.38828 3.82589 8.38828 4.18824C8.38828 4.55059 8.62906 4.79216 8.99023 4.79216H11.398C11.7592 4.79216 12 4.55059 12 4.18824V1.77256C12 1.41021 11.7592 1.16864 11.398 1.16864Z" fill="#1E1E1E"/></svg>',
5
+ );
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+
3
+ export const UNI_SAT_SVG = encodeSvgToImgSrc(
4
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 115.77 147.7" xmlns:v="https://vecta.io/nano"><defs><linearGradient id="A" x1="106.985" y1="30.78" x2="13.053" y2="72.524" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#201c1b"/><stop offset=".36" stop-color="#77390d"/><stop offset=".67" stop-color="#ea8101"/><stop offset="1" stop-color="#f4b852"/></linearGradient><linearGradient id="B" x1="11.381" y1="118.167" x2="120.232" y2="85.771" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1f1d1c"/><stop offset=".37" stop-color="#77390d"/><stop offset=".67" stop-color="#ea8101"/><stop offset="1" stop-color="#f4fb52"/></linearGradient><radialGradient id="C" cx="53.01" cy="45.84" fx="53.01" fy="45.84" r="11.13" gradientTransform="translate(0 0)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#f4b852"/><stop offset=".33" stop-color="#ea8101"/><stop offset=".64" stop-color="#77390d"/><stop offset="1" stop-color="#211c1d"/></radialGradient></defs><path d="M81.66 13.29l30.31 30.02c2.58 2.55 3.85 5.13 3.81 7.73s-1.15 4.97-3.32 7.12c-2.27 2.25-4.72 3.39-7.34 3.44-2.62.04-5.22-1.22-7.8-3.77l-31-30.7c-3.52-3.49-6.92-5.96-10.19-7.41s-6.71-1.68-10.31-.68c-3.61.99-7.48 3.54-11.63 7.64-5.72 5.67-8.45 10.99-8.17 15.96s3.12 10.13 8.51 15.46l31.25 30.96c2.61 2.58 3.89 5.16 3.85 7.72-.04 2.57-1.16 4.94-3.37 7.13-2.2 2.18-4.63 3.32-7.27 3.41s-5.27-1.16-7.87-3.74L20.81 73.56c-4.93-4.88-8.49-9.5-10.68-13.86s-3.01-9.29-2.44-14.79c.51-4.71 2.02-9.27 4.54-13.69 2.51-4.42 6.11-8.94 10.78-13.57 5.56-5.51 10.87-9.73 15.93-12.67C43.99 2.04 48.88.41 53.6.07c4.73-.34 9.39.6 14 2.82s9.29 5.68 14.05 10.4z" fill="url(#A)"/><path d="M34.11 134.42L3.81 104.4C1.23 101.84-.04 99.27 0 96.67s1.15-4.97 3.32-7.12c2.27-2.25 4.72-3.39 7.34-3.44 2.62-.04 5.22 1.21 7.8 3.77l30.99 30.7c3.53 3.49 6.92 5.96 10.19 7.41s6.71 1.67 10.32.68 7.48-3.54 11.63-7.65c5.72-5.67 8.45-10.99 8.17-15.96s-3.12-10.13-8.51-15.47L64.6 73.24c-2.61-2.58-3.89-5.16-3.85-7.72.04-2.57 1.16-4.94 3.37-7.13 2.2-2.18 4.63-3.32 7.27-3.41s5.27 1.16 7.87 3.74l15.7 15.41c4.93 4.88 8.49 9.5 10.68 13.86s3.01 9.29 2.44 14.79c-.51 4.71-2.02 9.27-4.54 13.69-2.51 4.42-6.11 8.94-10.78 13.57-5.56 5.51-10.87 9.73-15.93 12.67s-9.95 4.58-14.68 4.92-9.39-.6-14-2.82-9.29-5.68-14.05-10.4z" fill="url(#B)"/><circle cx="53.01" cy="45.83" r="11.13" fill="url(#C)"/></svg>',
5
+ );
@@ -0,0 +1,3 @@
1
+ export function encodeSvgToImgSrc(svg: string) {
2
+ return `data:image/svg+xml,${encodeURIComponent(svg)}`;
3
+ }
package/src/barrel.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from "@ckb-ccc/ccc";
2
2
  export * from "./connector";
3
3
  export * from "./events";
4
- export * from "./signers";
4
+ export * from "./status";
@@ -0,0 +1,292 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { LitElement, css, html } from "lit";
3
+ import { customElement, property, state } from "lit/decorators.js";
4
+ import { CLOSE_SVG } from "../assets/close.svg";
5
+ import { OKX_SVG } from "../assets/okx.svg";
6
+ import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
7
+ import { CloseEvent, SignerChangedEvent, StatusChangedEvent } from "../events";
8
+ import {
9
+ generateConnectingScene,
10
+ generateSignersScene,
11
+ generateWalletsScene,
12
+ } from "../scenes";
13
+ import { ConnectorStatus } from "../status";
14
+
15
+ @customElement("ccc-connector")
16
+ export class WebComponentConnector extends LitElement {
17
+ @state()
18
+ private wallets: ccc.Wallet[] = [];
19
+ private existedEip6963: string[] = [];
20
+
21
+ @property()
22
+ public isOpen: boolean = false;
23
+
24
+ @property()
25
+ public wallet?: ccc.Wallet;
26
+ @property()
27
+ public signer?: ccc.SignerInfo;
28
+ @property()
29
+ public status: ConnectorStatus = ConnectorStatus.SelectingSigner;
30
+
31
+ connectedCallback(): void {
32
+ super.connectedCallback();
33
+
34
+ const client = new ccc.ClientPublicTestnet();
35
+ const uniSatSigner = ccc.UniSat.getUniSatSigner(client);
36
+ if (uniSatSigner) {
37
+ this.addSigner("UniSat", UNI_SAT_SVG, ccc.SignerType.BTC, uniSatSigner);
38
+ }
39
+
40
+ const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(client);
41
+ if (okxBitcoinSigner) {
42
+ this.addSigner(
43
+ "OKX Wallet",
44
+ OKX_SVG,
45
+ ccc.SignerType.BTC,
46
+ okxBitcoinSigner,
47
+ );
48
+ }
49
+
50
+ const eip6963Manager = new ccc.Eip6963.SignerFactory(client);
51
+ eip6963Manager.subscribeSigners((signer) => {
52
+ if (this.existedEip6963.indexOf(signer.detail.info.uuid) !== -1) {
53
+ return;
54
+ }
55
+ this.existedEip6963.push(signer.detail.info.uuid);
56
+ this.addSigner(
57
+ `${signer.detail.info.name}`,
58
+ signer.detail.info.icon,
59
+ ccc.SignerType.EVM,
60
+ signer,
61
+ );
62
+ });
63
+ }
64
+
65
+ addSigner(
66
+ name: string,
67
+ icon: string,
68
+ type: ccc.SignerType,
69
+ signer: ccc.Signer,
70
+ ) {
71
+ const wallet = this.wallets.find((wallet) => wallet.name === name);
72
+ if (wallet) {
73
+ wallet.signers.push({ type, signer });
74
+ this.wallets = [...this.wallets];
75
+ } else {
76
+ this.wallets = [
77
+ ...this.wallets,
78
+ {
79
+ name,
80
+ icon,
81
+ signers: [{ type, signer }],
82
+ },
83
+ ];
84
+ }
85
+ }
86
+
87
+ render() {
88
+ const [title, body] = (() => {
89
+ if (!this.wallet) {
90
+ return generateWalletsScene(
91
+ this.wallets,
92
+ this.onWalletSelected,
93
+ this.onSignerSelected,
94
+ );
95
+ }
96
+ if (!this.signer) {
97
+ return generateSignersScene(this.wallet, this.onSignerSelected);
98
+ }
99
+ return generateConnectingScene(
100
+ this.wallet,
101
+ this.signer,
102
+ this.onSignerSelected,
103
+ );
104
+ })();
105
+
106
+ return html`<style>
107
+ :host {
108
+ ${this.isOpen ? "" : "display: none;"}
109
+ --background: #fff;
110
+ --divider: #eee;
111
+ --btn-primary: #f8f8f8;
112
+ --btn-primary-hover: #efeeee;
113
+ --btn-secondary: #ddd;
114
+ --btn-icon: #e9e4de;
115
+ color: #1e1e1e;
116
+ --tip-color: #666;
117
+ }
118
+ </style>
119
+ <div
120
+ class="background"
121
+ @click=${(event: Event) => {
122
+ if (event.target === event.currentTarget) {
123
+ this.onClose();
124
+ }
125
+ }}
126
+ >
127
+ <div class="main">
128
+ <div class="header text-bold fs-big">
129
+ <div class="back"></div>
130
+ ${title}
131
+ <img class="close" src=${CLOSE_SVG} @click=${this.onClose} />
132
+ </div>
133
+ <div class="body">${body}</div>
134
+ </div>
135
+ </div>`;
136
+ }
137
+
138
+ private onClose = () => {
139
+ this.dispatchEvent(new SignerChangedEvent());
140
+ this.dispatchEvent(new CloseEvent());
141
+ };
142
+
143
+ private onWalletSelected = (wallet: ccc.Wallet) => {
144
+ this.dispatchEvent(new SignerChangedEvent(wallet, this.signer));
145
+ };
146
+
147
+ private onSignerSelected = (wallet: ccc.Wallet, signer: ccc.SignerInfo) => {
148
+ this.dispatchEvent(new StatusChangedEvent(ConnectorStatus.Connecting));
149
+ this.dispatchEvent(new SignerChangedEvent(wallet, signer));
150
+
151
+ (async () => {
152
+ await signer.signer.connect();
153
+ this.dispatchEvent(new StatusChangedEvent(ConnectorStatus.Idle));
154
+ this.dispatchEvent(new CloseEvent());
155
+ })();
156
+ };
157
+
158
+ static styles = css`
159
+ :host {
160
+ width: 100vw;
161
+ height: 100vh;
162
+ position: fixed;
163
+ left: 0;
164
+ top: 0;
165
+ }
166
+
167
+ button {
168
+ background: none;
169
+ color: inherit;
170
+ border: none;
171
+ padding: 0;
172
+ font: inherit;
173
+ cursor: pointer;
174
+ outline: inherit;
175
+ }
176
+
177
+ .text-bold {
178
+ font-weight: bold;
179
+ }
180
+
181
+ .text-tip {
182
+ color: var(--tip-color);
183
+ }
184
+
185
+ .fs-big {
186
+ font-size: 1.2rem;
187
+ }
188
+
189
+ .mb-1 {
190
+ margin-bottom: 0.7rem;
191
+ }
192
+ .mb-2 {
193
+ margin-bottom: 1rem;
194
+ }
195
+ .mt-1 {
196
+ margin-top: 0.7rem;
197
+ }
198
+ .mt-2 {
199
+ margin-top: 1rem;
200
+ }
201
+
202
+ .background {
203
+ width: 100%;
204
+ height: 100%;
205
+ background: rgba(18, 19, 24, 0.7);
206
+ }
207
+
208
+ .main {
209
+ position: fixed;
210
+ left: 50%;
211
+ top: 50%;
212
+ transform: translate(-50%, -50%);
213
+ background: var(--background);
214
+ border-radius: 1.2rem;
215
+ }
216
+
217
+ .header {
218
+ display: flex;
219
+ justify-content: space-between;
220
+ align-items: center;
221
+ padding: 1rem 1.3rem;
222
+ border-bottom: 1px solid var(--divider);
223
+ }
224
+
225
+ .close,
226
+ .back {
227
+ width: 0.8rem;
228
+ height: 0.8rem;
229
+ cursor: pointer;
230
+ }
231
+
232
+ .body {
233
+ padding: 1.4rem 1.3rem;
234
+ min-width: 20rem;
235
+ display: flex;
236
+ flex-direction: column;
237
+ align-items: center;
238
+ }
239
+
240
+ .btn-primary {
241
+ width: 100%;
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: start;
245
+ padding: 0.75rem 1rem;
246
+ background: var(--btn-primary);
247
+ border-radius: 0.4rem;
248
+ transition: background 0.3s ease-in-out;
249
+ }
250
+
251
+ .btn-primary img {
252
+ width: 2rem;
253
+ height: 2rem;
254
+ margin-right: 1rem;
255
+ border-radius: 0.4rem;
256
+ background: var(--btn-icon);
257
+ }
258
+
259
+ .btn-primary:hover {
260
+ background: var(--btn-primary-hover);
261
+ }
262
+
263
+ .btn-secondary {
264
+ display: flex;
265
+ align-items: center;
266
+ padding: 0.25rem 1rem;
267
+ background: var(--btn-secondary);
268
+ border-radius: 9999px;
269
+ transition: background 0.3s ease-in-out;
270
+ }
271
+
272
+ .btn-secondary img {
273
+ width: 0.8rem;
274
+ height: 0.8rem;
275
+ margin-right: 0.5rem;
276
+ }
277
+
278
+ .wallet-icon {
279
+ width: 4rem;
280
+ height: 4rem;
281
+ margin-bottom: 0.5rem;
282
+ border-radius: 0.8rem;
283
+ background: var(--btn-icon);
284
+ }
285
+
286
+ .connecting-wallet-icon {
287
+ width: 5rem;
288
+ height: 5rem;
289
+ border-radius: 1rem;
290
+ }
291
+ `;
292
+ }
@@ -0,0 +1,23 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { ConnectorStatus } from "../status";
3
+
4
+ export class SignerChangedEvent extends Event {
5
+ constructor(
6
+ public readonly wallet?: ccc.Wallet,
7
+ public readonly signerInfo?: ccc.SignerInfo,
8
+ ) {
9
+ super("signerChanged", { composed: true });
10
+ }
11
+ }
12
+
13
+ export class StatusChangedEvent extends Event {
14
+ constructor(public readonly status: ConnectorStatus) {
15
+ super("statusChanged", { composed: true });
16
+ }
17
+ }
18
+
19
+ export class CloseEvent extends Event {
20
+ constructor() {
21
+ super("close", { composed: true });
22
+ }
23
+ }
@@ -0,0 +1,29 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { html } from "lit";
3
+ import { RETRY_SVG } from "../assets/retry.svg";
4
+
5
+ export function generateConnectingScene(
6
+ wallet: ccc.Wallet,
7
+ signer: ccc.SignerInfo,
8
+ onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
9
+ ) {
10
+ return [
11
+ wallet.name,
12
+ html`
13
+ <img
14
+ class="connecting-wallet-icon mb-1"
15
+ src=${wallet.icon}
16
+ alt=${wallet.name}
17
+ />
18
+ <span class="text-bold">Opening ${wallet.name}...</span>
19
+ <span class="text-tip">Confirm connection in the wallet</span>
20
+ <button
21
+ class="btn-secondary mt-2 mb-2"
22
+ @click=${() => onSignerSelected(wallet, signer)}
23
+ >
24
+ <img src=${RETRY_SVG} alt="retry" />
25
+ Try again
26
+ </button>
27
+ `,
28
+ ];
29
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./connecting";
2
+ export * from "./signers";
3
+ export * from "./wallets";
@@ -0,0 +1,40 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { html } from "lit";
3
+ import { repeat } from "lit/directives/repeat.js";
4
+ import { BTC_SVG, ETH_SVG } from "../assets/chains";
5
+
6
+ export function signerTypeToIcon(type: ccc.SignerType): string {
7
+ return {
8
+ [ccc.SignerType.BTC]: BTC_SVG,
9
+ [ccc.SignerType.EVM]: ETH_SVG,
10
+ }[type];
11
+ }
12
+
13
+ export function generateSignersScene(
14
+ wallet: ccc.Wallet,
15
+ onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
16
+ ) {
17
+ return [
18
+ "Select a Chain",
19
+
20
+ html`
21
+ <img class="wallet-icon" src=${wallet.icon} alt=${wallet.name} />
22
+ <span class="mb-2">${wallet.name}</span>
23
+ ${repeat(
24
+ wallet.signers,
25
+ (signer) => signer.type,
26
+ (signer) => html`
27
+ <button
28
+ class="btn-primary mb-1"
29
+ @click=${async () => {
30
+ onSignerSelected(wallet, signer);
31
+ }}
32
+ >
33
+ <img src=${signerTypeToIcon(signer.type)} alt=${signer.type} />
34
+ ${signer.type}
35
+ </button>
36
+ `,
37
+ )}
38
+ `,
39
+ ];
40
+ }
@@ -0,0 +1,32 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { html } from "lit";
3
+ import { repeat } from "lit/directives/repeat.js";
4
+
5
+ export function generateWalletsScene(
6
+ wallets: ccc.Wallet[],
7
+ onWalletSelected: (wallet: ccc.Wallet) => unknown,
8
+ onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
9
+ ) {
10
+ return [
11
+ "Connect Wallet",
12
+ repeat(
13
+ wallets,
14
+ (wallet) => wallet.name,
15
+ (wallet) => html`
16
+ <button
17
+ class="btn-primary mb-1"
18
+ @click=${async () => {
19
+ if (wallet.signers.length === 1) {
20
+ onSignerSelected(wallet, wallet.signers[0]);
21
+ } else {
22
+ onWalletSelected(wallet);
23
+ }
24
+ }}
25
+ >
26
+ <img src=${wallet.icon} alt=${wallet.name} />
27
+ ${wallet.name}
28
+ </button>
29
+ `,
30
+ ),
31
+ ];
32
+ }
@@ -0,0 +1,5 @@
1
+ export enum ConnectorStatus {
2
+ SelectingSigner = "SelectingSigner",
3
+ Connecting = "Connecting",
4
+ Idle = "Idle",
5
+ }
@@ -1,9 +0,0 @@
1
- import { LitElement } from "lit";
2
- export declare class WebComponentConnector extends LitElement {
3
- private signers;
4
- isOpen: boolean;
5
- connectedCallback(): void;
6
- static styles: import("lit").CSSResult;
7
- render(): import("lit").TemplateResult<1>;
8
- }
9
- //# sourceMappingURL=connector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAM5C,qBACa,qBAAsB,SAAQ,UAAU;IAEnD,OAAO,CAAC,OAAO,CAAoB;IAG5B,MAAM,EAAE,OAAO,CAAS;IAE/B,iBAAiB,IAAI,IAAI;IAsBzB,MAAM,CAAC,MAAM,0BA+CX;IAEF,MAAM;CAoCP"}
package/dist/connector.js DELETED
@@ -1,129 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { ClientPublicTestnet, Eip6963 } from "@ckb-ccc/ccc";
8
- import { LitElement, css, html } from "lit";
9
- import { customElement, property, state } from "lit/decorators.js";
10
- import { repeat } from "lit/directives/repeat.js";
11
- import { CloseEvent, ConnectedEvent } from "./events";
12
- import { SignerType } from "./signers";
13
- let WebComponentConnector = class WebComponentConnector extends LitElement {
14
- constructor() {
15
- super(...arguments);
16
- this.signers = [];
17
- this.isOpen = false;
18
- }
19
- connectedCallback() {
20
- super.connectedCallback();
21
- const client = new ClientPublicTestnet();
22
- const eip6963Manager = new Eip6963.SignerFactory(client);
23
- eip6963Manager.subscribeSigners((signer) => {
24
- if (this.signers.some((s) => s.id === signer.detail.info.uuid)) {
25
- return;
26
- }
27
- this.signers = [
28
- ...this.signers,
29
- {
30
- id: signer.detail.info.uuid,
31
- name: signer.detail.info.name,
32
- icon: signer.detail.info.icon,
33
- type: SignerType.Eip6963,
34
- signer,
35
- },
36
- ];
37
- });
38
- }
39
- render() {
40
- return html `<style>
41
- :host {
42
- ${this.isOpen ? "" : "display: none;"}
43
- --background: rgba(0, 0, 0, 0.2);
44
- }
45
- </style>
46
- <div
47
- class="background"
48
- @click=${(event) => {
49
- if (event.target === event.currentTarget) {
50
- this.dispatchEvent(new CloseEvent());
51
- }
52
- }}
53
- >
54
- <div class="main">
55
- ${repeat(this.signers, (signer) => signer.id, (signer) => html `
56
- <button
57
- class="wallet-button"
58
- @click=${async () => {
59
- await signer.signer.connect();
60
- this.dispatchEvent(new ConnectedEvent(signer));
61
- this.dispatchEvent(new CloseEvent());
62
- }}
63
- >
64
- <img src=${signer.icon} alt=${signer.name} />
65
- Connect ${signer.name}
66
- </button>
67
- `)}
68
- </div>
69
- </div>`;
70
- }
71
- };
72
- WebComponentConnector.styles = css `
73
- :host {
74
- width: 100vw;
75
- height: 100vh;
76
- position: fixed;
77
- left: 0;
78
- top: 0;
79
- }
80
-
81
- button {
82
- background: none;
83
- color: inherit;
84
- border: none;
85
- padding: 0;
86
- font: inherit;
87
- cursor: pointer;
88
- outline: inherit;
89
- }
90
-
91
- .background {
92
- width: 100%;
93
- height: 100%;
94
- background: var(--background);
95
- }
96
-
97
- .main {
98
- position: fixed;
99
- left: 50%;
100
- top: 50%;
101
- transform: translate(-50%, -50%);
102
- }
103
-
104
- .wallet-button {
105
- display: flex;
106
- align-items: center;
107
- justify-content: center;
108
- padding: 0.75rem 1.25rem;
109
- color: #fff;
110
- background: #000;
111
- background-image: none;
112
- border-radius: 9999px;
113
- border: none;
114
- }
115
-
116
- .wallet-button img {
117
- padding-right: 0.5rem;
118
- }
119
- `;
120
- __decorate([
121
- state()
122
- ], WebComponentConnector.prototype, "signers", void 0);
123
- __decorate([
124
- property()
125
- ], WebComponentConnector.prototype, "isOpen", void 0);
126
- WebComponentConnector = __decorate([
127
- customElement("ccc-connector")
128
- ], WebComponentConnector);
129
- export { WebComponentConnector };
package/dist/events.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import { SignerInfo } from "./signers";
2
- export declare class ConnectedEvent extends Event {
3
- readonly signerInfo: SignerInfo;
4
- constructor(signerInfo: SignerInfo);
5
- }
6
- export declare class CloseEvent extends Event {
7
- constructor();
8
- }
9
- //# sourceMappingURL=events.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,qBAAa,cAAe,SAAQ,KAAK;aACX,UAAU,EAAE,UAAU;gBAAtB,UAAU,EAAE,UAAU;CAGnD;AAED,qBAAa,UAAW,SAAQ,KAAK;;CAIpC"}