@mysten-incubation/dev-wallet 0.0.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/README.md +250 -0
- package/dist/_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs +10 -0
- package/dist/adapters/base-adapter.d.mts +33 -0
- package/dist/adapters/base-adapter.d.mts.map +1 -0
- package/dist/adapters/base-adapter.mjs +77 -0
- package/dist/adapters/base-adapter.mjs.map +1 -0
- package/dist/adapters/browser.d.mts +8 -0
- package/dist/adapters/browser.mjs +8 -0
- package/dist/adapters/build-managed-account.d.mts +12 -0
- package/dist/adapters/build-managed-account.d.mts.map +1 -0
- package/dist/adapters/build-managed-account.mjs +30 -0
- package/dist/adapters/build-managed-account.mjs.map +1 -0
- package/dist/adapters/idb-store.mjs +73 -0
- package/dist/adapters/idb-store.mjs.map +1 -0
- package/dist/adapters/in-memory-adapter.d.mts +16 -0
- package/dist/adapters/in-memory-adapter.d.mts.map +1 -0
- package/dist/adapters/in-memory-adapter.mjs +44 -0
- package/dist/adapters/in-memory-adapter.mjs.map +1 -0
- package/dist/adapters/passkey-adapter.d.mts +31 -0
- package/dist/adapters/passkey-adapter.d.mts.map +1 -0
- package/dist/adapters/passkey-adapter.mjs +87 -0
- package/dist/adapters/passkey-adapter.mjs.map +1 -0
- package/dist/adapters/remote-cli-adapter.d.mts +65 -0
- package/dist/adapters/remote-cli-adapter.d.mts.map +1 -0
- package/dist/adapters/remote-cli-adapter.mjs +299 -0
- package/dist/adapters/remote-cli-adapter.mjs.map +1 -0
- package/dist/adapters/webcrypto-adapter.d.mts +20 -0
- package/dist/adapters/webcrypto-adapter.d.mts.map +1 -0
- package/dist/adapters/webcrypto-adapter.mjs +68 -0
- package/dist/adapters/webcrypto-adapter.mjs.map +1 -0
- package/dist/bin/cli.d.mts +1 -0
- package/dist/bin/cli.mjs +183 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/client/dev-wallet-client.d.mts +57 -0
- package/dist/client/dev-wallet-client.d.mts.map +1 -0
- package/dist/client/dev-wallet-client.mjs +223 -0
- package/dist/client/dev-wallet-client.mjs.map +1 -0
- package/dist/client/index.d.mts +3 -0
- package/dist/client/index.mjs +4 -0
- package/dist/client/request-handler.d.mts +42 -0
- package/dist/client/request-handler.d.mts.map +1 -0
- package/dist/client/request-handler.mjs +115 -0
- package/dist/client/request-handler.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +4 -0
- package/dist/react/components.d.mts +32 -0
- package/dist/react/components.d.mts.map +1 -0
- package/dist/react/components.mjs +53 -0
- package/dist/react/components.mjs.map +1 -0
- package/dist/react/context.d.mts +22 -0
- package/dist/react/context.d.mts.map +1 -0
- package/dist/react/context.mjs +25 -0
- package/dist/react/context.mjs.map +1 -0
- package/dist/react/index.d.mts +4 -0
- package/dist/react/index.mjs +5 -0
- package/dist/react/useDevWallet.d.mts +38 -0
- package/dist/react/useDevWallet.d.mts.map +1 -0
- package/dist/react/useDevWallet.mjs +89 -0
- package/dist/react/useDevWallet.mjs.map +1 -0
- package/dist/server/cli-signing-middleware.d.mts +22 -0
- package/dist/server/cli-signing-middleware.d.mts.map +1 -0
- package/dist/server/cli-signing-middleware.mjs +117 -0
- package/dist/server/cli-signing-middleware.mjs.map +1 -0
- package/dist/server/index.d.mts +2 -0
- package/dist/server/index.mjs +3 -0
- package/dist/standalone/assets/in-memory-adapter-CBF4h2KD.js +1 -0
- package/dist/standalone/assets/main-VE4olb-Q.js +2841 -0
- package/dist/standalone/assets/webcrypto-adapter-DysAubFb.js +1 -0
- package/dist/standalone/bookmarklet.js +5 -0
- package/dist/standalone/index.html +48 -0
- package/dist/types.d.mts +55 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/ui/copy-controller.mjs +43 -0
- package/dist/ui/copy-controller.mjs.map +1 -0
- package/dist/ui/dev-wallet-account-selector.d.mts +24 -0
- package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -0
- package/dist/ui/dev-wallet-account-selector.mjs +268 -0
- package/dist/ui/dev-wallet-account-selector.mjs.map +1 -0
- package/dist/ui/dev-wallet-accounts.d.mts +29 -0
- package/dist/ui/dev-wallet-accounts.d.mts.map +1 -0
- package/dist/ui/dev-wallet-accounts.mjs +524 -0
- package/dist/ui/dev-wallet-accounts.mjs.map +1 -0
- package/dist/ui/dev-wallet-balances.d.mts +26 -0
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -0
- package/dist/ui/dev-wallet-balances.mjs +130 -0
- package/dist/ui/dev-wallet-balances.mjs.map +1 -0
- package/dist/ui/dev-wallet-connect.d.mts +31 -0
- package/dist/ui/dev-wallet-connect.d.mts.map +1 -0
- package/dist/ui/dev-wallet-connect.mjs +225 -0
- package/dist/ui/dev-wallet-connect.mjs.map +1 -0
- package/dist/ui/dev-wallet-dropdown.d.mts +27 -0
- package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -0
- package/dist/ui/dev-wallet-dropdown.mjs +121 -0
- package/dist/ui/dev-wallet-dropdown.mjs.map +1 -0
- package/dist/ui/dev-wallet-network-badge.d.mts +21 -0
- package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -0
- package/dist/ui/dev-wallet-network-badge.mjs +121 -0
- package/dist/ui/dev-wallet-network-badge.mjs.map +1 -0
- package/dist/ui/dev-wallet-new-account.d.mts +31 -0
- package/dist/ui/dev-wallet-new-account.d.mts.map +1 -0
- package/dist/ui/dev-wallet-new-account.mjs +577 -0
- package/dist/ui/dev-wallet-new-account.mjs.map +1 -0
- package/dist/ui/dev-wallet-objects.d.mts +26 -0
- package/dist/ui/dev-wallet-objects.d.mts.map +1 -0
- package/dist/ui/dev-wallet-objects.mjs +276 -0
- package/dist/ui/dev-wallet-objects.mjs.map +1 -0
- package/dist/ui/dev-wallet-panel.d.mts +22 -0
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -0
- package/dist/ui/dev-wallet-panel.mjs +192 -0
- package/dist/ui/dev-wallet-panel.mjs.map +1 -0
- package/dist/ui/dev-wallet-popup.d.mts +36 -0
- package/dist/ui/dev-wallet-popup.d.mts.map +1 -0
- package/dist/ui/dev-wallet-popup.mjs +137 -0
- package/dist/ui/dev-wallet-popup.mjs.map +1 -0
- package/dist/ui/dev-wallet-settings.d.mts +33 -0
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -0
- package/dist/ui/dev-wallet-settings.mjs +635 -0
- package/dist/ui/dev-wallet-settings.mjs.map +1 -0
- package/dist/ui/dev-wallet-signing-modal.d.mts +32 -0
- package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -0
- package/dist/ui/dev-wallet-signing-modal.mjs +115 -0
- package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -0
- package/dist/ui/dev-wallet-signing.d.mts +25 -0
- package/dist/ui/dev-wallet-signing.d.mts.map +1 -0
- package/dist/ui/dev-wallet-signing.mjs +544 -0
- package/dist/ui/dev-wallet-signing.mjs.map +1 -0
- package/dist/ui/dev-wallet-standalone.d.mts +23 -0
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -0
- package/dist/ui/dev-wallet-standalone.mjs +129 -0
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -0
- package/dist/ui/dev-wallet-tab-bar.d.mts +19 -0
- package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -0
- package/dist/ui/dev-wallet-tab-bar.mjs +143 -0
- package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -0
- package/dist/ui/index.d.mts +17 -0
- package/dist/ui/index.mjs +18 -0
- package/dist/ui/mount.d.mts +11 -0
- package/dist/ui/mount.d.mts.map +1 -0
- package/dist/ui/mount.mjs +17 -0
- package/dist/ui/mount.mjs.map +1 -0
- package/dist/ui/styles.mjs +250 -0
- package/dist/ui/styles.mjs.map +1 -0
- package/dist/ui/transaction-analyzer.mjs +58 -0
- package/dist/ui/transaction-analyzer.mjs.map +1 -0
- package/dist/ui/utils.mjs +98 -0
- package/dist/ui/utils.mjs.map +1 -0
- package/dist/ui/wallet-controller.mjs +275 -0
- package/dist/ui/wallet-controller.mjs.map +1 -0
- package/dist/wallet/constants.mjs +11 -0
- package/dist/wallet/constants.mjs.map +1 -0
- package/dist/wallet/dev-wallet.d.mts +118 -0
- package/dist/wallet/dev-wallet.d.mts.map +1 -0
- package/dist/wallet/dev-wallet.mjs +424 -0
- package/dist/wallet/dev-wallet.mjs.map +1 -0
- package/dist/wallet/initializer.d.mts +63 -0
- package/dist/wallet/initializer.d.mts.map +1 -0
- package/dist/wallet/initializer.mjs +75 -0
- package/dist/wallet/initializer.mjs.map +1 -0
- package/dist/wallet/signing.d.mts +35 -0
- package/dist/wallet/signing.d.mts.map +1 -0
- package/dist/wallet/signing.mjs +69 -0
- package/dist/wallet/signing.mjs.map +1 -0
- package/package.json +124 -0
- package/src/adapters/base-adapter.ts +93 -0
- package/src/adapters/browser.ts +15 -0
- package/src/adapters/build-managed-account.ts +33 -0
- package/src/adapters/idb-store.ts +87 -0
- package/src/adapters/in-memory-adapter.ts +51 -0
- package/src/adapters/passkey-adapter.ts +120 -0
- package/src/adapters/remote-cli-adapter.ts +388 -0
- package/src/adapters/webcrypto-adapter.ts +96 -0
- package/src/app/bookmarklet-entry.ts +77 -0
- package/src/app/index.html +48 -0
- package/src/app/main.ts +245 -0
- package/src/app/tsconfig.json +3 -0
- package/src/bin/cli.ts +214 -0
- package/src/client/dev-wallet-client.ts +280 -0
- package/src/client/index.ts +7 -0
- package/src/client/request-handler.ts +161 -0
- package/src/index.ts +19 -0
- package/src/react/components.ts +64 -0
- package/src/react/context.ts +38 -0
- package/src/react/index.ts +16 -0
- package/src/react/useDevWallet.ts +118 -0
- package/src/server/cli-signing-middleware.ts +146 -0
- package/src/server/index.ts +8 -0
- package/src/types.ts +58 -0
- package/src/ui/copy-controller.ts +49 -0
- package/src/ui/dev-wallet-account-selector.ts +283 -0
- package/src/ui/dev-wallet-accounts.ts +578 -0
- package/src/ui/dev-wallet-balances.ts +171 -0
- package/src/ui/dev-wallet-connect.ts +259 -0
- package/src/ui/dev-wallet-dropdown.ts +138 -0
- package/src/ui/dev-wallet-network-badge.ts +128 -0
- package/src/ui/dev-wallet-new-account.ts +662 -0
- package/src/ui/dev-wallet-objects.ts +336 -0
- package/src/ui/dev-wallet-panel.ts +207 -0
- package/src/ui/dev-wallet-popup.ts +169 -0
- package/src/ui/dev-wallet-settings.ts +692 -0
- package/src/ui/dev-wallet-signing-modal.ts +137 -0
- package/src/ui/dev-wallet-signing.ts +624 -0
- package/src/ui/dev-wallet-standalone.ts +136 -0
- package/src/ui/dev-wallet-tab-bar.ts +151 -0
- package/src/ui/index.ts +26 -0
- package/src/ui/mount.ts +21 -0
- package/src/ui/styles.ts +252 -0
- package/src/ui/transaction-analyzer.ts +60 -0
- package/src/ui/utils.ts +118 -0
- package/src/ui/wallet-controller.ts +340 -0
- package/src/wallet/constants.ts +17 -0
- package/src/wallet/dev-wallet.ts +597 -0
- package/src/wallet/initializer.ts +124 -0
- package/src/wallet/signing.ts +85 -0
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
import { sectionHeaderStyles, sharedStyles } from "./styles.mjs";
|
|
2
|
+
import { NETWORK_COLORS, emitEvent, formatAddress, getErrorMessage } from "./utils.mjs";
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs";
|
|
4
|
+
import "./dev-wallet-accounts.mjs";
|
|
5
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
6
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
7
|
+
|
|
8
|
+
//#region src/ui/dev-wallet-settings.ts
|
|
9
|
+
let DevWalletSettings = class DevWalletSettings$1 extends LitElement {
|
|
10
|
+
constructor(..._args) {
|
|
11
|
+
super(..._args);
|
|
12
|
+
this.wallet = null;
|
|
13
|
+
this.accounts = [];
|
|
14
|
+
this.adapters = [];
|
|
15
|
+
this.activeAddress = "";
|
|
16
|
+
this.bookmarkletOrigin = "";
|
|
17
|
+
this._showAddNetwork = false;
|
|
18
|
+
this._networkName = "";
|
|
19
|
+
this._networkUrl = "";
|
|
20
|
+
this._error = null;
|
|
21
|
+
this._editingNetwork = null;
|
|
22
|
+
this._editingUrl = "";
|
|
23
|
+
this._copied = false;
|
|
24
|
+
}
|
|
25
|
+
static {
|
|
26
|
+
this.styles = [
|
|
27
|
+
sharedStyles,
|
|
28
|
+
sectionHeaderStyles,
|
|
29
|
+
css`
|
|
30
|
+
:host {
|
|
31
|
+
display: block;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.section {
|
|
35
|
+
margin-bottom: 20px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.section:last-child {
|
|
39
|
+
margin-bottom: 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.network-list {
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
gap: 4px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.network-item {
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: center;
|
|
51
|
+
gap: 8px;
|
|
52
|
+
padding: 8px 12px;
|
|
53
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
54
|
+
border: 1px solid var(--dev-wallet-border);
|
|
55
|
+
background: var(--dev-wallet-secondary);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.network-item.active {
|
|
59
|
+
border-color: var(--dev-wallet-primary);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.network-dot {
|
|
63
|
+
width: 8px;
|
|
64
|
+
height: 8px;
|
|
65
|
+
border-radius: 50%;
|
|
66
|
+
flex-shrink: 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.network-name {
|
|
70
|
+
flex: 1;
|
|
71
|
+
font-size: 13px;
|
|
72
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
73
|
+
color: var(--dev-wallet-foreground);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.network-info {
|
|
77
|
+
flex: 1;
|
|
78
|
+
min-width: 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.network-url {
|
|
82
|
+
font-size: 10px;
|
|
83
|
+
color: var(--dev-wallet-muted-foreground);
|
|
84
|
+
font-family: var(--dev-wallet-font-mono);
|
|
85
|
+
overflow: hidden;
|
|
86
|
+
text-overflow: ellipsis;
|
|
87
|
+
white-space: nowrap;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.network-url-input {
|
|
91
|
+
width: 100%;
|
|
92
|
+
padding: 3px 6px;
|
|
93
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
94
|
+
border: 1px solid var(--dev-wallet-primary);
|
|
95
|
+
background: var(--dev-wallet-background);
|
|
96
|
+
color: var(--dev-wallet-foreground);
|
|
97
|
+
font-size: 10px;
|
|
98
|
+
font-family: var(--dev-wallet-font-mono);
|
|
99
|
+
outline: none;
|
|
100
|
+
box-sizing: border-box;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.network-actions {
|
|
104
|
+
display: flex;
|
|
105
|
+
gap: 2px;
|
|
106
|
+
flex-shrink: 0;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.btn-icon {
|
|
110
|
+
width: 22px;
|
|
111
|
+
height: 22px;
|
|
112
|
+
display: flex;
|
|
113
|
+
align-items: center;
|
|
114
|
+
justify-content: center;
|
|
115
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
116
|
+
font-size: 11px;
|
|
117
|
+
color: var(--dev-wallet-muted-foreground);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.btn-icon:hover {
|
|
121
|
+
background: var(--dev-wallet-border);
|
|
122
|
+
color: var(--dev-wallet-foreground);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.btn-icon-danger:hover {
|
|
126
|
+
color: var(--dev-wallet-destructive);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.network-active-badge {
|
|
130
|
+
font-size: 9px;
|
|
131
|
+
padding: 1px 5px;
|
|
132
|
+
border-radius: var(--dev-wallet-radius-2xs);
|
|
133
|
+
background: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);
|
|
134
|
+
color: var(--dev-wallet-primary);
|
|
135
|
+
font-weight: var(--dev-wallet-font-weight-semibold);
|
|
136
|
+
text-transform: uppercase;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.add-network-form {
|
|
140
|
+
display: flex;
|
|
141
|
+
flex-direction: column;
|
|
142
|
+
gap: 8px;
|
|
143
|
+
margin-top: 8px;
|
|
144
|
+
padding: 12px;
|
|
145
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
146
|
+
border: 1px dashed var(--dev-wallet-border);
|
|
147
|
+
background: var(--dev-wallet-secondary);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.form-input {
|
|
151
|
+
width: 100%;
|
|
152
|
+
padding: 6px 8px;
|
|
153
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
154
|
+
border: 1px solid var(--dev-wallet-input);
|
|
155
|
+
background: var(--dev-wallet-background);
|
|
156
|
+
color: var(--dev-wallet-foreground);
|
|
157
|
+
font-size: 12px;
|
|
158
|
+
font-family: inherit;
|
|
159
|
+
outline: none;
|
|
160
|
+
box-sizing: border-box;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.form-input:focus {
|
|
164
|
+
border-color: var(--dev-wallet-primary);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.form-input::placeholder {
|
|
168
|
+
color: var(--dev-wallet-muted-foreground);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.form-actions {
|
|
172
|
+
display: flex;
|
|
173
|
+
gap: 6px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.btn-sm {
|
|
177
|
+
padding: 5px 10px;
|
|
178
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
179
|
+
font-size: 11px;
|
|
180
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.btn-add {
|
|
184
|
+
background: var(--dev-wallet-primary);
|
|
185
|
+
color: var(--dev-wallet-primary-foreground);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.btn-add:disabled {
|
|
189
|
+
opacity: 0.5;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.btn-cancel {
|
|
193
|
+
background: var(--dev-wallet-secondary);
|
|
194
|
+
color: var(--dev-wallet-foreground);
|
|
195
|
+
border: 1px solid var(--dev-wallet-border);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.btn-toggle {
|
|
199
|
+
font-size: 12px;
|
|
200
|
+
color: var(--dev-wallet-primary);
|
|
201
|
+
padding: 4px 0;
|
|
202
|
+
margin-top: 4px;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.btn-toggle:hover {
|
|
206
|
+
text-decoration: underline;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.cli-section-column {
|
|
210
|
+
flex-direction: column;
|
|
211
|
+
align-items: flex-start;
|
|
212
|
+
gap: 6px;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.cli-header-row {
|
|
216
|
+
display: flex;
|
|
217
|
+
align-items: center;
|
|
218
|
+
gap: 8px;
|
|
219
|
+
width: 100%;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.cli-accounts-list {
|
|
223
|
+
width: 100%;
|
|
224
|
+
padding-left: 16px;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.cli-accounts-list .network-url {
|
|
228
|
+
padding: 2px 0;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.cli-hint {
|
|
232
|
+
padding-left: 16px;
|
|
233
|
+
margin-top: 0;
|
|
234
|
+
font-size: 12px;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.cli-unpaired-hint {
|
|
238
|
+
margin-top: 8px;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.about {
|
|
242
|
+
font-size: 12px;
|
|
243
|
+
color: var(--dev-wallet-muted-foreground);
|
|
244
|
+
line-height: 1.5;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.error {
|
|
248
|
+
font-size: 11px;
|
|
249
|
+
color: var(--dev-wallet-destructive);
|
|
250
|
+
margin-top: 4px;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.bookmarklet-link-wrapper {
|
|
254
|
+
margin-top: 8px;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.bookmarklet-link {
|
|
258
|
+
display: inline-flex;
|
|
259
|
+
align-items: center;
|
|
260
|
+
gap: 6px;
|
|
261
|
+
padding: 8px 14px;
|
|
262
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
263
|
+
background: var(--dev-wallet-primary);
|
|
264
|
+
color: var(--dev-wallet-primary-foreground);
|
|
265
|
+
font-size: 13px;
|
|
266
|
+
font-weight: var(--dev-wallet-font-weight-semibold);
|
|
267
|
+
text-decoration: none;
|
|
268
|
+
cursor: grab;
|
|
269
|
+
user-select: none;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.bookmarklet-link:hover {
|
|
273
|
+
opacity: 0.9;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.bookmarklet-link:active {
|
|
277
|
+
cursor: grabbing;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.bookmarklet-url {
|
|
281
|
+
font-family: var(--dev-wallet-font-mono);
|
|
282
|
+
font-size: 10px;
|
|
283
|
+
color: var(--dev-wallet-muted-foreground);
|
|
284
|
+
word-break: break-all;
|
|
285
|
+
user-select: all;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.console-snippet {
|
|
289
|
+
position: relative;
|
|
290
|
+
margin-top: 8px;
|
|
291
|
+
padding: 10px 12px;
|
|
292
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
293
|
+
background: var(--dev-wallet-secondary);
|
|
294
|
+
border: 1px solid var(--dev-wallet-border);
|
|
295
|
+
font-family: var(--dev-wallet-font-mono);
|
|
296
|
+
font-size: 11px;
|
|
297
|
+
color: var(--dev-wallet-foreground);
|
|
298
|
+
line-height: 1.5;
|
|
299
|
+
white-space: pre-wrap;
|
|
300
|
+
word-break: break-all;
|
|
301
|
+
user-select: all;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.btn-copy {
|
|
305
|
+
position: absolute;
|
|
306
|
+
top: 6px;
|
|
307
|
+
right: 6px;
|
|
308
|
+
padding: 3px 8px;
|
|
309
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
310
|
+
background: var(--dev-wallet-border);
|
|
311
|
+
color: var(--dev-wallet-muted-foreground);
|
|
312
|
+
font-size: 10px;
|
|
313
|
+
font-family: inherit;
|
|
314
|
+
cursor: pointer;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.btn-copy:hover {
|
|
318
|
+
background: var(--dev-wallet-input);
|
|
319
|
+
color: var(--dev-wallet-foreground);
|
|
320
|
+
}
|
|
321
|
+
`
|
|
322
|
+
];
|
|
323
|
+
}
|
|
324
|
+
render() {
|
|
325
|
+
return html`
|
|
326
|
+
<div class="section">${this.#renderNetworks()}</div>
|
|
327
|
+
${this.#hasCliAdapter() ? html`<div class="section">${this.#renderCliSigner()}</div>` : nothing}
|
|
328
|
+
<div class="section">${this.#renderAccounts()}</div>
|
|
329
|
+
<div class="section">${this.#renderBookmarklet()}</div>
|
|
330
|
+
<div class="section">${this.#renderAbout()}</div>
|
|
331
|
+
`;
|
|
332
|
+
}
|
|
333
|
+
#renderNetworks() {
|
|
334
|
+
if (!this.wallet) return nothing;
|
|
335
|
+
const networks = this.wallet.availableNetworks;
|
|
336
|
+
const activeNetwork = this.wallet.activeNetwork;
|
|
337
|
+
const urls = this.wallet.networkUrls;
|
|
338
|
+
return html`
|
|
339
|
+
<h3 class="section-header">Networks</h3>
|
|
340
|
+
<div class="network-list">
|
|
341
|
+
${networks.map((name) => {
|
|
342
|
+
const color = NETWORK_COLORS[name] ?? "#6b7280";
|
|
343
|
+
const isActive = name === activeNetwork;
|
|
344
|
+
const isEditing = this._editingNetwork === name;
|
|
345
|
+
return html`
|
|
346
|
+
<div class="network-item ${isActive ? "active" : ""}">
|
|
347
|
+
<span class="network-dot" style="background: ${color}"></span>
|
|
348
|
+
<div class="network-info">
|
|
349
|
+
<span class="network-name">${name}</span>
|
|
350
|
+
${isEditing ? html`<input
|
|
351
|
+
class="network-url-input"
|
|
352
|
+
type="text"
|
|
353
|
+
.value=${this._editingUrl}
|
|
354
|
+
@input=${(e) => {
|
|
355
|
+
this._editingUrl = e.target.value;
|
|
356
|
+
}}
|
|
357
|
+
@keydown=${(e) => {
|
|
358
|
+
if (e.key === "Enter") this.#saveNetworkUrl(name);
|
|
359
|
+
if (e.key === "Escape") this.#cancelEditNetwork();
|
|
360
|
+
}}
|
|
361
|
+
/>` : html`<span class="network-url" title=${urls[name] ?? ""}
|
|
362
|
+
>${urls[name] ?? ""}</span
|
|
363
|
+
>`}
|
|
364
|
+
</div>
|
|
365
|
+
<div class="network-actions">
|
|
366
|
+
${isEditing ? html`
|
|
367
|
+
<button
|
|
368
|
+
class="btn-icon"
|
|
369
|
+
title="Save"
|
|
370
|
+
aria-label="Save URL"
|
|
371
|
+
@click=${() => this.#saveNetworkUrl(name)}
|
|
372
|
+
>
|
|
373
|
+
✓
|
|
374
|
+
</button>
|
|
375
|
+
<button
|
|
376
|
+
class="btn-icon"
|
|
377
|
+
title="Cancel"
|
|
378
|
+
aria-label="Cancel editing"
|
|
379
|
+
@click=${this.#cancelEditNetwork}
|
|
380
|
+
>
|
|
381
|
+
✕
|
|
382
|
+
</button>
|
|
383
|
+
` : html`
|
|
384
|
+
<button
|
|
385
|
+
class="btn-icon"
|
|
386
|
+
title="Edit URL"
|
|
387
|
+
aria-label="Edit network URL"
|
|
388
|
+
@click=${() => this.#startEditNetwork(name, urls[name] ?? "")}
|
|
389
|
+
>
|
|
390
|
+
✎
|
|
391
|
+
</button>
|
|
392
|
+
${!isActive ? html`<button
|
|
393
|
+
class="btn-icon btn-icon-danger"
|
|
394
|
+
title="Remove"
|
|
395
|
+
aria-label="Remove network"
|
|
396
|
+
@click=${() => this.#removeNetwork(name)}
|
|
397
|
+
>
|
|
398
|
+
✕
|
|
399
|
+
</button>` : nothing}
|
|
400
|
+
`}
|
|
401
|
+
${isActive ? html`<span class="network-active-badge">Active</span>` : nothing}
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
`;
|
|
405
|
+
})}
|
|
406
|
+
</div>
|
|
407
|
+
${this._showAddNetwork ? this.#renderAddNetworkForm() : html`
|
|
408
|
+
<button
|
|
409
|
+
class="btn-toggle"
|
|
410
|
+
@click=${() => {
|
|
411
|
+
this._showAddNetwork = true;
|
|
412
|
+
}}
|
|
413
|
+
>
|
|
414
|
+
+ Add Network
|
|
415
|
+
</button>
|
|
416
|
+
`}
|
|
417
|
+
`;
|
|
418
|
+
}
|
|
419
|
+
#renderAddNetworkForm() {
|
|
420
|
+
return html`
|
|
421
|
+
<div class="add-network-form">
|
|
422
|
+
<input
|
|
423
|
+
class="form-input"
|
|
424
|
+
type="text"
|
|
425
|
+
placeholder="Network name (e.g. custom)"
|
|
426
|
+
.value=${this._networkName}
|
|
427
|
+
@input=${(e) => {
|
|
428
|
+
this._networkName = e.target.value;
|
|
429
|
+
this._error = null;
|
|
430
|
+
}}
|
|
431
|
+
/>
|
|
432
|
+
<input
|
|
433
|
+
class="form-input"
|
|
434
|
+
type="text"
|
|
435
|
+
placeholder="gRPC URL (e.g. http://localhost:9000)"
|
|
436
|
+
.value=${this._networkUrl}
|
|
437
|
+
@input=${(e) => {
|
|
438
|
+
this._networkUrl = e.target.value;
|
|
439
|
+
this._error = null;
|
|
440
|
+
}}
|
|
441
|
+
@keydown=${(e) => {
|
|
442
|
+
if (e.key === "Enter") this.#addNetwork();
|
|
443
|
+
if (e.key === "Escape") this.#cancelAddNetwork();
|
|
444
|
+
}}
|
|
445
|
+
/>
|
|
446
|
+
${this._error ? html`<div class="error">${this._error}</div>` : nothing}
|
|
447
|
+
<div class="form-actions">
|
|
448
|
+
<button
|
|
449
|
+
class="btn-sm btn-add"
|
|
450
|
+
?disabled=${!this._networkName.trim() || !this._networkUrl.trim()}
|
|
451
|
+
@click=${this.#addNetwork}
|
|
452
|
+
>
|
|
453
|
+
Add
|
|
454
|
+
</button>
|
|
455
|
+
<button class="btn-sm btn-cancel" @click=${this.#cancelAddNetwork}>Cancel</button>
|
|
456
|
+
</div>
|
|
457
|
+
</div>
|
|
458
|
+
`;
|
|
459
|
+
}
|
|
460
|
+
#hasCliAdapter() {
|
|
461
|
+
return this.adapters.some((a) => a.id === "remote-cli");
|
|
462
|
+
}
|
|
463
|
+
#renderCliSigner() {
|
|
464
|
+
const cliAdapter = this.adapters.find((a) => a.id === "remote-cli");
|
|
465
|
+
if (!cliAdapter) return nothing;
|
|
466
|
+
const isPaired = "isPaired" in cliAdapter && cliAdapter.isPaired;
|
|
467
|
+
const cliAccounts = cliAdapter.getAccounts();
|
|
468
|
+
return html`
|
|
469
|
+
<h3 class="section-header">CLI Signer</h3>
|
|
470
|
+
${isPaired ? html`
|
|
471
|
+
<div class="network-item active cli-section-column">
|
|
472
|
+
<div class="cli-header-row">
|
|
473
|
+
<span
|
|
474
|
+
class="network-dot"
|
|
475
|
+
style="background: var(--dev-wallet-status-connected)"
|
|
476
|
+
></span>
|
|
477
|
+
<span class="network-name">Connected</span>
|
|
478
|
+
${cliAccounts.length > 0 ? html`<span class="network-active-badge">${cliAccounts.length} imported</span>` : nothing}
|
|
479
|
+
</div>
|
|
480
|
+
${cliAccounts.length > 0 ? html`<div class="cli-accounts-list">
|
|
481
|
+
${cliAccounts.map((acc) => html`
|
|
482
|
+
<div class="network-url">${acc.label} (${formatAddress(acc.address)})</div>
|
|
483
|
+
`)}
|
|
484
|
+
</div>` : html`<div class="about cli-hint">Use + Add above to import CLI accounts.</div>`}
|
|
485
|
+
</div>
|
|
486
|
+
` : html`
|
|
487
|
+
<div class="network-item">
|
|
488
|
+
<span
|
|
489
|
+
class="network-dot"
|
|
490
|
+
style="background: var(--dev-wallet-status-disconnected)"
|
|
491
|
+
></span>
|
|
492
|
+
<span class="network-name" style="color: var(--dev-wallet-muted-foreground)"
|
|
493
|
+
>Not connected</span
|
|
494
|
+
>
|
|
495
|
+
</div>
|
|
496
|
+
<div class="about cli-unpaired-hint">
|
|
497
|
+
Open the token URL from your terminal to connect CLI accounts.
|
|
498
|
+
</div>
|
|
499
|
+
`}
|
|
500
|
+
`;
|
|
501
|
+
}
|
|
502
|
+
#renderAccounts() {
|
|
503
|
+
return html`
|
|
504
|
+
<dev-wallet-accounts
|
|
505
|
+
exportparts="account-list: accounts-account-list, add-button: accounts-add-button, empty-state: accounts-empty-state"
|
|
506
|
+
.accounts=${this.accounts}
|
|
507
|
+
.adapters=${this.adapters}
|
|
508
|
+
.activeAddress=${this.activeAddress}
|
|
509
|
+
></dev-wallet-accounts>
|
|
510
|
+
`;
|
|
511
|
+
}
|
|
512
|
+
#renderBookmarklet() {
|
|
513
|
+
if (!this.bookmarkletOrigin) return nothing;
|
|
514
|
+
const origin = this.bookmarkletOrigin;
|
|
515
|
+
const bookmarkletJs = `${origin}/bookmarklet.js`;
|
|
516
|
+
const bookmarkletHref = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${bookmarkletJs}'})))`;
|
|
517
|
+
const consoleSnippet = `var s=document.createElement('script');s.src='${bookmarkletJs}';document.head.appendChild(s);`;
|
|
518
|
+
return html`
|
|
519
|
+
<h3 class="section-header">Bookmarklet</h3>
|
|
520
|
+
<div class="about">
|
|
521
|
+
Drag this link to your bookmarks bar, then click it on any dApp to inject the wallet:
|
|
522
|
+
</div>
|
|
523
|
+
<div class="bookmarklet-link-wrapper">
|
|
524
|
+
<a
|
|
525
|
+
class="bookmarklet-link"
|
|
526
|
+
href=${bookmarkletHref}
|
|
527
|
+
title="Drag to bookmarks bar"
|
|
528
|
+
@click=${(e) => e.preventDefault()}
|
|
529
|
+
>
|
|
530
|
+
Dev Wallet
|
|
531
|
+
</a>
|
|
532
|
+
</div>
|
|
533
|
+
<div class="about" style="margin-top: 12px">Or paste this in the browser console:</div>
|
|
534
|
+
<div class="console-snippet">
|
|
535
|
+
${consoleSnippet}
|
|
536
|
+
<button class="btn-copy" @click=${() => this.#copySnippet(consoleSnippet)}>
|
|
537
|
+
${this._copied ? "Copied!" : "Copy"}
|
|
538
|
+
</button>
|
|
539
|
+
</div>
|
|
540
|
+
<div class="about" style="margin-top: 8px">
|
|
541
|
+
Or add this script to your page:<br />
|
|
542
|
+
<code class="bookmarklet-url">${bookmarkletJs}</code>
|
|
543
|
+
</div>
|
|
544
|
+
`;
|
|
545
|
+
}
|
|
546
|
+
#copySnippet(text) {
|
|
547
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
548
|
+
this._copied = true;
|
|
549
|
+
setTimeout(() => {
|
|
550
|
+
this._copied = false;
|
|
551
|
+
}, 2e3);
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
#renderAbout() {
|
|
555
|
+
return html`
|
|
556
|
+
<h3 class="section-header">About</h3>
|
|
557
|
+
<div class="about">
|
|
558
|
+
<strong>${this.wallet?.name ?? "Dev Wallet"}</strong><br />
|
|
559
|
+
A development wallet for testing Sui dApps.<br />
|
|
560
|
+
${this.wallet ? html`${this.wallet.accounts.length} account(s) across ${this.wallet.adapters.length}
|
|
561
|
+
adapter(s)` : nothing}
|
|
562
|
+
</div>
|
|
563
|
+
`;
|
|
564
|
+
}
|
|
565
|
+
#addNetwork() {
|
|
566
|
+
if (!this.wallet) return;
|
|
567
|
+
const name = this._networkName.trim();
|
|
568
|
+
const url = this._networkUrl.trim();
|
|
569
|
+
if (!name || !url) return;
|
|
570
|
+
if (this.wallet.availableNetworks.includes(name)) {
|
|
571
|
+
this._error = `Network "${name}" already exists`;
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
try {
|
|
575
|
+
this.wallet.addNetwork(name, url);
|
|
576
|
+
this._networkName = "";
|
|
577
|
+
this._networkUrl = "";
|
|
578
|
+
this._showAddNetwork = false;
|
|
579
|
+
this._error = null;
|
|
580
|
+
emitEvent(this, "network-added", {
|
|
581
|
+
name,
|
|
582
|
+
url
|
|
583
|
+
});
|
|
584
|
+
} catch (err) {
|
|
585
|
+
this._error = getErrorMessage(err, "Failed to add network");
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
#cancelAddNetwork() {
|
|
589
|
+
this._showAddNetwork = false;
|
|
590
|
+
this._networkName = "";
|
|
591
|
+
this._networkUrl = "";
|
|
592
|
+
this._error = null;
|
|
593
|
+
}
|
|
594
|
+
#startEditNetwork(name, url) {
|
|
595
|
+
this._editingNetwork = name;
|
|
596
|
+
this._editingUrl = url;
|
|
597
|
+
}
|
|
598
|
+
#saveNetworkUrl(name) {
|
|
599
|
+
if (!this.wallet) return;
|
|
600
|
+
const url = this._editingUrl.trim();
|
|
601
|
+
if (!url) return;
|
|
602
|
+
try {
|
|
603
|
+
this.wallet.addNetwork(name, url);
|
|
604
|
+
this._editingNetwork = null;
|
|
605
|
+
this._editingUrl = "";
|
|
606
|
+
} catch (error) {
|
|
607
|
+
this._error = error instanceof Error ? error.message : "Invalid URL";
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
#cancelEditNetwork() {
|
|
611
|
+
this._editingNetwork = null;
|
|
612
|
+
this._editingUrl = "";
|
|
613
|
+
}
|
|
614
|
+
#removeNetwork(name) {
|
|
615
|
+
if (!this.wallet) return;
|
|
616
|
+
this.wallet.removeNetwork(name);
|
|
617
|
+
}
|
|
618
|
+
};
|
|
619
|
+
__decorate([property({ attribute: false })], DevWalletSettings.prototype, "wallet", void 0);
|
|
620
|
+
__decorate([property({ attribute: false })], DevWalletSettings.prototype, "accounts", void 0);
|
|
621
|
+
__decorate([property({ attribute: false })], DevWalletSettings.prototype, "adapters", void 0);
|
|
622
|
+
__decorate([property({ type: String })], DevWalletSettings.prototype, "activeAddress", void 0);
|
|
623
|
+
__decorate([property({ type: String })], DevWalletSettings.prototype, "bookmarkletOrigin", void 0);
|
|
624
|
+
__decorate([state()], DevWalletSettings.prototype, "_showAddNetwork", void 0);
|
|
625
|
+
__decorate([state()], DevWalletSettings.prototype, "_networkName", void 0);
|
|
626
|
+
__decorate([state()], DevWalletSettings.prototype, "_networkUrl", void 0);
|
|
627
|
+
__decorate([state()], DevWalletSettings.prototype, "_error", void 0);
|
|
628
|
+
__decorate([state()], DevWalletSettings.prototype, "_editingNetwork", void 0);
|
|
629
|
+
__decorate([state()], DevWalletSettings.prototype, "_editingUrl", void 0);
|
|
630
|
+
__decorate([state()], DevWalletSettings.prototype, "_copied", void 0);
|
|
631
|
+
DevWalletSettings = __decorate([customElement("dev-wallet-settings")], DevWalletSettings);
|
|
632
|
+
|
|
633
|
+
//#endregion
|
|
634
|
+
export { DevWalletSettings };
|
|
635
|
+
//# sourceMappingURL=dev-wallet-settings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-wallet-settings.mjs","names":["DevWalletSettings","#renderNetworks","#hasCliAdapter","#renderCliSigner","#renderAccounts","#renderBookmarklet","#renderAbout","#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 { sectionHeaderStyles, sharedStyles } 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\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 20px;\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.network-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t.network-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.network-item.active {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\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\tcolor: var(--dev-wallet-foreground);\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\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\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-url-input {\n\t\t\t\twidth: 100%;\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\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\toutline: none;\n\t\t\t\tbox-sizing: border-box;\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\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.btn-icon:hover {\n\t\t\t\tbackground: var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.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\tfont-size: 9px;\n\t\t\t\tpadding: 1px 5px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\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\ttext-transform: uppercase;\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-sm);\n\t\t\t\tborder: 1px dashed var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.form-input {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 6px 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\toutline: none;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\n\t\t\t.form-input:focus {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.form-input::placeholder {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\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\tpadding: 4px 0;\n\t\t\t\tmargin-top: 4px;\n\t\t\t}\n\n\t\t\t.btn-toggle:hover {\n\t\t\t\ttext-decoration: underline;\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\tcolor: var(--dev-wallet-destructive);\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\tposition: relative;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 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\tword-break: break-all;\n\t\t\t\tuser-select: all;\n\t\t\t}\n\n\t\t\t.btn-copy {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 6px;\n\t\t\t\tright: 6px;\n\t\t\t\tpadding: 3px 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t.btn-copy:hover {\n\t\t\t\tbackground: var(--dev-wallet-input);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\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.#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<div class=\"section\">${this.#renderBookmarklet()}</div>\n\t\t\t<div class=\"section\">${this.#renderAbout()}</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${consoleSnippet}\n\t\t\t\t<button class=\"btn-copy\" @click=${() => this.#copySnippet(consoleSnippet)}>\n\t\t\t\t\t${this._copied ? 'Copied!' : 'Copy'}\n\t\t\t\t</button>\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#renderAbout() {\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">About</h3>\n\t\t\t<div class=\"about\">\n\t\t\t\t<strong>${this.wallet?.name ?? 'Dev Wallet'}</strong><br />\n\t\t\t\tA development wallet for testing Sui dApps.<br />\n\t\t\t\t${this.wallet\n\t\t\t\t\t? html`${this.wallet.accounts.length} account(s) across ${this.wallet.adapters.length}\n\t\t\t\t\t\tadapter(s)`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\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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"}
|