@mysten-incubation/dev-wallet 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -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 +61 -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 +183 -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-objects.mjs","names":["#lastFetchedAddress","#lastFetchedClient","#fetchObjects","#copy","#loadMore","#cursor","#fetchGeneration"],"sources":["../../src/ui/dev-wallet-objects.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { CopyController } from './copy-controller.js';\nimport { sectionHeaderStyles, sharedStyles, stateStyles } from './styles.js';\nimport { getTypeName, isCoinType } from './utils.js';\n\ninterface OwnedObject {\n\tobjectId: string;\n\ttype: string;\n\ttypeName: string;\n\tversion: string;\n\tdisplayName: string | null;\n\tdescription: string | null;\n\timageUrl: string | null;\n}\n\n@customElement('dev-wallet-objects')\nexport class DevWalletObjects extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tstateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.object-list {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.object-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 10px;\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\talign-items: flex-start;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttransition:\n\t\t\t\t\tbackground 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t}\n\n\t\t\t.object-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.object-thumb {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tobject-fit: cover;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-fallback {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tbackground: linear-gradient(135deg, var(--dev-wallet-bg-4), var(--dev-wallet-bg-2));\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.object-body {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.object-top {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.object-type {\n\t\t\t\tfont-size: 11px;\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\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.object-type-badge {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\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.object-description {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-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.object-version {\n\t\t\t\theight: 16px;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-id {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tpadding: 1px 2px;\n\t\t\t\tmargin: -1px -2px;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.object-id: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.object-id.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.load-more {\n\t\t\t\tmargin-top: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 30px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\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-primary);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.load-more:hover {\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.load-more:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t\tcursor: default;\n\t\t\t}\n\n\t\t\t@media (max-width: 380px) {\n\t\t\t\t.object-list {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@state()\n\tprivate _objects: OwnedObject[] = [];\n\n\t@state()\n\tprivate _loading = false;\n\n\t@state()\n\tprivate _loadingMore = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _hasNextPage = false;\n\n\t#copy = new CopyController(this);\n\t#cursor: string | null = null;\n\t#lastFetchedAddress = '';\n\t#lastFetchedClient: ClientWithCoreApi | null = null;\n\t#fetchGeneration = 0;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (\n\t\t\t(changedProperties.has('address') || changedProperties.has('client')) &&\n\t\t\tthis.address &&\n\t\t\tthis.client &&\n\t\t\t(this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)\n\t\t) {\n\t\t\tthis.#fetchObjects(false);\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.address || !this.client) {\n\t\t\treturn nothing;\n\t\t}\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Owned Objects</h3>\n\t\t\t${this._loading\n\t\t\t\t? html`<div class=\"loading\" part=\"loading\" aria-live=\"polite\">Loading...</div>`\n\t\t\t\t: this._error\n\t\t\t\t\t? html`<div class=\"error-state\" part=\"error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t\t${this._error}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: this._objects.length === 0\n\t\t\t\t\t\t? html`<div class=\"empty-state\" part=\"empty-state\">No objects found</div>`\n\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t<div class=\"object-list\" part=\"object-list\">\n\t\t\t\t\t\t\t\t\t${this._objects.map(\n\t\t\t\t\t\t\t\t\t\t(obj) => html`\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t${obj.imageUrl && /^https?:\\/\\//i.test(obj.imageUrl)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-thumb\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc=${obj.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talt=${obj.displayName ?? obj.typeName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@error=${(e: Event) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t((e.target as HTMLImageElement).style.display = 'none')}\n\t\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\t: html`<span class=\"object-fallback\">O</span>`}\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-type\"> ${obj.displayName ?? obj.typeName} </span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-version\">v${obj.version}</span>\n\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${obj.displayName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-type-badge\">${obj.typeName}</span>`\n\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${obj.description\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-description\">${obj.description}</span>`\n\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<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-id ${this.#copy.isCopied(obj.objectId) ? 'copied' : ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Copy object ID\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#copy.copy(obj.objectId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(obj.objectId);\n\t\t\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\t\t}}\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\t\t${this.#copy.isCopied(obj.objectId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${obj.objectId.slice(0, 10)}...${obj.objectId.slice(-8)}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\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</div>\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\t${this._hasNextPage\n\t\t\t\t\t\t\t\t\t? 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=\"load-more\"\n\t\t\t\t\t\t\t\t\t\t\t\tpart=\"load-more-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t?disabled=${this._loadingMore}\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${this.#loadMore}\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${this._loadingMore ? 'Loading...' : 'Load More'}\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: nothing}\n\t\t\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\tasync #fetchObjects(append: boolean) {\n\t\tthis.#lastFetchedAddress = this.address;\n\t\tthis.#lastFetchedClient = this.client;\n\n\t\tif (!append) {\n\t\t\tthis.#cursor = null;\n\t\t\tthis._objects = [];\n\t\t}\n\n\t\tconst generation = ++this.#fetchGeneration;\n\t\tif (append) {\n\t\t\tthis._loadingMore = true;\n\t\t} else {\n\t\t\tthis._loading = true;\n\t\t}\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst result = await this.client!.core.listOwnedObjects({\n\t\t\t\towner: this.address,\n\t\t\t\tlimit: 20,\n\t\t\t\tcursor: this.#cursor,\n\t\t\t\tinclude: { json: true },\n\t\t\t});\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\n\t\t\t// Filter out Coin types — those are shown in the balances tab\n\t\t\tconst nonCoinObjects: OwnedObject[] = result.objects\n\t\t\t\t.filter((obj) => !isCoinType(obj.type))\n\t\t\t\t.map((obj) => {\n\t\t\t\t\tconst json = obj.json;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tobjectId: obj.objectId,\n\t\t\t\t\t\ttype: obj.type,\n\t\t\t\t\t\ttypeName: getTypeName(obj.type),\n\t\t\t\t\t\tversion: obj.version,\n\t\t\t\t\t\tdisplayName: extractString(json, 'name'),\n\t\t\t\t\t\tdescription: extractString(json, 'description'),\n\t\t\t\t\t\timageUrl: extractString(json, 'image_url') ?? extractString(json, 'img_url'),\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\tthis._objects = append ? [...this._objects, ...nonCoinObjects] : nonCoinObjects;\n\t\t\tthis._hasNextPage = result.hasNextPage;\n\t\t\tthis.#cursor = result.cursor;\n\t\t} catch {\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._error = 'Failed to load objects';\n\t\t\tif (!append) this._objects = [];\n\t\t} finally {\n\t\t\tif (generation === this.#fetchGeneration) {\n\t\t\t\tthis._loading = false;\n\t\t\t\tthis._loadingMore = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t#loadMore() {\n\t\tthis.#fetchObjects(true);\n\t}\n}\n\nfunction extractString(\n\tjson: Record<string, unknown> | null | undefined,\n\tkey: string,\n): string | null {\n\tif (!json) return null;\n\tconst val = json[key];\n\treturn typeof val === 'string' && val.length > 0 ? val : null;\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-objects': DevWalletObjects;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-objects.mjs","names":["#lastFetchedAddress","#lastFetchedClient","#fetchObjects","#copy","#loadMore","#cursor","#fetchGeneration"],"sources":["../../src/ui/dev-wallet-objects.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { CopyController } from './copy-controller.js';\nimport { sectionHeaderStyles, sharedStyles, stateStyles } from './styles.js';\nimport { getTypeName, isCoinType } from './utils.js';\n\ninterface OwnedObject {\n\tobjectId: string;\n\ttype: string;\n\ttypeName: string;\n\tversion: string;\n\tdisplayName: string | null;\n\tdescription: string | null;\n\timageUrl: string | null;\n}\n\n@customElement('dev-wallet-objects')\nexport class DevWalletObjects extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tstateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.object-list {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.object-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 10px;\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\talign-items: flex-start;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttransition:\n\t\t\t\t\tbackground 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t}\n\n\t\t\t.object-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.object-thumb {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tobject-fit: cover;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-fallback {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tbackground: linear-gradient(135deg, var(--dev-wallet-bg-4), var(--dev-wallet-bg-2));\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.object-body {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.object-top {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.object-type {\n\t\t\t\tfont-size: 11px;\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\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.object-type-badge {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\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.object-description {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-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.object-version {\n\t\t\t\theight: 16px;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-id {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tpadding: 1px 2px;\n\t\t\t\tmargin: -1px -2px;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.object-id: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.object-id.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.load-more {\n\t\t\t\tmargin-top: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 30px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\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-primary);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.load-more:hover {\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.load-more:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t\tcursor: default;\n\t\t\t}\n\n\t\t\t@media (max-width: 380px) {\n\t\t\t\t.object-list {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@state()\n\tprivate _objects: OwnedObject[] = [];\n\n\t@state()\n\tprivate _loading = false;\n\n\t@state()\n\tprivate _loadingMore = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _hasNextPage = false;\n\n\t#copy = new CopyController(this);\n\t#cursor: string | null = null;\n\t#lastFetchedAddress = '';\n\t#lastFetchedClient: ClientWithCoreApi | null = null;\n\t#fetchGeneration = 0;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (\n\t\t\t(changedProperties.has('address') || changedProperties.has('client')) &&\n\t\t\tthis.address &&\n\t\t\tthis.client &&\n\t\t\t(this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)\n\t\t) {\n\t\t\tthis.#fetchObjects(false);\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.address || !this.client) {\n\t\t\treturn nothing;\n\t\t}\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Owned Objects</h3>\n\t\t\t${this._loading\n\t\t\t\t? html`<div class=\"loading\" part=\"loading\" aria-live=\"polite\">Loading...</div>`\n\t\t\t\t: this._error\n\t\t\t\t\t? html`<div class=\"error-state\" part=\"error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t\t${this._error}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: this._objects.length === 0\n\t\t\t\t\t\t? html`<div class=\"empty-state\" part=\"empty-state\">No objects found</div>`\n\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t<div class=\"object-list\" part=\"object-list\">\n\t\t\t\t\t\t\t\t\t${this._objects.map(\n\t\t\t\t\t\t\t\t\t\t(obj) => html`\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t${obj.imageUrl && /^https?:\\/\\//i.test(obj.imageUrl)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-thumb\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc=${obj.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talt=${obj.displayName ?? obj.typeName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@error=${(e: Event) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t((e.target as HTMLImageElement).style.display = 'none')}\n\t\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\t: html`<span class=\"object-fallback\">O</span>`}\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-type\"> ${obj.displayName ?? obj.typeName} </span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-version\">v${obj.version}</span>\n\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${obj.displayName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-type-badge\">${obj.typeName}</span>`\n\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${obj.description\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-description\">${obj.description}</span>`\n\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<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-id ${this.#copy.isCopied(obj.objectId) ? 'copied' : ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Copy object ID\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#copy.copy(obj.objectId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(obj.objectId);\n\t\t\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\t\t}}\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\t\t${this.#copy.isCopied(obj.objectId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${obj.objectId.slice(0, 10)}...${obj.objectId.slice(-8)}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\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</div>\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\t${this._hasNextPage\n\t\t\t\t\t\t\t\t\t? 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=\"load-more\"\n\t\t\t\t\t\t\t\t\t\t\t\tpart=\"load-more-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t?disabled=${this._loadingMore}\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${this.#loadMore}\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${this._loadingMore ? 'Loading...' : 'Load More'}\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: nothing}\n\t\t\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\tasync #fetchObjects(append: boolean) {\n\t\tthis.#lastFetchedAddress = this.address;\n\t\tthis.#lastFetchedClient = this.client;\n\n\t\tif (!append) {\n\t\t\tthis.#cursor = null;\n\t\t\tthis._objects = [];\n\t\t}\n\n\t\tconst generation = ++this.#fetchGeneration;\n\t\tif (append) {\n\t\t\tthis._loadingMore = true;\n\t\t} else {\n\t\t\tthis._loading = true;\n\t\t}\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst result = await this.client!.core.listOwnedObjects({\n\t\t\t\towner: this.address,\n\t\t\t\tlimit: 20,\n\t\t\t\tcursor: this.#cursor,\n\t\t\t\tinclude: { json: true },\n\t\t\t});\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\n\t\t\t// Filter out Coin types — those are shown in the balances tab\n\t\t\tconst nonCoinObjects: OwnedObject[] = result.objects\n\t\t\t\t.filter((obj) => !isCoinType(obj.type))\n\t\t\t\t.map((obj) => {\n\t\t\t\t\tconst json = obj.json;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tobjectId: obj.objectId,\n\t\t\t\t\t\ttype: obj.type,\n\t\t\t\t\t\ttypeName: getTypeName(obj.type),\n\t\t\t\t\t\tversion: obj.version,\n\t\t\t\t\t\tdisplayName: extractString(json, 'name'),\n\t\t\t\t\t\tdescription: extractString(json, 'description'),\n\t\t\t\t\t\timageUrl: extractString(json, 'image_url') ?? extractString(json, 'img_url'),\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\tthis._objects = append ? [...this._objects, ...nonCoinObjects] : nonCoinObjects;\n\t\t\tthis._hasNextPage = result.hasNextPage;\n\t\t\tthis.#cursor = result.cursor;\n\t\t} catch {\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._error = 'Failed to load objects';\n\t\t\tif (!append) this._objects = [];\n\t\t} finally {\n\t\t\tif (generation === this.#fetchGeneration) {\n\t\t\t\tthis._loading = false;\n\t\t\t\tthis._loadingMore = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t#loadMore() {\n\t\tthis.#fetchObjects(true);\n\t}\n}\n\nfunction extractString(\n\tjson: Record<string, unknown> | null | undefined,\n\tkey: string,\n): string | null {\n\tif (!json) return null;\n\tconst val = json[key];\n\treturn typeof val === 'string' && val.length > 0 ? val : null;\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-objects': DevWalletObjects;\n\t}\n}\n"],"mappings":";;;;;;;AAsBO,IAAA,mBAAA,MAAM,yBAAyB,WAAW;;;iBAiKtC;gBAGyB;kBAGD,CAAC;kBAGhB;sBAGI;gBAGS;sBAGT;eAEf,IAAI,eAAe,IAAI;iBACN;6BACH;4BACyB;0BAC5B;;;gBAxLM;GACxB;GACA;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyJJ;;CAuBA;CACA;CACA;CACA;CACA;CAEA,WAAoB,mBAAyC;EAC5D,KACE,kBAAkB,IAAI,SAAS,KAAK,kBAAkB,IAAI,QAAQ,MACnE,KAAK,WACL,KAAK,WACJ,KAAK,YAAY,KAAKA,uBAAuB,KAAK,WAAW,KAAKC,qBAEnE,KAAKC,cAAc,KAAK;CAE1B;CAEA,SAAkB;EACjB,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAC1B,OAAO;EAGR,OAAO,IAAI;;KAER,KAAK,WACJ,IAAI,4EACJ,KAAK,SACJ,IAAI;SACF,KAAK,OAAO;gBAEd,KAAK,SAAS,WAAW,IACxB,IAAI,uEACJ,IAAI;;WAED,KAAK,SAAS,KACd,QAAQ,IAAI;;cAET,IAAI,YAAY,gBAAgB,KAAK,IAAI,QAAQ,IAChD,IAAI;;qBAEE,IAAI,SAAS;qBACb,IAAI,eAAe,IAAI,SAAS;yBAC5B,MACR,EAAG,OAA4B,MAAM,UAAU,OAAQ;oBAEzD,IAAI,yCAAyC;;;2CAGjB,IAAI,eAAe,IAAI,SAAS;8CAC7B,IAAI,QAAQ;;eAE3C,IAAI,cACH,IAAI,mCAAmC,IAAI,SAAS,WACpD,QAAQ;eACT,IAAI,cACH,IAAI,oCAAoC,IAAI,YAAY,WACxD,QAAQ;;iCAES,KAAKC,MAAM,SAAS,IAAI,QAAQ,IAAI,WAAW,GAAG;;;;;6BAKtD,KAAKA,MAAM,KAAK,IAAI,QAAQ,EAAE;0BACjC,MAAqB;GAChC,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;IACvC,EAAE,eAAe;IACjB,KAAKA,MAAM,KAAK,IAAI,QAAQ;GAC7B;EACD,EAAE;;gBAEA,KAAKA,MAAM,SAAS,IAAI,QAAQ,IAC/B,YACA,GAAG,IAAI,SAAS,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,SAAS,MAAM,EAAE,IAAI;;;;WAKnE,EAAE;;UAED,KAAK,eACJ,IAAI;;;;wBAIS,KAAK,aAAa;qBACrB,KAAKC,UAAU;;cAEtB,KAAK,eAAe,eAAe,YAAY;;cAGlD,QAAQ;SACV;;CAER;CAEA,MAAMF,cAAc,QAAiB;EACpC,KAAKF,sBAAsB,KAAK;EAChC,KAAKC,qBAAqB,KAAK;EAE/B,IAAI,CAAC,QAAQ;GACZ,KAAKI,UAAU;GACf,KAAK,WAAW,CAAC;EAClB;EAEA,MAAM,aAAa,EAAE,KAAKC;EAC1B,IAAI,QACH,KAAK,eAAe;OAEpB,KAAK,WAAW;EAEjB,KAAK,SAAS;EAEd,IAAI;GACH,MAAM,SAAS,MAAM,KAAK,OAAQ,KAAK,iBAAiB;IACvD,OAAO,KAAK;IACZ,OAAO;IACP,QAAQ,KAAKD;IACb,SAAS,EAAE,MAAM,KAAK;GACvB,CAAC;GAED,IAAI,eAAe,KAAKC,kBAAkB;GAG1C,MAAM,iBAAgC,OAAO,QAC3C,QAAQ,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CACtC,KAAK,QAAQ;IACb,MAAM,OAAO,IAAI;IACjB,OAAO;KACN,UAAU,IAAI;KACd,MAAM,IAAI;KACV,UAAU,YAAY,IAAI,IAAI;KAC9B,SAAS,IAAI;KACb,aAAa,cAAc,MAAM,MAAM;KACvC,aAAa,cAAc,MAAM,aAAa;KAC9C,UAAU,cAAc,MAAM,WAAW,KAAK,cAAc,MAAM,SAAS;IAC5E;GACD,CAAC;GAEF,KAAK,WAAW,SAAS,CAAC,GAAG,KAAK,UAAU,GAAG,cAAc,IAAI;GACjE,KAAK,eAAe,OAAO;GAC3B,KAAKD,UAAU,OAAO;EACvB,QAAQ;GACP,IAAI,eAAe,KAAKC,kBAAkB;GAC1C,KAAK,SAAS;GACd,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC;EAC/B,UAAU;GACT,IAAI,eAAe,KAAKA,kBAAkB;IACzC,KAAK,WAAW;IAChB,KAAK,eAAe;GACrB;EACD;CACD;CAEA,YAAY;EACX,KAAKJ,cAAc,IAAI;CACxB;AACD;YAlLE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,iBAAA,WAAA,WAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,iBAAA,WAAA,UAAA,KAAA,CAAA;YAG7B,MAAM,CAAA,GAAA,iBAAA,WAAA,YAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,iBAAA,WAAA,YAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,iBAAA,WAAA,gBAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,iBAAA,WAAA,UAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,iBAAA,WAAA,gBAAA,KAAA,CAAA;+BAnLP,cAAc,oBAAoB,CAAA,GAAA,gBAAA;AAqVnC,SAAS,cACR,MACA,KACgB;CAChB,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,MAAM,KAAK;CACjB,OAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,IAAI,MAAM;AAC1D"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { ForkRelay } from "../adapters/fork-relay.mjs";
|
|
2
2
|
import { DevWallet } from "../wallet/dev-wallet.mjs";
|
|
3
3
|
import { CoinRecord } from "./utils.mjs";
|
|
4
|
-
import * as _$lit from "lit";
|
|
5
4
|
import { LitElement } from "lit";
|
|
6
5
|
|
|
7
6
|
//#region src/ui/dev-wallet-panel.d.ts
|
|
8
7
|
type DevWalletDockStyle = 'corner-pill' | 'side-tab';
|
|
9
8
|
declare class DevWalletPanel extends LitElement {
|
|
10
9
|
#private;
|
|
11
|
-
static styles: (
|
|
10
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
12
11
|
wallet: DevWallet | null;
|
|
13
12
|
/** Optional pre-seeded coin metadata. Pass the generated `coins`
|
|
14
13
|
* constant from devstack codegen (`src/generated/coins.ts`) to skip
|
|
@@ -28,7 +27,7 @@ declare class DevWalletPanel extends LitElement {
|
|
|
28
27
|
private _isOpen;
|
|
29
28
|
willUpdate(changedProperties: Map<string, unknown>): void;
|
|
30
29
|
updated(): void;
|
|
31
|
-
render():
|
|
30
|
+
render(): import("lit").TemplateResult<1>;
|
|
32
31
|
connectedCallback(): void;
|
|
33
32
|
disconnectedCallback(): void;
|
|
34
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-panel.d.mts","names":[],"sources":["../../src/ui/dev-wallet-panel.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-panel.d.mts","names":[],"sources":["../../src/ui/dev-wallet-panel.ts"],"mappings":";;;;;;KAYY,kBAAA;AAAA,cAGC,cAAA,SAAuB,UAAA;EAAA;SACnB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAgPtB,MAAA,EAAQ,SAAA;EApPqB;AAAA;AAE9B;EAwPC,KAAA,EAAO,UAAA;;;;;;EAQP,SAAA,EAAW,SAAA;EA/PwB;;;EAqQnC,YAAA;EAGA,SAAA,EAAW,kBAAA;EAAA,QAGH,OAAA;EAKC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAe9B,OAAA;EAsBA,MAAA,kBAAM,cAAA;EAsFN,iBAAA;EAKA,oBAAA;AAAA;AAAA,QAMF,MAAA;EAAA,UACG,qBAAA;IACT,kBAAA,EAAoB,cAAc;EAAA;AAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { connectDialogStyles, sharedStyles } from "./styles.mjs";
|
|
2
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
2
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
3
3
|
import { WalletController } from "./wallet-controller.mjs";
|
|
4
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
5
|
import { customElement, property, state } from "lit/decorators.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-panel.mjs","names":["#closePanel","#ctrl","#hadPendingRequest","#renderSidebar","#togglePanel","#walletIcon","#closeIcon","#handleKeydown"],"sources":["../../src/ui/dev-wallet-panel.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 { ForkRelay } from '../adapters/fork-relay.js';\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { WalletController } from './wallet-controller.js';\n\nexport type DevWalletDockStyle = 'corner-pill' | 'side-tab';\n\n@customElement('dev-wallet-panel')\nexport class DevWalletPanel extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: fixed;\n\t\t\t\tinset: 0;\n\t\t\t\tz-index: 999999;\n\t\t\t\tfont-size: 13px;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\n\t\t\t.trigger {\n\t\t\t\tposition: fixed;\n\t\t\t\tright: 20px;\n\t\t\t\tbottom: 20px;\n\t\t\t\twidth: 40px;\n\t\t\t\theight: 40px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-md);\n\t\t\t\ttransition:\n\t\t\t\t\ttransform 120ms,\n\t\t\t\t\tbox-shadow 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t\tpointer-events: auto;\n\t\t\t\tz-index: 2;\n\t\t\t}\n\n\t\t\t.trigger:hover {\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tbox-shadow:\n\t\t\t\t\tvar(--dev-wallet-shadow-md),\n\t\t\t\t\t0 0 0 4px var(--dev-wallet-accent-fade);\n\t\t\t}\n\n\t\t\t.trigger.side-tab {\n\t\t\t\ttop: 50%;\n\t\t\t\tright: 0;\n\t\t\t\tbottom: auto;\n\t\t\t\twidth: 34px;\n\t\t\t\theight: 88px;\n\t\t\t\tborder-radius: 12px 0 0 12px;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t}\n\n\t\t\t.trigger.side-tab:hover {\n\t\t\t\ttransform: translateY(calc(-50% - 1px));\n\t\t\t}\n\n\t\t\t.trigger svg {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 3px;\n\t\t\t\tbottom: 3px;\n\t\t\t\twidth: 10px;\n\t\t\t\theight: 10px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 2px solid var(--dev-wallet-surface);\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t}\n\n\t\t\t.status-dot.notice {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tanimation: pulse-ring 1.6s ease-out infinite;\n\t\t\t}\n\n\t\t\t.scrim {\n\t\t\t\tposition: fixed;\n\t\t\t\tinset: 0;\n\t\t\t\tbackground: rgba(2, 6, 14, 0.4);\n\t\t\t\tpointer-events: auto;\n\t\t\t\tanimation: fadein 160ms ease-out;\n\t\t\t}\n\n\t\t\t.sidebar {\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 12px;\n\t\t\t\tright: 12px;\n\t\t\t\tbottom: 76px;\n\t\t\t\twidth: 400px;\n\t\t\t\tmax-width: calc(100vw - 24px);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-drawer);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t\tpointer-events: auto;\n\t\t\t\tanimation: slidein-right 240ms cubic-bezier(0.2, 0.7, 0.2, 1);\n\t\t\t}\n\n\t\t\t.status-strip {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-height: 30px;\n\t\t\t\tpadding: 6px 10px 6px 12px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t}\n\n\t\t\t.status-strip .host-origin {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\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.sidebar-header {\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 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: 1;\n\t\t\t}\n\n\t\t\t.brand {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.logo-mark {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder-radius: 7px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 22px),\n\t\t\t\t\tlinear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.logo-mark svg {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t}\n\n\t\t\t.title-stack {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tline-height: 1.1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.sidebar-title {\n\t\t\t\tfont-size: 12.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.version {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.header-spacer {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 8px;\n\t\t\t}\n\n\t\t\t.close-btn {\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.close-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.close-btn svg {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t}\n\n\t\t\t.sidebar-body {\n\t\t\t\toverflow-y: auto;\n\t\t\t\toverflow-x: hidden;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tpadding: 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\t@media (max-width: 520px) {\n\t\t\t\t.sidebar {\n\t\t\t\t\tleft: 12px;\n\t\t\t\t\twidth: auto;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** Optional pre-seeded coin metadata. Pass the generated `coins`\n\t * constant from devstack codegen (`src/generated/coins.ts`) to skip\n\t * per-coin RPC fetches in the balances list and signing modal. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t/** Phase 5 Subtopic 6 — fork admin relay. When set, the panel\n\t * surfaces a \"Fork\" tab that drives advance-clock,\n\t * advance-checkpoint, and impersonation slot management against\n\t * the devstack wallet-app server. Construct from the manifest\n\t * with `createForkRelayFromManifest(manifest)`. */\n\t@property({ attribute: false })\n\tforkRelay: ForkRelay | null = null;\n\n\t/** Optional upstream label (`'mainnet'`, `'testnet'`, …) sourced\n\t * from `meta.upstream` on the manifest. Falls back to inferring\n\t * from the active network literal when not provided. */\n\t@property({ type: String })\n\tforkUpstream = '';\n\n\t@property({ type: String, attribute: 'dock-style' })\n\tdockStyle: DevWalletDockStyle = 'corner-pill';\n\n\t@state()\n\tprivate _isOpen = false;\n\n\t#ctrl = new WalletController(this);\n\t#hadPendingRequest = false;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('coins')) {\n\t\t\tthis.#ctrl.coins = this.coins;\n\t\t}\n\t\tif (changedProperties.has('forkRelay')) {\n\t\t\tthis.#ctrl.forkRelay = this.forkRelay;\n\t\t}\n\t\tif (changedProperties.has('forkUpstream')) {\n\t\t\tthis.#ctrl.forkUpstream = this.forkUpstream;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\t// Refresh balances only when transitioning from having a pending request to not\n\t\tconst hasPending = this.#ctrl.pendingRequest !== null;\n\t\tif (this.#hadPendingRequest && !hasPending) {\n\t\t\tthis.updateComplete.then(() => {\n\t\t\t\tthis.shadowRoot\n\t\t\t\t\t?.querySelector<\n\t\t\t\t\t\timport('./dev-wallet-balances.js').DevWalletBalances\n\t\t\t\t\t>('dev-wallet-balances')\n\t\t\t\t\t?.refresh();\n\t\t\t});\n\t\t}\n\t\tthis.#hadPendingRequest = hasPending;\n\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t${this._isOpen ? this.#renderSidebar() : nothing}\n\t\t\t<button\n\t\t\t\tclass=\"trigger ${this.dockStyle === 'side-tab' ? 'side-tab' : 'corner-pill'}\"\n\t\t\t\tpart=\"trigger\"\n\t\t\t\taria-label=${this._isOpen ? 'Close Dev Wallet' : 'Open Dev Wallet'}\n\t\t\t\taria-expanded=${this._isOpen}\n\t\t\t\t@click=${this.#togglePanel}\n\t\t\t>\n\t\t\t\t${this.#walletIcon}\n\t\t\t\t<span\n\t\t\t\t\tclass=\"status-dot ${this.#ctrl.pendingRequest ? 'notice' : ''}\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t></span>\n\t\t\t</button>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n\n\t#renderSidebar() {\n\t\treturn html`\n\t\t\t<button class=\"scrim\" aria-label=\"Close Dev Wallet\" @click=${this.#closePanel}></button>\n\t\t\t<div class=\"sidebar\" part=\"sidebar\">\n\t\t\t\t<div class=\"status-strip\">\n\t\t\t\t\t<span class=\"chip chip-success\">connected</span>\n\t\t\t\t\t<span class=\"host-origin\">${globalThis.location?.origin ?? 'embedded host'}</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"close-btn\"\n\t\t\t\t\t\tpart=\"close-button\"\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t@click=${this.#closePanel}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.#closeIcon}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"sidebar-header\">\n\t\t\t\t\t<div class=\"brand\">\n\t\t\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t\t\t<span class=\"title-stack\">\n\t\t\t\t\t\t\t<span class=\"sidebar-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"header-spacer\"></span>\n\t\t\t\t\t${this.#ctrl.renderNetworkBadge()}\n\t\t\t\t</div>\n\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t\t<div class=\"sidebar-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget #walletIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t<rect x=\"2\" y=\"6\" width=\"20\" height=\"14\" rx=\"2.5\" />\n\t\t\t<path d=\"M2 10h20\" />\n\t\t\t<rect x=\"15\" y=\"12\" width=\"5\" height=\"4\" rx=\"1\" />\n\t\t\t<circle cx=\"17.5\" cy=\"14\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n\t\t</svg>`;\n\t}\n\n\tget #closeIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t<path d=\"M18 6L6 18\" />\n\t\t\t<path d=\"M6 6l12 12\" />\n\t\t</svg>`;\n\t}\n\n\t#togglePanel() {\n\t\tthis._isOpen = !this._isOpen;\n\t\tif (this._isOpen) {\n\t\t\tthis.#ctrl.syncState();\n\t\t}\n\t}\n\n\t#closePanel() {\n\t\tthis._isOpen = false;\n\t}\n\n\t#handleKeydown = (event: KeyboardEvent) => {\n\t\tif (event.key === 'Escape' && this._isOpen) {\n\t\t\tthis.#closePanel();\n\t\t}\n\t};\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\twindow.addEventListener('keydown', this.#handleKeydown);\n\t}\n\n\toverride disconnectedCallback() {\n\t\twindow.removeEventListener('keydown', this.#handleKeydown);\n\t\tsuper.disconnectedCallback();\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-panel': DevWalletPanel;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-panel.mjs","names":["#closePanel","#ctrl","#hadPendingRequest","#renderSidebar","#togglePanel","#walletIcon","#closeIcon","#handleKeydown"],"sources":["../../src/ui/dev-wallet-panel.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 { ForkRelay } from '../adapters/fork-relay.js';\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { WalletController } from './wallet-controller.js';\n\nexport type DevWalletDockStyle = 'corner-pill' | 'side-tab';\n\n@customElement('dev-wallet-panel')\nexport class DevWalletPanel extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: fixed;\n\t\t\t\tinset: 0;\n\t\t\t\tz-index: 999999;\n\t\t\t\tfont-size: 13px;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\n\t\t\t.trigger {\n\t\t\t\tposition: fixed;\n\t\t\t\tright: 20px;\n\t\t\t\tbottom: 20px;\n\t\t\t\twidth: 40px;\n\t\t\t\theight: 40px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-md);\n\t\t\t\ttransition:\n\t\t\t\t\ttransform 120ms,\n\t\t\t\t\tbox-shadow 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t\tpointer-events: auto;\n\t\t\t\tz-index: 2;\n\t\t\t}\n\n\t\t\t.trigger:hover {\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tbox-shadow:\n\t\t\t\t\tvar(--dev-wallet-shadow-md),\n\t\t\t\t\t0 0 0 4px var(--dev-wallet-accent-fade);\n\t\t\t}\n\n\t\t\t.trigger.side-tab {\n\t\t\t\ttop: 50%;\n\t\t\t\tright: 0;\n\t\t\t\tbottom: auto;\n\t\t\t\twidth: 34px;\n\t\t\t\theight: 88px;\n\t\t\t\tborder-radius: 12px 0 0 12px;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t}\n\n\t\t\t.trigger.side-tab:hover {\n\t\t\t\ttransform: translateY(calc(-50% - 1px));\n\t\t\t}\n\n\t\t\t.trigger svg {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 3px;\n\t\t\t\tbottom: 3px;\n\t\t\t\twidth: 10px;\n\t\t\t\theight: 10px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 2px solid var(--dev-wallet-surface);\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t}\n\n\t\t\t.status-dot.notice {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tanimation: pulse-ring 1.6s ease-out infinite;\n\t\t\t}\n\n\t\t\t.scrim {\n\t\t\t\tposition: fixed;\n\t\t\t\tinset: 0;\n\t\t\t\tbackground: rgba(2, 6, 14, 0.4);\n\t\t\t\tpointer-events: auto;\n\t\t\t\tanimation: fadein 160ms ease-out;\n\t\t\t}\n\n\t\t\t.sidebar {\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 12px;\n\t\t\t\tright: 12px;\n\t\t\t\tbottom: 76px;\n\t\t\t\twidth: 400px;\n\t\t\t\tmax-width: calc(100vw - 24px);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-drawer);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t\tpointer-events: auto;\n\t\t\t\tanimation: slidein-right 240ms cubic-bezier(0.2, 0.7, 0.2, 1);\n\t\t\t}\n\n\t\t\t.status-strip {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-height: 30px;\n\t\t\t\tpadding: 6px 10px 6px 12px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t}\n\n\t\t\t.status-strip .host-origin {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\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.sidebar-header {\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 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: 1;\n\t\t\t}\n\n\t\t\t.brand {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.logo-mark {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder-radius: 7px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 22px),\n\t\t\t\t\tlinear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.logo-mark svg {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t}\n\n\t\t\t.title-stack {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tline-height: 1.1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.sidebar-title {\n\t\t\t\tfont-size: 12.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.version {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.header-spacer {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 8px;\n\t\t\t}\n\n\t\t\t.close-btn {\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.close-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.close-btn svg {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t}\n\n\t\t\t.sidebar-body {\n\t\t\t\toverflow-y: auto;\n\t\t\t\toverflow-x: hidden;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tpadding: 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\t@media (max-width: 520px) {\n\t\t\t\t.sidebar {\n\t\t\t\t\tleft: 12px;\n\t\t\t\t\twidth: auto;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** Optional pre-seeded coin metadata. Pass the generated `coins`\n\t * constant from devstack codegen (`src/generated/coins.ts`) to skip\n\t * per-coin RPC fetches in the balances list and signing modal. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t/** Phase 5 Subtopic 6 — fork admin relay. When set, the panel\n\t * surfaces a \"Fork\" tab that drives advance-clock,\n\t * advance-checkpoint, and impersonation slot management against\n\t * the devstack wallet-app server. Construct from the manifest\n\t * with `createForkRelayFromManifest(manifest)`. */\n\t@property({ attribute: false })\n\tforkRelay: ForkRelay | null = null;\n\n\t/** Optional upstream label (`'mainnet'`, `'testnet'`, …) sourced\n\t * from `meta.upstream` on the manifest. Falls back to inferring\n\t * from the active network literal when not provided. */\n\t@property({ type: String })\n\tforkUpstream = '';\n\n\t@property({ type: String, attribute: 'dock-style' })\n\tdockStyle: DevWalletDockStyle = 'corner-pill';\n\n\t@state()\n\tprivate _isOpen = false;\n\n\t#ctrl = new WalletController(this);\n\t#hadPendingRequest = false;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('coins')) {\n\t\t\tthis.#ctrl.coins = this.coins;\n\t\t}\n\t\tif (changedProperties.has('forkRelay')) {\n\t\t\tthis.#ctrl.forkRelay = this.forkRelay;\n\t\t}\n\t\tif (changedProperties.has('forkUpstream')) {\n\t\t\tthis.#ctrl.forkUpstream = this.forkUpstream;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\t// Refresh balances only when transitioning from having a pending request to not\n\t\tconst hasPending = this.#ctrl.pendingRequest !== null;\n\t\tif (this.#hadPendingRequest && !hasPending) {\n\t\t\tthis.updateComplete.then(() => {\n\t\t\t\tthis.shadowRoot\n\t\t\t\t\t?.querySelector<\n\t\t\t\t\t\timport('./dev-wallet-balances.js').DevWalletBalances\n\t\t\t\t\t>('dev-wallet-balances')\n\t\t\t\t\t?.refresh();\n\t\t\t});\n\t\t}\n\t\tthis.#hadPendingRequest = hasPending;\n\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t${this._isOpen ? this.#renderSidebar() : nothing}\n\t\t\t<button\n\t\t\t\tclass=\"trigger ${this.dockStyle === 'side-tab' ? 'side-tab' : 'corner-pill'}\"\n\t\t\t\tpart=\"trigger\"\n\t\t\t\taria-label=${this._isOpen ? 'Close Dev Wallet' : 'Open Dev Wallet'}\n\t\t\t\taria-expanded=${this._isOpen}\n\t\t\t\t@click=${this.#togglePanel}\n\t\t\t>\n\t\t\t\t${this.#walletIcon}\n\t\t\t\t<span\n\t\t\t\t\tclass=\"status-dot ${this.#ctrl.pendingRequest ? 'notice' : ''}\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t></span>\n\t\t\t</button>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n\n\t#renderSidebar() {\n\t\treturn html`\n\t\t\t<button class=\"scrim\" aria-label=\"Close Dev Wallet\" @click=${this.#closePanel}></button>\n\t\t\t<div class=\"sidebar\" part=\"sidebar\">\n\t\t\t\t<div class=\"status-strip\">\n\t\t\t\t\t<span class=\"chip chip-success\">connected</span>\n\t\t\t\t\t<span class=\"host-origin\">${globalThis.location?.origin ?? 'embedded host'}</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"close-btn\"\n\t\t\t\t\t\tpart=\"close-button\"\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t@click=${this.#closePanel}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.#closeIcon}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"sidebar-header\">\n\t\t\t\t\t<div class=\"brand\">\n\t\t\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t\t\t<span class=\"title-stack\">\n\t\t\t\t\t\t\t<span class=\"sidebar-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"header-spacer\"></span>\n\t\t\t\t\t${this.#ctrl.renderNetworkBadge()}\n\t\t\t\t</div>\n\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t\t<div class=\"sidebar-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget #walletIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t<rect x=\"2\" y=\"6\" width=\"20\" height=\"14\" rx=\"2.5\" />\n\t\t\t<path d=\"M2 10h20\" />\n\t\t\t<rect x=\"15\" y=\"12\" width=\"5\" height=\"4\" rx=\"1\" />\n\t\t\t<circle cx=\"17.5\" cy=\"14\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n\t\t</svg>`;\n\t}\n\n\tget #closeIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t<path d=\"M18 6L6 18\" />\n\t\t\t<path d=\"M6 6l12 12\" />\n\t\t</svg>`;\n\t}\n\n\t#togglePanel() {\n\t\tthis._isOpen = !this._isOpen;\n\t\tif (this._isOpen) {\n\t\t\tthis.#ctrl.syncState();\n\t\t}\n\t}\n\n\t#closePanel() {\n\t\tthis._isOpen = false;\n\t}\n\n\t#handleKeydown = (event: KeyboardEvent) => {\n\t\tif (event.key === 'Escape' && this._isOpen) {\n\t\t\tthis.#closePanel();\n\t\t}\n\t};\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\twindow.addEventListener('keydown', this.#handleKeydown);\n\t}\n\n\toverride disconnectedCallback() {\n\t\twindow.removeEventListener('keydown', this.#handleKeydown);\n\t\tsuper.disconnectedCallback();\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-panel': DevWalletPanel;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement } from "lit";
|
|
3
2
|
import { ClientWithCoreApi } from "@mysten/sui/client";
|
|
4
3
|
|
|
5
4
|
//#region src/ui/dev-wallet-popup.d.ts
|
|
6
5
|
declare class DevWalletPopup extends LitElement {
|
|
7
6
|
#private;
|
|
8
|
-
static styles: (
|
|
7
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
9
8
|
walletName: string;
|
|
10
9
|
requestType: 'connect' | 'sign-transaction' | 'sign-and-execute-transaction' | 'sign-personal-message';
|
|
11
10
|
appName: string;
|
|
@@ -22,7 +21,7 @@ declare class DevWalletPopup extends LitElement {
|
|
|
22
21
|
}>;
|
|
23
22
|
private _request;
|
|
24
23
|
willUpdate(changed: Map<string, unknown>): void;
|
|
25
|
-
render():
|
|
24
|
+
render(): import("lit").TemplateResult<1>;
|
|
26
25
|
}
|
|
27
26
|
declare global {
|
|
28
27
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-popup.d.mts","names":[],"sources":["../../src/ui/dev-wallet-popup.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-popup.d.mts","names":[],"sources":["../../src/ui/dev-wallet-popup.ts"],"mappings":";;;;cAaa,cAAA,SAAuB,UAAA;EAAA;SACnB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAqDtB,UAAA;EAGA,WAAA;EAOA,OAAA;EAGA,MAAA;EAGA,OAAA;EAGA,YAAA;EAGA,KAAA;EAGA,IAAA,WAAe,UAAA;EAGf,MAAA,EAAQ,iBAAA;EAGR,eAAA,EAAiB,KAAA;IAAQ,OAAA;IAAiB,KAAA;IAAgB,WAAA;EAAA;EAAA,QAGlD,QAAA;EAIC,UAAA,CAAW,OAAA,EAAS,GAAA;EA4BpB,MAAA,kBAAM,cAAA;AAAA;AAAA,QAqCR,MAAA;EAAA,UACG,qBAAA;IACT,kBAAA,EAAoB,cAAc;EAAA;AAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sharedStyles } from "./styles.mjs";
|
|
2
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
2
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
3
3
|
import "./dev-wallet-connect.mjs";
|
|
4
4
|
import "./dev-wallet-signing.mjs";
|
|
5
5
|
import { LitElement, css, html } from "lit";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-popup.mjs","names":["#requestId","#renderConnect","#renderSigning"],"sources":["../../src/ui/dev-wallet-popup.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { sharedStyles } from './styles.js';\nimport './dev-wallet-connect.js';\nimport './dev-wallet-signing.js';\n\n@customElement('dev-wallet-popup')\nexport class DevWalletPopup extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tpadding: 20px;\n\t\t\t\tbackground-color: var(--dev-wallet-bg-0);\n\t\t\t\tbackground-image:\n\t\t\t\t\tlinear-gradient(var(--dev-wallet-border) 1px, transparent 1px),\n\t\t\t\t\tlinear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);\n\t\t\t\tbackground-size: 32px 32px;\n\t\t\t}\n\n\t\t\t.popup-card {\n\t\t\t\twidth: 440px;\n\t\t\t\tmax-height: min(680px, 86vh);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\n\t\t\t.popup-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 12px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.popup-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.popup-body {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\twalletName = 'Dev Wallet (Web)';\n\n\t@property({ type: String })\n\trequestType:\n\t\t| 'connect'\n\t\t| 'sign-transaction'\n\t\t| 'sign-and-execute-transaction'\n\t\t| 'sign-personal-message' = 'connect';\n\n\t@property({ type: String })\n\tappName = '';\n\n\t@property({ type: String })\n\tappUrl = '';\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ type: String })\n\taccountLabel = '';\n\n\t@property({ type: String })\n\tchain = '';\n\n\t@property({ attribute: false })\n\tdata: string | Uint8Array | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@property({ attribute: false })\n\tconnectAccounts: Array<{ address: string; label?: string; adapterName?: string }> = [];\n\n\t@state()\n\tprivate _request: PendingSigningRequest | null = null;\n\n\t#requestId: string | null = null;\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (\n\t\t\tthis.requestType !== 'connect' &&\n\t\t\t(changed.has('requestType') ||\n\t\t\t\tchanged.has('address') ||\n\t\t\t\tchanged.has('accountLabel') ||\n\t\t\t\tchanged.has('chain') ||\n\t\t\t\tchanged.has('data'))\n\t\t) {\n\t\t\tif (!this.#requestId) {\n\t\t\t\tthis.#requestId = crypto.randomUUID();\n\t\t\t}\n\t\t\tthis._request = {\n\t\t\t\tid: this.#requestId,\n\t\t\t\ttype: this.requestType as PendingSigningRequest['type'],\n\t\t\t\taccount: {\n\t\t\t\t\taddress: this.address,\n\t\t\t\t\tlabel: this.accountLabel || undefined,\n\t\t\t\t\tpublicKey: new Uint8Array(0),\n\t\t\t\t\tchains: [],\n\t\t\t\t\tfeatures: [],\n\t\t\t\t},\n\t\t\t\tchain: this.chain,\n\t\t\t\tdata: this.data ?? '',\n\t\t\t};\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"popup-card\" part=\"card\">\n\t\t\t\t<div class=\"popup-header\">\n\t\t\t\t\t<span class=\"popup-title\">${this.walletName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"popup-body\">\n\t\t\t\t\t${this.requestType === 'connect' ? this.#renderConnect() : this.#renderSigning()}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderConnect() {\n\t\treturn html`\n\t\t\t<dev-wallet-connect\n\t\t\t\texportparts=\"approve-button: connect-approve-button, reject-button: connect-reject-button, account-list: connect-account-list, error-message: connect-error-message\"\n\t\t\t\t.appName=${this.appName}\n\t\t\t\t.appUrl=${this.appUrl}\n\t\t\t\t.accounts=${this.connectAccounts}\n\t\t\t></dev-wallet-connect>\n\t\t`;\n\t}\n\n\t#renderSigning() {\n\t\tif (!this._request) return html``;\n\n\t\treturn html`\n\t\t\t<dev-wallet-signing\n\t\t\t\texportparts=\"approve-button: signing-approve-button, reject-button: signing-reject-button, request-type: signing-request-type, empty-state: signing-empty-state, error-message: signing-error-message, footer: signing-footer\"\n\t\t\t\t.request=${this._request}\n\t\t\t\t.client=${this.client}\n\t\t\t></dev-wallet-signing>\n\t\t`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-popup': DevWalletPopup;\n\t}\n}\n"],"mappings":";;;;;;;AAaO,IAAA,iBAAA,MAAM,uBAAuB,WAAW;;;oBAsDjC;qBAOgB;iBAGnB;gBAGD;iBAGC;sBAGK;eAGP;cAG2B;gBAGA;yBAGiD,
|
|
1
|
+
{"version":3,"file":"dev-wallet-popup.mjs","names":["#requestId","#renderConnect","#renderSigning"],"sources":["../../src/ui/dev-wallet-popup.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { sharedStyles } from './styles.js';\nimport './dev-wallet-connect.js';\nimport './dev-wallet-signing.js';\n\n@customElement('dev-wallet-popup')\nexport class DevWalletPopup extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tpadding: 20px;\n\t\t\t\tbackground-color: var(--dev-wallet-bg-0);\n\t\t\t\tbackground-image:\n\t\t\t\t\tlinear-gradient(var(--dev-wallet-border) 1px, transparent 1px),\n\t\t\t\t\tlinear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);\n\t\t\t\tbackground-size: 32px 32px;\n\t\t\t}\n\n\t\t\t.popup-card {\n\t\t\t\twidth: 440px;\n\t\t\t\tmax-height: min(680px, 86vh);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\n\t\t\t.popup-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 12px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.popup-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.popup-body {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\twalletName = 'Dev Wallet (Web)';\n\n\t@property({ type: String })\n\trequestType:\n\t\t| 'connect'\n\t\t| 'sign-transaction'\n\t\t| 'sign-and-execute-transaction'\n\t\t| 'sign-personal-message' = 'connect';\n\n\t@property({ type: String })\n\tappName = '';\n\n\t@property({ type: String })\n\tappUrl = '';\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ type: String })\n\taccountLabel = '';\n\n\t@property({ type: String })\n\tchain = '';\n\n\t@property({ attribute: false })\n\tdata: string | Uint8Array | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@property({ attribute: false })\n\tconnectAccounts: Array<{ address: string; label?: string; adapterName?: string }> = [];\n\n\t@state()\n\tprivate _request: PendingSigningRequest | null = null;\n\n\t#requestId: string | null = null;\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (\n\t\t\tthis.requestType !== 'connect' &&\n\t\t\t(changed.has('requestType') ||\n\t\t\t\tchanged.has('address') ||\n\t\t\t\tchanged.has('accountLabel') ||\n\t\t\t\tchanged.has('chain') ||\n\t\t\t\tchanged.has('data'))\n\t\t) {\n\t\t\tif (!this.#requestId) {\n\t\t\t\tthis.#requestId = crypto.randomUUID();\n\t\t\t}\n\t\t\tthis._request = {\n\t\t\t\tid: this.#requestId,\n\t\t\t\ttype: this.requestType as PendingSigningRequest['type'],\n\t\t\t\taccount: {\n\t\t\t\t\taddress: this.address,\n\t\t\t\t\tlabel: this.accountLabel || undefined,\n\t\t\t\t\tpublicKey: new Uint8Array(0),\n\t\t\t\t\tchains: [],\n\t\t\t\t\tfeatures: [],\n\t\t\t\t},\n\t\t\t\tchain: this.chain,\n\t\t\t\tdata: this.data ?? '',\n\t\t\t};\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"popup-card\" part=\"card\">\n\t\t\t\t<div class=\"popup-header\">\n\t\t\t\t\t<span class=\"popup-title\">${this.walletName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"popup-body\">\n\t\t\t\t\t${this.requestType === 'connect' ? this.#renderConnect() : this.#renderSigning()}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderConnect() {\n\t\treturn html`\n\t\t\t<dev-wallet-connect\n\t\t\t\texportparts=\"approve-button: connect-approve-button, reject-button: connect-reject-button, account-list: connect-account-list, error-message: connect-error-message\"\n\t\t\t\t.appName=${this.appName}\n\t\t\t\t.appUrl=${this.appUrl}\n\t\t\t\t.accounts=${this.connectAccounts}\n\t\t\t></dev-wallet-connect>\n\t\t`;\n\t}\n\n\t#renderSigning() {\n\t\tif (!this._request) return html``;\n\n\t\treturn html`\n\t\t\t<dev-wallet-signing\n\t\t\t\texportparts=\"approve-button: signing-approve-button, reject-button: signing-reject-button, request-type: signing-request-type, empty-state: signing-empty-state, error-message: signing-error-message, footer: signing-footer\"\n\t\t\t\t.request=${this._request}\n\t\t\t\t.client=${this.client}\n\t\t\t></dev-wallet-signing>\n\t\t`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-popup': DevWalletPopup;\n\t}\n}\n"],"mappings":";;;;;;;AAaO,IAAA,iBAAA,MAAM,uBAAuB,WAAW;;;oBAsDjC;qBAOgB;iBAGnB;gBAGD;iBAGC;sBAGK;eAGP;cAG2B;gBAGA;yBAGiD,CAAC;kBAGpC;oBAErB;;;gBAzFH,CACxB,cACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDJ;;CAuCA;CAEA,WAAoB,SAA+B;EAClD,IACC,KAAK,gBAAgB,cACpB,QAAQ,IAAI,aAAa,KACzB,QAAQ,IAAI,SAAS,KACrB,QAAQ,IAAI,cAAc,KAC1B,QAAQ,IAAI,OAAO,KACnB,QAAQ,IAAI,MAAM,IAClB;GACD,IAAI,CAAC,KAAKA,YACT,KAAKA,aAAa,OAAO,WAAW;GAErC,KAAK,WAAW;IACf,IAAI,KAAKA;IACT,MAAM,KAAK;IACX,SAAS;KACR,SAAS,KAAK;KACd,OAAO,KAAK,gBAAgB;KAC5B,WAAW,IAAI,WAAW,CAAC;KAC3B,QAAQ,CAAC;KACT,UAAU,CAAC;IACZ;IACA,OAAO,KAAK;IACZ,MAAM,KAAK,QAAQ;GACpB;EACD;CACD;CAEA,SAAkB;EACjB,OAAO,IAAI;;;iCAGoB,KAAK,WAAW;;;OAG1C,KAAK,gBAAgB,YAAY,KAAKC,eAAe,IAAI,KAAKC,eAAe,EAAE;;;;CAIrF;CAEA,iBAAiB;EAChB,OAAO,IAAI;;;eAGE,KAAK,QAAQ;cACd,KAAK,OAAO;gBACV,KAAK,gBAAgB;;;CAGpC;CAEA,iBAAiB;EAChB,IAAI,CAAC,KAAK,UAAU,OAAO,IAAI;EAE/B,OAAO,IAAI;;;eAGE,KAAK,SAAS;cACf,KAAK,OAAO;;;CAGzB;AACD;YAtGE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,eAAA,WAAA,cAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,eAAA,WAAA,eAAA,KAAA,CAAA;YAOzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,eAAA,WAAA,WAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,eAAA,WAAA,UAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,eAAA,WAAA,WAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,eAAA,WAAA,gBAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,eAAA,WAAA,SAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,eAAA,WAAA,QAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,eAAA,WAAA,UAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,eAAA,WAAA,mBAAA,KAAA,CAAA;YAG7B,MAAM,CAAA,GAAA,eAAA,WAAA,YAAA,KAAA,CAAA;6BAxFP,cAAc,kBAAkB,CAAA,GAAA,cAAA"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { SignerAdapter } from "../types.mjs";
|
|
2
2
|
import { DevWallet } from "../wallet/dev-wallet.mjs";
|
|
3
3
|
import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
|
|
4
|
-
import * as _$lit from "lit";
|
|
5
4
|
import { LitElement } from "lit";
|
|
6
5
|
|
|
7
6
|
//#region src/ui/dev-wallet-settings.d.ts
|
|
8
7
|
declare class DevWalletSettings extends LitElement {
|
|
9
8
|
#private;
|
|
10
|
-
static styles: (
|
|
9
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
11
10
|
wallet: DevWallet | null;
|
|
12
11
|
accounts: readonly ReadonlyWalletAccount[];
|
|
13
12
|
adapters: SignerAdapter[];
|
|
@@ -20,7 +19,7 @@ declare class DevWalletSettings extends LitElement {
|
|
|
20
19
|
private _editingNetwork;
|
|
21
20
|
private _editingUrl;
|
|
22
21
|
private _copied;
|
|
23
|
-
render():
|
|
22
|
+
render(): import("lit").TemplateResult<1>;
|
|
24
23
|
}
|
|
25
24
|
declare global {
|
|
26
25
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-settings.d.mts","names":[],"sources":["../../src/ui/dev-wallet-settings.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-settings.d.mts","names":[],"sources":["../../src/ui/dev-wallet-settings.ts"],"mappings":";;;;;;cAwBa,iBAAA,SAA0B,UAAA;EAAA;SACtB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAiVtB,MAAA,EAAQ,SAAA;EAGR,QAAA,WAAmB,qBAAA;EAGnB,QAAA,EAAU,aAAA;EAGV,aAAA;EAGA,iBAAA;EAAA,QAGQ,eAAA;EAAA,QAGA,YAAA;EAAA,QAGA,WAAA;EAAA,QAGA,MAAA;EAAA,QAGA,eAAA;EAAA,QAGA,WAAA;EAAA,QAGA,OAAA;EAEC,MAAA,kBAAM,cAAA;AAAA;AAAA,QAmWR,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAiB;EAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { badgeStyles, cardItemStyles, formInputStyles, iconButtonStyles, inlineErrorStyles, listContainerStyles, monoTruncateStyles, sectionHeaderStyles, sharedStyles } from "./styles.mjs";
|
|
2
2
|
import { NETWORK_COLORS, emitEvent, 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 "./dev-wallet-accounts.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-settings.mjs","names":["#renderSummary","#renderNetworks","#hasCliAdapter","#renderCliSigner","#renderAccounts","#renderBookmarklet","#saveNetworkUrl","#cancelEditNetwork","#startEditNetwork","#removeNetwork","#renderAddNetworkForm","#addNetwork","#cancelAddNetwork","#copySnippet"],"sources":["../../src/ui/dev-wallet-settings.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport type { SignerAdapter } from '../types.js';\nimport {\n\tbadgeStyles,\n\tcardItemStyles,\n\tformInputStyles,\n\ticonButtonStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsectionHeaderStyles,\n\tsharedStyles,\n} from './styles.js';\nimport { emitEvent, formatAddress, getErrorMessage, NETWORK_COLORS } from './utils.js';\nimport './dev-wallet-accounts.js';\n\n@customElement('dev-wallet-settings')\nexport class DevWalletSettings extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tformInputStyles,\n\t\ticonButtonStyles,\n\t\tbadgeStyles,\n\t\tinlineErrorStyles,\n\t\tmonoTruncateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tpadding: 14px;\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t\tpadding: 12px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbackground: var(--dev-wallet-surface);\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.settings-summary {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.summary-cell {\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.summary-label {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9.5px;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.summary-value {\n\t\t\t\tmargin-top: 5px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-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.network-item {\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 9px 10px;\n\t\t\t}\n\n\t\t\t.network-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.network-name {\n\t\t\t\tflex: 1;\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t}\n\n\t\t\t.network-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.network-url {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.network-url-input {\n\t\t\t\tpadding: 3px 6px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-primary);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t}\n\n\t\t\t.network-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 2px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.btn-icon {\n\t\t\t\twidth: 22px;\n\t\t\t\theight: 22px;\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.btn-icon-danger:hover {\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.network-active-badge {\n\t\t\t\theight: 16px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.add-network-form {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tpadding: 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px dashed var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.form-input {\n\t\t\t\tpadding: 6px 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.form-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.btn-sm {\n\t\t\t\tpadding: 5px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.btn-add {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t}\n\n\t\t\t.btn-add:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t}\n\n\t\t\t.btn-cancel {\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.btn-toggle {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\theight: 30px;\n\t\t\t\tpadding: 0 10px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t}\n\n\t\t\t.btn-toggle: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.cli-section-column {\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: flex-start;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.cli-header-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.cli-accounts-list {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding-left: 16px;\n\t\t\t}\n\n\t\t\t.cli-accounts-list .network-url {\n\t\t\t\tpadding: 2px 0;\n\t\t\t}\n\n\t\t\t.cli-hint {\n\t\t\t\tpadding-left: 16px;\n\t\t\t\tmargin-top: 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.cli-unpaired-hint {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.about {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tline-height: 1.5;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tmargin-top: 4px;\n\t\t\t}\n\n\t\t\t.bookmarklet-link-wrapper {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.bookmarklet-link {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tpadding: 8px 14px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\ttext-decoration: none;\n\t\t\t\tcursor: grab;\n\t\t\t\tuser-select: none;\n\t\t\t}\n\n\t\t\t.bookmarklet-link:hover {\n\t\t\t\topacity: 0.9;\n\t\t\t}\n\n\t\t\t.bookmarklet-link:active {\n\t\t\t\tcursor: grabbing;\n\t\t\t}\n\n\t\t\t.bookmarklet-url {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t\tuser-select: all;\n\t\t\t}\n\n\t\t\t.console-snippet {\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t.console-snippet-header {\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\tgap: 8px;\n\t\t\t\tpadding: 7px 8px 7px 10px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: color-mix(in srgb, var(--dev-wallet-bg-1) 72%, transparent);\n\t\t\t}\n\n\t\t\t.console-snippet-label {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.console-snippet-code {\n\t\t\t\tmargin: 0;\n\t\t\t\tmax-width: 100%;\n\t\t\t\tpadding: 10px 12px 12px;\n\t\t\t\toverflow-x: auto;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tline-height: 1.5;\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\toverflow-wrap: anywhere;\n\t\t\t\tuser-select: all;\n\t\t\t}\n\n\t\t\t.btn-copy {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmin-width: 54px;\n\t\t\t\theight: 24px;\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcursor: pointer;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.btn-copy:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t@media (max-width: 420px) {\n\t\t\t\t.settings-summary {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t@property({ attribute: false })\n\taccounts: readonly ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t@state()\n\tprivate _showAddNetwork = false;\n\n\t@state()\n\tprivate _networkName = '';\n\n\t@state()\n\tprivate _networkUrl = '';\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _editingNetwork: string | null = null;\n\n\t@state()\n\tprivate _editingUrl = '';\n\n\t@state()\n\tprivate _copied = false;\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"section\">${this.#renderSummary()}</div>\n\t\t\t<div class=\"section\">${this.#renderNetworks()}</div>\n\t\t\t${this.#hasCliAdapter()\n\t\t\t\t? html`<div class=\"section\">${this.#renderCliSigner()}</div>`\n\t\t\t\t: nothing}\n\t\t\t<div class=\"section\">${this.#renderAccounts()}</div>\n\t\t\t${this.bookmarkletOrigin\n\t\t\t\t? html`<div class=\"section\">${this.#renderBookmarklet()}</div>`\n\t\t\t\t: nothing}\n\t\t`;\n\t}\n\n\t#renderSummary() {\n\t\tconst activeNetwork = this.wallet?.activeNetwork ?? 'none';\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Wallet</h3>\n\t\t\t<div class=\"settings-summary\">\n\t\t\t\t<div class=\"summary-cell\">\n\t\t\t\t\t<div class=\"summary-label\">Network</div>\n\t\t\t\t\t<div class=\"summary-value\">${activeNetwork}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"summary-cell\">\n\t\t\t\t\t<div class=\"summary-label\">Accounts</div>\n\t\t\t\t\t<div class=\"summary-value\">${this.accounts.length}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"summary-cell\">\n\t\t\t\t\t<div class=\"summary-label\">Adapters</div>\n\t\t\t\t\t<div class=\"summary-value\">${this.adapters.length}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderNetworks() {\n\t\tif (!this.wallet) return nothing;\n\n\t\tconst networks = this.wallet.availableNetworks;\n\t\tconst activeNetwork = this.wallet.activeNetwork;\n\t\tconst urls = this.wallet.networkUrls;\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Networks</h3>\n\t\t\t<div class=\"network-list\">\n\t\t\t\t${networks.map((name) => {\n\t\t\t\t\tconst color = NETWORK_COLORS[name] ?? '#6b7280';\n\t\t\t\t\tconst isActive = name === activeNetwork;\n\t\t\t\t\tconst isEditing = this._editingNetwork === name;\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"network-item ${isActive ? 'active' : ''}\">\n\t\t\t\t\t\t\t<span class=\"network-dot\" style=\"background: ${color}\"></span>\n\t\t\t\t\t\t\t<div class=\"network-info\">\n\t\t\t\t\t\t\t\t<span class=\"network-name\">${name}</span>\n\t\t\t\t\t\t\t\t${isEditing\n\t\t\t\t\t\t\t\t\t? html`<input\n\t\t\t\t\t\t\t\t\t\t\tclass=\"network-url-input\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t.value=${this._editingUrl}\n\t\t\t\t\t\t\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\tthis._editingUrl = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') this.#saveNetworkUrl(name);\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelEditNetwork();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t: html`<span class=\"network-url\" title=${urls[name] ?? ''}\n\t\t\t\t\t\t\t\t\t\t\t>${urls[name] ?? ''}</span\n\t\t\t\t\t\t\t\t\t\t>`}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"network-actions\">\n\t\t\t\t\t\t\t\t${isEditing\n\t\t\t\t\t\t\t\t\t? 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=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Save\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Save URL\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#saveNetworkUrl(name)}\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✓\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<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Cancel\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Cancel editing\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${this.#cancelEditNetwork}\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✕\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: 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=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Edit URL\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Edit network URL\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#startEditNetwork(name, urls[name] ?? '')}\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✎\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${!isActive\n\t\t\t\t\t\t\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon btn-icon-danger\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Remove network\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#removeNetwork(name)}\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\t\t✕\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t`}\n\t\t\t\t\t\t\t\t${isActive ? html`<span class=\"network-active-badge\">Active</span>` : nothing}\n\t\t\t\t\t\t\t</div>\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${this._showAddNetwork\n\t\t\t\t? this.#renderAddNetworkForm()\n\t\t\t\t: html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"btn-toggle\"\n\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\tthis._showAddNetwork = true;\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+ Add Network\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\t#renderAddNetworkForm() {\n\t\treturn html`\n\t\t\t<div class=\"add-network-form\">\n\t\t\t\t<input\n\t\t\t\t\tclass=\"form-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"Network name (e.g. custom)\"\n\t\t\t\t\t.value=${this._networkName}\n\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\tthis._networkName = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"form-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"gRPC URL (e.g. http://localhost:9000)\"\n\t\t\t\t\t.value=${this._networkUrl}\n\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\tthis._networkUrl = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t}}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter') this.#addNetwork();\n\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelAddNetwork();\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t${this._error ? html`<div class=\"error\">${this._error}</div>` : nothing}\n\t\t\t\t<div class=\"form-actions\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-sm btn-add\"\n\t\t\t\t\t\t?disabled=${!this._networkName.trim() || !this._networkUrl.trim()}\n\t\t\t\t\t\t@click=${this.#addNetwork}\n\t\t\t\t\t>\n\t\t\t\t\t\tAdd\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"btn-sm btn-cancel\" @click=${this.#cancelAddNetwork}>Cancel</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#hasCliAdapter(): boolean {\n\t\treturn this.adapters.some((a) => a.id === 'remote-cli');\n\t}\n\n\t#renderCliSigner() {\n\t\tconst cliAdapter = this.adapters.find((a) => a.id === 'remote-cli');\n\t\tif (!cliAdapter) return nothing;\n\n\t\tconst isPaired = 'isPaired' in cliAdapter && (cliAdapter as { isPaired: boolean }).isPaired;\n\t\tconst cliAccounts = cliAdapter.getAccounts();\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">CLI Signer</h3>\n\t\t\t${isPaired\n\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"network-item active cli-section-column\">\n\t\t\t\t\t\t\t<div class=\"cli-header-row\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"network-dot\"\n\t\t\t\t\t\t\t\t\tstyle=\"background: var(--dev-wallet-status-connected)\"\n\t\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t\t<span class=\"network-name\">Connected</span>\n\t\t\t\t\t\t\t\t${cliAccounts.length > 0\n\t\t\t\t\t\t\t\t\t? html`<span class=\"network-active-badge\">${cliAccounts.length} imported</span>`\n\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t${cliAccounts.length > 0\n\t\t\t\t\t\t\t\t? html`<div class=\"cli-accounts-list\">\n\t\t\t\t\t\t\t\t\t\t${cliAccounts.map(\n\t\t\t\t\t\t\t\t\t\t\t(acc) => html`\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"network-url\">${acc.label} (${formatAddress(acc.address)})</div>\n\t\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: html`<div class=\"about cli-hint\">Use + Add above to import CLI accounts.</div>`}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t: html`\n\t\t\t\t\t\t<div class=\"network-item\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"network-dot\"\n\t\t\t\t\t\t\t\tstyle=\"background: var(--dev-wallet-status-disconnected)\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t<span class=\"network-name\" style=\"color: var(--dev-wallet-muted-foreground)\"\n\t\t\t\t\t\t\t\t>Not connected</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"about cli-unpaired-hint\">\n\t\t\t\t\t\t\tOpen the token URL from your terminal to connect CLI accounts.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\t#renderAccounts() {\n\t\treturn html`\n\t\t\t<dev-wallet-accounts\n\t\t\t\texportparts=\"account-list: accounts-account-list, add-button: accounts-add-button, empty-state: accounts-empty-state\"\n\t\t\t\t.accounts=${this.accounts}\n\t\t\t\t.adapters=${this.adapters}\n\t\t\t\t.activeAddress=${this.activeAddress}\n\t\t\t></dev-wallet-accounts>\n\t\t`;\n\t}\n\n\t#renderBookmarklet() {\n\t\tif (!this.bookmarkletOrigin) return nothing;\n\t\tconst origin = this.bookmarkletOrigin;\n\n\t\tconst bookmarkletJs = `${origin}/bookmarklet.js`;\n\t\tconst bookmarkletHref = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${bookmarkletJs}'})))`;\n\t\tconst consoleSnippet = `var s=document.createElement('script');s.src='${bookmarkletJs}';document.head.appendChild(s);`;\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Bookmarklet</h3>\n\t\t\t<div class=\"about\">\n\t\t\t\tDrag this link to your bookmarks bar, then click it on any dApp to inject the wallet:\n\t\t\t</div>\n\t\t\t<div class=\"bookmarklet-link-wrapper\">\n\t\t\t\t<a\n\t\t\t\t\tclass=\"bookmarklet-link\"\n\t\t\t\t\thref=${bookmarkletHref}\n\t\t\t\t\ttitle=\"Drag to bookmarks bar\"\n\t\t\t\t\t@click=${(e: MouseEvent) => e.preventDefault()}\n\t\t\t\t>\n\t\t\t\t\tDev Wallet\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<div class=\"about\" style=\"margin-top: 12px\">Or paste this in the browser console:</div>\n\t\t\t<div class=\"console-snippet\">\n\t\t\t\t<div class=\"console-snippet-header\">\n\t\t\t\t\t<span class=\"console-snippet-label\">Console</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-copy\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label=\"Copy console snippet\"\n\t\t\t\t\t\t@click=${() => this.#copySnippet(consoleSnippet)}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._copied ? 'Copied' : 'Copy'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<pre class=\"console-snippet-code\"><code>${consoleSnippet}</code></pre>\n\t\t\t</div>\n\t\t\t<div class=\"about\" style=\"margin-top: 8px\">\n\t\t\t\tOr add this script to your page:<br />\n\t\t\t\t<code class=\"bookmarklet-url\">${bookmarkletJs}</code>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#copySnippet(text: string) {\n\t\tnavigator.clipboard.writeText(text).then(() => {\n\t\t\tthis._copied = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._copied = false;\n\t\t\t}, 2000);\n\t\t});\n\t}\n\n\t#addNetwork() {\n\t\tif (!this.wallet) return;\n\n\t\tconst name = this._networkName.trim();\n\t\tconst url = this._networkUrl.trim();\n\n\t\tif (!name || !url) return;\n\n\t\tif (this.wallet.availableNetworks.includes(name)) {\n\t\t\tthis._error = `Network \"${name}\" already exists`;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.wallet.addNetwork(name, url);\n\t\t\tthis._networkName = '';\n\t\t\tthis._networkUrl = '';\n\t\t\tthis._showAddNetwork = false;\n\t\t\tthis._error = null;\n\t\t\temitEvent(this, 'network-added', { name, url });\n\t\t} catch (err) {\n\t\t\tthis._error = getErrorMessage(err, 'Failed to add network');\n\t\t}\n\t}\n\n\t#cancelAddNetwork() {\n\t\tthis._showAddNetwork = false;\n\t\tthis._networkName = '';\n\t\tthis._networkUrl = '';\n\t\tthis._error = null;\n\t}\n\n\t#startEditNetwork(name: string, url: string) {\n\t\tthis._editingNetwork = name;\n\t\tthis._editingUrl = url;\n\t}\n\n\t#saveNetworkUrl(name: string) {\n\t\tif (!this.wallet) return;\n\t\tconst url = this._editingUrl.trim();\n\t\tif (!url) return;\n\n\t\ttry {\n\t\t\tthis.wallet.addNetwork(name, url);\n\t\t\tthis._editingNetwork = null;\n\t\t\tthis._editingUrl = '';\n\t\t} catch (error) {\n\t\t\tthis._error = error instanceof Error ? error.message : 'Invalid URL';\n\t\t}\n\t}\n\n\t#cancelEditNetwork() {\n\t\tthis._editingNetwork = null;\n\t\tthis._editingUrl = '';\n\t}\n\n\t#removeNetwork(name: string) {\n\t\tif (!this.wallet) return;\n\t\tthis.wallet.removeNetwork(name);\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-settings': DevWalletSettings;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-settings.mjs","names":["#renderSummary","#renderNetworks","#hasCliAdapter","#renderCliSigner","#renderAccounts","#renderBookmarklet","#saveNetworkUrl","#cancelEditNetwork","#startEditNetwork","#removeNetwork","#renderAddNetworkForm","#addNetwork","#cancelAddNetwork","#copySnippet"],"sources":["../../src/ui/dev-wallet-settings.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport type { SignerAdapter } from '../types.js';\nimport {\n\tbadgeStyles,\n\tcardItemStyles,\n\tformInputStyles,\n\ticonButtonStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsectionHeaderStyles,\n\tsharedStyles,\n} from './styles.js';\nimport { emitEvent, formatAddress, getErrorMessage, NETWORK_COLORS } from './utils.js';\nimport './dev-wallet-accounts.js';\n\n@customElement('dev-wallet-settings')\nexport class DevWalletSettings extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tformInputStyles,\n\t\ticonButtonStyles,\n\t\tbadgeStyles,\n\t\tinlineErrorStyles,\n\t\tmonoTruncateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tpadding: 14px;\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t\tpadding: 12px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbackground: var(--dev-wallet-surface);\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.settings-summary {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.summary-cell {\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.summary-label {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9.5px;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.summary-value {\n\t\t\t\tmargin-top: 5px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-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.network-item {\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 9px 10px;\n\t\t\t}\n\n\t\t\t.network-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.network-name {\n\t\t\t\tflex: 1;\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t}\n\n\t\t\t.network-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.network-url {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.network-url-input {\n\t\t\t\tpadding: 3px 6px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-primary);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t}\n\n\t\t\t.network-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 2px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.btn-icon {\n\t\t\t\twidth: 22px;\n\t\t\t\theight: 22px;\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.btn-icon-danger:hover {\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.network-active-badge {\n\t\t\t\theight: 16px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.add-network-form {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tpadding: 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px dashed var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.form-input {\n\t\t\t\tpadding: 6px 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.form-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.btn-sm {\n\t\t\t\tpadding: 5px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.btn-add {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t}\n\n\t\t\t.btn-add:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t}\n\n\t\t\t.btn-cancel {\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.btn-toggle {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\theight: 30px;\n\t\t\t\tpadding: 0 10px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t}\n\n\t\t\t.btn-toggle: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.cli-section-column {\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: flex-start;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.cli-header-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.cli-accounts-list {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding-left: 16px;\n\t\t\t}\n\n\t\t\t.cli-accounts-list .network-url {\n\t\t\t\tpadding: 2px 0;\n\t\t\t}\n\n\t\t\t.cli-hint {\n\t\t\t\tpadding-left: 16px;\n\t\t\t\tmargin-top: 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.cli-unpaired-hint {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.about {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tline-height: 1.5;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tmargin-top: 4px;\n\t\t\t}\n\n\t\t\t.bookmarklet-link-wrapper {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.bookmarklet-link {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tpadding: 8px 14px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\ttext-decoration: none;\n\t\t\t\tcursor: grab;\n\t\t\t\tuser-select: none;\n\t\t\t}\n\n\t\t\t.bookmarklet-link:hover {\n\t\t\t\topacity: 0.9;\n\t\t\t}\n\n\t\t\t.bookmarklet-link:active {\n\t\t\t\tcursor: grabbing;\n\t\t\t}\n\n\t\t\t.bookmarklet-url {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t\tuser-select: all;\n\t\t\t}\n\n\t\t\t.console-snippet {\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t.console-snippet-header {\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\tgap: 8px;\n\t\t\t\tpadding: 7px 8px 7px 10px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: color-mix(in srgb, var(--dev-wallet-bg-1) 72%, transparent);\n\t\t\t}\n\n\t\t\t.console-snippet-label {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.console-snippet-code {\n\t\t\t\tmargin: 0;\n\t\t\t\tmax-width: 100%;\n\t\t\t\tpadding: 10px 12px 12px;\n\t\t\t\toverflow-x: auto;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tline-height: 1.5;\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\toverflow-wrap: anywhere;\n\t\t\t\tuser-select: all;\n\t\t\t}\n\n\t\t\t.btn-copy {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmin-width: 54px;\n\t\t\t\theight: 24px;\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcursor: pointer;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.btn-copy:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t@media (max-width: 420px) {\n\t\t\t\t.settings-summary {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t@property({ attribute: false })\n\taccounts: readonly ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t@state()\n\tprivate _showAddNetwork = false;\n\n\t@state()\n\tprivate _networkName = '';\n\n\t@state()\n\tprivate _networkUrl = '';\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _editingNetwork: string | null = null;\n\n\t@state()\n\tprivate _editingUrl = '';\n\n\t@state()\n\tprivate _copied = false;\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"section\">${this.#renderSummary()}</div>\n\t\t\t<div class=\"section\">${this.#renderNetworks()}</div>\n\t\t\t${this.#hasCliAdapter()\n\t\t\t\t? html`<div class=\"section\">${this.#renderCliSigner()}</div>`\n\t\t\t\t: nothing}\n\t\t\t<div class=\"section\">${this.#renderAccounts()}</div>\n\t\t\t${this.bookmarkletOrigin\n\t\t\t\t? html`<div class=\"section\">${this.#renderBookmarklet()}</div>`\n\t\t\t\t: nothing}\n\t\t`;\n\t}\n\n\t#renderSummary() {\n\t\tconst activeNetwork = this.wallet?.activeNetwork ?? 'none';\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Wallet</h3>\n\t\t\t<div class=\"settings-summary\">\n\t\t\t\t<div class=\"summary-cell\">\n\t\t\t\t\t<div class=\"summary-label\">Network</div>\n\t\t\t\t\t<div class=\"summary-value\">${activeNetwork}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"summary-cell\">\n\t\t\t\t\t<div class=\"summary-label\">Accounts</div>\n\t\t\t\t\t<div class=\"summary-value\">${this.accounts.length}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"summary-cell\">\n\t\t\t\t\t<div class=\"summary-label\">Adapters</div>\n\t\t\t\t\t<div class=\"summary-value\">${this.adapters.length}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderNetworks() {\n\t\tif (!this.wallet) return nothing;\n\n\t\tconst networks = this.wallet.availableNetworks;\n\t\tconst activeNetwork = this.wallet.activeNetwork;\n\t\tconst urls = this.wallet.networkUrls;\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Networks</h3>\n\t\t\t<div class=\"network-list\">\n\t\t\t\t${networks.map((name) => {\n\t\t\t\t\tconst color = NETWORK_COLORS[name] ?? '#6b7280';\n\t\t\t\t\tconst isActive = name === activeNetwork;\n\t\t\t\t\tconst isEditing = this._editingNetwork === name;\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"network-item ${isActive ? 'active' : ''}\">\n\t\t\t\t\t\t\t<span class=\"network-dot\" style=\"background: ${color}\"></span>\n\t\t\t\t\t\t\t<div class=\"network-info\">\n\t\t\t\t\t\t\t\t<span class=\"network-name\">${name}</span>\n\t\t\t\t\t\t\t\t${isEditing\n\t\t\t\t\t\t\t\t\t? html`<input\n\t\t\t\t\t\t\t\t\t\t\tclass=\"network-url-input\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t.value=${this._editingUrl}\n\t\t\t\t\t\t\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\tthis._editingUrl = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') this.#saveNetworkUrl(name);\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelEditNetwork();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t: html`<span class=\"network-url\" title=${urls[name] ?? ''}\n\t\t\t\t\t\t\t\t\t\t\t>${urls[name] ?? ''}</span\n\t\t\t\t\t\t\t\t\t\t>`}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"network-actions\">\n\t\t\t\t\t\t\t\t${isEditing\n\t\t\t\t\t\t\t\t\t? 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=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Save\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Save URL\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#saveNetworkUrl(name)}\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✓\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<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Cancel\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Cancel editing\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${this.#cancelEditNetwork}\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✕\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: 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=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Edit URL\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Edit network URL\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#startEditNetwork(name, urls[name] ?? '')}\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✎\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${!isActive\n\t\t\t\t\t\t\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon btn-icon-danger\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Remove network\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#removeNetwork(name)}\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\t\t✕\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t`}\n\t\t\t\t\t\t\t\t${isActive ? html`<span class=\"network-active-badge\">Active</span>` : nothing}\n\t\t\t\t\t\t\t</div>\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${this._showAddNetwork\n\t\t\t\t? this.#renderAddNetworkForm()\n\t\t\t\t: html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"btn-toggle\"\n\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\tthis._showAddNetwork = true;\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+ Add Network\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\t#renderAddNetworkForm() {\n\t\treturn html`\n\t\t\t<div class=\"add-network-form\">\n\t\t\t\t<input\n\t\t\t\t\tclass=\"form-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"Network name (e.g. custom)\"\n\t\t\t\t\t.value=${this._networkName}\n\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\tthis._networkName = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"form-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"gRPC URL (e.g. http://localhost:9000)\"\n\t\t\t\t\t.value=${this._networkUrl}\n\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\tthis._networkUrl = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t}}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter') this.#addNetwork();\n\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelAddNetwork();\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t${this._error ? html`<div class=\"error\">${this._error}</div>` : nothing}\n\t\t\t\t<div class=\"form-actions\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-sm btn-add\"\n\t\t\t\t\t\t?disabled=${!this._networkName.trim() || !this._networkUrl.trim()}\n\t\t\t\t\t\t@click=${this.#addNetwork}\n\t\t\t\t\t>\n\t\t\t\t\t\tAdd\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"btn-sm btn-cancel\" @click=${this.#cancelAddNetwork}>Cancel</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#hasCliAdapter(): boolean {\n\t\treturn this.adapters.some((a) => a.id === 'remote-cli');\n\t}\n\n\t#renderCliSigner() {\n\t\tconst cliAdapter = this.adapters.find((a) => a.id === 'remote-cli');\n\t\tif (!cliAdapter) return nothing;\n\n\t\tconst isPaired = 'isPaired' in cliAdapter && (cliAdapter as { isPaired: boolean }).isPaired;\n\t\tconst cliAccounts = cliAdapter.getAccounts();\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">CLI Signer</h3>\n\t\t\t${isPaired\n\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"network-item active cli-section-column\">\n\t\t\t\t\t\t\t<div class=\"cli-header-row\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"network-dot\"\n\t\t\t\t\t\t\t\t\tstyle=\"background: var(--dev-wallet-status-connected)\"\n\t\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t\t<span class=\"network-name\">Connected</span>\n\t\t\t\t\t\t\t\t${cliAccounts.length > 0\n\t\t\t\t\t\t\t\t\t? html`<span class=\"network-active-badge\">${cliAccounts.length} imported</span>`\n\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t${cliAccounts.length > 0\n\t\t\t\t\t\t\t\t? html`<div class=\"cli-accounts-list\">\n\t\t\t\t\t\t\t\t\t\t${cliAccounts.map(\n\t\t\t\t\t\t\t\t\t\t\t(acc) => html`\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"network-url\">${acc.label} (${formatAddress(acc.address)})</div>\n\t\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: html`<div class=\"about cli-hint\">Use + Add above to import CLI accounts.</div>`}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t: html`\n\t\t\t\t\t\t<div class=\"network-item\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"network-dot\"\n\t\t\t\t\t\t\t\tstyle=\"background: var(--dev-wallet-status-disconnected)\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t<span class=\"network-name\" style=\"color: var(--dev-wallet-muted-foreground)\"\n\t\t\t\t\t\t\t\t>Not connected</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"about cli-unpaired-hint\">\n\t\t\t\t\t\t\tOpen the token URL from your terminal to connect CLI accounts.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\t#renderAccounts() {\n\t\treturn html`\n\t\t\t<dev-wallet-accounts\n\t\t\t\texportparts=\"account-list: accounts-account-list, add-button: accounts-add-button, empty-state: accounts-empty-state\"\n\t\t\t\t.accounts=${this.accounts}\n\t\t\t\t.adapters=${this.adapters}\n\t\t\t\t.activeAddress=${this.activeAddress}\n\t\t\t></dev-wallet-accounts>\n\t\t`;\n\t}\n\n\t#renderBookmarklet() {\n\t\tif (!this.bookmarkletOrigin) return nothing;\n\t\tconst origin = this.bookmarkletOrigin;\n\n\t\tconst bookmarkletJs = `${origin}/bookmarklet.js`;\n\t\tconst bookmarkletHref = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${bookmarkletJs}'})))`;\n\t\tconst consoleSnippet = `var s=document.createElement('script');s.src='${bookmarkletJs}';document.head.appendChild(s);`;\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Bookmarklet</h3>\n\t\t\t<div class=\"about\">\n\t\t\t\tDrag this link to your bookmarks bar, then click it on any dApp to inject the wallet:\n\t\t\t</div>\n\t\t\t<div class=\"bookmarklet-link-wrapper\">\n\t\t\t\t<a\n\t\t\t\t\tclass=\"bookmarklet-link\"\n\t\t\t\t\thref=${bookmarkletHref}\n\t\t\t\t\ttitle=\"Drag to bookmarks bar\"\n\t\t\t\t\t@click=${(e: MouseEvent) => e.preventDefault()}\n\t\t\t\t>\n\t\t\t\t\tDev Wallet\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<div class=\"about\" style=\"margin-top: 12px\">Or paste this in the browser console:</div>\n\t\t\t<div class=\"console-snippet\">\n\t\t\t\t<div class=\"console-snippet-header\">\n\t\t\t\t\t<span class=\"console-snippet-label\">Console</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-copy\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label=\"Copy console snippet\"\n\t\t\t\t\t\t@click=${() => this.#copySnippet(consoleSnippet)}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._copied ? 'Copied' : 'Copy'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<pre class=\"console-snippet-code\"><code>${consoleSnippet}</code></pre>\n\t\t\t</div>\n\t\t\t<div class=\"about\" style=\"margin-top: 8px\">\n\t\t\t\tOr add this script to your page:<br />\n\t\t\t\t<code class=\"bookmarklet-url\">${bookmarkletJs}</code>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#copySnippet(text: string) {\n\t\tnavigator.clipboard.writeText(text).then(() => {\n\t\t\tthis._copied = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._copied = false;\n\t\t\t}, 2000);\n\t\t});\n\t}\n\n\t#addNetwork() {\n\t\tif (!this.wallet) return;\n\n\t\tconst name = this._networkName.trim();\n\t\tconst url = this._networkUrl.trim();\n\n\t\tif (!name || !url) return;\n\n\t\tif (this.wallet.availableNetworks.includes(name)) {\n\t\t\tthis._error = `Network \"${name}\" already exists`;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.wallet.addNetwork(name, url);\n\t\t\tthis._networkName = '';\n\t\t\tthis._networkUrl = '';\n\t\t\tthis._showAddNetwork = false;\n\t\t\tthis._error = null;\n\t\t\temitEvent(this, 'network-added', { name, url });\n\t\t} catch (err) {\n\t\t\tthis._error = getErrorMessage(err, 'Failed to add network');\n\t\t}\n\t}\n\n\t#cancelAddNetwork() {\n\t\tthis._showAddNetwork = false;\n\t\tthis._networkName = '';\n\t\tthis._networkUrl = '';\n\t\tthis._error = null;\n\t}\n\n\t#startEditNetwork(name: string, url: string) {\n\t\tthis._editingNetwork = name;\n\t\tthis._editingUrl = url;\n\t}\n\n\t#saveNetworkUrl(name: string) {\n\t\tif (!this.wallet) return;\n\t\tconst url = this._editingUrl.trim();\n\t\tif (!url) return;\n\n\t\ttry {\n\t\t\tthis.wallet.addNetwork(name, url);\n\t\t\tthis._editingNetwork = null;\n\t\t\tthis._editingUrl = '';\n\t\t} catch (error) {\n\t\t\tthis._error = error instanceof Error ? error.message : 'Invalid URL';\n\t\t}\n\t}\n\n\t#cancelEditNetwork() {\n\t\tthis._editingNetwork = null;\n\t\tthis._editingUrl = '';\n\t}\n\n\t#removeNetwork(name: string) {\n\t\tif (!this.wallet) return;\n\t\tthis.wallet.removeNetwork(name);\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-settings': DevWalletSettings;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { PendingSigningRequest } from "../wallet/dev-wallet.mjs";
|
|
2
2
|
import { CoinRecord } from "./utils.mjs";
|
|
3
|
-
import * as _$lit from "lit";
|
|
4
3
|
import { LitElement, nothing } from "lit";
|
|
5
4
|
import { ClientWithCoreApi } from "@mysten/sui/client";
|
|
6
5
|
|
|
@@ -14,7 +13,7 @@ import { ClientWithCoreApi } from "@mysten/sui/client";
|
|
|
14
13
|
*/
|
|
15
14
|
declare class DevWalletSigningModal extends LitElement {
|
|
16
15
|
#private;
|
|
17
|
-
static styles: (
|
|
16
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
18
17
|
request: PendingSigningRequest | null;
|
|
19
18
|
client: ClientWithCoreApi | null;
|
|
20
19
|
/** Pre-seeded coin metadata forwarded to `<dev-wallet-signing>`. See
|
|
@@ -27,7 +26,7 @@ declare class DevWalletSigningModal extends LitElement {
|
|
|
27
26
|
impersonation: boolean;
|
|
28
27
|
firstUpdated(): void;
|
|
29
28
|
disconnectedCallback(): void;
|
|
30
|
-
render():
|
|
29
|
+
render(): import("lit").TemplateResult<1> | typeof nothing;
|
|
31
30
|
}
|
|
32
31
|
declare global {
|
|
33
32
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-signing-modal.d.mts","names":[],"sources":["../../src/ui/dev-wallet-signing-modal.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-signing-modal.d.mts","names":[],"sources":["../../src/ui/dev-wallet-signing-modal.ts"],"mappings":";;;;;;;;AAoBA;;;;;cACa,qBAAA,SAA8B,UAAA;EAAA;SAC1B,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAsEtB,OAAA,EAAS,qBAAA;EAGT,MAAA,EAAQ,iBAAA;EA1EkC;;EA+E1C,KAAA,EAAO,UAAA;EAGP,UAAA;EAjFsB;;;EAuFtB,aAAA;EAOS,YAAA;EAQA,oBAAA;EAOA,MAAA,kBAAM,cAAA,aAAA,OAAA;AAAA;AAAA,QAyCR,MAAA;EAAA,UACG,qBAAA;IACT,0BAAA,EAA4B,qBAAqB;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 "./dev-wallet-signing.mjs";
|
|
5
5
|
import { LitElement, css, html, nothing } from "lit";
|
|
6
6
|
import { customElement, property } from "lit/decorators.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-signing-modal.mjs","names":["#handleDialogCancel","#handleApprove","#handleReject"],"sources":["../../src/ui/dev-wallet-signing-modal.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { emitEvent } from './utils.js';\nimport './dev-wallet-signing.js';\n\n/**\n * A centered modal overlay for signing requests.\n *\n * Renders a backdrop and centered dialog containing the\n * `<dev-wallet-signing>` component. Dispatches `approve` and\n * `reject` events to the parent.\n */\n@customElement('dev-wallet-signing-modal')\nexport class DevWalletSigningModal extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\tdialog {\n\t\t\t\twidth: 440px;\n\t\t\t\tmax-width: calc(100vw - 32px);\n\t\t\t\tmax-height: min(680px, 86vh);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tpadding: 0;\n\t\t\t\tcolor: inherit;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\tdialog::backdrop {\n\t\t\t\tbackground: rgba(2, 6, 14, 0.55);\n\t\t\t}\n\n\t\t\t.modal-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 12px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.modal-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.modal-body {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\n\t\t\t/* Phase 4 P4.19 — footnote rendered when the active account\n\t\t\t is in fork-mode impersonation. Visually distinct so users\n\t\t\t don't conflate this with a real signature flow. */\n\t\t\t.fork-footnote {\n\t\t\t\tpadding: 8px 16px;\n\t\t\t\tbackground: rgba(234, 179, 8, 0.12);\n\t\t\t\tborder-top: 1px solid rgba(234, 179, 8, 0.35);\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}\n\n\t\t\t.fork-footnote strong {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\trequest: PendingSigningRequest | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t/** Pre-seeded coin metadata forwarded to `<dev-wallet-signing>`. See\n\t * the matching property on `DevWalletSigning` for details. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@property({ type: String })\n\twalletName = 'Dev Wallet';\n\n\t/** Phase 4 P4.19 — when the active account's `source === 'impersonate'`,\n\t * the parent flips this on and the modal renders a footnote\n\t * explaining no real signature will be produced. */\n\t@property({ type: Boolean })\n\timpersonation = false;\n\n\t#handleDialogCancel = (e: Event) => {\n\t\te.preventDefault();\n\t\temitEvent(this, 'reject');\n\t};\n\n\toverride firstUpdated() {\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tif (dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t}\n\t\tdialog?.addEventListener('cancel', this.#handleDialogCancel);\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tdialog?.removeEventListener('cancel', this.#handleDialogCancel);\n\t\tif (dialog?.open) dialog.close();\n\t}\n\n\toverride render() {\n\t\tif (!this.request) return nothing;\n\n\t\treturn html`\n\t\t\t<dialog part=\"dialog\">\n\t\t\t\t<div class=\"modal-header\">\n\t\t\t\t\t<span class=\"modal-title\">${this.walletName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"modal-body\">\n\t\t\t\t\t<dev-wallet-signing\n\t\t\t\t\t\texportparts=\"approve-button: signing-approve-button, reject-button: signing-reject-button, request-type: signing-request-type, empty-state: signing-empty-state, error-message: signing-error-message, footer: signing-footer\"\n\t\t\t\t\t\t.request=${this.request}\n\t\t\t\t\t\t.client=${this.client}\n\t\t\t\t\t\t.coins=${this.coins}\n\t\t\t\t\t\t@approve=${this.#handleApprove}\n\t\t\t\t\t\t@reject=${this.#handleReject}\n\t\t\t\t\t></dev-wallet-signing>\n\t\t\t\t</div>\n\t\t\t\t${this.impersonation\n\t\t\t\t\t? html`<div class=\"fork-footnote\" part=\"fork-footnote\">\n\t\t\t\t\t\t\t<strong>Fork-only:</strong> this account is in <em>impersonation</em> mode. The fork\n\t\t\t\t\t\t\taccepts the transaction with an empty signature (no real private key signs it), so it\n\t\t\t\t\t\t\twould be rejected by mainnet / testnet / devnet validators.\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#handleApprove(e: Event) {\n\t\t// Stop the composed signing event from also reaching the parent\n\t\te.stopPropagation();\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#handleReject(e: Event) {\n\t\te.stopPropagation();\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing-modal': DevWalletSigningModal;\n\t}\n}\n"],"mappings":";;;;;;;AAqBO,IAAA,wBAAA,MAAM,8BAA8B,WAAW;;;iBAuEb;gBAGL;eAKR;oBAGd;uBAMG;8BAEO,MAAa;
|
|
1
|
+
{"version":3,"file":"dev-wallet-signing-modal.mjs","names":["#handleDialogCancel","#handleApprove","#handleReject"],"sources":["../../src/ui/dev-wallet-signing-modal.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { emitEvent } from './utils.js';\nimport './dev-wallet-signing.js';\n\n/**\n * A centered modal overlay for signing requests.\n *\n * Renders a backdrop and centered dialog containing the\n * `<dev-wallet-signing>` component. Dispatches `approve` and\n * `reject` events to the parent.\n */\n@customElement('dev-wallet-signing-modal')\nexport class DevWalletSigningModal extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\tdialog {\n\t\t\t\twidth: 440px;\n\t\t\t\tmax-width: calc(100vw - 32px);\n\t\t\t\tmax-height: min(680px, 86vh);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tpadding: 0;\n\t\t\t\tcolor: inherit;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\tdialog::backdrop {\n\t\t\t\tbackground: rgba(2, 6, 14, 0.55);\n\t\t\t}\n\n\t\t\t.modal-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 12px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.modal-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.modal-body {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\n\t\t\t/* Phase 4 P4.19 — footnote rendered when the active account\n\t\t\t is in fork-mode impersonation. Visually distinct so users\n\t\t\t don't conflate this with a real signature flow. */\n\t\t\t.fork-footnote {\n\t\t\t\tpadding: 8px 16px;\n\t\t\t\tbackground: rgba(234, 179, 8, 0.12);\n\t\t\t\tborder-top: 1px solid rgba(234, 179, 8, 0.35);\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}\n\n\t\t\t.fork-footnote strong {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\trequest: PendingSigningRequest | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t/** Pre-seeded coin metadata forwarded to `<dev-wallet-signing>`. See\n\t * the matching property on `DevWalletSigning` for details. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@property({ type: String })\n\twalletName = 'Dev Wallet';\n\n\t/** Phase 4 P4.19 — when the active account's `source === 'impersonate'`,\n\t * the parent flips this on and the modal renders a footnote\n\t * explaining no real signature will be produced. */\n\t@property({ type: Boolean })\n\timpersonation = false;\n\n\t#handleDialogCancel = (e: Event) => {\n\t\te.preventDefault();\n\t\temitEvent(this, 'reject');\n\t};\n\n\toverride firstUpdated() {\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tif (dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t}\n\t\tdialog?.addEventListener('cancel', this.#handleDialogCancel);\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tdialog?.removeEventListener('cancel', this.#handleDialogCancel);\n\t\tif (dialog?.open) dialog.close();\n\t}\n\n\toverride render() {\n\t\tif (!this.request) return nothing;\n\n\t\treturn html`\n\t\t\t<dialog part=\"dialog\">\n\t\t\t\t<div class=\"modal-header\">\n\t\t\t\t\t<span class=\"modal-title\">${this.walletName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"modal-body\">\n\t\t\t\t\t<dev-wallet-signing\n\t\t\t\t\t\texportparts=\"approve-button: signing-approve-button, reject-button: signing-reject-button, request-type: signing-request-type, empty-state: signing-empty-state, error-message: signing-error-message, footer: signing-footer\"\n\t\t\t\t\t\t.request=${this.request}\n\t\t\t\t\t\t.client=${this.client}\n\t\t\t\t\t\t.coins=${this.coins}\n\t\t\t\t\t\t@approve=${this.#handleApprove}\n\t\t\t\t\t\t@reject=${this.#handleReject}\n\t\t\t\t\t></dev-wallet-signing>\n\t\t\t\t</div>\n\t\t\t\t${this.impersonation\n\t\t\t\t\t? html`<div class=\"fork-footnote\" part=\"fork-footnote\">\n\t\t\t\t\t\t\t<strong>Fork-only:</strong> this account is in <em>impersonation</em> mode. The fork\n\t\t\t\t\t\t\taccepts the transaction with an empty signature (no real private key signs it), so it\n\t\t\t\t\t\t\twould be rejected by mainnet / testnet / devnet validators.\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#handleApprove(e: Event) {\n\t\t// Stop the composed signing event from also reaching the parent\n\t\te.stopPropagation();\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#handleReject(e: Event) {\n\t\te.stopPropagation();\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing-modal': DevWalletSigningModal;\n\t}\n}\n"],"mappings":";;;;;;;AAqBO,IAAA,wBAAA,MAAM,8BAA8B,WAAW;;;iBAuEb;gBAGL;eAKR;oBAGd;uBAMG;8BAEO,MAAa;GACnC,EAAE,eAAe;GACjB,UAAU,MAAM,QAAQ;EACzB;;;gBA5FyB,CACxB,cACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEJ;;CAsBA;CAKA,eAAwB;EACvB,MAAM,SAAS,KAAK,YAAY,cAAc,QAAQ;EACtD,IAAI,UAAU,CAAC,OAAO,MACrB,OAAO,UAAU;EAElB,QAAQ,iBAAiB,UAAU,KAAKA,mBAAmB;CAC5D;CAEA,uBAAgC;EAC/B,MAAM,qBAAqB;EAC3B,MAAM,SAAS,KAAK,YAAY,cAAc,QAAQ;EACtD,QAAQ,oBAAoB,UAAU,KAAKA,mBAAmB;EAC9D,IAAI,QAAQ,MAAM,OAAO,MAAM;CAChC;CAEA,SAAkB;EACjB,IAAI,CAAC,KAAK,SAAS,OAAO;EAE1B,OAAO,IAAI;;;iCAGoB,KAAK,WAAW;;;;;iBAKhC,KAAK,QAAQ;gBACd,KAAK,OAAO;eACb,KAAK,MAAM;iBACT,KAAKC,eAAe;gBACrB,KAAKC,cAAc;;;MAG7B,KAAK,gBACJ,IAAI;;;;gBAKJ,QAAQ;;;CAGd;CAEA,eAAe,GAAU;EAExB,EAAE,gBAAgB;EAClB,UAAU,MAAM,SAAS;CAC1B;CAEA,cAAc,GAAU;EACvB,EAAE,gBAAgB;EAClB,UAAU,MAAM,QAAQ;CACzB;AACD;YA/EE,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,sBAAA,WAAA,WAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,sBAAA,WAAA,UAAA,KAAA,CAAA;YAK7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,sBAAA,WAAA,SAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,sBAAA,WAAA,cAAA,KAAA,CAAA;YAMzB,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,sBAAA,WAAA,iBAAA,KAAA,CAAA;oCAxF3B,cAAc,0BAA0B,CAAA,GAAA,qBAAA"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { PendingSigningRequest } from "../wallet/dev-wallet.mjs";
|
|
2
2
|
import { CoinRecord } from "./utils.mjs";
|
|
3
|
-
import * as _$lit from "lit";
|
|
4
3
|
import { LitElement } from "lit";
|
|
5
4
|
import { ClientWithCoreApi } from "@mysten/sui/client";
|
|
6
5
|
|
|
7
6
|
//#region src/ui/dev-wallet-signing.d.ts
|
|
8
7
|
declare class DevWalletSigning extends LitElement {
|
|
9
8
|
#private;
|
|
10
|
-
static styles: (
|
|
9
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
11
10
|
request: PendingSigningRequest | null;
|
|
12
11
|
client: ClientWithCoreApi | null;
|
|
13
12
|
/** Optional pre-seeded coin metadata — pass the generated `coins`
|
|
@@ -19,7 +18,7 @@ declare class DevWalletSigning extends LitElement {
|
|
|
19
18
|
private _analysisError;
|
|
20
19
|
private _analyzing;
|
|
21
20
|
willUpdate(changedProperties: Map<string, unknown>): void;
|
|
22
|
-
render():
|
|
21
|
+
render(): import("lit").TemplateResult<1>;
|
|
23
22
|
}
|
|
24
23
|
declare global {
|
|
25
24
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-signing.d.mts","names":[],"sources":["../../src/ui/dev-wallet-signing.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-signing.d.mts","names":[],"sources":["../../src/ui/dev-wallet-signing.ts"],"mappings":";;;;;;cAsCa,gBAAA,SAAyB,UAAA;EAAA;SACrB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EA+OtB,OAAA,EAAS,qBAAA;EAGT,MAAA,EAAQ,iBAAA;EAHC;;;;EAUT,KAAA,EAAO,UAAA;EAAA,QAGC,SAAA;EAAA,QAGA,cAAA;EAAA,QAGA,UAAA;EASC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAsE9B,MAAA,kBAAM,cAAA;AAAA;AAAA,QAgRR,MAAA;EAAA,UACG,qBAAA;IACT,oBAAA,EAAsB,gBAAgB;EAAA;AAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { actionButtonStyles, copyableTextStyles, listContainerStyles, monoTruncateStyles, sharedStyles, subLabelStyles } from "./styles.mjs";
|
|
2
2
|
import { emitEvent, formatAddress, formatCoinBalance, getCoinSymbol, indexCoinsByType, lookupCoinByType } 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 { analyzeTransaction } from "./transaction-analyzer.mjs";
|
|
6
6
|
import { LitElement, css, html, nothing } from "lit";
|
|
7
7
|
import { customElement, property, state } from "lit/decorators.js";
|
|
@@ -491,6 +491,7 @@ let DevWalletSigning = class DevWalletSigning extends LitElement {
|
|
|
491
491
|
case "Result": return `Result [${arg.index[0]}, ${arg.index[1]}]`;
|
|
492
492
|
case "Pure": return `${arg.bytes.slice(0, 16)}${arg.bytes.length > 16 ? "..." : ""}`;
|
|
493
493
|
case "Object": return formatAddress(arg.object.objectId);
|
|
494
|
+
case "Withdrawal": return `Withdraw ${arg.amount} ${getCoinSymbol(arg.coinType)} from ${arg.withdrawFrom}`;
|
|
494
495
|
case "Unknown": return "unknown";
|
|
495
496
|
}
|
|
496
497
|
}
|