@mysten-incubation/dev-wallet 0.0.1 → 0.3.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.
- package/CHANGELOG.md +139 -0
- package/LICENSE +189 -0
- package/dist/_virtual/{_@oxc-project_runtime@0.107.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.mjs +2 -3
- package/dist/adapters/base-adapter.mjs +6 -7
- package/dist/adapters/base-adapter.mjs.map +1 -1
- package/dist/adapters/browser.d.mts +4 -1
- package/dist/adapters/browser.mjs +4 -2
- package/dist/adapters/build-managed-account.mjs +8 -10
- package/dist/adapters/build-managed-account.mjs.map +1 -1
- package/dist/adapters/devstack-adapter.d.mts +111 -0
- package/dist/adapters/devstack-adapter.d.mts.map +1 -0
- package/dist/adapters/devstack-adapter.mjs +224 -0
- package/dist/adapters/devstack-adapter.mjs.map +1 -0
- package/dist/adapters/devstack-paths.d.mts +11 -0
- package/dist/adapters/devstack-paths.d.mts.map +1 -0
- package/dist/adapters/devstack-paths.mjs +11 -0
- package/dist/adapters/devstack-paths.mjs.map +1 -0
- package/dist/adapters/fork-relay.d.mts +109 -0
- package/dist/adapters/fork-relay.d.mts.map +1 -0
- package/dist/adapters/fork-relay.mjs +208 -0
- package/dist/adapters/fork-relay.mjs.map +1 -0
- package/dist/adapters/idb-store.mjs +12 -16
- package/dist/adapters/idb-store.mjs.map +1 -1
- package/dist/adapters/in-memory-adapter.mjs +4 -10
- package/dist/adapters/in-memory-adapter.mjs.map +1 -1
- package/dist/adapters/passkey-adapter.mjs +4 -12
- package/dist/adapters/passkey-adapter.mjs.map +1 -1
- package/dist/adapters/remote-cli-adapter.mjs +37 -72
- package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
- package/dist/adapters/webcrypto-adapter.mjs +2 -4
- package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
- package/dist/bin/cli.mjs +9 -22
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/client/dev-wallet-client.mjs +13 -28
- package/dist/client/dev-wallet-client.mjs.map +1 -1
- package/dist/client/index.mjs +1 -2
- package/dist/client/request-handler.mjs +36 -42
- package/dist/client/request-handler.mjs.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/react/components.d.mts +9 -9
- package/dist/react/components.d.mts.map +1 -1
- package/dist/react/components.mjs +2 -5
- package/dist/react/components.mjs.map +1 -1
- package/dist/react/context.d.mts +3 -3
- package/dist/react/context.d.mts.map +1 -1
- package/dist/react/context.mjs +3 -8
- package/dist/react/context.mjs.map +1 -1
- package/dist/react/index.mjs +1 -2
- package/dist/react/useDevWallet.d.mts +3 -0
- package/dist/react/useDevWallet.d.mts.map +1 -1
- package/dist/react/useDevWallet.mjs +9 -14
- package/dist/react/useDevWallet.mjs.map +1 -1
- package/dist/server/cli-signing-middleware.mjs +7 -20
- package/dist/server/cli-signing-middleware.mjs.map +1 -1
- package/dist/server/index.mjs +1 -2
- package/dist/standalone/assets/{in-memory-adapter-CBF4h2KD.js → in-memory-adapter-qRkNfj9O.js} +1 -1
- package/dist/standalone/assets/main-DDltQnzR.js +3954 -0
- package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js} +1 -1
- package/dist/standalone/index.html +11 -12
- package/dist/ui/copy-controller.mjs +3 -3
- package/dist/ui/copy-controller.mjs.map +1 -1
- package/dist/ui/dev-wallet-account-selector.d.mts +3 -4
- package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
- package/dist/ui/dev-wallet-account-selector.mjs +48 -25
- package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
- package/dist/ui/dev-wallet-accounts.d.mts +9 -4
- package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
- package/dist/ui/dev-wallet-accounts.mjs +62 -140
- package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
- package/dist/ui/dev-wallet-balances.d.mts +10 -3
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
- package/dist/ui/dev-wallet-balances.mjs +241 -43
- package/dist/ui/dev-wallet-balances.mjs.map +1 -1
- package/dist/ui/dev-wallet-connect.d.mts +3 -3
- package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
- package/dist/ui/dev-wallet-connect.mjs +24 -16
- package/dist/ui/dev-wallet-connect.mjs.map +1 -1
- package/dist/ui/dev-wallet-dropdown.d.mts +3 -3
- package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
- package/dist/ui/dev-wallet-dropdown.mjs +37 -47
- package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
- package/dist/ui/dev-wallet-fork-panel.d.mts +43 -0
- package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -0
- package/dist/ui/dev-wallet-fork-panel.mjs +500 -0
- package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -0
- package/dist/ui/dev-wallet-network-badge.d.mts +3 -4
- package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
- package/dist/ui/dev-wallet-network-badge.mjs +52 -21
- package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
- package/dist/ui/dev-wallet-new-account.d.mts +3 -4
- package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
- package/dist/ui/dev-wallet-new-account.mjs +31 -105
- package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
- package/dist/ui/dev-wallet-objects.d.mts +3 -3
- package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
- package/dist/ui/dev-wallet-objects.mjs +76 -39
- package/dist/ui/dev-wallet-objects.mjs.map +1 -1
- package/dist/ui/dev-wallet-panel.d.mts +24 -4
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-panel.mjs +247 -64
- package/dist/ui/dev-wallet-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-popup.d.mts +3 -5
- package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
- package/dist/ui/dev-wallet-popup.mjs +19 -15
- package/dist/ui/dev-wallet-popup.mjs.map +1 -1
- package/dist/ui/dev-wallet-settings.d.mts +3 -4
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
- package/dist/ui/dev-wallet-settings.mjs +149 -97
- package/dist/ui/dev-wallet-settings.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.d.mts +11 -4
- package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.mjs +46 -18
- package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing.d.mts +9 -3
- package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing.mjs +119 -130
- package/dist/ui/dev-wallet-signing.mjs.map +1 -1
- package/dist/ui/dev-wallet-standalone.d.mts +8 -3
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
- package/dist/ui/dev-wallet-standalone.mjs +303 -38
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.d.mts +13 -5
- package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.mjs +143 -82
- package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
- package/dist/ui/index.d.mts +3 -2
- package/dist/ui/index.mjs +2 -2
- package/dist/ui/mount.d.mts +14 -1
- package/dist/ui/mount.d.mts.map +1 -1
- package/dist/ui/mount.mjs +5 -2
- package/dist/ui/mount.mjs.map +1 -1
- package/dist/ui/styles.mjs +428 -66
- package/dist/ui/styles.mjs.map +1 -1
- package/dist/ui/transaction-analyzer.mjs +19 -30
- package/dist/ui/transaction-analyzer.mjs.map +1 -1
- package/dist/ui/utils.d.mts +59 -0
- package/dist/ui/utils.d.mts.map +1 -0
- package/dist/ui/utils.mjs +42 -15
- package/dist/ui/utils.mjs.map +1 -1
- package/dist/ui/wallet-controller.mjs +89 -20
- package/dist/ui/wallet-controller.mjs.map +1 -1
- package/dist/wallet/constants.d.mts +9 -0
- package/dist/wallet/constants.d.mts.map +1 -0
- package/dist/wallet/constants.mjs +1 -1
- package/dist/wallet/dev-wallet.mjs +42 -99
- package/dist/wallet/dev-wallet.mjs.map +1 -1
- package/dist/wallet/initializer.d.mts +3 -0
- package/dist/wallet/initializer.d.mts.map +1 -1
- package/dist/wallet/initializer.mjs +9 -14
- package/dist/wallet/initializer.mjs.map +1 -1
- package/dist/wallet/signing.mjs +8 -21
- package/dist/wallet/signing.mjs.map +1 -1
- package/package.json +8 -6
- package/src/adapters/browser.ts +21 -0
- package/src/adapters/devstack-adapter.ts +342 -0
- package/src/adapters/devstack-paths.ts +15 -0
- package/src/adapters/fork-relay.ts +321 -0
- package/src/app/index.html +10 -11
- package/src/react/useDevWallet.ts +5 -1
- package/src/ui/dev-wallet-account-selector.ts +44 -17
- package/src/ui/dev-wallet-accounts.ts +87 -124
- package/src/ui/dev-wallet-balances.ts +248 -27
- package/src/ui/dev-wallet-connect.ts +19 -8
- package/src/ui/dev-wallet-dropdown.ts +7 -5
- package/src/ui/dev-wallet-fork-panel.ts +591 -0
- package/src/ui/dev-wallet-network-badge.ts +49 -10
- package/src/ui/dev-wallet-new-account.ts +21 -62
- package/src/ui/dev-wallet-objects.ts +59 -19
- package/src/ui/dev-wallet-panel.ts +261 -42
- package/src/ui/dev-wallet-popup.ts +12 -6
- package/src/ui/dev-wallet-settings.ts +159 -94
- package/src/ui/dev-wallet-signing-modal.ts +47 -7
- package/src/ui/dev-wallet-signing.ts +124 -97
- package/src/ui/dev-wallet-standalone.ts +310 -22
- package/src/ui/dev-wallet-tab-bar.ts +132 -70
- package/src/ui/index.ts +3 -0
- package/src/ui/mount.ts +23 -1
- package/src/ui/styles.ts +434 -58
- package/src/ui/utils.ts +66 -0
- package/src/ui/wallet-controller.ts +103 -5
- package/src/wallet/initializer.ts +7 -1
- package/dist/standalone/assets/main-VE4olb-Q.js +0 -2841
package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as g,a as d,p as u,B as m,b as h}from"./main-
|
|
1
|
+
import{S as g,a as d,p as u,B as m,b as h}from"./main-DDltQnzR.js";function S(c){const e=new Uint8Array(c),t=e.slice(1,33),r=(e.slice(33,65)[31]&1)===0?2:3,s=new Uint8Array(d.SIZE);return s[0]=r,s.set(t,1),s}var y=class p extends g{#e;static async generate({extractable:e=!1}={}){const t=await globalThis.crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},e,["sign","verify"]),r=await globalThis.crypto.subtle.exportKey("raw",t.publicKey);return new p(t.privateKey,S(new Uint8Array(r)))}static import(e){return new p(e.privateKey,e.publicKey)}getKeyScheme(){return"Secp256r1"}constructor(e,t){super(),this.privateKey=e,this.#e=new d(t)}export(){const e={privateKey:this.privateKey,publicKey:this.#e.toRawBytes()};return Object.defineProperty(e,"toJSON",{enumerable:!1,value:()=>{throw new Error("The exported keypair must not be serialized. It must be stored in IndexedDB directly.")}}),e}getPublicKey(){return this.#e}async sign(e){const t=await globalThis.crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},this.privateKey,e),r=u.Signature.fromBytes(new Uint8Array(t));return(r.hasHighS()?new u.Signature(r.r,u.Point.Fn.neg(r.s)):r).toBytes("compact")}};class A{#e;#t;#r=null;constructor(e,t){this.#e=e,this.#t=t}get(e){return this.#s("readonly",t=>t.get(e))}async set(e,t){await this.#s("readwrite",r=>r.put(t,e))}del(e){return this.#s("readwrite",t=>t.delete(e))}entries(){return this.#n().then(e=>new Promise((t,r)=>{const s=e.transaction(this.#t,"readonly"),o=s.objectStore(this.#t),n=[],a=o.openCursor();a.onsuccess=()=>{const i=a.result;i&&(n.push([i.key,i.value]),i.continue())},s.oncomplete=()=>t(n),s.onerror=()=>r(s.error)}))}#n(){return this.#r||(this.#r=new Promise((e,t)=>{const r=indexedDB.open(this.#e);r.onupgradeneeded=()=>{r.result.objectStoreNames.contains(this.#t)||r.result.createObjectStore(this.#t)},r.onsuccess=()=>e(r.result),r.onerror=()=>{this.#r=null,t(r.error)}})),this.#r}#s(e,t){return this.#n().then(r=>new Promise((s,o)=>{const n=r.transaction(this.#t,e),a=t(n.objectStore(this.#t));n.oncomplete=()=>s(a.result),n.onerror=()=>o(n.error),n.onabort=()=>o(n.error)}))}}const f="dev-wallet-webcrypto",K="accounts",l="__account_meta__";class x extends m{constructor(e){super(),this.id="webcrypto",this.name="WebCrypto Signer",this.#e=new A(e?.dbName??f,e?.storeName??K)}#e;async initialize(){const e=await this.#e.entries(),t=await this.#e.get(l)??[],r=[];for(const[s,o]of e){if(s===l)continue;const n=s;try{const a=o,i=y.import(a),b=t.find(w=>w.address===n);r.push(h(i,n,b?.label??"Account"))}catch(a){console.warn(`[dev-wallet] Failed to load account ${n}, skipping:`,a)}}this.setInitialAccounts(r)}async createAccount(e){const t=await y.generate(),r=t.getPublicKey().toSuiAddress(),s=e?.label??this.getDefaultLabel(),o=h(t,r,s);return await this.#e.set(r,t.export()),this.addAccount(o),await this.#t(),o}async renameAccount(e,t){return this._performRename(e,t)?(await this.#t(),!0):!1}async removeAccount(e){return this.removeAccountByAddress(e)?(await this.#e.del(e),await this.#t(),!0):!1}async#t(){const e=this.getAccounts().map(t=>({address:t.address,label:t.label}));await this.#e.set(l,e)}}export{x as WebCryptoSignerAdapter};
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Dev Wallet</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
|
+
<link
|
|
10
|
+
href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap"
|
|
11
|
+
rel="stylesheet"
|
|
12
|
+
/>
|
|
7
13
|
<style>
|
|
8
14
|
* {
|
|
9
15
|
margin: 0;
|
|
@@ -12,33 +18,26 @@
|
|
|
12
18
|
}
|
|
13
19
|
body {
|
|
14
20
|
font-family:
|
|
21
|
+
'Geist',
|
|
15
22
|
ui-sans-serif,
|
|
16
23
|
system-ui,
|
|
17
24
|
-apple-system,
|
|
18
25
|
BlinkMacSystemFont,
|
|
19
26
|
'Segoe UI',
|
|
20
|
-
Roboto,
|
|
21
|
-
'Helvetica Neue',
|
|
22
|
-
Arial,
|
|
23
27
|
sans-serif;
|
|
24
|
-
background:
|
|
25
|
-
color:
|
|
28
|
+
background: #05080f;
|
|
29
|
+
color: #e6eefb;
|
|
26
30
|
min-height: 100vh;
|
|
27
31
|
}
|
|
28
32
|
#app {
|
|
29
|
-
display: flex;
|
|
30
|
-
flex-direction: column;
|
|
31
|
-
align-items: center;
|
|
32
|
-
justify-content: center;
|
|
33
33
|
min-height: 100vh;
|
|
34
|
-
padding: 20px;
|
|
35
34
|
}
|
|
36
35
|
.loading {
|
|
37
|
-
color:
|
|
36
|
+
color: #94a6c2;
|
|
38
37
|
font-size: 14px;
|
|
39
38
|
}
|
|
40
39
|
</style>
|
|
41
|
-
<script type="module" crossorigin src="/assets/main-
|
|
40
|
+
<script type="module" crossorigin src="/assets/main-DDltQnzR.js"></script>
|
|
42
41
|
</head>
|
|
43
42
|
<body>
|
|
44
43
|
<div id="app">
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { copyToClipboard } from "./utils.mjs";
|
|
2
|
-
|
|
3
2
|
//#region src/ui/copy-controller.ts
|
|
4
3
|
var CopyController = class {
|
|
5
|
-
#timeout
|
|
4
|
+
#timeout;
|
|
6
5
|
#duration;
|
|
7
6
|
constructor(host, duration = 1500) {
|
|
8
7
|
this.copied = false;
|
|
9
8
|
this.copiedValue = null;
|
|
9
|
+
this.#timeout = null;
|
|
10
10
|
this.#duration = duration;
|
|
11
11
|
this.host = host;
|
|
12
12
|
host.addController(this);
|
|
@@ -37,7 +37,7 @@ var CopyController = class {
|
|
|
37
37
|
return this.copied && this.copiedValue === text;
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
|
-
|
|
41
40
|
//#endregion
|
|
42
41
|
export { CopyController };
|
|
42
|
+
|
|
43
43
|
//# sourceMappingURL=copy-controller.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-controller.mjs","names":["#duration","#timeout"],"sources":["../../src/ui/copy-controller.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { copyToClipboard } from './utils.js';\n\nexport class CopyController implements ReactiveController {\n\thost: ReactiveControllerHost;\n\tcopied = false;\n\tcopiedValue: string | null = null;\n\t#timeout: ReturnType<typeof setTimeout> | null = null;\n\t#duration: number;\n\n\tconstructor(host: ReactiveControllerHost, duration = 1500) {\n\t\tthis.#duration = duration;\n\t\tthis.host = host;\n\t\thost.addController(this);\n\t}\n\n\thostConnected(): void {}\n\n\thostDisconnected(): void {\n\t\tif (this.#timeout) {\n\t\t\tclearTimeout(this.#timeout);\n\t\t\tthis.#timeout = null;\n\t\t}\n\t}\n\n\tasync copy(text: string): Promise<boolean> {\n\t\tconst ok = await copyToClipboard(text);\n\t\tif (ok) {\n\t\t\tthis.copied = true;\n\t\t\tthis.copiedValue = text;\n\t\t\tif (this.#timeout) clearTimeout(this.#timeout);\n\t\t\tthis.#timeout = setTimeout(() => {\n\t\t\t\tthis.copied = false;\n\t\t\t\tthis.copiedValue = null;\n\t\t\t\tthis.host.requestUpdate();\n\t\t\t}, this.#duration);\n\t\t\tthis.host.requestUpdate();\n\t\t}\n\t\treturn ok;\n\t}\n\n\tisCopied(text: string): boolean {\n\t\treturn this.copied && this.copiedValue === text;\n\t}\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"copy-controller.mjs","names":["#duration","#timeout"],"sources":["../../src/ui/copy-controller.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { copyToClipboard } from './utils.js';\n\nexport class CopyController implements ReactiveController {\n\thost: ReactiveControllerHost;\n\tcopied = false;\n\tcopiedValue: string | null = null;\n\t#timeout: ReturnType<typeof setTimeout> | null = null;\n\t#duration: number;\n\n\tconstructor(host: ReactiveControllerHost, duration = 1500) {\n\t\tthis.#duration = duration;\n\t\tthis.host = host;\n\t\thost.addController(this);\n\t}\n\n\thostConnected(): void {}\n\n\thostDisconnected(): void {\n\t\tif (this.#timeout) {\n\t\t\tclearTimeout(this.#timeout);\n\t\t\tthis.#timeout = null;\n\t\t}\n\t}\n\n\tasync copy(text: string): Promise<boolean> {\n\t\tconst ok = await copyToClipboard(text);\n\t\tif (ok) {\n\t\t\tthis.copied = true;\n\t\t\tthis.copiedValue = text;\n\t\t\tif (this.#timeout) clearTimeout(this.#timeout);\n\t\t\tthis.#timeout = setTimeout(() => {\n\t\t\t\tthis.copied = false;\n\t\t\t\tthis.copiedValue = null;\n\t\t\t\tthis.host.requestUpdate();\n\t\t\t}, this.#duration);\n\t\t\tthis.host.requestUpdate();\n\t\t}\n\t\treturn ok;\n\t}\n\n\tisCopied(text: string): boolean {\n\t\treturn this.copied && this.copiedValue === text;\n\t}\n}\n"],"mappings":";;AAOA,IAAa,iBAAb,MAA0D;CAIzD;CACA;CAEA,YAAY,MAA8B,WAAW,MAAM;gBALlD;qBACoB;kBACoB;AAIhD,QAAA,WAAiB;AACjB,OAAK,OAAO;AACZ,OAAK,cAAc,KAAK;;CAGzB,gBAAsB;CAEtB,mBAAyB;AACxB,MAAI,MAAA,SAAe;AAClB,gBAAa,MAAA,QAAc;AAC3B,SAAA,UAAgB;;;CAIlB,MAAM,KAAK,MAAgC;EAC1C,MAAM,KAAK,MAAM,gBAAgB,KAAK;AACtC,MAAI,IAAI;AACP,QAAK,SAAS;AACd,QAAK,cAAc;AACnB,OAAI,MAAA,QAAe,cAAa,MAAA,QAAc;AAC9C,SAAA,UAAgB,iBAAiB;AAChC,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,KAAK,eAAe;MACvB,MAAA,SAAe;AAClB,QAAK,KAAK,eAAe;;AAE1B,SAAO;;CAGR,SAAS,MAAuB;AAC/B,SAAO,KAAK,UAAU,KAAK,gBAAgB"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { SignerAdapter } from "../types.mjs";
|
|
2
|
-
import "./dev-wallet-dropdown.mjs";
|
|
3
2
|
import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
|
|
4
|
-
import * as
|
|
3
|
+
import * as _$lit from "lit";
|
|
5
4
|
import { LitElement } from "lit";
|
|
6
5
|
|
|
7
6
|
//#region src/ui/dev-wallet-account-selector.d.ts
|
|
8
7
|
declare class DevWalletAccountSelector extends LitElement {
|
|
9
8
|
#private;
|
|
10
|
-
static styles: (
|
|
9
|
+
static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
|
|
11
10
|
accounts: ReadonlyWalletAccount[];
|
|
12
11
|
adapters: SignerAdapter[];
|
|
13
12
|
activeAddress: string;
|
|
14
13
|
private _open;
|
|
15
|
-
render():
|
|
14
|
+
render(): _$lit.TemplateResult<1>;
|
|
16
15
|
}
|
|
17
16
|
declare global {
|
|
18
17
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-account-selector.d.mts","names":[],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-account-selector.d.mts","names":[],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"mappings":";;;;;;cAsBa,wBAAA,SAAiC,UAAA;EAAA;SAC7B,MAAA,GADqB,KAAA,CACf,SAAA,GAAA,KAAA,CAAA,SAAA;EAsKtB,QAAA,EAAU,qBAAA;EAGV,QAAA,EAAU,aAAA;EAGV,aAAA;EAAA,QAGQ,KAAA;EAIC,MAAA,CAAA,GAVc,KAAA,CAUR,cAAA;AAAA;AAAA,QAuGR,MAAA;EAAA,UACG,qBAAA;IACT,6BAAA,EAA+B,wBAAA;EAAA;AAAA"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { dropdownItemStyles, sharedStyles } from "./styles.mjs";
|
|
2
2
|
import { emitEvent, findAdapterForAddress, formatAddress } from "./utils.mjs";
|
|
3
3
|
import { CopyController } from "./copy-controller.mjs";
|
|
4
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
4
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
|
|
5
5
|
import "./dev-wallet-dropdown.mjs";
|
|
6
6
|
import { LitElement, css, html, nothing } from "lit";
|
|
7
7
|
import { customElement, property, state } from "lit/decorators.js";
|
|
8
|
-
|
|
9
8
|
//#region src/ui/dev-wallet-account-selector.ts
|
|
10
9
|
/** Short display names for adapter badges. */
|
|
11
10
|
const ADAPTER_SHORT_NAMES = {
|
|
@@ -14,13 +13,14 @@ const ADAPTER_SHORT_NAMES = {
|
|
|
14
13
|
"In-Memory Signer": "Memory",
|
|
15
14
|
"Passkey Signer": "Passkey"
|
|
16
15
|
};
|
|
17
|
-
let DevWalletAccountSelector = class DevWalletAccountSelector
|
|
16
|
+
let DevWalletAccountSelector = class DevWalletAccountSelector extends LitElement {
|
|
18
17
|
constructor(..._args) {
|
|
19
18
|
super(..._args);
|
|
20
19
|
this.accounts = [];
|
|
21
20
|
this.adapters = [];
|
|
22
21
|
this.activeAddress = "";
|
|
23
22
|
this._open = false;
|
|
23
|
+
this.#copy = new CopyController(this);
|
|
24
24
|
}
|
|
25
25
|
static {
|
|
26
26
|
this.styles = [
|
|
@@ -34,17 +34,22 @@ let DevWalletAccountSelector = class DevWalletAccountSelector$1 extends LitEleme
|
|
|
34
34
|
.active-account {
|
|
35
35
|
display: flex;
|
|
36
36
|
align-items: center;
|
|
37
|
-
gap:
|
|
37
|
+
gap: 10px;
|
|
38
38
|
width: 100%;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
min-height: 54px;
|
|
40
|
+
padding: 10px 12px;
|
|
41
|
+
border-radius: var(--dev-wallet-radius-lg);
|
|
42
|
+
border: 1px solid var(--dev-wallet-border);
|
|
43
|
+
background: var(--dev-wallet-surface);
|
|
42
44
|
cursor: pointer;
|
|
43
|
-
transition:
|
|
45
|
+
transition:
|
|
46
|
+
background 120ms,
|
|
47
|
+
border-color 120ms;
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
.active-account:hover {
|
|
47
|
-
background: var(--dev-wallet-
|
|
51
|
+
background: var(--dev-wallet-bg-hover);
|
|
52
|
+
border-color: var(--dev-wallet-border-strong);
|
|
48
53
|
}
|
|
49
54
|
|
|
50
55
|
.avatar {
|
|
@@ -75,26 +80,36 @@ let DevWalletAccountSelector = class DevWalletAccountSelector$1 extends LitEleme
|
|
|
75
80
|
text-overflow: ellipsis;
|
|
76
81
|
}
|
|
77
82
|
|
|
83
|
+
.account-label-row {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 6px;
|
|
87
|
+
min-width: 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
78
90
|
.account-address {
|
|
79
91
|
font-size: 11px;
|
|
80
92
|
font-family: var(--dev-wallet-font-mono);
|
|
81
|
-
color: var(--dev-wallet-
|
|
93
|
+
color: var(--dev-wallet-text-3);
|
|
82
94
|
}
|
|
83
95
|
|
|
84
96
|
.copy-btn {
|
|
85
|
-
width:
|
|
86
|
-
height:
|
|
97
|
+
width: 36px;
|
|
98
|
+
height: 54px;
|
|
87
99
|
display: flex;
|
|
88
100
|
align-items: center;
|
|
89
101
|
justify-content: center;
|
|
90
|
-
border-radius: var(--dev-wallet-radius
|
|
102
|
+
border-radius: var(--dev-wallet-radius);
|
|
103
|
+
border: 1px solid var(--dev-wallet-border);
|
|
104
|
+
background: transparent;
|
|
91
105
|
color: var(--dev-wallet-muted-foreground);
|
|
92
106
|
flex-shrink: 0;
|
|
93
107
|
font-size: 12px;
|
|
94
108
|
}
|
|
95
109
|
|
|
96
110
|
.copy-btn:hover {
|
|
97
|
-
background: var(--dev-wallet-
|
|
111
|
+
background: var(--dev-wallet-bg-hover);
|
|
112
|
+
border-color: var(--dev-wallet-border-strong);
|
|
98
113
|
color: var(--dev-wallet-foreground);
|
|
99
114
|
}
|
|
100
115
|
|
|
@@ -110,7 +125,8 @@ let DevWalletAccountSelector = class DevWalletAccountSelector$1 extends LitEleme
|
|
|
110
125
|
}
|
|
111
126
|
|
|
112
127
|
.dropdown-item[aria-selected='true'] {
|
|
113
|
-
background:
|
|
128
|
+
background: var(--dev-wallet-accent-fade);
|
|
129
|
+
border-color: var(--dev-wallet-border-strong);
|
|
114
130
|
}
|
|
115
131
|
|
|
116
132
|
.dropdown-item .avatar {
|
|
@@ -138,11 +154,16 @@ let DevWalletAccountSelector = class DevWalletAccountSelector$1 extends LitEleme
|
|
|
138
154
|
}
|
|
139
155
|
|
|
140
156
|
.adapter-badge {
|
|
157
|
+
height: 16px;
|
|
158
|
+
display: inline-flex;
|
|
159
|
+
align-items: center;
|
|
160
|
+
padding: 0 5px;
|
|
161
|
+
border-radius: 999px;
|
|
162
|
+
border: 1px solid var(--dev-wallet-border);
|
|
163
|
+
background: var(--dev-wallet-bg-3);
|
|
164
|
+
color: var(--dev-wallet-text-3);
|
|
165
|
+
font-family: var(--dev-wallet-font-mono);
|
|
141
166
|
font-size: 9px;
|
|
142
|
-
padding: 1px 4px;
|
|
143
|
-
border-radius: var(--dev-wallet-radius-2xs);
|
|
144
|
-
background: var(--dev-wallet-secondary);
|
|
145
|
-
color: var(--dev-wallet-muted-foreground);
|
|
146
167
|
white-space: nowrap;
|
|
147
168
|
}
|
|
148
169
|
|
|
@@ -167,14 +188,13 @@ let DevWalletAccountSelector = class DevWalletAccountSelector$1 extends LitEleme
|
|
|
167
188
|
`
|
|
168
189
|
];
|
|
169
190
|
}
|
|
170
|
-
#copy
|
|
191
|
+
#copy;
|
|
171
192
|
render() {
|
|
172
193
|
const active = this.accounts.find((a) => a.address === this.activeAddress);
|
|
173
|
-
if (!active)
|
|
174
|
-
return html`<div class="empty-state" part="empty-state">No account selected</div>`;
|
|
175
|
-
}
|
|
194
|
+
if (!active) return html`<div class="empty-state" part="empty-state">No account selected</div>`;
|
|
176
195
|
const label = this.#getLabel(active);
|
|
177
196
|
const initial = (label[0] ?? "?").toUpperCase();
|
|
197
|
+
const activeAdapterName = this.#getAdapterName(active.address);
|
|
178
198
|
return html`
|
|
179
199
|
<div class="selector-row">
|
|
180
200
|
<dev-wallet-dropdown
|
|
@@ -193,7 +213,10 @@ let DevWalletAccountSelector = class DevWalletAccountSelector$1 extends LitEleme
|
|
|
193
213
|
>
|
|
194
214
|
<span class="avatar">${initial}</span>
|
|
195
215
|
<div class="account-info">
|
|
196
|
-
<div class="account-label"
|
|
216
|
+
<div class="account-label-row">
|
|
217
|
+
<div class="account-label">${label}</div>
|
|
218
|
+
${activeAdapterName ? html`<span class="adapter-badge">${activeAdapterName}</span>` : nothing}
|
|
219
|
+
</div>
|
|
197
220
|
<div class="account-address">${formatAddress(active.address)}</div>
|
|
198
221
|
</div>
|
|
199
222
|
<svg
|
|
@@ -262,7 +285,7 @@ __decorate([property({ attribute: false })], DevWalletAccountSelector.prototype,
|
|
|
262
285
|
__decorate([property({ type: String })], DevWalletAccountSelector.prototype, "activeAddress", void 0);
|
|
263
286
|
__decorate([state()], DevWalletAccountSelector.prototype, "_open", void 0);
|
|
264
287
|
DevWalletAccountSelector = __decorate([customElement("dev-wallet-account-selector")], DevWalletAccountSelector);
|
|
265
|
-
|
|
266
288
|
//#endregion
|
|
267
289
|
export { DevWalletAccountSelector };
|
|
290
|
+
|
|
268
291
|
//# sourceMappingURL=dev-wallet-account-selector.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-account-selector.mjs","names":["DevWalletAccountSelector","#getLabel","#getAdapterName","#select","#copy"],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport { dropdownItemStyles, sharedStyles } from './styles.js';\nimport { CopyController } from './copy-controller.js';\nimport { emitEvent, findAdapterForAddress, formatAddress } from './utils.js';\nimport './dev-wallet-dropdown.js';\n\n/** Short display names for adapter badges. */\nconst ADAPTER_SHORT_NAMES: Record<string, string> = {\n\t'WebCrypto Signer': 'WebCrypto',\n\t'Remote CLI Signer': 'CLI',\n\t'In-Memory Signer': 'Memory',\n\t'Passkey Signer': 'Passkey',\n};\n\n@customElement('dev-wallet-account-selector')\nexport class DevWalletAccountSelector extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tdropdownItemStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.active-account {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-md);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.active-account:hover {\n\t\t\t\tbackground: var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.avatar {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.account-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.account-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.copy-btn {\n\t\t\t\twidth: 22px;\n\t\t\t\theight: 22px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.copy-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.copy-btn.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.chevron {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item[aria-selected='true'] {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 10%, transparent);\n\t\t\t}\n\n\t\t\t.dropdown-item .avatar {\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-address {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-info {\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.adapter-badge {\n\t\t\t\tfont-size: 9px;\n\t\t\t\tpadding: 1px 4px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.selector-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.selector-wrapper {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\t--dropdown-max-height: 240px;\n\t\t\t}\n\n\t\t\t.empty-state {\n\t\t\t\tpadding: 16px;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\taccounts: ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t@state()\n\tprivate _open = false;\n\n\t#copy = new CopyController(this);\n\n\toverride render() {\n\t\tconst active = this.accounts.find((a) => a.address === this.activeAddress);\n\n\t\tif (!active) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"empty-state\">No account selected</div>`;\n\t\t}\n\n\t\tconst label = this.#getLabel(active);\n\t\tconst initial = (label[0] ?? '?').toUpperCase();\n\n\t\treturn html`\n\t\t\t<div class=\"selector-row\">\n\t\t\t\t<dev-wallet-dropdown\n\t\t\t\t\tfull-width\n\t\t\t\t\tclass=\"selector-wrapper\"\n\t\t\t\t\t.open=${this._open}\n\t\t\t\t\t@close=${() => (this._open = false)}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\tclass=\"active-account\"\n\t\t\t\t\t\tpart=\"trigger\"\n\t\t\t\t\t\taria-expanded=${this._open}\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t@click=${() => (this._open = !this._open)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"avatar\">${initial}</span>\n\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t<div class=\"account-label\">${label}</div>\n\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(active.address)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"chevron\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M6 9l6 6 6-6\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div slot=\"popover\" role=\"listbox\" aria-label=\"Select account\">\n\t\t\t\t\t\t${this.accounts.map((account) => {\n\t\t\t\t\t\t\tconst accountLabel = this.#getLabel(account);\n\t\t\t\t\t\t\tconst accountInitial = (accountLabel[0] ?? '?').toUpperCase();\n\t\t\t\t\t\t\tconst adapterName = this.#getAdapterName(account.address);\n\n\t\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"dropdown-item\"\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\taria-selected=${account.address === this.activeAddress}\n\t\t\t\t\t\t\t\t\t@click=${() => this.#select(account)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"avatar\">${accountInitial}</span>\n\t\t\t\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-label\">${accountLabel}</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(account.address)}</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t${adapterName ? html`<span class=\"adapter-badge\">${adapterName}</span>` : nothing}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</dev-wallet-dropdown>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"copy-btn ${this.#copy.isCopied(active.address) ? 'copied' : ''}\"\n\t\t\t\t\tpart=\"copy-button\"\n\t\t\t\t\ttitle=\"Copy address\"\n\t\t\t\t\taria-label=\"Copy address\"\n\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tthis.#copy.copy(active.address);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${this.#copy.isCopied(active.address) ? '\\u2713' : '\\u2398'}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#getLabel(account: ReadonlyWalletAccount): string {\n\t\treturn account.label ?? `Account ${account.address.slice(0, 8)}`;\n\t}\n\n\t#getAdapterName(address: string): string | null {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return null;\n\t\treturn ADAPTER_SHORT_NAMES[adapter.name] ?? adapter.name;\n\t}\n\n\t#select(account: ReadonlyWalletAccount) {\n\t\tthis._open = false;\n\t\temitEvent(this, 'account-selected', { account });\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-account-selector': DevWalletAccountSelector;\n\t}\n}\n"],"mappings":";;;;;;;;;;AAcA,MAAM,sBAA8C;CACnD,oBAAoB;CACpB,qBAAqB;CACrB,oBAAoB;CACpB,kBAAkB;CAClB;AAGM,qCAAMA,mCAAiC,WAAW;;;kBAkJpB,EAAE;kBAGV,EAAE;uBAGd;eAGA;;;gBA1JS;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IH;;CAcD,QAAQ,IAAI,eAAe,KAAK;CAEhC,AAAS,SAAS;EACjB,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM,EAAE,YAAY,KAAK,cAAc;AAE1E,MAAI,CAAC,QAAQ;AACZ,UAAO,IAAI;;EAGZ,MAAM,QAAQ,MAAKC,SAAU,OAAO;EACpC,MAAM,WAAW,MAAM,MAAM,KAAK,aAAa;AAE/C,SAAO,IAAI;;;;;aAKA,KAAK,MAAM;oBACH,KAAK,QAAQ,MAAO;;;;;;sBAMnB,KAAK,MAAM;;qBAEX,KAAK,QAAQ,CAAC,KAAK,MAAO;;6BAEnB,QAAQ;;oCAED,MAAM;sCACJ,cAAc,OAAO,QAAQ,CAAC;;;;;;;;;;;;;QAa5D,KAAK,SAAS,KAAK,YAAY;GAChC,MAAM,eAAe,MAAKA,SAAU,QAAQ;GAC5C,MAAM,kBAAkB,aAAa,MAAM,KAAK,aAAa;GAC7D,MAAM,cAAc,MAAKC,eAAgB,QAAQ,QAAQ;AAEzD,UAAO,IAAI;;;;yBAIO,QAAQ,YAAY,KAAK,cAAc;wBACxC,MAAKC,OAAQ,QAAQ,CAAC;;gCAEd,eAAe;;uCAER,aAAa;yCACX,cAAc,QAAQ,QAAQ,CAAC;;WAE7D,cAAc,IAAI,+BAA+B,YAAY,WAAW,QAAQ;;;IAGnF,CAAC;;;;uBAIc,MAAKC,KAAM,SAAS,OAAO,QAAQ,GAAG,WAAW,GAAG;;;;eAI5D,MAAa;AACtB,KAAE,iBAAiB;AACnB,SAAKA,KAAM,KAAK,OAAO,QAAQ;IAC9B;;OAEA,MAAKA,KAAM,SAAS,OAAO,QAAQ,GAAG,MAAW,IAAS;;;;;CAMhE,UAAU,SAAwC;AACjD,SAAO,QAAQ,SAAS,WAAW,QAAQ,QAAQ,MAAM,GAAG,EAAE;;CAG/D,gBAAgB,SAAgC;EAC/C,MAAM,UAAU,sBAAsB,KAAK,UAAU,QAAQ;AAC7D,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,oBAAoB,QAAQ,SAAS,QAAQ;;CAGrD,QAAQ,SAAgC;AACvC,OAAK,QAAQ;AACb,YAAU,MAAM,oBAAoB,EAAE,SAAS,CAAC;;;YA3GhD,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC;YAG1B,OAAO;uCA3JR,cAAc,8BAA8B"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-account-selector.mjs","names":["#getLabel","#getAdapterName","#select","#copy"],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport { dropdownItemStyles, sharedStyles } from './styles.js';\nimport { CopyController } from './copy-controller.js';\nimport { emitEvent, findAdapterForAddress, formatAddress } from './utils.js';\nimport './dev-wallet-dropdown.js';\n\n/** Short display names for adapter badges. */\nconst ADAPTER_SHORT_NAMES: Record<string, string> = {\n\t'WebCrypto Signer': 'WebCrypto',\n\t'Remote CLI Signer': 'CLI',\n\t'In-Memory Signer': 'Memory',\n\t'Passkey Signer': 'Passkey',\n};\n\n@customElement('dev-wallet-account-selector')\nexport class DevWalletAccountSelector extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tdropdownItemStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.active-account {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\twidth: 100%;\n\t\t\t\tmin-height: 54px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\tbackground 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t}\n\n\t\t\t.active-account:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.avatar {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.account-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.account-label-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.copy-btn {\n\t\t\t\twidth: 36px;\n\t\t\t\theight: 54px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: transparent;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.copy-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.copy-btn.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.chevron {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item[aria-selected='true'] {\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.dropdown-item .avatar {\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-address {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-info {\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.adapter-badge {\n\t\t\t\theight: 16px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.selector-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.selector-wrapper {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\t--dropdown-max-height: 240px;\n\t\t\t}\n\n\t\t\t.empty-state {\n\t\t\t\tpadding: 16px;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\taccounts: ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t@state()\n\tprivate _open = false;\n\n\t#copy = new CopyController(this);\n\n\toverride render() {\n\t\tconst active = this.accounts.find((a) => a.address === this.activeAddress);\n\n\t\tif (!active) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"empty-state\">No account selected</div>`;\n\t\t}\n\n\t\tconst label = this.#getLabel(active);\n\t\tconst initial = (label[0] ?? '?').toUpperCase();\n\t\tconst activeAdapterName = this.#getAdapterName(active.address);\n\n\t\treturn html`\n\t\t\t<div class=\"selector-row\">\n\t\t\t\t<dev-wallet-dropdown\n\t\t\t\t\tfull-width\n\t\t\t\t\tclass=\"selector-wrapper\"\n\t\t\t\t\t.open=${this._open}\n\t\t\t\t\t@close=${() => (this._open = false)}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\tclass=\"active-account\"\n\t\t\t\t\t\tpart=\"trigger\"\n\t\t\t\t\t\taria-expanded=${this._open}\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t@click=${() => (this._open = !this._open)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"avatar\">${initial}</span>\n\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t<div class=\"account-label-row\">\n\t\t\t\t\t\t\t\t<div class=\"account-label\">${label}</div>\n\t\t\t\t\t\t\t\t${activeAdapterName\n\t\t\t\t\t\t\t\t\t? html`<span class=\"adapter-badge\">${activeAdapterName}</span>`\n\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(active.address)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"chevron\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M6 9l6 6 6-6\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div slot=\"popover\" role=\"listbox\" aria-label=\"Select account\">\n\t\t\t\t\t\t${this.accounts.map((account) => {\n\t\t\t\t\t\t\tconst accountLabel = this.#getLabel(account);\n\t\t\t\t\t\t\tconst accountInitial = (accountLabel[0] ?? '?').toUpperCase();\n\t\t\t\t\t\t\tconst adapterName = this.#getAdapterName(account.address);\n\n\t\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"dropdown-item\"\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\taria-selected=${account.address === this.activeAddress}\n\t\t\t\t\t\t\t\t\t@click=${() => this.#select(account)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"avatar\">${accountInitial}</span>\n\t\t\t\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-label\">${accountLabel}</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(account.address)}</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t${adapterName ? html`<span class=\"adapter-badge\">${adapterName}</span>` : nothing}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</dev-wallet-dropdown>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"copy-btn ${this.#copy.isCopied(active.address) ? 'copied' : ''}\"\n\t\t\t\t\tpart=\"copy-button\"\n\t\t\t\t\ttitle=\"Copy address\"\n\t\t\t\t\taria-label=\"Copy address\"\n\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tthis.#copy.copy(active.address);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${this.#copy.isCopied(active.address) ? '\\u2713' : '\\u2398'}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#getLabel(account: ReadonlyWalletAccount): string {\n\t\treturn account.label ?? `Account ${account.address.slice(0, 8)}`;\n\t}\n\n\t#getAdapterName(address: string): string | null {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return null;\n\t\treturn ADAPTER_SHORT_NAMES[adapter.name] ?? adapter.name;\n\t}\n\n\t#select(account: ReadonlyWalletAccount) {\n\t\tthis._open = false;\n\t\temitEvent(this, 'account-selected', { account });\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-account-selector': DevWalletAccountSelector;\n\t}\n}\n"],"mappings":";;;;;;;;;AAcA,MAAM,sBAA8C;CACnD,oBAAoB;CACpB,qBAAqB;CACrB,oBAAoB;CACpB,kBAAkB;CAClB;AAGM,IAAA,2BAAA,MAAM,iCAAiC,WAAW;;;kBAuKpB,EAAE;kBAGV,EAAE;uBAGd;eAGA;eAER,IAAI,eAAe,KAAK;;;gBAjLP;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKH;;CAcD;CAEA,SAAkB;EACjB,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM,EAAE,YAAY,KAAK,cAAc;AAE1E,MAAI,CAAC,OACJ,QAAO,IAAI;EAGZ,MAAM,QAAQ,MAAA,SAAe,OAAO;EACpC,MAAM,WAAW,MAAM,MAAM,KAAK,aAAa;EAC/C,MAAM,oBAAoB,MAAA,eAAqB,OAAO,QAAQ;AAE9D,SAAO,IAAI;;;;;aAKA,KAAK,MAAM;oBACH,KAAK,QAAQ,MAAO;;;;;;sBAMnB,KAAK,MAAM;;qBAEX,KAAK,QAAQ,CAAC,KAAK,MAAO;;6BAEnB,QAAQ;;;qCAGA,MAAM;UACjC,oBACC,IAAI,+BAA+B,kBAAkB,WACrD,QAAQ;;sCAEmB,cAAc,OAAO,QAAQ,CAAC;;;;;;;;;;;;;QAa5D,KAAK,SAAS,KAAK,YAAY;GAChC,MAAM,eAAe,MAAA,SAAe,QAAQ;GAC5C,MAAM,kBAAkB,aAAa,MAAM,KAAK,aAAa;GAC7D,MAAM,cAAc,MAAA,eAAqB,QAAQ,QAAQ;AAEzD,UAAO,IAAI;;;;yBAIO,QAAQ,YAAY,KAAK,cAAc;wBACxC,MAAA,OAAa,QAAQ,CAAC;;gCAEd,eAAe;;uCAER,aAAa;yCACX,cAAc,QAAQ,QAAQ,CAAC;;WAE7D,cAAc,IAAI,+BAA+B,YAAY,WAAW,QAAQ;;;IAGnF,CAAC;;;;uBAIc,MAAA,KAAW,SAAS,OAAO,QAAQ,GAAG,WAAW,GAAG;;;;eAI5D,MAAa;AACtB,KAAE,iBAAiB;AACnB,SAAA,KAAW,KAAK,OAAO,QAAQ;IAC9B;;OAEA,MAAA,KAAW,SAAS,OAAO,QAAQ,GAAG,MAAW,IAAS;;;;;CAMhE,UAAU,SAAwC;AACjD,SAAO,QAAQ,SAAS,WAAW,QAAQ,QAAQ,MAAM,GAAG,EAAE;;CAG/D,gBAAgB,SAAgC;EAC/C,MAAM,UAAU,sBAAsB,KAAK,UAAU,QAAQ;AAC7D,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,oBAAoB,QAAQ,SAAS,QAAQ;;CAGrD,QAAQ,SAAgC;AACvC,OAAK,QAAQ;AACb,YAAU,MAAM,oBAAoB,EAAE,SAAS,CAAC;;;YAjHhD,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,yBAAA,WAAA,YAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,yBAAA,WAAA,YAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,yBAAA,WAAA,iBAAA,KAAA,EAAA;YAG1B,OAAO,CAAA,EAAA,yBAAA,WAAA,SAAA,KAAA,EAAA;uCAhLR,cAAc,8BAA8B,CAAA,EAAA,yBAAA"}
|
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
import { SignerAdapter } from "../types.mjs";
|
|
2
|
-
import "./dev-wallet-new-account.mjs";
|
|
3
2
|
import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
|
|
4
|
-
import * as
|
|
3
|
+
import * as _$lit from "lit";
|
|
5
4
|
import { LitElement } from "lit";
|
|
6
5
|
|
|
7
6
|
//#region src/ui/dev-wallet-accounts.d.ts
|
|
8
7
|
declare class DevWalletAccounts extends LitElement {
|
|
9
8
|
#private;
|
|
10
|
-
static styles: (
|
|
9
|
+
static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
|
|
11
10
|
accounts: readonly ReadonlyWalletAccount[];
|
|
12
11
|
adapters: SignerAdapter[];
|
|
13
12
|
activeAddress: string;
|
|
13
|
+
/** Phase 4 P4.20 — when set to a `*-fork` literal, the panel
|
|
14
|
+
* surfaces a warning on the "+ Add" button (or hides it outright
|
|
15
|
+
* when no fork-compatible funding path exists). Fork stacks have
|
|
16
|
+
* no faucet; arbitrary fresh accounts can't be funded without an
|
|
17
|
+
* impersonation seed already configured at the supervisor level. */
|
|
18
|
+
network: string;
|
|
14
19
|
private _dialogOpen;
|
|
15
20
|
private _editingAddress;
|
|
16
21
|
private _editingLabel;
|
|
17
22
|
private _confirmDeleteAddress;
|
|
18
23
|
private _deleting;
|
|
19
24
|
private _deleteError;
|
|
20
|
-
render():
|
|
25
|
+
render(): _$lit.TemplateResult<1>;
|
|
21
26
|
}
|
|
22
27
|
declare global {
|
|
23
28
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-accounts.d.mts","names":[],"sources":["../../src/ui/dev-wallet-accounts.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-accounts.d.mts","names":[],"sources":["../../src/ui/dev-wallet-accounts.ts"],"mappings":";;;;;;cAkCa,iBAAA,SAA0B,UAAA;EAAA;SACtB,MAAA,GADc,KAAA,CACR,SAAA,GAAA,KAAA,CAAA,SAAA;EA8KtB,QAAA,WAAmB,qBAAA;EAGnB,QAAA,EAAU,aAAA;EAGV,aAAA;EArL8B;;;;;EA6L9B,OAAA;EAAA,QAGQ,WAAA;EAAA,QAKA,eAAA;EAAA,QAGA,aAAA;EAAA,QAGA,qBAAA;EAAA,QAGA,SAAA;EAAA,QAGA,YAAA;EAEC,MAAA,CAAA,GAjCc,KAAA,CAiCR,cAAA;AAAA;AAAA,QAmSR,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAA;EAAA;AAAA"}
|