@mysten-incubation/dev-wallet 0.3.0 → 0.4.1
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 +76 -2
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0/helpers → _@oxc-project_runtime@0.135.0/helpers/esm}/decorate.mjs +1 -1
- package/dist/adapters/base-adapter.d.mts.map +1 -1
- package/dist/adapters/base-adapter.mjs.map +1 -1
- package/dist/adapters/build-managed-account.mjs.map +1 -1
- package/dist/adapters/devstack-adapter.d.mts.map +1 -1
- package/dist/adapters/devstack-adapter.mjs.map +1 -1
- package/dist/adapters/devstack-paths.d.mts.map +1 -1
- package/dist/adapters/devstack-paths.mjs.map +1 -1
- package/dist/adapters/fork-relay.d.mts.map +1 -1
- package/dist/adapters/fork-relay.mjs.map +1 -1
- package/dist/adapters/idb-store.mjs.map +1 -1
- package/dist/adapters/in-memory-adapter.d.mts.map +1 -1
- package/dist/adapters/in-memory-adapter.mjs.map +1 -1
- package/dist/adapters/passkey-adapter.d.mts.map +1 -1
- package/dist/adapters/passkey-adapter.mjs.map +1 -1
- package/dist/adapters/remote-cli-adapter.d.mts.map +1 -1
- package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
- package/dist/adapters/webcrypto-adapter.d.mts.map +1 -1
- package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/client/dev-wallet-client.d.mts.map +1 -1
- package/dist/client/dev-wallet-client.mjs.map +1 -1
- package/dist/client/request-handler.d.mts.map +1 -1
- package/dist/client/request-handler.mjs.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.mjs +2 -1
- package/dist/inject/index.d.mts +61 -0
- package/dist/inject/index.d.mts.map +1 -0
- package/dist/inject/index.mjs +67 -0
- package/dist/inject/index.mjs.map +1 -0
- package/dist/react/components.d.mts +6 -8
- package/dist/react/components.d.mts.map +1 -1
- package/dist/react/components.mjs.map +1 -1
- package/dist/react/context.d.mts +2 -3
- package/dist/react/context.d.mts.map +1 -1
- package/dist/react/context.mjs.map +1 -1
- package/dist/react/useDevWallet.d.mts +3 -11
- package/dist/react/useDevWallet.d.mts.map +1 -1
- package/dist/react/useDevWallet.mjs +14 -36
- package/dist/react/useDevWallet.mjs.map +1 -1
- package/dist/server/cli-signing-middleware.d.mts.map +1 -1
- package/dist/server/cli-signing-middleware.mjs.map +1 -1
- package/dist/standalone/assets/base-adapter-DET6CP7z.js +1 -0
- package/dist/standalone/assets/in-memory-adapter-CX7xym4e.js +1 -0
- package/dist/standalone/assets/main-CuOnBmaa.js +7 -0
- package/dist/standalone/assets/webcrypto-adapter-CUQmbHDy.js +1 -0
- package/dist/standalone/bookmarklet.js +5 -5
- package/dist/standalone/index.html +2 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/ui/copy-controller.mjs.map +1 -1
- package/dist/ui/dev-wallet-account-selector.d.mts +2 -3
- package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
- package/dist/ui/dev-wallet-account-selector.mjs +1 -1
- package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
- package/dist/ui/dev-wallet-accounts.d.mts +2 -3
- package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
- package/dist/ui/dev-wallet-accounts.mjs +1 -1
- package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
- package/dist/ui/dev-wallet-balances.d.mts +2 -3
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
- package/dist/ui/dev-wallet-balances.mjs +1 -1
- package/dist/ui/dev-wallet-balances.mjs.map +1 -1
- package/dist/ui/dev-wallet-connect.d.mts +2 -3
- package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
- package/dist/ui/dev-wallet-connect.mjs +1 -1
- package/dist/ui/dev-wallet-connect.mjs.map +1 -1
- package/dist/ui/dev-wallet-dropdown.d.mts +2 -3
- package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
- package/dist/ui/dev-wallet-dropdown.mjs +1 -1
- package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
- package/dist/ui/dev-wallet-fork-panel.d.mts +2 -3
- package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-fork-panel.mjs +1 -1
- package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-network-badge.d.mts +2 -3
- package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
- package/dist/ui/dev-wallet-network-badge.mjs +1 -1
- package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
- package/dist/ui/dev-wallet-new-account.d.mts +2 -3
- package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
- package/dist/ui/dev-wallet-new-account.mjs +1 -1
- package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
- package/dist/ui/dev-wallet-objects.d.mts +2 -3
- package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
- package/dist/ui/dev-wallet-objects.mjs +1 -1
- package/dist/ui/dev-wallet-objects.mjs.map +1 -1
- package/dist/ui/dev-wallet-panel.d.mts +2 -3
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-panel.mjs +1 -1
- package/dist/ui/dev-wallet-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-popup.d.mts +2 -3
- package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
- package/dist/ui/dev-wallet-popup.mjs +1 -1
- package/dist/ui/dev-wallet-popup.mjs.map +1 -1
- package/dist/ui/dev-wallet-settings.d.mts +2 -3
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
- package/dist/ui/dev-wallet-settings.mjs +1 -1
- package/dist/ui/dev-wallet-settings.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.d.mts +2 -3
- package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.mjs +1 -1
- package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing.d.mts +2 -3
- package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing.mjs +2 -1
- package/dist/ui/dev-wallet-signing.mjs.map +1 -1
- package/dist/ui/dev-wallet-standalone.d.mts +2 -3
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
- package/dist/ui/dev-wallet-standalone.mjs +1 -1
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.d.mts +1 -2
- package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.mjs +1 -1
- package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
- package/dist/ui/mount.mjs.map +1 -1
- package/dist/ui/styles.mjs.map +1 -1
- package/dist/ui/transaction-analyzer.mjs.map +1 -1
- package/dist/ui/utils.d.mts.map +1 -1
- package/dist/ui/utils.mjs.map +1 -1
- package/dist/ui/wallet-controller.mjs.map +1 -1
- package/dist/wallet/constants.d.mts.map +1 -1
- package/dist/wallet/constants.mjs.map +1 -1
- package/dist/wallet/dev-wallet.d.mts +19 -0
- package/dist/wallet/dev-wallet.d.mts.map +1 -1
- package/dist/wallet/dev-wallet.mjs +58 -2
- package/dist/wallet/dev-wallet.mjs.map +1 -1
- package/dist/wallet/initializer.d.mts.map +1 -1
- package/dist/wallet/initializer.mjs +10 -26
- package/dist/wallet/initializer.mjs.map +1 -1
- package/dist/wallet/mount-and-register.d.mts +44 -0
- package/dist/wallet/mount-and-register.d.mts.map +1 -0
- package/dist/wallet/mount-and-register.mjs +46 -0
- package/dist/wallet/mount-and-register.mjs.map +1 -0
- package/dist/wallet/signing.d.mts.map +1 -1
- package/dist/wallet/signing.mjs.map +1 -1
- package/package.json +26 -22
- package/src/index.ts +5 -0
- package/src/inject/index.ts +200 -0
- package/src/react/useDevWallet.ts +26 -71
- package/src/ui/dev-wallet-signing.ts +2 -0
- package/src/wallet/dev-wallet.ts +75 -2
- package/src/wallet/initializer.ts +16 -42
- package/src/wallet/mount-and-register.ts +93 -0
- package/dist/standalone/assets/in-memory-adapter-qRkNfj9O.js +0 -1
- package/dist/standalone/assets/main-DDltQnzR.js +0 -3954
- package/dist/standalone/assets/webcrypto-adapter-FejcrL9x.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-connect.mjs","names":["#toggleAccount","#reject","#approve"],"sources":["../../src/ui/dev-wallet-connect.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { actionButtonStyles, sharedStyles } from './styles.js';\nimport { emitEvent, formatAddress, toggleSetItem } from './utils.js';\n\ninterface AccountInfo {\n\taddress: string;\n\tlabel?: string;\n\tadapterName?: string;\n}\n\n@customElement('dev-wallet-connect')\nexport class DevWalletConnect extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex: 1;\n\t\t\t\tflex-direction: column;\n\t\t\t\tmin-height: 0;\n\t\t\t}\n\n\t\t\t.connect-content {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.connect-header {\n\t\t\t\ttext-align: left;\n\t\t\t\tmargin-bottom: 14px;\n\t\t\t}\n\n\t\t\t.connect-title {\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}\n\n\t\t\t.connect-desc {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmargin-top: 4px;\n\t\t\t}\n\n\t\t\t.app-info {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.app-name {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.app-url {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t}\n\n\t\t\t.account-list {\n\t\t\t\tmax-height: 240px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.account-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 10px;\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}\n\n\t\t\t.account-item: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.account-item input[type='checkbox'] {\n\t\t\t\taccent-color: var(--dev-wallet-primary);\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}\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.account-adapter {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t\tpadding: 1px 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tmargin-left: 6px;\n\t\t\t}\n\n\t\t\t.connect-footer {\n\t\t\t\tpadding: 12px 16px;\n\t\t\t\tborder-top: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t/* Override: connect uses --primary instead of --positive for approve */\n\t\t\t.btn-approve {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.btn-approve:hover {\n\t\t\t\tbackground: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);\n\t\t\t}\n\n\t\t\t.btn-approve:disabled {\n\t\t\t\tcursor: default;\n\t\t\t}\n\n\t\t\t.error-message {\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\tappName = '';\n\n\t@property({ type: String })\n\tappUrl = '';\n\n\t@property({ attribute: false })\n\taccounts: AccountInfo[] = [];\n\n\t@state()\n\tprivate _connecting = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _selectedAddresses: Set<string> = new Set();\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (\n\t\t\tchangedProperties.has('accounts') &&\n\t\t\tthis.accounts.length > 0 &&\n\t\t\tthis._selectedAddresses.size === 0\n\t\t) {\n\t\t\tthis._selectedAddresses = new Set(this.accounts.map((a) => a.address));\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"connect-content\">\n\t\t\t\t<div class=\"connect-header\">\n\t\t\t\t\t<div class=\"connect-title\">Connection Request</div>\n\t\t\t\t\t<div class=\"connect-desc\">Select accounts to share with the app</div>\n\t\t\t\t\t${this.appName\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<div class=\"app-info\">\n\t\t\t\t\t\t\t\t\t<span class=\"app-name\">${this.appName}</span>\n\t\t\t\t\t\t\t\t\t<span class=\"app-url\">${this.appUrl}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t\t${this.accounts.length > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<div class=\"account-list\" part=\"account-list\">\n\t\t\t\t\t\t\t\t${this.accounts.map(\n\t\t\t\t\t\t\t\t\t(account) => html`\n\t\t\t\t\t\t\t\t\t\t<label class=\"account-item\">\n\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t.checked=${this._selectedAddresses.has(account.address)}\n\t\t\t\t\t\t\t\t\t\t\t\t@change=${() => this.#toggleAccount(account.address)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t${account.label\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<div class=\"account-label\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${account.label}${account.adapterName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"account-adapter\">${account.adapterName}</span>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\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\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t\t<div class=\"connect-footer\">\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-reject\" part=\"reject-button\" @click=${this.#reject}>Reject</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn btn-approve\"\n\t\t\t\t\t\tpart=\"approve-button\"\n\t\t\t\t\t\t?disabled=${this._connecting || this._selectedAddresses.size === 0}\n\t\t\t\t\t\t@click=${this.#approve}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._connecting ? 'Connecting...' : `Connect (${this._selectedAddresses.size})`}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t${this._error\n\t\t\t\t\t? html`<p class=\"error-message\" part=\"error-message\">${this._error}</p>`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget selectedAddresses(): string[] {\n\t\treturn [...this._selectedAddresses];\n\t}\n\n\t#toggleAccount(address: string) {\n\t\tthis._selectedAddresses = toggleSetItem(this._selectedAddresses, address);\n\t}\n\n\t#approve() {\n\t\tthis._connecting = true;\n\t\tthis._error = null;\n\t\temitEvent(this, 'approve', { selectedAddresses: this.selectedAddresses });\n\t}\n\n\t#reject() {\n\t\temitEvent(this, 'reject');\n\t}\n\n\tshowError(message: string) {\n\t\tthis._connecting = false;\n\t\tthis._error = message;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-connect': DevWalletConnect;\n\t}\n}\n"],"mappings":";;;;;;AAgBO,IAAA,mBAAA,MAAM,yBAAyB,WAAW;;;iBAwItC;gBAGD;kBAGiB,
|
|
1
|
+
{"version":3,"file":"dev-wallet-connect.mjs","names":["#toggleAccount","#reject","#approve"],"sources":["../../src/ui/dev-wallet-connect.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { actionButtonStyles, sharedStyles } from './styles.js';\nimport { emitEvent, formatAddress, toggleSetItem } from './utils.js';\n\ninterface AccountInfo {\n\taddress: string;\n\tlabel?: string;\n\tadapterName?: string;\n}\n\n@customElement('dev-wallet-connect')\nexport class DevWalletConnect extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex: 1;\n\t\t\t\tflex-direction: column;\n\t\t\t\tmin-height: 0;\n\t\t\t}\n\n\t\t\t.connect-content {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.connect-header {\n\t\t\t\ttext-align: left;\n\t\t\t\tmargin-bottom: 14px;\n\t\t\t}\n\n\t\t\t.connect-title {\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}\n\n\t\t\t.connect-desc {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmargin-top: 4px;\n\t\t\t}\n\n\t\t\t.app-info {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.app-name {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.app-url {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t}\n\n\t\t\t.account-list {\n\t\t\t\tmax-height: 240px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.account-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 10px;\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}\n\n\t\t\t.account-item: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.account-item input[type='checkbox'] {\n\t\t\t\taccent-color: var(--dev-wallet-primary);\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}\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.account-adapter {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t\tpadding: 1px 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tmargin-left: 6px;\n\t\t\t}\n\n\t\t\t.connect-footer {\n\t\t\t\tpadding: 12px 16px;\n\t\t\t\tborder-top: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t/* Override: connect uses --primary instead of --positive for approve */\n\t\t\t.btn-approve {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.btn-approve:hover {\n\t\t\t\tbackground: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);\n\t\t\t}\n\n\t\t\t.btn-approve:disabled {\n\t\t\t\tcursor: default;\n\t\t\t}\n\n\t\t\t.error-message {\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\tappName = '';\n\n\t@property({ type: String })\n\tappUrl = '';\n\n\t@property({ attribute: false })\n\taccounts: AccountInfo[] = [];\n\n\t@state()\n\tprivate _connecting = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _selectedAddresses: Set<string> = new Set();\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (\n\t\t\tchangedProperties.has('accounts') &&\n\t\t\tthis.accounts.length > 0 &&\n\t\t\tthis._selectedAddresses.size === 0\n\t\t) {\n\t\t\tthis._selectedAddresses = new Set(this.accounts.map((a) => a.address));\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"connect-content\">\n\t\t\t\t<div class=\"connect-header\">\n\t\t\t\t\t<div class=\"connect-title\">Connection Request</div>\n\t\t\t\t\t<div class=\"connect-desc\">Select accounts to share with the app</div>\n\t\t\t\t\t${this.appName\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<div class=\"app-info\">\n\t\t\t\t\t\t\t\t\t<span class=\"app-name\">${this.appName}</span>\n\t\t\t\t\t\t\t\t\t<span class=\"app-url\">${this.appUrl}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t\t${this.accounts.length > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<div class=\"account-list\" part=\"account-list\">\n\t\t\t\t\t\t\t\t${this.accounts.map(\n\t\t\t\t\t\t\t\t\t(account) => html`\n\t\t\t\t\t\t\t\t\t\t<label class=\"account-item\">\n\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t.checked=${this._selectedAddresses.has(account.address)}\n\t\t\t\t\t\t\t\t\t\t\t\t@change=${() => this.#toggleAccount(account.address)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t${account.label\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<div class=\"account-label\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${account.label}${account.adapterName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"account-adapter\">${account.adapterName}</span>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\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\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t\t<div class=\"connect-footer\">\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-reject\" part=\"reject-button\" @click=${this.#reject}>Reject</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn btn-approve\"\n\t\t\t\t\t\tpart=\"approve-button\"\n\t\t\t\t\t\t?disabled=${this._connecting || this._selectedAddresses.size === 0}\n\t\t\t\t\t\t@click=${this.#approve}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._connecting ? 'Connecting...' : `Connect (${this._selectedAddresses.size})`}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t${this._error\n\t\t\t\t\t? html`<p class=\"error-message\" part=\"error-message\">${this._error}</p>`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget selectedAddresses(): string[] {\n\t\treturn [...this._selectedAddresses];\n\t}\n\n\t#toggleAccount(address: string) {\n\t\tthis._selectedAddresses = toggleSetItem(this._selectedAddresses, address);\n\t}\n\n\t#approve() {\n\t\tthis._connecting = true;\n\t\tthis._error = null;\n\t\temitEvent(this, 'approve', { selectedAddresses: this.selectedAddresses });\n\t}\n\n\t#reject() {\n\t\temitEvent(this, 'reject');\n\t}\n\n\tshowError(message: string) {\n\t\tthis._connecting = false;\n\t\tthis._error = message;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-connect': DevWalletConnect;\n\t}\n}\n"],"mappings":";;;;;;AAgBO,IAAA,mBAAA,MAAM,yBAAyB,WAAW;;;iBAwItC;gBAGD;kBAGiB,CAAC;qBAGL;gBAGU;4CAGU,IAAI,IAAI;;;gBAtJzB;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiIJ;;CAoBA,WAAoB,mBAAyC;EAC5D,IACC,kBAAkB,IAAI,UAAU,KAChC,KAAK,SAAS,SAAS,KACvB,KAAK,mBAAmB,SAAS,GAEjC,KAAK,qBAAqB,IAAI,IAAI,KAAK,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC;CAEvE;CAEA,SAAkB;EACjB,OAAO,IAAI;;;;;OAKN,KAAK,UACJ,IAAI;;kCAEsB,KAAK,QAAQ;iCACd,KAAK,OAAO;;WAGrC,QAAQ;;MAEV,KAAK,SAAS,SAAS,IACtB,IAAI;;UAED,KAAK,SAAS,KACd,YAAY,IAAI;;;;uBAIH,KAAK,mBAAmB,IAAI,QAAQ,OAAO,EAAE;4BACxC,KAAKA,eAAe,QAAQ,OAAO,EAAE;;;cAGnD,QAAQ,QACP,IAAI;iBACF,QAAQ,QAAQ,QAAQ,cACvB,IAAI,iCAAiC,QAAQ,YAAY,WACzD,QAAQ;wBAEX,QAAQ;2CACoB,cAAc,QAAQ,OAAO,EAAE;;;UAIlE,EAAE;;UAGH,QAAQ;;;;kEAImD,KAAKC,QAAQ;;;;kBAI7D,KAAK,eAAe,KAAK,mBAAmB,SAAS,EAAE;eAC1D,KAAKC,SAAS;;QAErB,KAAK,cAAc,kBAAkB,YAAY,KAAK,mBAAmB,KAAK,GAAG;;;MAGnF,KAAK,SACJ,IAAI,iDAAiD,KAAK,OAAO,QACjE,QAAQ;;;CAGd;CAEA,IAAI,oBAA8B;EACjC,OAAO,CAAC,GAAG,KAAK,kBAAkB;CACnC;CAEA,eAAe,SAAiB;EAC/B,KAAK,qBAAqB,cAAc,KAAK,oBAAoB,OAAO;CACzE;CAEA,WAAW;EACV,KAAK,cAAc;EACnB,KAAK,SAAS;EACd,UAAU,MAAM,WAAW,EAAE,mBAAmB,KAAK,kBAAkB,CAAC;CACzE;CAEA,UAAU;EACT,UAAU,MAAM,QAAQ;CACzB;CAEA,UAAU,SAAiB;EAC1B,KAAK,cAAc;EACnB,KAAK,SAAS;CACf;AACD;YAhHE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,iBAAA,WAAA,WAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,iBAAA,WAAA,UAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,iBAAA,WAAA,YAAA,KAAA,CAAA;YAG7B,MAAM,CAAA,GAAA,iBAAA,WAAA,eAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,iBAAA,WAAA,UAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,iBAAA,WAAA,sBAAA,KAAA,CAAA;+BAvJP,cAAc,oBAAoB,CAAA,GAAA,gBAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement } from "lit";
|
|
3
2
|
|
|
4
3
|
//#region src/ui/dev-wallet-dropdown.d.ts
|
|
@@ -8,10 +7,10 @@ import { LitElement } from "lit";
|
|
|
8
7
|
*/
|
|
9
8
|
declare class DevWalletDropdown extends LitElement {
|
|
10
9
|
#private;
|
|
11
|
-
static styles: (
|
|
10
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
12
11
|
open: boolean;
|
|
13
12
|
fullWidth: boolean;
|
|
14
|
-
render():
|
|
13
|
+
render(): import("lit").TemplateResult<1>;
|
|
15
14
|
close(): void;
|
|
16
15
|
connectedCallback(): void;
|
|
17
16
|
disconnectedCallback(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-dropdown.d.mts","names":[],"sources":["../../src/ui/dev-wallet-dropdown.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-dropdown.d.mts","names":[],"sources":["../../src/ui/dev-wallet-dropdown.ts"],"mappings":";;;;;AAaA;;cACa,iBAAA,SAA0B,UAAU;EAAA;SAChC,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAqCtB,IAAA;EAGA,SAAA;EAES,MAAA,kBAAM,cAAA;EAOf,KAAA;EA8CS,iBAAA;EAQA,oBAAA;EAMA,UAAA,CAAW,OAAA,EAAS,GAAA;AAAA;AAAA,QAWtB,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAiB;EAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { sharedStyles } from "./styles.mjs";
|
|
2
2
|
import { emitEvent } from "./utils.mjs";
|
|
3
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
4
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
5
|
import { customElement, property } from "lit/decorators.js";
|
|
6
6
|
//#region src/ui/dev-wallet-dropdown.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-dropdown.mjs","names":["#handleKeydown","#handleDocClick"],"sources":["../../src/ui/dev-wallet-dropdown.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { sharedStyles } from './styles.js';\nimport { emitEvent } from './utils.js';\n\n/**\n * @slot trigger - The element that opens the dropdown (parent handles click to toggle)\n * @slot popover - The dropdown content\n */\n@customElement('dev-wallet-dropdown')\nexport class DevWalletDropdown extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tposition: relative;\n\t\t\t\tdisplay: inline-block;\n\t\t\t}\n\n\t\t\t:host([full-width]) {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.popover {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 100%;\n\t\t\t\tleft: 0;\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tmin-width: 100%;\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\tz-index: 10;\n\t\t\t\toverflow: hidden;\n\t\t\t\tmax-height: var(--dropdown-max-height, none);\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 4px;\n\t\t\t\tanimation: popin 120ms ease-out;\n\t\t\t}\n\n\t\t\t:host([full-width]) .popover {\n\t\t\t\tright: 0;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: Boolean, reflect: true })\n\topen = false;\n\n\t@property({ type: Boolean, reflect: true, attribute: 'full-width' })\n\tfullWidth = false;\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t${this.open ? html`<div class=\"popover\"><slot name=\"popover\"></slot></div>` : nothing}\n\t\t`;\n\t}\n\n\tclose() {\n\t\tif (this.open) {\n\t\t\tthis.open = false;\n\t\t\temitEvent(this, 'close');\n\t\t}\n\t}\n\n\t#handleDocClick = (e: Event) => {\n\t\tif (this.open && !e.composedPath().includes(this)) {\n\t\t\tthis.close();\n\t\t}\n\t};\n\n\t#handleKeydown = (e: KeyboardEvent) => {\n\t\tif (!this.open) return;\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tthis.close();\n\t\t\tconst trigger = this.querySelector('[slot=\"trigger\"]') as HTMLElement | null;\n\t\t\ttrigger?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tconst items = Array.from(\n\t\t\t\tthis.querySelectorAll<HTMLElement>(\n\t\t\t\t\t'[slot=\"popover\"] button, [slot=\"popover\"] [role=\"option\"]',\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (items.length === 0) return;\n\n\t\t\tconst focused = items.find((el) => el === document.activeElement);\n\t\t\tlet index = focused ? items.indexOf(focused) : -1;\n\n\t\t\tif (e.key === 'ArrowDown') {\n\t\t\t\tindex = index < items.length - 1 ? index + 1 : 0;\n\t\t\t} else {\n\t\t\t\tindex = index > 0 ? index - 1 : items.length - 1;\n\t\t\t}\n\n\t\t\titems[index]?.focus();\n\t\t}\n\t};\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\tthis.addEventListener('keydown', this.#handleKeydown);\n\t\tif (this.open) {\n\t\t\tdocument.addEventListener('click', this.#handleDocClick, true);\n\t\t}\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tdocument.removeEventListener('click', this.#handleDocClick, true);\n\t\tthis.removeEventListener('keydown', this.#handleKeydown);\n\t}\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (changed.has('open')) {\n\t\t\tif (this.open) {\n\t\t\t\tdocument.addEventListener('click', this.#handleDocClick, true);\n\t\t\t} else {\n\t\t\t\tdocument.removeEventListener('click', this.#handleDocClick, true);\n\t\t\t}\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-dropdown': DevWalletDropdown;\n\t}\n}\n"],"mappings":";;;;;;AAcO,IAAA,oBAAA,MAAM,0BAA0B,WAAW;;;cAsC1C;mBAGK;0BAgBO,MAAa;
|
|
1
|
+
{"version":3,"file":"dev-wallet-dropdown.mjs","names":["#handleKeydown","#handleDocClick"],"sources":["../../src/ui/dev-wallet-dropdown.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { sharedStyles } from './styles.js';\nimport { emitEvent } from './utils.js';\n\n/**\n * @slot trigger - The element that opens the dropdown (parent handles click to toggle)\n * @slot popover - The dropdown content\n */\n@customElement('dev-wallet-dropdown')\nexport class DevWalletDropdown extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tposition: relative;\n\t\t\t\tdisplay: inline-block;\n\t\t\t}\n\n\t\t\t:host([full-width]) {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.popover {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 100%;\n\t\t\t\tleft: 0;\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tmin-width: 100%;\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\tz-index: 10;\n\t\t\t\toverflow: hidden;\n\t\t\t\tmax-height: var(--dropdown-max-height, none);\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 4px;\n\t\t\t\tanimation: popin 120ms ease-out;\n\t\t\t}\n\n\t\t\t:host([full-width]) .popover {\n\t\t\t\tright: 0;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: Boolean, reflect: true })\n\topen = false;\n\n\t@property({ type: Boolean, reflect: true, attribute: 'full-width' })\n\tfullWidth = false;\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t${this.open ? html`<div class=\"popover\"><slot name=\"popover\"></slot></div>` : nothing}\n\t\t`;\n\t}\n\n\tclose() {\n\t\tif (this.open) {\n\t\t\tthis.open = false;\n\t\t\temitEvent(this, 'close');\n\t\t}\n\t}\n\n\t#handleDocClick = (e: Event) => {\n\t\tif (this.open && !e.composedPath().includes(this)) {\n\t\t\tthis.close();\n\t\t}\n\t};\n\n\t#handleKeydown = (e: KeyboardEvent) => {\n\t\tif (!this.open) return;\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tthis.close();\n\t\t\tconst trigger = this.querySelector('[slot=\"trigger\"]') as HTMLElement | null;\n\t\t\ttrigger?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tconst items = Array.from(\n\t\t\t\tthis.querySelectorAll<HTMLElement>(\n\t\t\t\t\t'[slot=\"popover\"] button, [slot=\"popover\"] [role=\"option\"]',\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (items.length === 0) return;\n\n\t\t\tconst focused = items.find((el) => el === document.activeElement);\n\t\t\tlet index = focused ? items.indexOf(focused) : -1;\n\n\t\t\tif (e.key === 'ArrowDown') {\n\t\t\t\tindex = index < items.length - 1 ? index + 1 : 0;\n\t\t\t} else {\n\t\t\t\tindex = index > 0 ? index - 1 : items.length - 1;\n\t\t\t}\n\n\t\t\titems[index]?.focus();\n\t\t}\n\t};\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\tthis.addEventListener('keydown', this.#handleKeydown);\n\t\tif (this.open) {\n\t\t\tdocument.addEventListener('click', this.#handleDocClick, true);\n\t\t}\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tdocument.removeEventListener('click', this.#handleDocClick, true);\n\t\tthis.removeEventListener('keydown', this.#handleKeydown);\n\t}\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (changed.has('open')) {\n\t\t\tif (this.open) {\n\t\t\t\tdocument.addEventListener('click', this.#handleDocClick, true);\n\t\t\t} else {\n\t\t\t\tdocument.removeEventListener('click', this.#handleDocClick, true);\n\t\t\t}\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-dropdown': DevWalletDropdown;\n\t}\n}\n"],"mappings":";;;;;;AAcO,IAAA,oBAAA,MAAM,0BAA0B,WAAW;;;cAsC1C;mBAGK;0BAgBO,MAAa;GAC/B,IAAI,KAAK,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,SAAS,IAAI,GAC/C,KAAK,MAAM;EAEb;yBAEkB,MAAqB;GACtC,IAAI,CAAC,KAAK,MAAM;GAEhB,IAAI,EAAE,QAAQ,UAAU;IACvB,EAAE,eAAe;IACjB,KAAK,MAAM;IAEX,AADgB,KAAK,cAAc,oBACnC,CAAA,EAAS,MAAM;IACf;GACD;GAEA,IAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;IACjD,EAAE,eAAe;IACjB,MAAM,QAAQ,MAAM,KACnB,KAAK,iBACJ,iEACD,CACD;IACA,IAAI,MAAM,WAAW,GAAG;IAExB,MAAM,UAAU,MAAM,MAAM,OAAO,OAAO,SAAS,aAAa;IAChE,IAAI,QAAQ,UAAU,MAAM,QAAQ,OAAO,IAAI;IAE/C,IAAI,EAAE,QAAQ,aACb,QAAQ,QAAQ,MAAM,SAAS,IAAI,QAAQ,IAAI;SAE/C,QAAQ,QAAQ,IAAI,QAAQ,IAAI,MAAM,SAAS;IAGhD,MAAM,MAAM,EAAE,MAAM;GACrB;EACD;;;gBA7FyB,CACxB,cACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCJ;;CAQA,SAAkB;EACjB,OAAO,IAAI;;KAER,KAAK,OAAO,IAAI,4DAA4D,QAAQ;;CAExF;CAEA,QAAQ;EACP,IAAI,KAAK,MAAM;GACd,KAAK,OAAO;GACZ,UAAU,MAAM,OAAO;EACxB;CACD;CAEA;CAMA;CAiCA,oBAA6B;EAC5B,MAAM,kBAAkB;EACxB,KAAK,iBAAiB,WAAW,KAAKA,cAAc;EACpD,IAAI,KAAK,MACR,SAAS,iBAAiB,SAAS,KAAKC,iBAAiB,IAAI;CAE/D;CAEA,uBAAgC;EAC/B,MAAM,qBAAqB;EAC3B,SAAS,oBAAoB,SAAS,KAAKA,iBAAiB,IAAI;EAChE,KAAK,oBAAoB,WAAW,KAAKD,cAAc;CACxD;CAEA,WAAoB,SAA+B;EAClD,IAAI,QAAQ,IAAI,MAAM,GACrB,IAAI,KAAK,MACR,SAAS,iBAAiB,SAAS,KAAKC,iBAAiB,IAAI;OAE7D,SAAS,oBAAoB,SAAS,KAAKA,iBAAiB,IAAI;CAGnE;AACD;YAlFE,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,kBAAA,WAAA,QAAA,KAAA,CAAA;YAGzC,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAa,CAAC,CAAA,GAAA,kBAAA,WAAA,aAAA,KAAA,CAAA;gCAzCnE,cAAc,qBAAqB,CAAA,GAAA,iBAAA"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { ForkRelay } from "../adapters/fork-relay.mjs";
|
|
2
|
-
import * as _$lit from "lit";
|
|
3
2
|
import { LitElement } from "lit";
|
|
4
3
|
|
|
5
4
|
//#region src/ui/dev-wallet-fork-panel.d.ts
|
|
6
5
|
declare class DevWalletForkPanel extends LitElement {
|
|
7
6
|
#private;
|
|
8
|
-
static styles: (
|
|
7
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
9
8
|
/** Fork relay client. Provided by the parent (`wallet-controller`)
|
|
10
9
|
* when the active manifest exposes a forked stack. When `null`,
|
|
11
10
|
* the panel renders an empty state — the tab gating in the
|
|
@@ -27,7 +26,7 @@ declare class DevWalletForkPanel extends LitElement {
|
|
|
27
26
|
connectedCallback(): void;
|
|
28
27
|
disconnectedCallback(): void;
|
|
29
28
|
willUpdate(changed: Map<string, unknown>): void;
|
|
30
|
-
render():
|
|
29
|
+
render(): import("lit").TemplateResult<1>;
|
|
31
30
|
/** Public hook for tests + external consumers (e.g. signing-modal
|
|
32
31
|
* wants to re-read slots after a transaction lands). Resolves once
|
|
33
32
|
* both status + slots have refreshed. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-fork-panel.d.mts","names":[],"sources":["../../src/ui/dev-wallet-fork-panel.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-fork-panel.d.mts","names":[],"sources":["../../src/ui/dev-wallet-fork-panel.ts"],"mappings":";;;;cA+Ba,kBAAA,SAA2B,UAAA;EAAA;SACvB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EADS;;;;EA+K/B,KAAA,EAAO,SAAA;EA/KgC;;EAoLvC,QAAA;EAAA,QAGQ,OAAA;EAAA,QAGA,YAAA;EAAA,QAGA,cAAA;EAAA,QAGA,eAAA;EAAA,QAGA,YAAA;EAAA,QAGA,MAAA;EAAA,QAGA,WAAA;EAAA,QAGA,mBAAA;EAAA,QAGA,aAAA;EAAA,QAGA,qBAAA;EAIC,iBAAA;EAMA,oBAAA;EAKA,UAAA,CAAW,OAAA,EAAS,GAAA;EAYpB,MAAA,kBAAM,cAAA;EApCP;;;EA6VF,OAAA,IAAW,OAAA;AAAA;AAAA,QAKV,MAAA;EAAA,UACG,qBAAA;IACT,uBAAA,EAAyB,kBAAkB;EAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { actionButtonStyles, cardItemStyles, formInputStyles, inlineErrorStyles, listContainerStyles, monoTruncateStyles, sectionHeaderStyles, sharedStyles, stateStyles, subLabelStyles } from "./styles.mjs";
|
|
2
2
|
import { formatAddress, getErrorMessage } from "./utils.mjs";
|
|
3
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
4
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
5
|
import { customElement, property, state } from "lit/decorators.js";
|
|
6
6
|
//#region src/ui/dev-wallet-fork-panel.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-fork-panel.mjs","names":["#parseClock","#parseCheckpointCount","#startPolling","#refreshAll","#stopPolling","#renderStatus","#onClockInput","#onAdvanceClock","#onCheckpointInput","#onAdvanceCheckpoint","#renderSlots","#onToggleSlot","#pollTimer","#refreshStatus","#refreshSlots"],"sources":["../../src/ui/dev-wallet-fork-panel.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n// Dev-wallet fork-controls panel. Renders when the active stack is in\n// `runtime === 'forked'` mode and surfaces a curated slice of the\n// sui-fork admin API to the operator: status read, advance-clock,\n// advance-checkpoint, and impersonation slot toggles.\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { ForkImpersonationSlot, ForkRelay, ForkStatus } from '../adapters/fork-relay.js';\nimport {\n\tactionButtonStyles,\n\tcardItemStyles,\n\tformInputStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsectionHeaderStyles,\n\tsubLabelStyles,\n\tsharedStyles,\n\tstateStyles,\n} from './styles.js';\nimport { formatAddress, getErrorMessage } from './utils.js';\n\n/** Default polling cadence for `GetStatus`. Slow on purpose — the panel\n * also refreshes after every action verb lands. */\nconst STATUS_POLL_MS = 4000;\n\n@customElement('dev-wallet-fork-panel')\nexport class DevWalletForkPanel extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tactionButtonStyles,\n\t\tstateStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tformInputStyles,\n\t\tinlineErrorStyles,\n\t\tmonoTruncateStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 18px;\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.status-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: max-content 1fr;\n\t\t\t\tcolumn-gap: 12px;\n\t\t\t\trow-gap: 6px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-md);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.status-label {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\talign-self: center;\n\t\t\t}\n\n\t\t\t.status-value {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t}\n\n\t\t\t.status-value.dim {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.action-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 6px;\n\t\t\t\talign-items: stretch;\n\t\t\t}\n\n\t\t\t.action-input {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t}\n\n\t\t\t.btn-action {\n\t\t\t\tmin-width: 96px;\n\t\t\t\tpadding: 0 14px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\ttransition: background-color 0.15s;\n\t\t\t}\n\n\t\t\t.btn-action:hover:not(:disabled) {\n\t\t\t\tbackground: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);\n\t\t\t}\n\n\t\t\t.btn-action:disabled {\n\t\t\t\topacity: 0.55;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.slot-list {\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.slot-item {\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t}\n\n\t\t\t.slot-meta {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t}\n\n\t\t\t.slot-label {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\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.slot-address {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.slot-toggle {\n\t\t\t\tpadding: 4px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.slot-toggle.on {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.slot-toggle:hover:not(:disabled) {\n\t\t\t\tfilter: brightness(1.05);\n\t\t\t}\n\n\t\t\t.slot-toggle:disabled {\n\t\t\t\topacity: 0.55;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.helper-text {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\t.fork-banner {\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tbackground: rgba(234, 179, 8, 0.12);\n\t\t\t\tborder: 1px solid rgba(234, 179, 8, 0.35);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tline-height: 1.4;\n\t\t\t\tmargin-bottom: 14px;\n\t\t\t}\n\n\t\t\t.fork-banner strong {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.inline-error {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tmargin-top: 6px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t/** Fork relay client. Provided by the parent (`wallet-controller`)\n\t * when the active manifest exposes a forked stack. When `null`,\n\t * the panel renders an empty state — the tab gating in the\n\t * controller normally prevents this. */\n\t@property({ attribute: false })\n\trelay: ForkRelay | null = null;\n\n\t/** Upstream label (`'mainnet'`, `'testnet'`, …). Surfaced in the\n\t * banner so the operator can't misread which chain the fork forked. */\n\t@property({ type: String })\n\tupstream = '';\n\n\t@state()\n\tprivate _status: ForkStatus | null = null;\n\n\t@state()\n\tprivate _statusError: string | null = null;\n\n\t@state()\n\tprivate _statusLoading = false;\n\n\t@state()\n\tprivate _actionInFlight: 'advance-clock' | 'advance-checkpoint' | null = null;\n\n\t@state()\n\tprivate _actionError: string | null = null;\n\n\t@state()\n\tprivate _slots: ForkImpersonationSlot[] = [];\n\n\t@state()\n\tprivate _slotsError: string | null = null;\n\n\t@state()\n\tprivate _slotToggleInFlight: string | null = null;\n\n\t@state()\n\tprivate _clockInputMs = '1000';\n\n\t@state()\n\tprivate _checkpointInputCount = '1';\n\n\t#pollTimer: ReturnType<typeof setInterval> | null = null;\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\tthis.#startPolling();\n\t\tvoid this.#refreshAll();\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tthis.#stopPolling();\n\t}\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (changed.has('relay')) {\n\t\t\tthis._status = null;\n\t\t\tthis._statusError = null;\n\t\t\tthis._slots = [];\n\t\t\tthis._slotsError = null;\n\t\t\tif (this.relay !== null) {\n\t\t\t\tvoid this.#refreshAll();\n\t\t\t}\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.relay) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"empty-state\">\n\t\t\t\tFork controls require a devstack wallet-app connection.\n\t\t\t</div>`;\n\t\t}\n\n\t\tconst upstream = this._status?.upstream ?? this.upstream;\n\t\treturn html`\n\t\t\t<div class=\"fork-banner\" part=\"fork-banner\">\n\t\t\t\t<strong>Fork mode:</strong> changes here only affect the local\n\t\t\t\t${upstream ? html`<em>${upstream}</em>` : 'forked'} sui-fork stack — no real funds at risk.\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Status</div>\n\t\t\t\t${this.#renderStatus()}\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Advance clock</div>\n\t\t\t\t<div class=\"action-row\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"action-input\"\n\t\t\t\t\t\tpart=\"advance-clock-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\taria-label=\"Advance clock duration in ms\"\n\t\t\t\t\t\t.value=${this._clockInputMs}\n\t\t\t\t\t\t@input=${this.#onClockInput}\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-action\"\n\t\t\t\t\t\tpart=\"advance-clock-button\"\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null || !this.#parseClock()}\n\t\t\t\t\t\t@click=${this.#onAdvanceClock}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._actionInFlight === 'advance-clock' ? 'Advancing…' : '+ ms'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"helper-text\">\n\t\t\t\t\tAdvances <code>clock::timestamp_ms()</code> by the given milliseconds.\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Advance checkpoints</div>\n\t\t\t\t<div class=\"action-row\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"action-input\"\n\t\t\t\t\t\tpart=\"advance-checkpoint-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\taria-label=\"Advance checkpoint count\"\n\t\t\t\t\t\t.value=${this._checkpointInputCount}\n\t\t\t\t\t\t@input=${this.#onCheckpointInput}\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-action\"\n\t\t\t\t\t\tpart=\"advance-checkpoint-button\"\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null || !this.#parseCheckpointCount()}\n\t\t\t\t\t\t@click=${this.#onAdvanceCheckpoint}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._actionInFlight === 'advance-checkpoint' ? 'Sealing…' : '+ ckpt'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"helper-text\">\n\t\t\t\t\tSeals pending transactions into <code>n</code> new checkpoints.\n\t\t\t\t</div>\n\t\t\t\t${this._actionError\n\t\t\t\t\t? html`<div class=\"inline-error\" part=\"action-error\">${this._actionError}</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Impersonation slots</div>\n\t\t\t\t${this.#renderSlots()}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderStatus() {\n\t\tif (this._statusLoading && this._status === null) {\n\t\t\treturn html`<div class=\"loading\" part=\"status-loading\">Loading fork status…</div>`;\n\t\t}\n\t\tif (this._statusError) {\n\t\t\treturn html` <div class=\"error-state\" part=\"status-error\">${this._statusError}</div> `;\n\t\t}\n\t\tif (!this._status) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"status-empty\">Fork status unavailable.</div>`;\n\t\t}\n\t\tconst { checkpoint, clockMs, autoTickMs } = this._status;\n\t\tconst clockIso = (() => {\n\t\t\ttry {\n\t\t\t\treturn new Date(Number(clockMs)).toISOString();\n\t\t\t} catch {\n\t\t\t\treturn '—';\n\t\t\t}\n\t\t})();\n\t\treturn html`\n\t\t\t<div class=\"status-grid\" part=\"status-grid\">\n\t\t\t\t<span class=\"status-label\">Checkpoint</span>\n\t\t\t\t<span class=\"status-value\" part=\"status-checkpoint\">${checkpoint.toString()}</span>\n\t\t\t\t<span class=\"status-label\">Clock</span>\n\t\t\t\t<span class=\"status-value\" part=\"status-clock\">${clockMs.toString()}</span>\n\t\t\t\t<span class=\"status-label\">UTC</span>\n\t\t\t\t<span class=\"status-value dim\" part=\"status-clock-iso\">${clockIso}</span>\n\t\t\t\t<span class=\"status-label\">Auto-tick</span>\n\t\t\t\t<span class=\"status-value dim\" part=\"status-auto-tick\">\n\t\t\t\t\t${autoTickMs ? `${autoTickMs}ms` : 'off'}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderSlots() {\n\t\tif (this._slotsError) {\n\t\t\treturn html`<div class=\"error-state\" part=\"slots-error\">${this._slotsError}</div>`;\n\t\t}\n\t\tif (this._slots.length === 0) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"slots-empty\">\n\t\t\t\tNo impersonation slots configured. Add addresses via\n\t\t\t\t<code>Sui({fork:{impersonate:[…]}})</code>.\n\t\t\t</div>`;\n\t\t}\n\t\treturn html`\n\t\t\t<div class=\"slot-list\" part=\"slot-list\">\n\t\t\t\t${this._slots.map((slot) => {\n\t\t\t\t\tconst inFlight = this._slotToggleInFlight === slot.address;\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=${slot.active ? 'slot-item active' : 'slot-item'}\n\t\t\t\t\t\t\tpart=${slot.active ? 'slot-item slot-item-active' : 'slot-item'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"slot-meta\">\n\t\t\t\t\t\t\t\t<span class=\"slot-label\">${slot.label ?? formatAddress(slot.address)}</span>\n\t\t\t\t\t\t\t\t<span class=\"slot-address\">${formatAddress(slot.address)}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=${slot.active ? 'slot-toggle on' : 'slot-toggle'}\n\t\t\t\t\t\t\t\tpart=\"slot-toggle\"\n\t\t\t\t\t\t\t\taria-pressed=${slot.active}\n\t\t\t\t\t\t\t\t?disabled=${inFlight}\n\t\t\t\t\t\t\t\t@click=${() => this.#onToggleSlot(slot)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${inFlight ? '…' : slot.active ? 'On' : 'Off'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div class=\"helper-text\">\n\t\t\t\tWhen <strong>On</strong>, user-driven tx signing for the matching account routes through\n\t\t\t\t<code>executeImpersonated</code> instead of a real signature.\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t// ── Input bindings ────────────────────────────────────────────────────\n\n\t#onClockInput = (e: Event) => {\n\t\tthis._clockInputMs = (e.target as HTMLInputElement).value;\n\t};\n\n\t#onCheckpointInput = (e: Event) => {\n\t\tthis._checkpointInputCount = (e.target as HTMLInputElement).value;\n\t};\n\n\t#parseClock(): number | null {\n\t\tconst n = Number(this._clockInputMs);\n\t\tif (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;\n\t\treturn n;\n\t}\n\n\t#parseCheckpointCount(): number | null {\n\t\tconst n = Number(this._checkpointInputCount);\n\t\tif (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;\n\t\treturn n;\n\t}\n\n\t// ── Action handlers ───────────────────────────────────────────────────\n\n\t#onAdvanceClock = async () => {\n\t\tconst ms = this.#parseClock();\n\t\tif (ms === null || !this.relay) return;\n\t\tthis._actionInFlight = 'advance-clock';\n\t\tthis._actionError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.advanceClock(ms);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t} else {\n\t\t\t\tthis._actionError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._actionError = getErrorMessage(error, 'advance-clock failed');\n\t\t} finally {\n\t\t\tthis._actionInFlight = null;\n\t\t}\n\t};\n\n\t#onAdvanceCheckpoint = async () => {\n\t\tconst count = this.#parseCheckpointCount();\n\t\tif (count === null || !this.relay) return;\n\t\tthis._actionInFlight = 'advance-checkpoint';\n\t\tthis._actionError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.advanceCheckpoint(count);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t} else {\n\t\t\t\tthis._actionError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._actionError = getErrorMessage(error, 'advance-checkpoint failed');\n\t\t} finally {\n\t\t\tthis._actionInFlight = null;\n\t\t}\n\t};\n\n\t#onToggleSlot = async (slot: ForkImpersonationSlot) => {\n\t\tif (!this.relay || this._slotToggleInFlight !== null) return;\n\t\tthis._slotToggleInFlight = slot.address;\n\t\tthis._slotsError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.setImpersonation(slot.address, !slot.active);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._slots = result.value;\n\t\t\t\t// Notify dapp-level integrations (`wallet-controller`) so the\n\t\t\t\t// signing modal flips its impersonation footnote in lock-step\n\t\t\t\t// with the toggle. Composed/bubbling so the host element sees\n\t\t\t\t// it regardless of where the panel was mounted.\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('fork-impersonation-changed', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\taddress: slot.address,\n\t\t\t\t\t\t\tactive: !slot.active,\n\t\t\t\t\t\t\tslots: result.value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis._slotsError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._slotsError = getErrorMessage(error, 'toggle failed');\n\t\t} finally {\n\t\t\tthis._slotToggleInFlight = null;\n\t\t}\n\t};\n\n\t// ── Polling ───────────────────────────────────────────────────────────\n\n\t#startPolling() {\n\t\tthis.#stopPolling();\n\t\tthis.#pollTimer = setInterval(() => {\n\t\t\tvoid this.#refreshStatus();\n\t\t}, STATUS_POLL_MS);\n\t}\n\n\t#stopPolling() {\n\t\tif (this.#pollTimer !== null) {\n\t\t\tclearInterval(this.#pollTimer);\n\t\t\tthis.#pollTimer = null;\n\t\t}\n\t}\n\n\tasync #refreshAll(): Promise<void> {\n\t\tawait Promise.all([this.#refreshStatus(), this.#refreshSlots()]);\n\t}\n\n\tasync #refreshStatus(): Promise<void> {\n\t\tif (!this.relay) return;\n\t\tthis._statusLoading = true;\n\t\ttry {\n\t\t\tconst result = await this.relay.getStatus();\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t\tthis._statusError = null;\n\t\t\t} else {\n\t\t\t\tthis._statusError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._statusError = getErrorMessage(error, 'status refresh failed');\n\t\t} finally {\n\t\t\tthis._statusLoading = false;\n\t\t}\n\t}\n\n\tasync #refreshSlots(): Promise<void> {\n\t\tif (!this.relay) return;\n\t\ttry {\n\t\t\tconst result = await this.relay.listImpersonations();\n\t\t\tif (result.ok) {\n\t\t\t\tthis._slots = result.value;\n\t\t\t\tthis._slotsError = null;\n\t\t\t} else {\n\t\t\t\tthis._slotsError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._slotsError = getErrorMessage(error, 'slot refresh failed');\n\t\t}\n\t}\n\n\t/** Public hook for tests + external consumers (e.g. signing-modal\n\t * wants to re-read slots after a transaction lands). Resolves once\n\t * both status + slots have refreshed. */\n\tasync refresh(): Promise<void> {\n\t\tawait this.#refreshAll();\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-fork-panel': DevWalletForkPanel;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-fork-panel.mjs","names":["#parseClock","#parseCheckpointCount","#startPolling","#refreshAll","#stopPolling","#renderStatus","#onClockInput","#onAdvanceClock","#onCheckpointInput","#onAdvanceCheckpoint","#renderSlots","#onToggleSlot","#pollTimer","#refreshStatus","#refreshSlots"],"sources":["../../src/ui/dev-wallet-fork-panel.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n// Dev-wallet fork-controls panel. Renders when the active stack is in\n// `runtime === 'forked'` mode and surfaces a curated slice of the\n// sui-fork admin API to the operator: status read, advance-clock,\n// advance-checkpoint, and impersonation slot toggles.\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { ForkImpersonationSlot, ForkRelay, ForkStatus } from '../adapters/fork-relay.js';\nimport {\n\tactionButtonStyles,\n\tcardItemStyles,\n\tformInputStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsectionHeaderStyles,\n\tsubLabelStyles,\n\tsharedStyles,\n\tstateStyles,\n} from './styles.js';\nimport { formatAddress, getErrorMessage } from './utils.js';\n\n/** Default polling cadence for `GetStatus`. Slow on purpose — the panel\n * also refreshes after every action verb lands. */\nconst STATUS_POLL_MS = 4000;\n\n@customElement('dev-wallet-fork-panel')\nexport class DevWalletForkPanel extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tactionButtonStyles,\n\t\tstateStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tformInputStyles,\n\t\tinlineErrorStyles,\n\t\tmonoTruncateStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 18px;\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.status-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: max-content 1fr;\n\t\t\t\tcolumn-gap: 12px;\n\t\t\t\trow-gap: 6px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-md);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.status-label {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\talign-self: center;\n\t\t\t}\n\n\t\t\t.status-value {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t}\n\n\t\t\t.status-value.dim {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.action-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 6px;\n\t\t\t\talign-items: stretch;\n\t\t\t}\n\n\t\t\t.action-input {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t}\n\n\t\t\t.btn-action {\n\t\t\t\tmin-width: 96px;\n\t\t\t\tpadding: 0 14px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\ttransition: background-color 0.15s;\n\t\t\t}\n\n\t\t\t.btn-action:hover:not(:disabled) {\n\t\t\t\tbackground: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);\n\t\t\t}\n\n\t\t\t.btn-action:disabled {\n\t\t\t\topacity: 0.55;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.slot-list {\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.slot-item {\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t}\n\n\t\t\t.slot-meta {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t}\n\n\t\t\t.slot-label {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\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.slot-address {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.slot-toggle {\n\t\t\t\tpadding: 4px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.slot-toggle.on {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.slot-toggle:hover:not(:disabled) {\n\t\t\t\tfilter: brightness(1.05);\n\t\t\t}\n\n\t\t\t.slot-toggle:disabled {\n\t\t\t\topacity: 0.55;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.helper-text {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\t.fork-banner {\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tbackground: rgba(234, 179, 8, 0.12);\n\t\t\t\tborder: 1px solid rgba(234, 179, 8, 0.35);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tline-height: 1.4;\n\t\t\t\tmargin-bottom: 14px;\n\t\t\t}\n\n\t\t\t.fork-banner strong {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.inline-error {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tmargin-top: 6px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t/** Fork relay client. Provided by the parent (`wallet-controller`)\n\t * when the active manifest exposes a forked stack. When `null`,\n\t * the panel renders an empty state — the tab gating in the\n\t * controller normally prevents this. */\n\t@property({ attribute: false })\n\trelay: ForkRelay | null = null;\n\n\t/** Upstream label (`'mainnet'`, `'testnet'`, …). Surfaced in the\n\t * banner so the operator can't misread which chain the fork forked. */\n\t@property({ type: String })\n\tupstream = '';\n\n\t@state()\n\tprivate _status: ForkStatus | null = null;\n\n\t@state()\n\tprivate _statusError: string | null = null;\n\n\t@state()\n\tprivate _statusLoading = false;\n\n\t@state()\n\tprivate _actionInFlight: 'advance-clock' | 'advance-checkpoint' | null = null;\n\n\t@state()\n\tprivate _actionError: string | null = null;\n\n\t@state()\n\tprivate _slots: ForkImpersonationSlot[] = [];\n\n\t@state()\n\tprivate _slotsError: string | null = null;\n\n\t@state()\n\tprivate _slotToggleInFlight: string | null = null;\n\n\t@state()\n\tprivate _clockInputMs = '1000';\n\n\t@state()\n\tprivate _checkpointInputCount = '1';\n\n\t#pollTimer: ReturnType<typeof setInterval> | null = null;\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\tthis.#startPolling();\n\t\tvoid this.#refreshAll();\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tthis.#stopPolling();\n\t}\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (changed.has('relay')) {\n\t\t\tthis._status = null;\n\t\t\tthis._statusError = null;\n\t\t\tthis._slots = [];\n\t\t\tthis._slotsError = null;\n\t\t\tif (this.relay !== null) {\n\t\t\t\tvoid this.#refreshAll();\n\t\t\t}\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.relay) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"empty-state\">\n\t\t\t\tFork controls require a devstack wallet-app connection.\n\t\t\t</div>`;\n\t\t}\n\n\t\tconst upstream = this._status?.upstream ?? this.upstream;\n\t\treturn html`\n\t\t\t<div class=\"fork-banner\" part=\"fork-banner\">\n\t\t\t\t<strong>Fork mode:</strong> changes here only affect the local\n\t\t\t\t${upstream ? html`<em>${upstream}</em>` : 'forked'} sui-fork stack — no real funds at risk.\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Status</div>\n\t\t\t\t${this.#renderStatus()}\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Advance clock</div>\n\t\t\t\t<div class=\"action-row\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"action-input\"\n\t\t\t\t\t\tpart=\"advance-clock-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\taria-label=\"Advance clock duration in ms\"\n\t\t\t\t\t\t.value=${this._clockInputMs}\n\t\t\t\t\t\t@input=${this.#onClockInput}\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-action\"\n\t\t\t\t\t\tpart=\"advance-clock-button\"\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null || !this.#parseClock()}\n\t\t\t\t\t\t@click=${this.#onAdvanceClock}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._actionInFlight === 'advance-clock' ? 'Advancing…' : '+ ms'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"helper-text\">\n\t\t\t\t\tAdvances <code>clock::timestamp_ms()</code> by the given milliseconds.\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Advance checkpoints</div>\n\t\t\t\t<div class=\"action-row\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"action-input\"\n\t\t\t\t\t\tpart=\"advance-checkpoint-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\taria-label=\"Advance checkpoint count\"\n\t\t\t\t\t\t.value=${this._checkpointInputCount}\n\t\t\t\t\t\t@input=${this.#onCheckpointInput}\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-action\"\n\t\t\t\t\t\tpart=\"advance-checkpoint-button\"\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null || !this.#parseCheckpointCount()}\n\t\t\t\t\t\t@click=${this.#onAdvanceCheckpoint}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._actionInFlight === 'advance-checkpoint' ? 'Sealing…' : '+ ckpt'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"helper-text\">\n\t\t\t\t\tSeals pending transactions into <code>n</code> new checkpoints.\n\t\t\t\t</div>\n\t\t\t\t${this._actionError\n\t\t\t\t\t? html`<div class=\"inline-error\" part=\"action-error\">${this._actionError}</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Impersonation slots</div>\n\t\t\t\t${this.#renderSlots()}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderStatus() {\n\t\tif (this._statusLoading && this._status === null) {\n\t\t\treturn html`<div class=\"loading\" part=\"status-loading\">Loading fork status…</div>`;\n\t\t}\n\t\tif (this._statusError) {\n\t\t\treturn html` <div class=\"error-state\" part=\"status-error\">${this._statusError}</div> `;\n\t\t}\n\t\tif (!this._status) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"status-empty\">Fork status unavailable.</div>`;\n\t\t}\n\t\tconst { checkpoint, clockMs, autoTickMs } = this._status;\n\t\tconst clockIso = (() => {\n\t\t\ttry {\n\t\t\t\treturn new Date(Number(clockMs)).toISOString();\n\t\t\t} catch {\n\t\t\t\treturn '—';\n\t\t\t}\n\t\t})();\n\t\treturn html`\n\t\t\t<div class=\"status-grid\" part=\"status-grid\">\n\t\t\t\t<span class=\"status-label\">Checkpoint</span>\n\t\t\t\t<span class=\"status-value\" part=\"status-checkpoint\">${checkpoint.toString()}</span>\n\t\t\t\t<span class=\"status-label\">Clock</span>\n\t\t\t\t<span class=\"status-value\" part=\"status-clock\">${clockMs.toString()}</span>\n\t\t\t\t<span class=\"status-label\">UTC</span>\n\t\t\t\t<span class=\"status-value dim\" part=\"status-clock-iso\">${clockIso}</span>\n\t\t\t\t<span class=\"status-label\">Auto-tick</span>\n\t\t\t\t<span class=\"status-value dim\" part=\"status-auto-tick\">\n\t\t\t\t\t${autoTickMs ? `${autoTickMs}ms` : 'off'}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderSlots() {\n\t\tif (this._slotsError) {\n\t\t\treturn html`<div class=\"error-state\" part=\"slots-error\">${this._slotsError}</div>`;\n\t\t}\n\t\tif (this._slots.length === 0) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"slots-empty\">\n\t\t\t\tNo impersonation slots configured. Add addresses via\n\t\t\t\t<code>Sui({fork:{impersonate:[…]}})</code>.\n\t\t\t</div>`;\n\t\t}\n\t\treturn html`\n\t\t\t<div class=\"slot-list\" part=\"slot-list\">\n\t\t\t\t${this._slots.map((slot) => {\n\t\t\t\t\tconst inFlight = this._slotToggleInFlight === slot.address;\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=${slot.active ? 'slot-item active' : 'slot-item'}\n\t\t\t\t\t\t\tpart=${slot.active ? 'slot-item slot-item-active' : 'slot-item'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"slot-meta\">\n\t\t\t\t\t\t\t\t<span class=\"slot-label\">${slot.label ?? formatAddress(slot.address)}</span>\n\t\t\t\t\t\t\t\t<span class=\"slot-address\">${formatAddress(slot.address)}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=${slot.active ? 'slot-toggle on' : 'slot-toggle'}\n\t\t\t\t\t\t\t\tpart=\"slot-toggle\"\n\t\t\t\t\t\t\t\taria-pressed=${slot.active}\n\t\t\t\t\t\t\t\t?disabled=${inFlight}\n\t\t\t\t\t\t\t\t@click=${() => this.#onToggleSlot(slot)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${inFlight ? '…' : slot.active ? 'On' : 'Off'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div class=\"helper-text\">\n\t\t\t\tWhen <strong>On</strong>, user-driven tx signing for the matching account routes through\n\t\t\t\t<code>executeImpersonated</code> instead of a real signature.\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t// ── Input bindings ────────────────────────────────────────────────────\n\n\t#onClockInput = (e: Event) => {\n\t\tthis._clockInputMs = (e.target as HTMLInputElement).value;\n\t};\n\n\t#onCheckpointInput = (e: Event) => {\n\t\tthis._checkpointInputCount = (e.target as HTMLInputElement).value;\n\t};\n\n\t#parseClock(): number | null {\n\t\tconst n = Number(this._clockInputMs);\n\t\tif (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;\n\t\treturn n;\n\t}\n\n\t#parseCheckpointCount(): number | null {\n\t\tconst n = Number(this._checkpointInputCount);\n\t\tif (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;\n\t\treturn n;\n\t}\n\n\t// ── Action handlers ───────────────────────────────────────────────────\n\n\t#onAdvanceClock = async () => {\n\t\tconst ms = this.#parseClock();\n\t\tif (ms === null || !this.relay) return;\n\t\tthis._actionInFlight = 'advance-clock';\n\t\tthis._actionError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.advanceClock(ms);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t} else {\n\t\t\t\tthis._actionError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._actionError = getErrorMessage(error, 'advance-clock failed');\n\t\t} finally {\n\t\t\tthis._actionInFlight = null;\n\t\t}\n\t};\n\n\t#onAdvanceCheckpoint = async () => {\n\t\tconst count = this.#parseCheckpointCount();\n\t\tif (count === null || !this.relay) return;\n\t\tthis._actionInFlight = 'advance-checkpoint';\n\t\tthis._actionError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.advanceCheckpoint(count);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t} else {\n\t\t\t\tthis._actionError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._actionError = getErrorMessage(error, 'advance-checkpoint failed');\n\t\t} finally {\n\t\t\tthis._actionInFlight = null;\n\t\t}\n\t};\n\n\t#onToggleSlot = async (slot: ForkImpersonationSlot) => {\n\t\tif (!this.relay || this._slotToggleInFlight !== null) return;\n\t\tthis._slotToggleInFlight = slot.address;\n\t\tthis._slotsError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.setImpersonation(slot.address, !slot.active);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._slots = result.value;\n\t\t\t\t// Notify dapp-level integrations (`wallet-controller`) so the\n\t\t\t\t// signing modal flips its impersonation footnote in lock-step\n\t\t\t\t// with the toggle. Composed/bubbling so the host element sees\n\t\t\t\t// it regardless of where the panel was mounted.\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('fork-impersonation-changed', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\taddress: slot.address,\n\t\t\t\t\t\t\tactive: !slot.active,\n\t\t\t\t\t\t\tslots: result.value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis._slotsError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._slotsError = getErrorMessage(error, 'toggle failed');\n\t\t} finally {\n\t\t\tthis._slotToggleInFlight = null;\n\t\t}\n\t};\n\n\t// ── Polling ───────────────────────────────────────────────────────────\n\n\t#startPolling() {\n\t\tthis.#stopPolling();\n\t\tthis.#pollTimer = setInterval(() => {\n\t\t\tvoid this.#refreshStatus();\n\t\t}, STATUS_POLL_MS);\n\t}\n\n\t#stopPolling() {\n\t\tif (this.#pollTimer !== null) {\n\t\t\tclearInterval(this.#pollTimer);\n\t\t\tthis.#pollTimer = null;\n\t\t}\n\t}\n\n\tasync #refreshAll(): Promise<void> {\n\t\tawait Promise.all([this.#refreshStatus(), this.#refreshSlots()]);\n\t}\n\n\tasync #refreshStatus(): Promise<void> {\n\t\tif (!this.relay) return;\n\t\tthis._statusLoading = true;\n\t\ttry {\n\t\t\tconst result = await this.relay.getStatus();\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t\tthis._statusError = null;\n\t\t\t} else {\n\t\t\t\tthis._statusError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._statusError = getErrorMessage(error, 'status refresh failed');\n\t\t} finally {\n\t\t\tthis._statusLoading = false;\n\t\t}\n\t}\n\n\tasync #refreshSlots(): Promise<void> {\n\t\tif (!this.relay) return;\n\t\ttry {\n\t\t\tconst result = await this.relay.listImpersonations();\n\t\t\tif (result.ok) {\n\t\t\t\tthis._slots = result.value;\n\t\t\t\tthis._slotsError = null;\n\t\t\t} else {\n\t\t\t\tthis._slotsError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._slotsError = getErrorMessage(error, 'slot refresh failed');\n\t\t}\n\t}\n\n\t/** Public hook for tests + external consumers (e.g. signing-modal\n\t * wants to re-read slots after a transaction lands). Resolves once\n\t * both status + slots have refreshed. */\n\tasync refresh(): Promise<void> {\n\t\tawait this.#refreshAll();\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-fork-panel': DevWalletForkPanel;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement } from "lit";
|
|
3
2
|
|
|
4
3
|
//#region src/ui/dev-wallet-network-badge.d.ts
|
|
5
4
|
declare class DevWalletNetworkBadge extends LitElement {
|
|
6
5
|
#private;
|
|
7
|
-
static styles: (
|
|
6
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
8
7
|
active: string;
|
|
9
8
|
networks: string[];
|
|
10
9
|
private _open;
|
|
11
|
-
render():
|
|
10
|
+
render(): import("lit").TemplateResult<1>;
|
|
12
11
|
}
|
|
13
12
|
declare global {
|
|
14
13
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-network-badge.d.mts","names":[],"sources":["../../src/ui/dev-wallet-network-badge.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-network-badge.d.mts","names":[],"sources":["../../src/ui/dev-wallet-network-badge.ts"],"mappings":";;;cAWa,qBAAA,SAA8B,UAAU;EAAA;SACpC,MAAA,iBAAM,SAAA,iBAAA,SAAA;EA4EtB,MAAA;EAGA,QAAA;EAAA,QAGQ,KAAA;EAEC,MAAA,kBAAM,cAAA;AAAA;AAAA,QAkER,MAAA;EAAA,UACG,qBAAA;IACT,0BAAA,EAA4B,qBAAqB;EAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dropdownItemStyles, sharedStyles } from "./styles.mjs";
|
|
2
2
|
import { NETWORK_COLORS, isForkNetwork } from "./utils.mjs";
|
|
3
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
4
4
|
import "./dev-wallet-dropdown.mjs";
|
|
5
5
|
import { LitElement, css, html } from "lit";
|
|
6
6
|
import { customElement, property, state } from "lit/decorators.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-network-badge.mjs","names":["#select"],"sources":["../../src/ui/dev-wallet-network-badge.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { dropdownItemStyles, sharedStyles } from './styles.js';\nimport { isForkNetwork, NETWORK_COLORS } from './utils.js';\nimport './dev-wallet-dropdown.js';\n\n@customElement('dev-wallet-network-badge')\nexport class DevWalletNetworkBadge 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: inline-block;\n\t\t\t}\n\n\t\t\t.badge {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\theight: 26px;\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\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\t\tcolor 120ms;\n\t\t\t}\n\n\t\t\t/* Phase 4 P4.17 — amber stripe + fork label when the\n\t\t\t active network is a *-fork variant. The stripe is\n\t\t\t diagonal-hatched so it survives dark + light themes\n\t\t\t without depending on a separate badge background. */\n\t\t\t.badge.fork {\n\t\t\t\tbackground-image: repeating-linear-gradient(\n\t\t\t\t\t45deg,\n\t\t\t\t\trgba(234, 179, 8, 0.18),\n\t\t\t\t\trgba(234, 179, 8, 0.18) 4px,\n\t\t\t\t\ttransparent 4px,\n\t\t\t\t\ttransparent 8px\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t.fork-tag {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-bold);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tmargin-left: 4px;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.5px;\n\t\t\t}\n\n\t\t\t.badge:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-4);\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.dot {\n\t\t\t\twidth: 6px;\n\t\t\t\theight: 6px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t}\n\n\t\t\t.chevron {\n\t\t\t\twidth: 10px;\n\t\t\t\theight: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.dropdown-item {\n\t\t\t\tpadding: 8px 12px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\tactive = '';\n\n\t@property({ attribute: false })\n\tnetworks: string[] = [];\n\n\t@state()\n\tprivate _open = false;\n\n\toverride render() {\n\t\tconst color = NETWORK_COLORS[this.active] ?? NETWORK_COLORS['localnet'];\n\t\tconst fork = isForkNetwork(this.active);\n\t\t// Phase 4 P4.17 — when `meta.runtime: 'forked'` flows through\n\t\t// (codegen emits the network literal as e.g. `'mainnet-fork'`),\n\t\t// the badge surfaces an amber-hatched stripe + a `(fork)`\n\t\t// label so the user can't mistake the wallet panel for one\n\t\t// pointed at real upstream funds.\n\t\tconst baseLabel = fork ? this.active.replace(/-fork$/, '') : this.active;\n\n\t\treturn html`\n\t\t\t<dev-wallet-dropdown .open=${this._open} @close=${() => (this._open = false)}>\n\t\t\t\t<button\n\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\tclass=${fork ? 'badge fork' : 'badge'}\n\t\t\t\t\tpart=\"trigger\"\n\t\t\t\t\taria-expanded=${this._open}\n\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\ttitle=${fork ? `sui-fork stack — no real ${baseLabel} funds at risk` : ''}\n\t\t\t\t\t@click=${() => (this._open = !this._open)}\n\t\t\t\t>\n\t\t\t\t\t<span class=\"dot\" style=\"background: ${color}\"></span>\n\t\t\t\t\t${baseLabel} ${fork ? html`<span class=\"fork-tag\">fork</span>` : ''}\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"chevron\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path d=\"M6 9l6 6 6-6\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div slot=\"popover\">\n\t\t\t\t\t${this.networks.map((network) => {\n\t\t\t\t\t\tconst dotColor = NETWORK_COLORS[network] ?? NETWORK_COLORS['localnet'];\n\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"dropdown-item\"\n\t\t\t\t\t\t\t\taria-selected=${network === this.active}\n\t\t\t\t\t\t\t\t@click=${() => this.#select(network)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span class=\"dot\" style=\"background: ${dotColor}\"></span>\n\t\t\t\t\t\t\t\t${network}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t`;\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</dev-wallet-dropdown>\n\t\t`;\n\t}\n\n\t#select(network: string) {\n\t\tthis._open = false;\n\t\tif (network !== this.active) {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('network-changed', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { network },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-network-badge': DevWalletNetworkBadge;\n\t}\n}\n"],"mappings":";;;;;;;AAWO,IAAA,wBAAA,MAAM,8BAA8B,WAAW;;;gBA6E5C;kBAGY,
|
|
1
|
+
{"version":3,"file":"dev-wallet-network-badge.mjs","names":["#select"],"sources":["../../src/ui/dev-wallet-network-badge.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { dropdownItemStyles, sharedStyles } from './styles.js';\nimport { isForkNetwork, NETWORK_COLORS } from './utils.js';\nimport './dev-wallet-dropdown.js';\n\n@customElement('dev-wallet-network-badge')\nexport class DevWalletNetworkBadge 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: inline-block;\n\t\t\t}\n\n\t\t\t.badge {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\theight: 26px;\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\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\t\tcolor 120ms;\n\t\t\t}\n\n\t\t\t/* Phase 4 P4.17 — amber stripe + fork label when the\n\t\t\t active network is a *-fork variant. The stripe is\n\t\t\t diagonal-hatched so it survives dark + light themes\n\t\t\t without depending on a separate badge background. */\n\t\t\t.badge.fork {\n\t\t\t\tbackground-image: repeating-linear-gradient(\n\t\t\t\t\t45deg,\n\t\t\t\t\trgba(234, 179, 8, 0.18),\n\t\t\t\t\trgba(234, 179, 8, 0.18) 4px,\n\t\t\t\t\ttransparent 4px,\n\t\t\t\t\ttransparent 8px\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t.fork-tag {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-bold);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tmargin-left: 4px;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.5px;\n\t\t\t}\n\n\t\t\t.badge:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-4);\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.dot {\n\t\t\t\twidth: 6px;\n\t\t\t\theight: 6px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t}\n\n\t\t\t.chevron {\n\t\t\t\twidth: 10px;\n\t\t\t\theight: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.dropdown-item {\n\t\t\t\tpadding: 8px 12px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\tactive = '';\n\n\t@property({ attribute: false })\n\tnetworks: string[] = [];\n\n\t@state()\n\tprivate _open = false;\n\n\toverride render() {\n\t\tconst color = NETWORK_COLORS[this.active] ?? NETWORK_COLORS['localnet'];\n\t\tconst fork = isForkNetwork(this.active);\n\t\t// Phase 4 P4.17 — when `meta.runtime: 'forked'` flows through\n\t\t// (codegen emits the network literal as e.g. `'mainnet-fork'`),\n\t\t// the badge surfaces an amber-hatched stripe + a `(fork)`\n\t\t// label so the user can't mistake the wallet panel for one\n\t\t// pointed at real upstream funds.\n\t\tconst baseLabel = fork ? this.active.replace(/-fork$/, '') : this.active;\n\n\t\treturn html`\n\t\t\t<dev-wallet-dropdown .open=${this._open} @close=${() => (this._open = false)}>\n\t\t\t\t<button\n\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\tclass=${fork ? 'badge fork' : 'badge'}\n\t\t\t\t\tpart=\"trigger\"\n\t\t\t\t\taria-expanded=${this._open}\n\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\ttitle=${fork ? `sui-fork stack — no real ${baseLabel} funds at risk` : ''}\n\t\t\t\t\t@click=${() => (this._open = !this._open)}\n\t\t\t\t>\n\t\t\t\t\t<span class=\"dot\" style=\"background: ${color}\"></span>\n\t\t\t\t\t${baseLabel} ${fork ? html`<span class=\"fork-tag\">fork</span>` : ''}\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"chevron\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path d=\"M6 9l6 6 6-6\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div slot=\"popover\">\n\t\t\t\t\t${this.networks.map((network) => {\n\t\t\t\t\t\tconst dotColor = NETWORK_COLORS[network] ?? NETWORK_COLORS['localnet'];\n\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"dropdown-item\"\n\t\t\t\t\t\t\t\taria-selected=${network === this.active}\n\t\t\t\t\t\t\t\t@click=${() => this.#select(network)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span class=\"dot\" style=\"background: ${dotColor}\"></span>\n\t\t\t\t\t\t\t\t${network}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t`;\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</dev-wallet-dropdown>\n\t\t`;\n\t}\n\n\t#select(network: string) {\n\t\tthis._open = false;\n\t\tif (network !== this.active) {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('network-changed', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { network },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-network-badge': DevWalletNetworkBadge;\n\t}\n}\n"],"mappings":";;;;;;;AAWO,IAAA,wBAAA,MAAM,8BAA8B,WAAW;;;gBA6E5C;kBAGY,CAAC;eAGN;;;gBAlFS;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsEJ;;CAWA,SAAkB;EACjB,MAAM,QAAQ,eAAe,KAAK,WAAW,eAAe;EAC5D,MAAM,OAAO,cAAc,KAAK,MAAM;EAMtC,MAAM,YAAY,OAAO,KAAK,OAAO,QAAQ,UAAU,EAAE,IAAI,KAAK;EAElE,OAAO,IAAI;gCACmB,KAAK,MAAM,gBAAiB,KAAK,QAAQ,MAAO;;;aAGnE,OAAO,eAAe,QAAQ;;qBAEtB,KAAK,MAAM;;aAEnB,OAAO,4BAA4B,UAAU,kBAAkB,GAAG;oBAC1D,KAAK,QAAQ,CAAC,KAAK,MAAO;;4CAEH,MAAM;OAC3C,UAAU,GAAG,OAAO,IAAI,uCAAuC,GAAG;;;;;;;;;;;;OAYlE,KAAK,SAAS,KAAK,YAAY;GAChC,MAAM,WAAW,eAAe,YAAY,eAAe;GAC3D,OAAO,IAAI;;;wBAGO,YAAY,KAAK,OAAO;uBACzB,KAAKA,QAAQ,OAAO,EAAE;;+CAEE,SAAS;UAC9C,QAAQ;;;EAGb,CAAC,EAAE;;;;CAIP;CAEA,QAAQ,SAAiB;EACxB,KAAK,QAAQ;EACb,IAAI,YAAY,KAAK,QACpB,KAAK,cACJ,IAAI,YAAY,mBAAmB;GAClC,SAAS;GACT,UAAU;GACV,QAAQ,EAAE,QAAQ;EACnB,CAAC,CACF;CAEF;AACD;YAzEE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,sBAAA,WAAA,UAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,sBAAA,WAAA,YAAA,KAAA,CAAA;YAG7B,MAAM,CAAA,GAAA,sBAAA,WAAA,SAAA,KAAA,CAAA;oCAnFP,cAAc,0BAA0B,CAAA,GAAA,qBAAA"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { SignerAdapter } from "../types.mjs";
|
|
2
|
-
import * as _$lit from "lit";
|
|
3
2
|
import { LitElement } from "lit";
|
|
4
3
|
|
|
5
4
|
//#region src/ui/dev-wallet-new-account.d.ts
|
|
6
5
|
declare class DevWalletNewAccount extends LitElement {
|
|
7
6
|
#private;
|
|
8
|
-
static styles: (
|
|
7
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
9
8
|
adapters: SignerAdapter[];
|
|
10
9
|
open: boolean;
|
|
11
10
|
private _mode;
|
|
@@ -18,7 +17,7 @@ declare class DevWalletNewAccount extends LitElement {
|
|
|
18
17
|
private _dropdownOpen;
|
|
19
18
|
private _selectedImports;
|
|
20
19
|
updated(changed: Map<string, unknown>): void;
|
|
21
|
-
render():
|
|
20
|
+
render(): import("lit").TemplateResult<1>;
|
|
22
21
|
}
|
|
23
22
|
declare global {
|
|
24
23
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-new-account.d.mts","names":[],"sources":["../../src/ui/dev-wallet-new-account.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-new-account.d.mts","names":[],"sources":["../../src/ui/dev-wallet-new-account.ts"],"mappings":";;;;cAsCa,mBAAA,SAA4B,UAAA;EAAA;SACxB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EA6MtB,QAAA,EAAU,aAAA;EAGV,IAAA;EAAA,QAGQ,KAAA;EAAA,QAGA,MAAA;EAAA,QAGA,kBAAA;EAAA,QAGA,SAAA;EAAA,QAGA,MAAA;EAAA,QAGA,kBAAA;EAAA,QAGA,eAAA;EAAA,QAGA,aAAA;EAAA,QAGA,gBAAA;EA8BC,OAAA,CAAQ,OAAA,EAAS,GAAA;EAqBjB,MAAA,kBAAM,cAAA;AAAA;AAAA,QAmSR,MAAA;EAAA,UACG,qBAAA;IACT,wBAAA,EAA0B,mBAAmB;EAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { actionButtonStyles, badgeStyles, cardItemStyles, dialogStyles, formInputStyles, inlineErrorStyles, listContainerStyles, monoTruncateStyles, sharedStyles, stateStyles, subLabelStyles } from "./styles.mjs";
|
|
2
2
|
import { emitEvent, formatAddress, getErrorMessage, isPairableAdapter, toggleSetItem } from "./utils.mjs";
|
|
3
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
4
4
|
import "./dev-wallet-dropdown.mjs";
|
|
5
5
|
import { LitElement, css, html, nothing } from "lit";
|
|
6
6
|
import { customElement, property, state } from "lit/decorators.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-new-account.mjs","names":["#creatableAdapters","#importableAdapters","#hasUnpairedImportableAdapters","#loadAvailableAccounts","#handleDialogCancel","#renderCreateForm","#renderImportList","#close","#handleLabelInput","#handleKeydown","#handleCancel","#handleCreate","#toggleImportSelection","#handleImportSelected"],"sources":["../../src/ui/dev-wallet-new-account.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport {\n\tactionButtonStyles,\n\tbadgeStyles,\n\tcardItemStyles,\n\tdialogStyles,\n\tformInputStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsharedStyles,\n\tsubLabelStyles,\n\tstateStyles,\n} from './styles.js';\nimport {\n\temitEvent,\n\tformatAddress,\n\tgetErrorMessage,\n\tisPairableAdapter,\n\ttoggleSetItem,\n} from './utils.js';\nimport './dev-wallet-dropdown.js';\n\ninterface AvailableAccount {\n\tadapterId: string;\n\tadapterName: string;\n\taddress: string;\n\tscheme: string;\n\talias?: string | null;\n}\n\n@customElement('dev-wallet-new-account')\nexport class DevWalletNewAccount extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tstateStyles,\n\t\tdialogStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tformInputStyles,\n\t\tmonoTruncateStyles,\n\t\tbadgeStyles,\n\t\tinlineErrorStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\tdialog {\n\t\t\t\twidth: 320px;\n\t\t\t\tmax-height: min(420px, 80vh);\n\t\t\t\tpadding: 20px;\n\t\t\t}\n\n\t\t\t.tabs {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tpadding: 3px;\n\t\t\t}\n\n\t\t\t.tab {\n\t\t\t\tflex: 1;\n\t\t\t\tpadding: 6px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\ttext-align: center;\n\t\t\t\ttransition: all 0.15s;\n\t\t\t}\n\n\t\t\t.tab.active {\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-sm);\n\t\t\t}\n\n\t\t\t.tab:not(.active):hover {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.field {\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\t.field-input {\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\n\t\t\t.field-input:focus {\n\t\t\t\toutline: 2px solid color-mix(in oklab, var(--dev-wallet-ring) 50%, transparent);\n\t\t\t\toutline-offset: -1px;\n\t\t\t}\n\n\t\t\t.select-trigger {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttext-align: left;\n\t\t\t}\n\n\t\t\t.select-trigger:hover {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.select-trigger .chevron {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\ttransition: transform 0.15s;\n\t\t\t}\n\n\t\t\t.select-trigger.open .chevron {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\n\t\t\t.select-option {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground: transparent;\n\t\t\t\ttext-align: left;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background 0.1s;\n\t\t\t}\n\n\t\t\t.select-option:hover {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t\t\t}\n\n\t\t\t.select-option.selected {\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.import-list {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tmax-height: 240px;\n\t\t\t\tmin-height: 60px;\n\t\t\t}\n\n\t\t\t.import-item {\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: left;\n\t\t\t\ttransition: border-color 0.15s;\n\t\t\t}\n\n\t\t\t.import-item:hover {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.import-item.selected {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 10%, var(--dev-wallet-secondary));\n\t\t\t}\n\n\t\t\t.import-item:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.import-checkbox {\n\t\t\t\twidth: 16px;\n\t\t\t\theight: 16px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tborder: 2px solid var(--dev-wallet-border);\n\t\t\t\tflex-shrink: 0;\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: 10px;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\ttransition: all 0.15s;\n\t\t\t}\n\n\t\t\t.import-checkbox.checked {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.import-item-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.import-item-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.import-item-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.import-item-badge {\n\t\t\t\tpadding: 1px 6px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.empty-state,\n\t\t\t.loading {\n\t\t\t\tpadding: 20px;\n\t\t\t}\n\n\t\t\t.actions {\n\t\t\t\tmargin-top: 16px;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: Boolean })\n\topen = false;\n\n\t@state()\n\tprivate _mode: 'create' | 'import' = 'create';\n\n\t@state()\n\tprivate _label = '';\n\n\t@state()\n\tprivate _selectedAdapterId = '';\n\n\t@state()\n\tprivate _creating = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _availableAccounts: AvailableAccount[] = [];\n\n\t@state()\n\tprivate _loadingImports = false;\n\n\t@state()\n\tprivate _dropdownOpen = false;\n\n\t@state()\n\tprivate _selectedImports = new Set<string>();\n\n\tget #creatableAdapters(): SignerAdapter[] {\n\t\treturn this.adapters.filter((a) => 'createAccount' in a && a.createAccount);\n\t}\n\n\tget #importableAdapters(): SignerAdapter[] {\n\t\treturn this.adapters.filter(\n\t\t\t(a) =>\n\t\t\t\t'importAccount' in a &&\n\t\t\t\ta.importAccount &&\n\t\t\t\t'listAvailableAccounts' in a &&\n\t\t\t\ta.listAvailableAccounts &&\n\t\t\t\t// Skip adapters that require pairing but aren't paired yet\n\t\t\t\t(!isPairableAdapter(a) || a.isPaired),\n\t\t);\n\t}\n\n\tget #hasUnpairedImportableAdapters(): boolean {\n\t\treturn this.adapters.some(\n\t\t\t(a) =>\n\t\t\t\t'importAccount' in a &&\n\t\t\t\ta.importAccount &&\n\t\t\t\t'listAvailableAccounts' in a &&\n\t\t\t\ta.listAvailableAccounts &&\n\t\t\t\tisPairableAdapter(a) &&\n\t\t\t\t!a.isPaired,\n\t\t);\n\t}\n\n\toverride updated(changed: Map<string, unknown>) {\n\t\tif (changed.has('open')) {\n\t\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\t\tif (this.open && dialog && !dialog.open) {\n\t\t\t\tconst canCreate = this.#creatableAdapters.length > 0;\n\t\t\t\tconst canImport = this.#importableAdapters.length > 0;\n\t\t\t\tif (canImport && !canCreate) {\n\t\t\t\t\tthis._mode = 'import';\n\t\t\t\t} else {\n\t\t\t\t\tthis._mode = 'create';\n\t\t\t\t}\n\t\t\t\tif (canImport) {\n\t\t\t\t\tthis.#loadAvailableAccounts();\n\t\t\t\t}\n\t\t\t\tdialog.showModal();\n\t\t\t} else if (!this.open && dialog?.open) {\n\t\t\t\tdialog.close();\n\t\t\t}\n\t\t}\n\t}\n\n\toverride render() {\n\t\tconst canCreate = this.#creatableAdapters.length > 0;\n\t\tconst canImport = this.#importableAdapters.length > 0;\n\t\tconst showTabs = canCreate && canImport;\n\n\t\treturn html`\n\t\t\t<dialog part=\"dialog\" @cancel=${this.#handleDialogCancel}>\n\t\t\t\t<div class=\"dialog-title\">Add Account</div>\n\t\t\t\t${showTabs\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<div class=\"tabs\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"tab ${this._mode === 'create' ? 'active' : ''}\"\n\t\t\t\t\t\t\t\t\t@click=${() => (this._mode = 'create')}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tCreate\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"tab ${this._mode === 'import' ? 'active' : ''}\"\n\t\t\t\t\t\t\t\t\t@click=${() => (this._mode = 'import')}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tImport\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this._mode === 'create' ? this.#renderCreateForm() : this.#renderImportList()}\n\t\t\t\t${this._error\n\t\t\t\t\t? html`<div class=\"error\" part=\"error-message\">${this._error}</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#handleDialogCancel(e: Event) {\n\t\te.preventDefault();\n\t\tif (!this._creating) {\n\t\t\tthis.#close();\n\t\t}\n\t}\n\n\t#renderCreateForm() {\n\t\tconst creatableAdapters = this.#creatableAdapters;\n\t\tconst showPicker = creatableAdapters.length > 1;\n\n\t\tconst selectedAdapter =\n\t\t\tcreatableAdapters.find((a) => a.id === this._selectedAdapterId) ?? creatableAdapters[0];\n\n\t\treturn html`\n\t\t\t${showPicker\n\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"field\">\n\t\t\t\t\t\t\t<label class=\"field-label\">Type</label>\n\t\t\t\t\t\t\t<dev-wallet-dropdown\n\t\t\t\t\t\t\t\tfull-width\n\t\t\t\t\t\t\t\t.open=${this._dropdownOpen}\n\t\t\t\t\t\t\t\t@close=${() => (this._dropdownOpen = false)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\tclass=\"select-trigger ${this._dropdownOpen ? 'open' : ''}\"\n\t\t\t\t\t\t\t\t\t@click=${() => (this._dropdownOpen = !this._dropdownOpen)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span>${selectedAdapter?.name ?? 'Select...'}</span>\n\t\t\t\t\t\t\t\t\t<span class=\"chevron\">▼</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<div slot=\"popover\">\n\t\t\t\t\t\t\t\t\t${creatableAdapters.map(\n\t\t\t\t\t\t\t\t\t\t(a) => html`\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"select-option ${a.id === (selectedAdapter?.id ?? '')\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'selected'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis._selectedAdapterId = a.id;\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis._dropdownOpen = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t${a.name}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</dev-wallet-dropdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t: nothing}\n\t\t\t<div class=\"field\">\n\t\t\t\t<label class=\"field-label\">Label</label>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"field-input\"\n\t\t\t\t\tpart=\"label-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"e.g. Test Account\"\n\t\t\t\t\t.value=${this._label}\n\t\t\t\t\t@input=${this.#handleLabelInput}\n\t\t\t\t\t@keydown=${this.#handleKeydown}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"actions\">\n\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"btn btn-create\"\n\t\t\t\t\tpart=\"create-button\"\n\t\t\t\t\t?disabled=${this._creating}\n\t\t\t\t\t@click=${this.#handleCreate}\n\t\t\t\t>\n\t\t\t\t\t${this._creating ? 'Creating...' : 'Create'}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderImportList() {\n\t\tif (this._loadingImports) {\n\t\t\treturn html`<div class=\"loading\">Loading accounts...</div>\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>`;\n\t\t}\n\n\t\tif (this._availableAccounts.length === 0) {\n\t\t\treturn html`<div class=\"empty-state\">\n\t\t\t\t\t${this.#hasUnpairedImportableAdapters\n\t\t\t\t\t\t? 'Open the token URL from your terminal to connect CLI accounts.'\n\t\t\t\t\t\t: 'No accounts available to import'}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>`;\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=\"import-list\">\n\t\t\t\t${this._availableAccounts.map((account) => {\n\t\t\t\t\tconst selected = this._selectedImports.has(account.address);\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"import-item ${selected ? 'selected' : ''}\"\n\t\t\t\t\t\t\trole=\"checkbox\"\n\t\t\t\t\t\t\taria-checked=\"${selected}\"\n\t\t\t\t\t\t\t?disabled=${this._creating}\n\t\t\t\t\t\t\t@click=${() => this.#toggleImportSelection(account.address)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"import-checkbox ${selected ? 'checked' : ''}\"\n\t\t\t\t\t\t\t\t>${selected ? '✓' : ''}</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"import-item-info\">\n\t\t\t\t\t\t\t\t<div class=\"import-item-label\">\n\t\t\t\t\t\t\t\t\t${account.alias || formatAddress(account.address)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"import-item-address\">${formatAddress(account.address)}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span class=\"import-item-badge\">${account.scheme}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div class=\"actions\">\n\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"btn btn-create\"\n\t\t\t\t\tpart=\"create-button\"\n\t\t\t\t\t?disabled=${this._creating || this._selectedImports.size === 0}\n\t\t\t\t\t@click=${this.#handleImportSelected}\n\t\t\t\t>\n\t\t\t\t\t${this._creating\n\t\t\t\t\t\t? 'Importing...'\n\t\t\t\t\t\t: `Import${this._selectedImports.size > 0 ? ` (${this._selectedImports.size})` : ''}`}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tasync #loadAvailableAccounts() {\n\t\tthis._loadingImports = true;\n\t\tthis._availableAccounts = [];\n\n\t\ttry {\n\t\t\tconst results: AvailableAccount[] = [];\n\t\t\tfor (const adapter of this.#importableAdapters) {\n\t\t\t\tconst accounts = await adapter.listAvailableAccounts!();\n\t\t\t\tfor (const account of accounts) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tadapterId: adapter.id,\n\t\t\t\t\t\tadapterName: adapter.name,\n\t\t\t\t\t\taddress: account.address,\n\t\t\t\t\t\tscheme: account.scheme,\n\t\t\t\t\t\talias: 'alias' in account ? (account.alias as string | null) : null,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._availableAccounts = results;\n\t\t} catch (error) {\n\t\t\tthis._error = getErrorMessage(error, 'Failed to load accounts');\n\t\t} finally {\n\t\t\tthis._loadingImports = false;\n\t\t}\n\t}\n\n\t#handleLabelInput(e: InputEvent) {\n\t\tthis._label = (e.target as HTMLInputElement).value;\n\t\tthis._error = null;\n\t}\n\n\t#handleKeydown(e: KeyboardEvent) {\n\t\tif (e.key === 'Enter' && !this._creating) {\n\t\t\tthis.#handleCreate();\n\t\t} else if (e.key === 'Escape') {\n\t\t\tthis.#close();\n\t\t}\n\t}\n\n\t#handleCancel() {\n\t\tthis.#close();\n\t}\n\n\tasync #handleCreate() {\n\t\tconst creatableAdapters = this.#creatableAdapters;\n\t\tif (creatableAdapters.length === 0) return;\n\n\t\tconst adapter =\n\t\t\tcreatableAdapters.find((a) => a.id === this._selectedAdapterId) ?? creatableAdapters[0];\n\t\tif (!adapter?.createAccount) return;\n\n\t\tthis._creating = true;\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst options: Record<string, unknown> = {};\n\t\t\tif (this._label.trim()) {\n\t\t\t\toptions.label = this._label.trim();\n\t\t\t}\n\t\t\tawait adapter.createAccount(options);\n\t\t\tthis.#close();\n\t\t\temitEvent(this, 'account-created');\n\t\t} catch (error) {\n\t\t\tthis._error = getErrorMessage(error, 'Failed to create account');\n\t\t} finally {\n\t\t\tthis._creating = false;\n\t\t}\n\t}\n\n\t#toggleImportSelection(address: string) {\n\t\tthis._selectedImports = toggleSetItem(this._selectedImports, address);\n\t}\n\n\tasync #handleImportSelected() {\n\t\tconst selected = this._availableAccounts.filter((a) => this._selectedImports.has(a.address));\n\t\tif (selected.length === 0) return;\n\n\t\tthis._creating = true;\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tfor (const account of selected) {\n\t\t\t\tconst adapter = this.#importableAdapters.find((a) => a.id === account.adapterId);\n\t\t\t\tif (!adapter?.importAccount) continue;\n\t\t\t\tawait adapter.importAccount({ address: account.address });\n\t\t\t}\n\t\t\tthis.#close();\n\t\t\temitEvent(this, 'account-created');\n\t\t} catch (error) {\n\t\t\tthis._error = getErrorMessage(error, 'Failed to import account');\n\t\t} finally {\n\t\t\tthis._creating = false;\n\t\t}\n\t}\n\n\t#close() {\n\t\tthis._label = '';\n\t\tthis._selectedAdapterId = '';\n\t\tthis._error = null;\n\t\tthis._availableAccounts = [];\n\t\tthis._selectedImports = new Set();\n\t\tthis._mode = 'create';\n\t\tthis._dropdownOpen = false;\n\t\t// Don't mutate `this.open` — let the parent control it via the `close` event\n\t\temitEvent(this, 'close');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-new-account': DevWalletNewAccount;\n\t}\n}\n"],"mappings":";;;;;;;AAsCO,IAAA,sBAAA,MAAM,4BAA4B,WAAW;;;kBA8MvB,EAAE;cAGvB;eAG8B;gBAGpB;4BAGY;mBAGT;gBAGY;4BAGiB,EAAE;yBAGzB;uBAGF;0CAGG,IAAI,KAAa;;;gBA3OnB;GACxB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8LH;;CAmCD,KAAA,oBAA0C;AACzC,SAAO,KAAK,SAAS,QAAQ,MAAM,mBAAmB,KAAK,EAAE,cAAc;;CAG5E,KAAA,qBAA2C;AAC1C,SAAO,KAAK,SAAS,QACnB,MACA,mBAAmB,KACnB,EAAE,iBACF,2BAA2B,KAC3B,EAAE,0BAED,CAAC,kBAAkB,EAAE,IAAI,EAAE,UAC7B;;CAGF,KAAA,gCAA8C;AAC7C,SAAO,KAAK,SAAS,MACnB,MACA,mBAAmB,KACnB,EAAE,iBACF,2BAA2B,KAC3B,EAAE,yBACF,kBAAkB,EAAE,IACpB,CAAC,EAAE,SACJ;;CAGF,QAAiB,SAA+B;AAC/C,MAAI,QAAQ,IAAI,OAAO,EAAE;GACxB,MAAM,SAAS,KAAK,YAAY,cAAc,SAAS;AACvD,OAAI,KAAK,QAAQ,UAAU,CAAC,OAAO,MAAM;IACxC,MAAM,YAAY,MAAA,kBAAwB,SAAS;IACnD,MAAM,YAAY,MAAA,mBAAyB,SAAS;AACpD,QAAI,aAAa,CAAC,UACjB,MAAK,QAAQ;QAEb,MAAK,QAAQ;AAEd,QAAI,UACH,OAAA,uBAA6B;AAE9B,WAAO,WAAW;cACR,CAAC,KAAK,QAAQ,QAAQ,KAChC,QAAO,OAAO;;;CAKjB,SAAkB;EACjB,MAAM,YAAY,MAAA,kBAAwB,SAAS;EACnD,MAAM,YAAY,MAAA,mBAAyB,SAAS;EACpD,MAAM,WAAW,aAAa;AAE9B,SAAO,IAAI;mCACsB,MAAA,mBAAyB;;MAEtD,WACC,IAAI;;;sBAGW,KAAK,UAAU,WAAW,WAAW,GAAG;wBACrC,KAAK,QAAQ,SAAU;;;;;sBAK1B,KAAK,UAAU,WAAW,WAAW,GAAG;wBACrC,KAAK,QAAQ,SAAU;;;;;UAMzC,QAAQ;MACT,KAAK,UAAU,WAAW,MAAA,kBAAwB,GAAG,MAAA,kBAAwB,CAAC;MAC9E,KAAK,SACJ,IAAI,2CAA2C,KAAK,OAAO,UAC3D,QAAQ;;;;CAKd,oBAAoB,GAAU;AAC7B,IAAE,gBAAgB;AAClB,MAAI,CAAC,KAAK,UACT,OAAA,OAAa;;CAIf,oBAAoB;EACnB,MAAM,oBAAoB,MAAA;EAC1B,MAAM,aAAa,kBAAkB,SAAS;EAE9C,MAAM,kBACL,kBAAkB,MAAM,MAAM,EAAE,OAAO,KAAK,mBAAmB,IAAI,kBAAkB;AAEtF,SAAO,IAAI;KACR,aACC,IAAI;;;;;gBAKM,KAAK,cAAc;uBACX,KAAK,gBAAgB,MAAO;;;;iCAInB,KAAK,gBAAgB,SAAS,GAAG;wBACzC,KAAK,gBAAgB,CAAC,KAAK,cAAe;;iBAElD,iBAAiB,QAAQ,YAAY;;;;WAI3C,kBAAkB,KAClB,MAAM,IAAI;;mCAEc,EAAE,QAAQ,iBAAiB,MAAM,MACrD,aACA,GAAG;2BACS;AACd,QAAK,qBAAqB,EAAE;AAC5B,QAAK,gBAAgB;AACrB,QAAK,SAAS;IACb;;cAEA,EAAE,KAAK;;YAGX,CAAC;;;;SAKL,QAAQ;;;;;;;;cAQA,KAAK,OAAO;cACZ,MAAA,iBAAuB;gBACrB,MAAA,cAAoB;;;;iEAI6B,MAAA,aAAmB;;;;;;iBAMnE,KAAK,UAAU;cAClB,MAAA,aAAmB;;OAE1B,KAAK,YAAY,gBAAgB,SAAS;;;;;CAMhD,oBAAoB;AACnB,MAAI,KAAK,gBACR,QAAO,IAAI;;kEAEoD,MAAA,aAAmB;;;;AAMnF,MAAI,KAAK,mBAAmB,WAAW,EACtC,QAAO,IAAI;OACP,MAAA,gCACC,mEACA,kCAAkC;;;kEAGwB,MAAA,aAAmB;;;;AAMnF,SAAO,IAAI;;MAEP,KAAK,mBAAmB,KAAK,YAAY;GAC1C,MAAM,WAAW,KAAK,iBAAiB,IAAI,QAAQ,QAAQ;AAC3D,UAAO,IAAI;;4BAEY,WAAW,aAAa,GAAG;;uBAEhC,SAAS;mBACb,KAAK,UAAU;sBACZ,MAAA,sBAA4B,QAAQ,QAAQ,CAAC;;sCAE7B,WAAW,YAAY,GAAG;WACrD,WAAW,MAAM,GAAG;;;;WAIpB,QAAQ,SAAS,cAAc,QAAQ,QAAQ,CAAC;;2CAEhB,cAAc,QAAQ,QAAQ,CAAC;;yCAEjC,QAAQ,OAAO;;;IAGlD,CAAC;;;iEAG0D,MAAA,aAAmB;;;;;;iBAMnE,KAAK,aAAa,KAAK,iBAAiB,SAAS,EAAE;cACtD,MAAA,qBAA2B;;OAElC,KAAK,YACJ,iBACA,SAAS,KAAK,iBAAiB,OAAO,IAAI,KAAK,KAAK,iBAAiB,KAAK,KAAK,KAAK;;;;;CAM3F,OAAA,wBAA+B;AAC9B,OAAK,kBAAkB;AACvB,OAAK,qBAAqB,EAAE;AAE5B,MAAI;GACH,MAAM,UAA8B,EAAE;AACtC,QAAK,MAAM,WAAW,MAAA,oBAA0B;IAC/C,MAAM,WAAW,MAAM,QAAQ,uBAAwB;AACvD,SAAK,MAAM,WAAW,SACrB,SAAQ,KAAK;KACZ,WAAW,QAAQ;KACnB,aAAa,QAAQ;KACrB,SAAS,QAAQ;KACjB,QAAQ,QAAQ;KAChB,OAAO,WAAW,UAAW,QAAQ,QAA0B;KAC/D,CAAC;;AAGJ,QAAK,qBAAqB;WAClB,OAAO;AACf,QAAK,SAAS,gBAAgB,OAAO,0BAA0B;YACtD;AACT,QAAK,kBAAkB;;;CAIzB,kBAAkB,GAAe;AAChC,OAAK,SAAU,EAAE,OAA4B;AAC7C,OAAK,SAAS;;CAGf,eAAe,GAAkB;AAChC,MAAI,EAAE,QAAQ,WAAW,CAAC,KAAK,UAC9B,OAAA,cAAoB;WACV,EAAE,QAAQ,SACpB,OAAA,OAAa;;CAIf,gBAAgB;AACf,QAAA,OAAa;;CAGd,OAAA,eAAsB;EACrB,MAAM,oBAAoB,MAAA;AAC1B,MAAI,kBAAkB,WAAW,EAAG;EAEpC,MAAM,UACL,kBAAkB,MAAM,MAAM,EAAE,OAAO,KAAK,mBAAmB,IAAI,kBAAkB;AACtF,MAAI,CAAC,SAAS,cAAe;AAE7B,OAAK,YAAY;AACjB,OAAK,SAAS;AAEd,MAAI;GACH,MAAM,UAAmC,EAAE;AAC3C,OAAI,KAAK,OAAO,MAAM,CACrB,SAAQ,QAAQ,KAAK,OAAO,MAAM;AAEnC,SAAM,QAAQ,cAAc,QAAQ;AACpC,SAAA,OAAa;AACb,aAAU,MAAM,kBAAkB;WAC1B,OAAO;AACf,QAAK,SAAS,gBAAgB,OAAO,2BAA2B;YACvD;AACT,QAAK,YAAY;;;CAInB,uBAAuB,SAAiB;AACvC,OAAK,mBAAmB,cAAc,KAAK,kBAAkB,QAAQ;;CAGtE,OAAA,uBAA8B;EAC7B,MAAM,WAAW,KAAK,mBAAmB,QAAQ,MAAM,KAAK,iBAAiB,IAAI,EAAE,QAAQ,CAAC;AAC5F,MAAI,SAAS,WAAW,EAAG;AAE3B,OAAK,YAAY;AACjB,OAAK,SAAS;AAEd,MAAI;AACH,QAAK,MAAM,WAAW,UAAU;IAC/B,MAAM,UAAU,MAAA,mBAAyB,MAAM,MAAM,EAAE,OAAO,QAAQ,UAAU;AAChF,QAAI,CAAC,SAAS,cAAe;AAC7B,UAAM,QAAQ,cAAc,EAAE,SAAS,QAAQ,SAAS,CAAC;;AAE1D,SAAA,OAAa;AACb,aAAU,MAAM,kBAAkB;WAC1B,OAAO;AACf,QAAK,SAAS,gBAAgB,OAAO,2BAA2B;YACvD;AACT,QAAK,YAAY;;;CAInB,SAAS;AACR,OAAK,SAAS;AACd,OAAK,qBAAqB;AAC1B,OAAK,SAAS;AACd,OAAK,qBAAqB,EAAE;AAC5B,OAAK,mCAAmB,IAAI,KAAK;AACjC,OAAK,QAAQ;AACb,OAAK,gBAAgB;AAErB,YAAU,MAAM,QAAQ;;;YAjXxB,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,oBAAA,WAAA,YAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,MAAM,SAAS,CAAC,CAAA,EAAA,oBAAA,WAAA,QAAA,KAAA,EAAA;YAG3B,OAAO,CAAA,EAAA,oBAAA,WAAA,SAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,UAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,sBAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,aAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,UAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,sBAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,mBAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,iBAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,oBAAA,WAAA,oBAAA,KAAA,EAAA;kCA5OR,cAAc,yBAAyB,CAAA,EAAA,oBAAA"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-new-account.mjs","names":["#creatableAdapters","#importableAdapters","#hasUnpairedImportableAdapters","#loadAvailableAccounts","#handleDialogCancel","#renderCreateForm","#renderImportList","#close","#handleLabelInput","#handleKeydown","#handleCancel","#handleCreate","#toggleImportSelection","#handleImportSelected"],"sources":["../../src/ui/dev-wallet-new-account.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport {\n\tactionButtonStyles,\n\tbadgeStyles,\n\tcardItemStyles,\n\tdialogStyles,\n\tformInputStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsharedStyles,\n\tsubLabelStyles,\n\tstateStyles,\n} from './styles.js';\nimport {\n\temitEvent,\n\tformatAddress,\n\tgetErrorMessage,\n\tisPairableAdapter,\n\ttoggleSetItem,\n} from './utils.js';\nimport './dev-wallet-dropdown.js';\n\ninterface AvailableAccount {\n\tadapterId: string;\n\tadapterName: string;\n\taddress: string;\n\tscheme: string;\n\talias?: string | null;\n}\n\n@customElement('dev-wallet-new-account')\nexport class DevWalletNewAccount extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tstateStyles,\n\t\tdialogStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tformInputStyles,\n\t\tmonoTruncateStyles,\n\t\tbadgeStyles,\n\t\tinlineErrorStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\tdialog {\n\t\t\t\twidth: 320px;\n\t\t\t\tmax-height: min(420px, 80vh);\n\t\t\t\tpadding: 20px;\n\t\t\t}\n\n\t\t\t.tabs {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tpadding: 3px;\n\t\t\t}\n\n\t\t\t.tab {\n\t\t\t\tflex: 1;\n\t\t\t\tpadding: 6px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\ttext-align: center;\n\t\t\t\ttransition: all 0.15s;\n\t\t\t}\n\n\t\t\t.tab.active {\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-sm);\n\t\t\t}\n\n\t\t\t.tab:not(.active):hover {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.field {\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\t.field-input {\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\n\t\t\t.field-input:focus {\n\t\t\t\toutline: 2px solid color-mix(in oklab, var(--dev-wallet-ring) 50%, transparent);\n\t\t\t\toutline-offset: -1px;\n\t\t\t}\n\n\t\t\t.select-trigger {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttext-align: left;\n\t\t\t}\n\n\t\t\t.select-trigger:hover {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.select-trigger .chevron {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\ttransition: transform 0.15s;\n\t\t\t}\n\n\t\t\t.select-trigger.open .chevron {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\n\t\t\t.select-option {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground: transparent;\n\t\t\t\ttext-align: left;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background 0.1s;\n\t\t\t}\n\n\t\t\t.select-option:hover {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t\t\t}\n\n\t\t\t.select-option.selected {\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.import-list {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tmax-height: 240px;\n\t\t\t\tmin-height: 60px;\n\t\t\t}\n\n\t\t\t.import-item {\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: left;\n\t\t\t\ttransition: border-color 0.15s;\n\t\t\t}\n\n\t\t\t.import-item:hover {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.import-item.selected {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 10%, var(--dev-wallet-secondary));\n\t\t\t}\n\n\t\t\t.import-item:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.import-checkbox {\n\t\t\t\twidth: 16px;\n\t\t\t\theight: 16px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tborder: 2px solid var(--dev-wallet-border);\n\t\t\t\tflex-shrink: 0;\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: 10px;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\ttransition: all 0.15s;\n\t\t\t}\n\n\t\t\t.import-checkbox.checked {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.import-item-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.import-item-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.import-item-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.import-item-badge {\n\t\t\t\tpadding: 1px 6px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.empty-state,\n\t\t\t.loading {\n\t\t\t\tpadding: 20px;\n\t\t\t}\n\n\t\t\t.actions {\n\t\t\t\tmargin-top: 16px;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: Boolean })\n\topen = false;\n\n\t@state()\n\tprivate _mode: 'create' | 'import' = 'create';\n\n\t@state()\n\tprivate _label = '';\n\n\t@state()\n\tprivate _selectedAdapterId = '';\n\n\t@state()\n\tprivate _creating = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _availableAccounts: AvailableAccount[] = [];\n\n\t@state()\n\tprivate _loadingImports = false;\n\n\t@state()\n\tprivate _dropdownOpen = false;\n\n\t@state()\n\tprivate _selectedImports = new Set<string>();\n\n\tget #creatableAdapters(): SignerAdapter[] {\n\t\treturn this.adapters.filter((a) => 'createAccount' in a && a.createAccount);\n\t}\n\n\tget #importableAdapters(): SignerAdapter[] {\n\t\treturn this.adapters.filter(\n\t\t\t(a) =>\n\t\t\t\t'importAccount' in a &&\n\t\t\t\ta.importAccount &&\n\t\t\t\t'listAvailableAccounts' in a &&\n\t\t\t\ta.listAvailableAccounts &&\n\t\t\t\t// Skip adapters that require pairing but aren't paired yet\n\t\t\t\t(!isPairableAdapter(a) || a.isPaired),\n\t\t);\n\t}\n\n\tget #hasUnpairedImportableAdapters(): boolean {\n\t\treturn this.adapters.some(\n\t\t\t(a) =>\n\t\t\t\t'importAccount' in a &&\n\t\t\t\ta.importAccount &&\n\t\t\t\t'listAvailableAccounts' in a &&\n\t\t\t\ta.listAvailableAccounts &&\n\t\t\t\tisPairableAdapter(a) &&\n\t\t\t\t!a.isPaired,\n\t\t);\n\t}\n\n\toverride updated(changed: Map<string, unknown>) {\n\t\tif (changed.has('open')) {\n\t\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\t\tif (this.open && dialog && !dialog.open) {\n\t\t\t\tconst canCreate = this.#creatableAdapters.length > 0;\n\t\t\t\tconst canImport = this.#importableAdapters.length > 0;\n\t\t\t\tif (canImport && !canCreate) {\n\t\t\t\t\tthis._mode = 'import';\n\t\t\t\t} else {\n\t\t\t\t\tthis._mode = 'create';\n\t\t\t\t}\n\t\t\t\tif (canImport) {\n\t\t\t\t\tthis.#loadAvailableAccounts();\n\t\t\t\t}\n\t\t\t\tdialog.showModal();\n\t\t\t} else if (!this.open && dialog?.open) {\n\t\t\t\tdialog.close();\n\t\t\t}\n\t\t}\n\t}\n\n\toverride render() {\n\t\tconst canCreate = this.#creatableAdapters.length > 0;\n\t\tconst canImport = this.#importableAdapters.length > 0;\n\t\tconst showTabs = canCreate && canImport;\n\n\t\treturn html`\n\t\t\t<dialog part=\"dialog\" @cancel=${this.#handleDialogCancel}>\n\t\t\t\t<div class=\"dialog-title\">Add Account</div>\n\t\t\t\t${showTabs\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<div class=\"tabs\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"tab ${this._mode === 'create' ? 'active' : ''}\"\n\t\t\t\t\t\t\t\t\t@click=${() => (this._mode = 'create')}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tCreate\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"tab ${this._mode === 'import' ? 'active' : ''}\"\n\t\t\t\t\t\t\t\t\t@click=${() => (this._mode = 'import')}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tImport\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this._mode === 'create' ? this.#renderCreateForm() : this.#renderImportList()}\n\t\t\t\t${this._error\n\t\t\t\t\t? html`<div class=\"error\" part=\"error-message\">${this._error}</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#handleDialogCancel(e: Event) {\n\t\te.preventDefault();\n\t\tif (!this._creating) {\n\t\t\tthis.#close();\n\t\t}\n\t}\n\n\t#renderCreateForm() {\n\t\tconst creatableAdapters = this.#creatableAdapters;\n\t\tconst showPicker = creatableAdapters.length > 1;\n\n\t\tconst selectedAdapter =\n\t\t\tcreatableAdapters.find((a) => a.id === this._selectedAdapterId) ?? creatableAdapters[0];\n\n\t\treturn html`\n\t\t\t${showPicker\n\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"field\">\n\t\t\t\t\t\t\t<label class=\"field-label\">Type</label>\n\t\t\t\t\t\t\t<dev-wallet-dropdown\n\t\t\t\t\t\t\t\tfull-width\n\t\t\t\t\t\t\t\t.open=${this._dropdownOpen}\n\t\t\t\t\t\t\t\t@close=${() => (this._dropdownOpen = false)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\tclass=\"select-trigger ${this._dropdownOpen ? 'open' : ''}\"\n\t\t\t\t\t\t\t\t\t@click=${() => (this._dropdownOpen = !this._dropdownOpen)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span>${selectedAdapter?.name ?? 'Select...'}</span>\n\t\t\t\t\t\t\t\t\t<span class=\"chevron\">▼</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<div slot=\"popover\">\n\t\t\t\t\t\t\t\t\t${creatableAdapters.map(\n\t\t\t\t\t\t\t\t\t\t(a) => html`\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"select-option ${a.id === (selectedAdapter?.id ?? '')\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'selected'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis._selectedAdapterId = a.id;\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis._dropdownOpen = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t${a.name}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</dev-wallet-dropdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t: nothing}\n\t\t\t<div class=\"field\">\n\t\t\t\t<label class=\"field-label\">Label</label>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"field-input\"\n\t\t\t\t\tpart=\"label-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"e.g. Test Account\"\n\t\t\t\t\t.value=${this._label}\n\t\t\t\t\t@input=${this.#handleLabelInput}\n\t\t\t\t\t@keydown=${this.#handleKeydown}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"actions\">\n\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"btn btn-create\"\n\t\t\t\t\tpart=\"create-button\"\n\t\t\t\t\t?disabled=${this._creating}\n\t\t\t\t\t@click=${this.#handleCreate}\n\t\t\t\t>\n\t\t\t\t\t${this._creating ? 'Creating...' : 'Create'}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderImportList() {\n\t\tif (this._loadingImports) {\n\t\t\treturn html`<div class=\"loading\">Loading accounts...</div>\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>`;\n\t\t}\n\n\t\tif (this._availableAccounts.length === 0) {\n\t\t\treturn html`<div class=\"empty-state\">\n\t\t\t\t\t${this.#hasUnpairedImportableAdapters\n\t\t\t\t\t\t? 'Open the token URL from your terminal to connect CLI accounts.'\n\t\t\t\t\t\t: 'No accounts available to import'}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>`;\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=\"import-list\">\n\t\t\t\t${this._availableAccounts.map((account) => {\n\t\t\t\t\tconst selected = this._selectedImports.has(account.address);\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"import-item ${selected ? 'selected' : ''}\"\n\t\t\t\t\t\t\trole=\"checkbox\"\n\t\t\t\t\t\t\taria-checked=\"${selected}\"\n\t\t\t\t\t\t\t?disabled=${this._creating}\n\t\t\t\t\t\t\t@click=${() => this.#toggleImportSelection(account.address)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"import-checkbox ${selected ? 'checked' : ''}\"\n\t\t\t\t\t\t\t\t>${selected ? '✓' : ''}</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"import-item-info\">\n\t\t\t\t\t\t\t\t<div class=\"import-item-label\">\n\t\t\t\t\t\t\t\t\t${account.alias || formatAddress(account.address)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"import-item-address\">${formatAddress(account.address)}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span class=\"import-item-badge\">${account.scheme}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div class=\"actions\">\n\t\t\t\t<button class=\"btn btn-cancel\" part=\"cancel-button\" @click=${this.#handleCancel}>\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"btn btn-create\"\n\t\t\t\t\tpart=\"create-button\"\n\t\t\t\t\t?disabled=${this._creating || this._selectedImports.size === 0}\n\t\t\t\t\t@click=${this.#handleImportSelected}\n\t\t\t\t>\n\t\t\t\t\t${this._creating\n\t\t\t\t\t\t? 'Importing...'\n\t\t\t\t\t\t: `Import${this._selectedImports.size > 0 ? ` (${this._selectedImports.size})` : ''}`}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tasync #loadAvailableAccounts() {\n\t\tthis._loadingImports = true;\n\t\tthis._availableAccounts = [];\n\n\t\ttry {\n\t\t\tconst results: AvailableAccount[] = [];\n\t\t\tfor (const adapter of this.#importableAdapters) {\n\t\t\t\tconst accounts = await adapter.listAvailableAccounts!();\n\t\t\t\tfor (const account of accounts) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tadapterId: adapter.id,\n\t\t\t\t\t\tadapterName: adapter.name,\n\t\t\t\t\t\taddress: account.address,\n\t\t\t\t\t\tscheme: account.scheme,\n\t\t\t\t\t\talias: 'alias' in account ? (account.alias as string | null) : null,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._availableAccounts = results;\n\t\t} catch (error) {\n\t\t\tthis._error = getErrorMessage(error, 'Failed to load accounts');\n\t\t} finally {\n\t\t\tthis._loadingImports = false;\n\t\t}\n\t}\n\n\t#handleLabelInput(e: InputEvent) {\n\t\tthis._label = (e.target as HTMLInputElement).value;\n\t\tthis._error = null;\n\t}\n\n\t#handleKeydown(e: KeyboardEvent) {\n\t\tif (e.key === 'Enter' && !this._creating) {\n\t\t\tthis.#handleCreate();\n\t\t} else if (e.key === 'Escape') {\n\t\t\tthis.#close();\n\t\t}\n\t}\n\n\t#handleCancel() {\n\t\tthis.#close();\n\t}\n\n\tasync #handleCreate() {\n\t\tconst creatableAdapters = this.#creatableAdapters;\n\t\tif (creatableAdapters.length === 0) return;\n\n\t\tconst adapter =\n\t\t\tcreatableAdapters.find((a) => a.id === this._selectedAdapterId) ?? creatableAdapters[0];\n\t\tif (!adapter?.createAccount) return;\n\n\t\tthis._creating = true;\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst options: Record<string, unknown> = {};\n\t\t\tif (this._label.trim()) {\n\t\t\t\toptions.label = this._label.trim();\n\t\t\t}\n\t\t\tawait adapter.createAccount(options);\n\t\t\tthis.#close();\n\t\t\temitEvent(this, 'account-created');\n\t\t} catch (error) {\n\t\t\tthis._error = getErrorMessage(error, 'Failed to create account');\n\t\t} finally {\n\t\t\tthis._creating = false;\n\t\t}\n\t}\n\n\t#toggleImportSelection(address: string) {\n\t\tthis._selectedImports = toggleSetItem(this._selectedImports, address);\n\t}\n\n\tasync #handleImportSelected() {\n\t\tconst selected = this._availableAccounts.filter((a) => this._selectedImports.has(a.address));\n\t\tif (selected.length === 0) return;\n\n\t\tthis._creating = true;\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tfor (const account of selected) {\n\t\t\t\tconst adapter = this.#importableAdapters.find((a) => a.id === account.adapterId);\n\t\t\t\tif (!adapter?.importAccount) continue;\n\t\t\t\tawait adapter.importAccount({ address: account.address });\n\t\t\t}\n\t\t\tthis.#close();\n\t\t\temitEvent(this, 'account-created');\n\t\t} catch (error) {\n\t\t\tthis._error = getErrorMessage(error, 'Failed to import account');\n\t\t} finally {\n\t\t\tthis._creating = false;\n\t\t}\n\t}\n\n\t#close() {\n\t\tthis._label = '';\n\t\tthis._selectedAdapterId = '';\n\t\tthis._error = null;\n\t\tthis._availableAccounts = [];\n\t\tthis._selectedImports = new Set();\n\t\tthis._mode = 'create';\n\t\tthis._dropdownOpen = false;\n\t\t// Don't mutate `this.open` — let the parent control it via the `close` event\n\t\temitEvent(this, 'close');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-new-account': DevWalletNewAccount;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement, nothing } from "lit";
|
|
3
2
|
import { ClientWithCoreApi } from "@mysten/sui/client";
|
|
4
3
|
|
|
5
4
|
//#region src/ui/dev-wallet-objects.d.ts
|
|
6
5
|
declare class DevWalletObjects extends LitElement {
|
|
7
6
|
#private;
|
|
8
|
-
static styles: (
|
|
7
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
9
8
|
address: string;
|
|
10
9
|
client: ClientWithCoreApi | null;
|
|
11
10
|
private _objects;
|
|
@@ -14,7 +13,7 @@ declare class DevWalletObjects extends LitElement {
|
|
|
14
13
|
private _error;
|
|
15
14
|
private _hasNextPage;
|
|
16
15
|
willUpdate(changedProperties: Map<string, unknown>): void;
|
|
17
|
-
render():
|
|
16
|
+
render(): import("lit").TemplateResult<1> | typeof nothing;
|
|
18
17
|
}
|
|
19
18
|
declare global {
|
|
20
19
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-objects.d.mts","names":[],"sources":["../../src/ui/dev-wallet-objects.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-objects.d.mts","names":[],"sources":["../../src/ui/dev-wallet-objects.ts"],"mappings":";;;;cAsBa,gBAAA,SAAyB,UAAA;EAAA;SACrB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAgKtB,OAAA;EAGA,MAAA,EAAQ,iBAAA;EAAA,QAGA,QAAA;EAAA,QAGA,QAAA;EAAA,QAGA,YAAA;EAAA,QAGA,MAAA;EAAA,QAGA,YAAA;EAQC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAW9B,MAAA,kBAAM,cAAA,aAAA,OAAA;AAAA;AAAA,QAuJR,MAAA;EAAA,UACG,qBAAA;IACT,oBAAA,EAAsB,gBAAgB;EAAA;AAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { sectionHeaderStyles, sharedStyles, stateStyles } from "./styles.mjs";
|
|
2
2
|
import { getTypeName, isCoinType } 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.135.0/helpers/esm/decorate.mjs";
|
|
5
5
|
import { LitElement, css, html, nothing } from "lit";
|
|
6
6
|
import { customElement, property, state } from "lit/decorators.js";
|
|
7
7
|
//#region src/ui/dev-wallet-objects.ts
|