@mysten-incubation/dev-wallet 0.5.0 → 0.6.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 +41 -0
- package/README.md +12 -8
- package/dist/client/connected-apps.d.mts +35 -0
- package/dist/client/connected-apps.d.mts.map +1 -0
- package/dist/client/connected-apps.mjs +50 -0
- package/dist/client/connected-apps.mjs.map +1 -0
- package/dist/client/dev-wallet-client.mjs +1 -1
- package/dist/client/dev-wallet-client.mjs.map +1 -1
- package/dist/client/index.d.mts +2 -1
- package/dist/client/index.mjs +2 -1
- package/dist/client/request-handler.d.mts +7 -0
- package/dist/client/request-handler.d.mts.map +1 -1
- package/dist/client/request-handler.mjs +17 -2
- package/dist/client/request-handler.mjs.map +1 -1
- package/dist/inject/index.d.mts +4 -0
- package/dist/inject/index.d.mts.map +1 -1
- package/dist/inject/index.mjs +31 -0
- package/dist/inject/index.mjs.map +1 -1
- package/dist/standalone/assets/{in-memory-adapter-Ban2kRYS.js → in-memory-adapter-uuWG4K4k.js} +1 -1
- package/dist/standalone/assets/main-CKYv0eR6.js +7 -0
- package/dist/standalone/assets/{webcrypto-adapter-Ddqn-RAu.js → webcrypto-adapter-5ShaPc_M.js} +1 -1
- package/dist/standalone/bookmarklet.js +1 -1
- package/dist/standalone/index.html +1 -1
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
- package/dist/ui/dev-wallet-balances.mjs +20 -13
- package/dist/ui/dev-wallet-balances.mjs.map +1 -1
- package/dist/ui/dev-wallet-connect-guide.d.mts +29 -0
- package/dist/ui/dev-wallet-connect-guide.d.mts.map +1 -0
- package/dist/ui/dev-wallet-connect-guide.mjs +386 -0
- package/dist/ui/dev-wallet-connect-guide.mjs.map +1 -0
- package/dist/ui/dev-wallet-connected-apps.d.mts +27 -0
- package/dist/ui/dev-wallet-connected-apps.d.mts.map +1 -0
- package/dist/ui/dev-wallet-connected-apps.mjs +164 -0
- package/dist/ui/dev-wallet-connected-apps.mjs.map +1 -0
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-panel.mjs +0 -9
- package/dist/ui/dev-wallet-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-settings.d.mts +8 -2
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
- package/dist/ui/dev-wallet-settings.mjs +86 -171
- package/dist/ui/dev-wallet-settings.mjs.map +1 -1
- package/dist/ui/dev-wallet-standalone.d.mts +7 -2
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
- package/dist/ui/dev-wallet-standalone.mjs +68 -222
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
- package/dist/ui/index.d.mts +3 -1
- package/dist/ui/index.mjs +3 -1
- package/dist/ui/wallet-controller.mjs +15 -3
- package/dist/ui/wallet-controller.mjs.map +1 -1
- package/dist/wallet/dev-wallet.d.mts +15 -3
- package/dist/wallet/dev-wallet.d.mts.map +1 -1
- package/dist/wallet/dev-wallet.mjs +94 -30
- package/dist/wallet/dev-wallet.mjs.map +1 -1
- package/dist/wallet/persisted.mjs +20 -0
- package/dist/wallet/persisted.mjs.map +1 -0
- package/package.json +6 -6
- package/src/app/main.ts +6 -2
- package/src/client/connected-apps.ts +79 -0
- package/src/client/dev-wallet-client.ts +2 -1
- package/src/client/index.ts +2 -0
- package/src/client/request-handler.ts +24 -1
- package/src/inject/index.ts +55 -0
- package/src/ui/dev-wallet-balances.ts +25 -13
- package/src/ui/dev-wallet-connect-guide.ts +428 -0
- package/src/ui/dev-wallet-connected-apps.ts +191 -0
- package/src/ui/dev-wallet-panel.ts +0 -9
- package/src/ui/dev-wallet-settings.ts +101 -179
- package/src/ui/dev-wallet-standalone.ts +80 -231
- package/src/ui/index.ts +2 -0
- package/src/ui/wallet-controller.ts +23 -3
- package/src/wallet/dev-wallet.ts +130 -39
- package/src/wallet/persisted.ts +24 -0
- package/dist/standalone/assets/main-xfzarPod.js +0 -7
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { CopyController } from "./copy-controller.mjs";
|
|
2
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
3
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
4
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
5
|
+
//#region src/ui/dev-wallet-connect-guide.ts
|
|
6
|
+
function detectPlatform() {
|
|
7
|
+
const nav = globalThis.navigator;
|
|
8
|
+
if (!nav) return "desktop";
|
|
9
|
+
const ua = nav.userAgent;
|
|
10
|
+
if (/Android/.test(ua)) return /Firefox/.test(ua) ? "android-firefox" : "android";
|
|
11
|
+
if (/iPhone|iPad|iPod/.test(ua) || /Macintosh/.test(ua) && nav.maxTouchPoints > 1) return "ios";
|
|
12
|
+
return "desktop";
|
|
13
|
+
}
|
|
14
|
+
const BOOKMARKS_BAR_SHORTCUT = /Mac|iPhone|iPad/.test(globalThis.navigator?.platform ?? "") ? "⌘ Shift B" : "Ctrl Shift B";
|
|
15
|
+
const TABS = [{
|
|
16
|
+
id: "bookmarklet",
|
|
17
|
+
label: "Bookmarklet"
|
|
18
|
+
}, {
|
|
19
|
+
id: "dapp-kit",
|
|
20
|
+
label: "dApp Kit"
|
|
21
|
+
}];
|
|
22
|
+
let DevWalletConnectGuide = class DevWalletConnectGuide extends LitElement {
|
|
23
|
+
constructor(..._args) {
|
|
24
|
+
super(..._args);
|
|
25
|
+
this.origin = "";
|
|
26
|
+
this._dragNudge = false;
|
|
27
|
+
this._tab = "bookmarklet";
|
|
28
|
+
this.platform = detectPlatform();
|
|
29
|
+
this.#copy = new CopyController(this);
|
|
30
|
+
this.#nudgeDrag = (e) => {
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
this._dragNudge = true;
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
this._dragNudge = false;
|
|
35
|
+
}, 2500);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
static {
|
|
39
|
+
this.styles = css`
|
|
40
|
+
:host {
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
gap: 10px;
|
|
44
|
+
font-size: 12px;
|
|
45
|
+
line-height: 1.55;
|
|
46
|
+
color: var(--dev-wallet-muted-foreground);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.tabs {
|
|
50
|
+
display: flex;
|
|
51
|
+
gap: 2px;
|
|
52
|
+
padding: 2px;
|
|
53
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
54
|
+
border: 1px solid var(--dev-wallet-border);
|
|
55
|
+
background: var(--dev-wallet-bg-1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.tab {
|
|
59
|
+
flex: 1;
|
|
60
|
+
height: 26px;
|
|
61
|
+
border: 0;
|
|
62
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
63
|
+
background: transparent;
|
|
64
|
+
color: var(--dev-wallet-muted-foreground);
|
|
65
|
+
font: inherit;
|
|
66
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.tab:hover {
|
|
71
|
+
color: var(--dev-wallet-foreground);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.tab[aria-selected='true'] {
|
|
75
|
+
background: var(--dev-wallet-bg-3);
|
|
76
|
+
color: var(--dev-wallet-foreground);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.panel {
|
|
80
|
+
display: flex;
|
|
81
|
+
flex-direction: column;
|
|
82
|
+
gap: 10px;
|
|
83
|
+
padding-top: 4px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.guide-title {
|
|
87
|
+
margin: 0;
|
|
88
|
+
font-family: var(--dev-wallet-font-mono);
|
|
89
|
+
font-size: 10px;
|
|
90
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
91
|
+
letter-spacing: 0.14em;
|
|
92
|
+
text-transform: uppercase;
|
|
93
|
+
color: var(--dev-wallet-text-3);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.guide p {
|
|
97
|
+
margin: 0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.guide strong {
|
|
101
|
+
color: var(--dev-wallet-foreground);
|
|
102
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.steps {
|
|
106
|
+
margin: 0;
|
|
107
|
+
padding-left: 18px;
|
|
108
|
+
display: flex;
|
|
109
|
+
flex-direction: column;
|
|
110
|
+
gap: 8px;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.steps li::marker {
|
|
114
|
+
color: var(--dev-wallet-text-3);
|
|
115
|
+
font-family: var(--dev-wallet-font-mono);
|
|
116
|
+
font-size: 11px;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.steps .bookmarklet-row {
|
|
120
|
+
margin-top: 6px;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
kbd {
|
|
124
|
+
padding: 1px 5px;
|
|
125
|
+
border-radius: var(--dev-wallet-radius-2xs);
|
|
126
|
+
border: 1px solid var(--dev-wallet-border-strong);
|
|
127
|
+
background: var(--dev-wallet-bg-2);
|
|
128
|
+
font-family: var(--dev-wallet-font-mono);
|
|
129
|
+
font-size: 10.5px;
|
|
130
|
+
color: var(--dev-wallet-foreground);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.bookmarklet-row {
|
|
134
|
+
display: flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
flex-wrap: wrap;
|
|
137
|
+
gap: 10px;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.bookmarklet {
|
|
141
|
+
display: inline-flex;
|
|
142
|
+
align-items: center;
|
|
143
|
+
gap: 6px;
|
|
144
|
+
padding: 6px 12px;
|
|
145
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
146
|
+
border: 1px solid var(--dev-wallet-border-strong);
|
|
147
|
+
background: var(--dev-wallet-bg-2);
|
|
148
|
+
color: var(--dev-wallet-foreground);
|
|
149
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
150
|
+
text-decoration: none;
|
|
151
|
+
cursor: grab;
|
|
152
|
+
user-select: none;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.bookmarklet:hover {
|
|
156
|
+
background: var(--dev-wallet-bg-hover);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.bookmarklet:active {
|
|
160
|
+
cursor: grabbing;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.bookmarklet svg {
|
|
164
|
+
width: 13px;
|
|
165
|
+
height: 13px;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.hint {
|
|
169
|
+
font-size: 11px;
|
|
170
|
+
color: var(--dev-wallet-text-3);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.hint.nudge {
|
|
174
|
+
color: var(--dev-wallet-warning);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.link-btn {
|
|
178
|
+
align-self: flex-start;
|
|
179
|
+
text-align: left;
|
|
180
|
+
padding: 0;
|
|
181
|
+
border: 0;
|
|
182
|
+
background: none;
|
|
183
|
+
color: var(--dev-wallet-muted-foreground);
|
|
184
|
+
font: inherit;
|
|
185
|
+
text-decoration: underline;
|
|
186
|
+
text-underline-offset: 2px;
|
|
187
|
+
cursor: pointer;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.link-btn.inline {
|
|
191
|
+
display: inline;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.link-btn:hover {
|
|
195
|
+
color: var(--dev-wallet-foreground);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.snippet {
|
|
199
|
+
position: relative;
|
|
200
|
+
border-radius: var(--dev-wallet-radius);
|
|
201
|
+
border: 1px solid var(--dev-wallet-border);
|
|
202
|
+
background: var(--dev-wallet-bg-1);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.snippet pre,
|
|
206
|
+
.snippet code {
|
|
207
|
+
font-family: var(--dev-wallet-font-mono);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.snippet pre {
|
|
211
|
+
margin: 0;
|
|
212
|
+
padding: 10px 12px;
|
|
213
|
+
overflow-x: auto;
|
|
214
|
+
font-size: 10.5px;
|
|
215
|
+
line-height: 1.6;
|
|
216
|
+
color: var(--dev-wallet-foreground);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.snippet .btn-copy {
|
|
220
|
+
position: absolute;
|
|
221
|
+
top: 6px;
|
|
222
|
+
right: 6px;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.btn-copy {
|
|
226
|
+
height: 22px;
|
|
227
|
+
padding: 0 8px;
|
|
228
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
229
|
+
border: 1px solid var(--dev-wallet-border);
|
|
230
|
+
background: var(--dev-wallet-bg-2);
|
|
231
|
+
color: var(--dev-wallet-foreground);
|
|
232
|
+
font-family: var(--dev-wallet-font-sans);
|
|
233
|
+
font-size: 10.5px;
|
|
234
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
235
|
+
cursor: pointer;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.btn-copy:hover {
|
|
239
|
+
background: var(--dev-wallet-bg-hover);
|
|
240
|
+
border-color: var(--dev-wallet-border-strong);
|
|
241
|
+
}
|
|
242
|
+
`;
|
|
243
|
+
}
|
|
244
|
+
#copy;
|
|
245
|
+
render() {
|
|
246
|
+
const origin = this.origin;
|
|
247
|
+
const scriptUrl = `${origin}/bookmarklet.js`;
|
|
248
|
+
const bookmarkletHref = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${scriptUrl}'})))`;
|
|
249
|
+
const consoleScript = `var s=document.createElement('script');s.src='${scriptUrl}';document.head.appendChild(s);`;
|
|
250
|
+
const dappKitSnippet = `import {
|
|
251
|
+
devWalletClientInitializer,
|
|
252
|
+
} from '@mysten-incubation/dev-wallet/client';
|
|
253
|
+
|
|
254
|
+
createDAppKit({
|
|
255
|
+
networks: ['devnet'],
|
|
256
|
+
walletInitializers: [
|
|
257
|
+
devWalletClientInitializer({
|
|
258
|
+
origin: '${origin}',
|
|
259
|
+
}),
|
|
260
|
+
],
|
|
261
|
+
});`;
|
|
262
|
+
return html`
|
|
263
|
+
<h2 class="guide-title">Connect an app</h2>
|
|
264
|
+
<div class="tabs" role="tablist" aria-label="Connection method">
|
|
265
|
+
${TABS.map(({ id, label }) => html`<button
|
|
266
|
+
role="tab"
|
|
267
|
+
class="tab"
|
|
268
|
+
aria-selected=${this._tab === id}
|
|
269
|
+
@click=${() => this._tab = id}
|
|
270
|
+
>
|
|
271
|
+
${label}
|
|
272
|
+
</button>`)}
|
|
273
|
+
</div>
|
|
274
|
+
<div role="tabpanel" class="panel">
|
|
275
|
+
${this._tab === "bookmarklet" ? this.platform === "desktop" ? this.#renderBookmarklet(bookmarkletHref, consoleScript) : this.#renderMobileBookmarklet(bookmarkletHref) : this.#renderDappKit(dappKitSnippet)}
|
|
276
|
+
</div>
|
|
277
|
+
`;
|
|
278
|
+
}
|
|
279
|
+
#renderBookmarklet(bookmarkletHref, consoleScript) {
|
|
280
|
+
return html`
|
|
281
|
+
<p>Add this wallet to any dApp without changing its code.</p>
|
|
282
|
+
<ol class="steps">
|
|
283
|
+
<li>Show your browser's bookmarks bar (<kbd>${BOOKMARKS_BAR_SHORTCUT}</kbd>).</li>
|
|
284
|
+
<li>
|
|
285
|
+
Drag this button onto the bookmarks bar:
|
|
286
|
+
<div class="bookmarklet-row">
|
|
287
|
+
<a
|
|
288
|
+
class="bookmarklet"
|
|
289
|
+
href=${bookmarkletHref}
|
|
290
|
+
title="Drag to your bookmarks bar"
|
|
291
|
+
@click=${this.#nudgeDrag}
|
|
292
|
+
>${this.#walletIcon} Dev Wallet</a
|
|
293
|
+
>
|
|
294
|
+
${this._dragNudge ? html`<span class="hint nudge">Drag it, don't click it</span>` : nothing}
|
|
295
|
+
</div>
|
|
296
|
+
</li>
|
|
297
|
+
<li>
|
|
298
|
+
Open your dApp and click the bookmark. Then choose
|
|
299
|
+
<strong>Dev Wallet (Web)</strong> in the dApp's wallet picker.
|
|
300
|
+
</li>
|
|
301
|
+
</ol>
|
|
302
|
+
<p class="hint">
|
|
303
|
+
The bookmark only lasts until the page reloads. After a reload, click it again.
|
|
304
|
+
</p>
|
|
305
|
+
<button class="link-btn" type="button" @click=${() => this.#copy.copy(consoleScript)}>
|
|
306
|
+
${this.#copy.isCopied(consoleScript) ? "Copied. Paste it into the dApp’s browser console." : "Can’t use bookmarks? Copy a script for the dApp’s console instead."}
|
|
307
|
+
</button>
|
|
308
|
+
`;
|
|
309
|
+
}
|
|
310
|
+
#renderMobileBookmarklet(bookmarkletHref) {
|
|
311
|
+
if (this.platform === "android-firefox") return html`
|
|
312
|
+
<p>
|
|
313
|
+
Firefox for Android doesn't run bookmarklets. Open the dApp in Chrome, or use the
|
|
314
|
+
<button class="link-btn inline" type="button" @click=${() => this._tab = "dapp-kit"}>
|
|
315
|
+
dApp Kit
|
|
316
|
+
</button>
|
|
317
|
+
option if you're building the app.
|
|
318
|
+
</p>
|
|
319
|
+
`;
|
|
320
|
+
return html`
|
|
321
|
+
<p>Add this wallet to any dApp without changing its code. Phones can't drag bookmarks, so:</p>
|
|
322
|
+
<ol class="steps">
|
|
323
|
+
<li>
|
|
324
|
+
<button class="btn-copy" type="button" @click=${() => this.#copy.copy(bookmarkletHref)}>
|
|
325
|
+
${this.#copy.isCopied(bookmarkletHref) ? "Copied" : "Copy bookmarklet code"}
|
|
326
|
+
</button>
|
|
327
|
+
</li>
|
|
328
|
+
${this.platform === "ios" ? html`
|
|
329
|
+
<li>Bookmark this page, then open Bookmarks and edit the new bookmark.</li>
|
|
330
|
+
<li>Replace its address with the copied code and tap Done.</li>
|
|
331
|
+
<li>
|
|
332
|
+
On your dApp, open Bookmarks and tap the bookmark. Then choose
|
|
333
|
+
<strong>Dev Wallet (Web)</strong> in the dApp's wallet picker.
|
|
334
|
+
</li>
|
|
335
|
+
` : html`
|
|
336
|
+
<li>
|
|
337
|
+
Bookmark this page, then edit the bookmark: name it "Dev Wallet" and replace its URL
|
|
338
|
+
with the copied code.
|
|
339
|
+
</li>
|
|
340
|
+
<li>
|
|
341
|
+
On your dApp, type "Dev Wallet" in the address bar and tap the bookmark suggestion
|
|
342
|
+
(opening it from the bookmarks list won't work). Then choose
|
|
343
|
+
<strong>Dev Wallet (Web)</strong> in the dApp's wallet picker.
|
|
344
|
+
</li>
|
|
345
|
+
`}
|
|
346
|
+
</ol>
|
|
347
|
+
<p class="hint">
|
|
348
|
+
The bookmark only lasts until the page reloads. After a reload, run it again.
|
|
349
|
+
</p>
|
|
350
|
+
`;
|
|
351
|
+
}
|
|
352
|
+
#renderDappKit(dappKitSnippet) {
|
|
353
|
+
return html`
|
|
354
|
+
<p>Register the wallet with dApp Kit so it's always in your app's wallet picker.</p>
|
|
355
|
+
<div class="snippet">
|
|
356
|
+
<button
|
|
357
|
+
class="btn-copy"
|
|
358
|
+
type="button"
|
|
359
|
+
aria-label="Copy dApp Kit snippet"
|
|
360
|
+
@click=${() => this.#copy.copy(dappKitSnippet)}
|
|
361
|
+
>
|
|
362
|
+
${this.#copy.isCopied(dappKitSnippet) ? "Copied" : "Copy"}
|
|
363
|
+
</button>
|
|
364
|
+
<pre><code>${dappKitSnippet}</code></pre>
|
|
365
|
+
</div>
|
|
366
|
+
`;
|
|
367
|
+
}
|
|
368
|
+
#nudgeDrag;
|
|
369
|
+
get #walletIcon() {
|
|
370
|
+
return html`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7">
|
|
371
|
+
<rect x="2" y="6" width="20" height="14" rx="2.5" />
|
|
372
|
+
<path d="M2 10h20" />
|
|
373
|
+
<rect x="15" y="12" width="5" height="4" rx="1" />
|
|
374
|
+
<circle cx="17.5" cy="14" r="0.5" fill="currentColor" stroke="none" />
|
|
375
|
+
</svg>`;
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
__decorate([property({ type: String })], DevWalletConnectGuide.prototype, "origin", void 0);
|
|
379
|
+
__decorate([state()], DevWalletConnectGuide.prototype, "_dragNudge", void 0);
|
|
380
|
+
__decorate([state()], DevWalletConnectGuide.prototype, "_tab", void 0);
|
|
381
|
+
__decorate([property({ attribute: false })], DevWalletConnectGuide.prototype, "platform", void 0);
|
|
382
|
+
DevWalletConnectGuide = __decorate([customElement("dev-wallet-connect-guide")], DevWalletConnectGuide);
|
|
383
|
+
//#endregion
|
|
384
|
+
export { DevWalletConnectGuide };
|
|
385
|
+
|
|
386
|
+
//# sourceMappingURL=dev-wallet-connect-guide.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-wallet-connect-guide.mjs","names":["#renderBookmarklet","#renderMobileBookmarklet","#renderDappKit","#nudgeDrag","#walletIcon","#copy"],"sources":["../../src/ui/dev-wallet-connect-guide.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 { CopyController } from './copy-controller.js';\n\n/**\n * How to point a dApp at a hosted/standalone dev wallet: a draggable\n * bookmarklet, a console script, and a dApp Kit snippet — all derived from\n * the wallet's `origin`. Rendered beside the standalone wallet on wide\n * screens and at the top of its Settings tab.\n */\ntype Platform = 'ios' | 'android' | 'android-firefox' | 'desktop';\n\nfunction detectPlatform(): Platform {\n\tconst nav = globalThis.navigator;\n\tif (!nav) return 'desktop';\n\tconst ua = nav.userAgent;\n\tif (/Android/.test(ua)) return /Firefox/.test(ua) ? 'android-firefox' : 'android';\n\t// iPadOS reports itself as a Mac; touch support gives it away.\n\tif (/iPhone|iPad|iPod/.test(ua) || (/Macintosh/.test(ua) && nav.maxTouchPoints > 1)) {\n\t\treturn 'ios';\n\t}\n\treturn 'desktop';\n}\n\nconst BOOKMARKS_BAR_SHORTCUT = /Mac|iPhone|iPad/.test(globalThis.navigator?.platform ?? '')\n\t? '⌘ Shift B'\n\t: 'Ctrl Shift B';\n\ntype TabId = 'bookmarklet' | 'dapp-kit';\nconst TABS: { id: TabId; label: string }[] = [\n\t{ id: 'bookmarklet', label: 'Bookmarklet' },\n\t{ id: 'dapp-kit', label: 'dApp Kit' },\n];\n\n@customElement('dev-wallet-connect-guide')\nexport class DevWalletConnectGuide extends LitElement {\n\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 10px;\n\t\t\tfont-size: 12px;\n\t\t\tline-height: 1.55;\n\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t}\n\n\t\t.tabs {\n\t\t\tdisplay: flex;\n\t\t\tgap: 2px;\n\t\t\tpadding: 2px;\n\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t}\n\n\t\t.tab {\n\t\t\tflex: 1;\n\t\t\theight: 26px;\n\t\t\tborder: 0;\n\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\tbackground: transparent;\n\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\tfont: inherit;\n\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t.tab:hover {\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t}\n\n\t\t.tab[aria-selected='true'] {\n\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t}\n\n\t\t.panel {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 10px;\n\t\t\tpadding-top: 4px;\n\t\t}\n\n\t\t.guide-title {\n\t\t\tmargin: 0;\n\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\tfont-size: 10px;\n\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\tletter-spacing: 0.14em;\n\t\t\ttext-transform: uppercase;\n\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t}\n\n\t\t.guide p {\n\t\t\tmargin: 0;\n\t\t}\n\n\t\t.guide strong {\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t}\n\n\t\t.steps {\n\t\t\tmargin: 0;\n\t\t\tpadding-left: 18px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 8px;\n\t\t}\n\n\t\t.steps li::marker {\n\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\tfont-size: 11px;\n\t\t}\n\n\t\t.steps .bookmarklet-row {\n\t\t\tmargin-top: 6px;\n\t\t}\n\n\t\tkbd {\n\t\t\tpadding: 1px 5px;\n\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\tfont-size: 10.5px;\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t}\n\n\t\t.bookmarklet-row {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tflex-wrap: wrap;\n\t\t\tgap: 10px;\n\t\t}\n\n\t\t.bookmarklet {\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\tgap: 6px;\n\t\t\tpadding: 6px 12px;\n\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\ttext-decoration: none;\n\t\t\tcursor: grab;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t.bookmarklet:hover {\n\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t}\n\n\t\t.bookmarklet:active {\n\t\t\tcursor: grabbing;\n\t\t}\n\n\t\t.bookmarklet svg {\n\t\t\twidth: 13px;\n\t\t\theight: 13px;\n\t\t}\n\n\t\t.hint {\n\t\t\tfont-size: 11px;\n\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t}\n\n\t\t.hint.nudge {\n\t\t\tcolor: var(--dev-wallet-warning);\n\t\t}\n\n\t\t.link-btn {\n\t\t\talign-self: flex-start;\n\t\t\ttext-align: left;\n\t\t\tpadding: 0;\n\t\t\tborder: 0;\n\t\t\tbackground: none;\n\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\tfont: inherit;\n\t\t\ttext-decoration: underline;\n\t\t\ttext-underline-offset: 2px;\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t.link-btn.inline {\n\t\t\tdisplay: inline;\n\t\t}\n\n\t\t.link-btn:hover {\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t}\n\n\t\t.snippet {\n\t\t\tposition: relative;\n\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t}\n\n\t\t.snippet pre,\n\t\t.snippet code {\n\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t}\n\n\t\t.snippet pre {\n\t\t\tmargin: 0;\n\t\t\tpadding: 10px 12px;\n\t\t\toverflow-x: auto;\n\t\t\tfont-size: 10.5px;\n\t\t\tline-height: 1.6;\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t}\n\n\t\t.snippet .btn-copy {\n\t\t\tposition: absolute;\n\t\t\ttop: 6px;\n\t\t\tright: 6px;\n\t\t}\n\n\t\t.btn-copy {\n\t\t\theight: 22px;\n\t\t\tpadding: 0 8px;\n\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\tfont-family: var(--dev-wallet-font-sans);\n\t\t\tfont-size: 10.5px;\n\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t.btn-copy:hover {\n\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t}\n\t`;\n\n\t/** Origin the wallet is served from (e.g. `https://sui-dev-wallet.vercel.app`). */\n\t@property({ type: String })\n\torigin = '';\n\n\t@state()\n\tprivate _dragNudge = false;\n\n\t@state()\n\tprivate _tab: TabId = 'bookmarklet';\n\n\t/** Phones can't drag bookmarklets, so they get copy-and-edit steps instead. */\n\t@property({ attribute: false })\n\tplatform: Platform = detectPlatform();\n\n\t#copy = new CopyController(this);\n\n\toverride render() {\n\t\tconst origin = this.origin;\n\t\tconst scriptUrl = `${origin}/bookmarklet.js`;\n\t\tconst bookmarkletHref = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${scriptUrl}'})))`;\n\t\tconst consoleScript = `var s=document.createElement('script');s.src='${scriptUrl}';document.head.appendChild(s);`;\n\t\tconst dappKitSnippet = `import {\n devWalletClientInitializer,\n} from '@mysten-incubation/dev-wallet/client';\n\ncreateDAppKit({\n networks: ['devnet'],\n walletInitializers: [\n devWalletClientInitializer({\n origin: '${origin}',\n }),\n ],\n});`;\n\n\t\treturn html`\n\t\t\t<h2 class=\"guide-title\">Connect an app</h2>\n\t\t\t<div class=\"tabs\" role=\"tablist\" aria-label=\"Connection method\">\n\t\t\t\t${TABS.map(\n\t\t\t\t\t({ id, label }) =>\n\t\t\t\t\t\thtml`<button\n\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\tclass=\"tab\"\n\t\t\t\t\t\t\taria-selected=${this._tab === id}\n\t\t\t\t\t\t\t@click=${() => (this._tab = id)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${label}\n\t\t\t\t\t\t</button>`,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div role=\"tabpanel\" class=\"panel\">\n\t\t\t\t${this._tab === 'bookmarklet'\n\t\t\t\t\t? this.platform === 'desktop'\n\t\t\t\t\t\t? this.#renderBookmarklet(bookmarkletHref, consoleScript)\n\t\t\t\t\t\t: this.#renderMobileBookmarklet(bookmarkletHref)\n\t\t\t\t\t: this.#renderDappKit(dappKitSnippet)}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderBookmarklet(bookmarkletHref: string, consoleScript: string) {\n\t\treturn html`\n\t\t\t<p>Add this wallet to any dApp without changing its code.</p>\n\t\t\t<ol class=\"steps\">\n\t\t\t\t<li>Show your browser's bookmarks bar (<kbd>${BOOKMARKS_BAR_SHORTCUT}</kbd>).</li>\n\t\t\t\t<li>\n\t\t\t\t\tDrag this button onto the bookmarks bar:\n\t\t\t\t\t<div class=\"bookmarklet-row\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"bookmarklet\"\n\t\t\t\t\t\t\thref=${bookmarkletHref}\n\t\t\t\t\t\t\ttitle=\"Drag to your bookmarks bar\"\n\t\t\t\t\t\t\t@click=${this.#nudgeDrag}\n\t\t\t\t\t\t\t>${this.#walletIcon} Dev Wallet</a\n\t\t\t\t\t\t>\n\t\t\t\t\t\t${this._dragNudge\n\t\t\t\t\t\t\t? html`<span class=\"hint nudge\">Drag it, don't click it</span>`\n\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t</div>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tOpen your dApp and click the bookmark. Then choose\n\t\t\t\t\t<strong>Dev Wallet (Web)</strong> in the dApp's wallet picker.\n\t\t\t\t</li>\n\t\t\t</ol>\n\t\t\t<p class=\"hint\">\n\t\t\t\tThe bookmark only lasts until the page reloads. After a reload, click it again.\n\t\t\t</p>\n\t\t\t<button class=\"link-btn\" type=\"button\" @click=${() => this.#copy.copy(consoleScript)}>\n\t\t\t\t${this.#copy.isCopied(consoleScript)\n\t\t\t\t\t? 'Copied. Paste it into the dApp’s browser console.'\n\t\t\t\t\t: 'Can’t use bookmarks? Copy a script for the dApp’s console instead.'}\n\t\t\t</button>\n\t\t`;\n\t}\n\n\t#renderMobileBookmarklet(bookmarkletHref: string) {\n\t\tif (this.platform === 'android-firefox') {\n\t\t\treturn html`\n\t\t\t\t<p>\n\t\t\t\t\tFirefox for Android doesn't run bookmarklets. Open the dApp in Chrome, or use the\n\t\t\t\t\t<button class=\"link-btn inline\" type=\"button\" @click=${() => (this._tab = 'dapp-kit')}>\n\t\t\t\t\t\tdApp Kit\n\t\t\t\t\t</button>\n\t\t\t\t\toption if you're building the app.\n\t\t\t\t</p>\n\t\t\t`;\n\t\t}\n\t\tconst copied = this.#copy.isCopied(bookmarkletHref);\n\t\treturn html`\n\t\t\t<p>Add this wallet to any dApp without changing its code. Phones can't drag bookmarks, so:</p>\n\t\t\t<ol class=\"steps\">\n\t\t\t\t<li>\n\t\t\t\t\t<button class=\"btn-copy\" type=\"button\" @click=${() => this.#copy.copy(bookmarkletHref)}>\n\t\t\t\t\t\t${copied ? 'Copied' : 'Copy bookmarklet code'}\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t\t${this.platform === 'ios'\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<li>Bookmark this page, then open Bookmarks and edit the new bookmark.</li>\n\t\t\t\t\t\t\t<li>Replace its address with the copied code and tap Done.</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tOn your dApp, open Bookmarks and tap the bookmark. Then choose\n\t\t\t\t\t\t\t\t<strong>Dev Wallet (Web)</strong> in the dApp's wallet picker.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tBookmark this page, then edit the bookmark: name it \"Dev Wallet\" and replace its URL\n\t\t\t\t\t\t\t\twith the copied code.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tOn your dApp, type \"Dev Wallet\" in the address bar and tap the bookmark suggestion\n\t\t\t\t\t\t\t\t(opening it from the bookmarks list won't work). Then choose\n\t\t\t\t\t\t\t\t<strong>Dev Wallet (Web)</strong> in the dApp's wallet picker.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t`}\n\t\t\t</ol>\n\t\t\t<p class=\"hint\">\n\t\t\t\tThe bookmark only lasts until the page reloads. After a reload, run it again.\n\t\t\t</p>\n\t\t`;\n\t}\n\n\t#renderDappKit(dappKitSnippet: string) {\n\t\treturn html`\n\t\t\t<p>Register the wallet with dApp Kit so it's always in your app's wallet picker.</p>\n\t\t\t<div class=\"snippet\">\n\t\t\t\t<button\n\t\t\t\t\tclass=\"btn-copy\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Copy dApp Kit snippet\"\n\t\t\t\t\t@click=${() => this.#copy.copy(dappKitSnippet)}\n\t\t\t\t>\n\t\t\t\t\t${this.#copy.isCopied(dappKitSnippet) ? 'Copied' : 'Copy'}\n\t\t\t\t</button>\n\t\t\t\t<pre><code>${dappKitSnippet}</code></pre>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#nudgeDrag = (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\tthis._dragNudge = true;\n\t\tsetTimeout(() => {\n\t\t\tthis._dragNudge = false;\n\t\t}, 2500);\n\t};\n\n\tget #walletIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\">\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\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-connect-guide': DevWalletConnectGuide;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ConnectedAppsStore } from "../client/connected-apps.mjs";
|
|
2
|
+
import { LitElement } from "lit";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/dev-wallet-connected-apps.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Lists the dApps connected to a standalone wallet, with a Disconnect action
|
|
7
|
+
* per app. Disconnecting makes the wallet reject that app's signing requests
|
|
8
|
+
* until it connects again.
|
|
9
|
+
*/
|
|
10
|
+
declare class DevWalletConnectedApps extends LitElement {
|
|
11
|
+
#private;
|
|
12
|
+
static styles: import("lit").CSSResult;
|
|
13
|
+
store: ConnectedAppsStore | null;
|
|
14
|
+
private _apps;
|
|
15
|
+
connectedCallback(): void;
|
|
16
|
+
disconnectedCallback(): void;
|
|
17
|
+
willUpdate(changed: Map<string, unknown>): void;
|
|
18
|
+
render(): import("lit").TemplateResult<1>;
|
|
19
|
+
}
|
|
20
|
+
declare global {
|
|
21
|
+
interface HTMLElementTagNameMap {
|
|
22
|
+
'dev-wallet-connected-apps': DevWalletConnectedApps;
|
|
23
|
+
}
|
|
24
|
+
} //# sourceMappingURL=dev-wallet-connected-apps.d.ts.map
|
|
25
|
+
//#endregion
|
|
26
|
+
export { DevWalletConnectedApps };
|
|
27
|
+
//# sourceMappingURL=dev-wallet-connected-apps.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-wallet-connected-apps.d.mts","names":[],"sources":["../../src/ui/dev-wallet-connected-apps.ts"],"mappings":";;;;;;AAcA;;;cACa,sBAAA,SAA+B,UAAA;EAAA;SAC3B,MAAA,gBAAM,SAAA;EAwFtB,KAAA,EAAO,kBAAA;EAAA,QAGC,KAAA;EAIC,iBAAA;EAKA,oBAAA;EAMA,UAAA,CAAW,OAAA,EAAS,GAAA;EAmBpB,MAAA,kBAAM,cAAA;AAAA;AAAA,QA6CR,MAAA;EAAA,UACG,qBAAA;IACT,2BAAA,EAA6B,sBAAsB;EAAA;AAAA"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { formatAddress } from "./utils.mjs";
|
|
2
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
3
|
+
import { LitElement, css, html } from "lit";
|
|
4
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
5
|
+
//#region src/ui/dev-wallet-connected-apps.ts
|
|
6
|
+
let DevWalletConnectedApps = class DevWalletConnectedApps extends LitElement {
|
|
7
|
+
constructor(..._args) {
|
|
8
|
+
super(..._args);
|
|
9
|
+
this.store = null;
|
|
10
|
+
this._apps = [];
|
|
11
|
+
this.#unsubscribe = null;
|
|
12
|
+
}
|
|
13
|
+
static {
|
|
14
|
+
this.styles = css`
|
|
15
|
+
:host {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
gap: 10px;
|
|
19
|
+
font-size: 12px;
|
|
20
|
+
line-height: 1.5;
|
|
21
|
+
color: var(--dev-wallet-muted-foreground);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.title {
|
|
25
|
+
margin: 0;
|
|
26
|
+
font-family: var(--dev-wallet-font-mono);
|
|
27
|
+
font-size: 10px;
|
|
28
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
29
|
+
letter-spacing: 0.14em;
|
|
30
|
+
text-transform: uppercase;
|
|
31
|
+
color: var(--dev-wallet-text-3);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.empty {
|
|
35
|
+
margin: 0;
|
|
36
|
+
color: var(--dev-wallet-text-3);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
ul {
|
|
40
|
+
margin: 0;
|
|
41
|
+
padding: 0;
|
|
42
|
+
list-style: none;
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
gap: 6px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
li {
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: center;
|
|
51
|
+
gap: 10px;
|
|
52
|
+
padding: 8px 8px 8px 10px;
|
|
53
|
+
border-radius: var(--dev-wallet-radius-lg);
|
|
54
|
+
border: 1px solid var(--dev-wallet-border);
|
|
55
|
+
background: var(--dev-wallet-bg-1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.info {
|
|
59
|
+
flex: 1;
|
|
60
|
+
min-width: 0;
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: column;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.name {
|
|
66
|
+
color: var(--dev-wallet-foreground);
|
|
67
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
68
|
+
overflow: hidden;
|
|
69
|
+
text-overflow: ellipsis;
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.meta {
|
|
74
|
+
font-family: var(--dev-wallet-font-mono);
|
|
75
|
+
font-size: 10.5px;
|
|
76
|
+
color: var(--dev-wallet-text-3);
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
text-overflow: ellipsis;
|
|
79
|
+
white-space: nowrap;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.disconnect {
|
|
83
|
+
flex-shrink: 0;
|
|
84
|
+
height: 24px;
|
|
85
|
+
padding: 0 8px;
|
|
86
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
87
|
+
border: 1px solid var(--dev-wallet-border);
|
|
88
|
+
background: transparent;
|
|
89
|
+
color: var(--dev-wallet-text-2);
|
|
90
|
+
font: inherit;
|
|
91
|
+
font-size: 11px;
|
|
92
|
+
cursor: pointer;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.disconnect:hover {
|
|
96
|
+
border-color: var(--dev-wallet-destructive);
|
|
97
|
+
color: var(--dev-wallet-destructive);
|
|
98
|
+
}
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
#unsubscribe;
|
|
102
|
+
connectedCallback() {
|
|
103
|
+
super.connectedCallback();
|
|
104
|
+
this.#bind();
|
|
105
|
+
}
|
|
106
|
+
disconnectedCallback() {
|
|
107
|
+
super.disconnectedCallback();
|
|
108
|
+
this.#unsubscribe?.();
|
|
109
|
+
this.#unsubscribe = null;
|
|
110
|
+
}
|
|
111
|
+
willUpdate(changed) {
|
|
112
|
+
if (changed.has("store") && this.isConnected) this.#bind();
|
|
113
|
+
}
|
|
114
|
+
#bind() {
|
|
115
|
+
this.#unsubscribe?.();
|
|
116
|
+
this.#unsubscribe = this.store?.subscribe(() => this.#load()) ?? null;
|
|
117
|
+
this.#load();
|
|
118
|
+
}
|
|
119
|
+
#load() {
|
|
120
|
+
this._apps = this.store?.list() ?? [];
|
|
121
|
+
}
|
|
122
|
+
#disconnect(origin) {
|
|
123
|
+
this.store?.remove(origin);
|
|
124
|
+
this.#load();
|
|
125
|
+
}
|
|
126
|
+
render() {
|
|
127
|
+
return html`
|
|
128
|
+
<h2 class="title">Connected apps</h2>
|
|
129
|
+
${this._apps.length === 0 ? html`<p class="empty">No apps connected yet.</p>` : html`<ul>
|
|
130
|
+
${this._apps.map((app) => html`<li>
|
|
131
|
+
<div class="info">
|
|
132
|
+
<span class="name" title=${app.name}>${app.name || safeHost(app.origin)}</span>
|
|
133
|
+
<span class="meta" title=${app.origin}>${this.#describe(app)}</span>
|
|
134
|
+
</div>
|
|
135
|
+
<button
|
|
136
|
+
class="disconnect"
|
|
137
|
+
type="button"
|
|
138
|
+
aria-label=${`Disconnect ${app.origin}`}
|
|
139
|
+
@click=${() => this.#disconnect(app.origin)}
|
|
140
|
+
>
|
|
141
|
+
Disconnect
|
|
142
|
+
</button>
|
|
143
|
+
</li>`)}
|
|
144
|
+
</ul>`}
|
|
145
|
+
`;
|
|
146
|
+
}
|
|
147
|
+
#describe(app) {
|
|
148
|
+
return `${safeHost(app.origin)} · ${app.accounts.length === 1 ? formatAddress(app.accounts[0]) : `${app.accounts.length} accounts`}`;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
__decorate([property({ attribute: false })], DevWalletConnectedApps.prototype, "store", void 0);
|
|
152
|
+
__decorate([state()], DevWalletConnectedApps.prototype, "_apps", void 0);
|
|
153
|
+
DevWalletConnectedApps = __decorate([customElement("dev-wallet-connected-apps")], DevWalletConnectedApps);
|
|
154
|
+
function safeHost(origin) {
|
|
155
|
+
try {
|
|
156
|
+
return new URL(origin).host;
|
|
157
|
+
} catch {
|
|
158
|
+
return origin;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//#endregion
|
|
162
|
+
export { DevWalletConnectedApps };
|
|
163
|
+
|
|
164
|
+
//# sourceMappingURL=dev-wallet-connected-apps.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-wallet-connected-apps.mjs","names":["#bind","#unsubscribe","#load","#describe","#disconnect"],"sources":["../../src/ui/dev-wallet-connected-apps.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { ConnectedApp, ConnectedAppsStore } from '../client/connected-apps.js';\nimport { formatAddress } from './utils.js';\n\n/**\n * Lists the dApps connected to a standalone wallet, with a Disconnect action\n * per app. Disconnecting makes the wallet reject that app's signing requests\n * until it connects again.\n */\n@customElement('dev-wallet-connected-apps')\nexport class DevWalletConnectedApps extends LitElement {\n\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 10px;\n\t\t\tfont-size: 12px;\n\t\t\tline-height: 1.5;\n\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t}\n\n\t\t.title {\n\t\t\tmargin: 0;\n\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\tfont-size: 10px;\n\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\tletter-spacing: 0.14em;\n\t\t\ttext-transform: uppercase;\n\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t}\n\n\t\t.empty {\n\t\t\tmargin: 0;\n\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t}\n\n\t\tul {\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tlist-style: none;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 6px;\n\t\t}\n\n\t\tli {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 10px;\n\t\t\tpadding: 8px 8px 8px 10px;\n\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t}\n\n\t\t.info {\n\t\t\tflex: 1;\n\t\t\tmin-width: 0;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t}\n\n\t\t.name {\n\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t.meta {\n\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\tfont-size: 10.5px;\n\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t.disconnect {\n\t\t\tflex-shrink: 0;\n\t\t\theight: 24px;\n\t\t\tpadding: 0 8px;\n\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\tbackground: transparent;\n\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\tfont: inherit;\n\t\t\tfont-size: 11px;\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t.disconnect:hover {\n\t\t\tborder-color: var(--dev-wallet-destructive);\n\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t}\n\t`;\n\n\t@property({ attribute: false })\n\tstore: ConnectedAppsStore | null = null;\n\n\t@state()\n\tprivate _apps: ConnectedApp[] = [];\n\n\t#unsubscribe: (() => void) | null = null;\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\tthis.#bind();\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tthis.#unsubscribe?.();\n\t\tthis.#unsubscribe = null;\n\t}\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (changed.has('store') && this.isConnected) this.#bind();\n\t}\n\n\t#bind() {\n\t\tthis.#unsubscribe?.();\n\t\tthis.#unsubscribe = this.store?.subscribe(() => this.#load()) ?? null;\n\t\tthis.#load();\n\t}\n\n\t#load() {\n\t\tthis._apps = this.store?.list() ?? [];\n\t}\n\n\t#disconnect(origin: string) {\n\t\tthis.store?.remove(origin);\n\t\tthis.#load();\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<h2 class=\"title\">Connected apps</h2>\n\t\t\t${this._apps.length === 0\n\t\t\t\t? html`<p class=\"empty\">No apps connected yet.</p>`\n\t\t\t\t: html`<ul>\n\t\t\t\t\t\t${this._apps.map(\n\t\t\t\t\t\t\t(app) =>\n\t\t\t\t\t\t\t\thtml`<li>\n\t\t\t\t\t\t\t\t\t<div class=\"info\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"name\" title=${app.name}>${app.name || safeHost(app.origin)}</span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"meta\" title=${app.origin}>${this.#describe(app)}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"disconnect\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\taria-label=${`Disconnect ${app.origin}`}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.#disconnect(app.origin)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tDisconnect\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ul>`}\n\t\t`;\n\t}\n\n\t#describe(app: ConnectedApp) {\n\t\tconst host = safeHost(app.origin);\n\t\tconst accounts =\n\t\t\tapp.accounts.length === 1\n\t\t\t\t? formatAddress(app.accounts[0])\n\t\t\t\t: `${app.accounts.length} accounts`;\n\t\treturn `${host} · ${accounts}`;\n\t}\n}\n\nfunction safeHost(origin: string): string {\n\ttry {\n\t\treturn new URL(origin).host;\n\t} catch {\n\t\treturn origin;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-connected-apps': DevWalletConnectedApps;\n\t}\n}\n"],"mappings":";;;;;AAeO,IAAA,yBAAA,MAAM,+BAA+B,WAAW;;;eAyFnB;eAGH,CAAC;sBAEG;;;gBA7FX,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6F5B;CAEA,oBAA6B;EAC5B,MAAM,kBAAkB;EACxB,KAAKA,MAAM;CACZ;CAEA,uBAAgC;EAC/B,MAAM,qBAAqB;EAC3B,KAAKC,eAAe;EACpB,KAAKA,eAAe;CACrB;CAEA,WAAoB,SAA+B;EAClD,IAAI,QAAQ,IAAI,OAAO,KAAK,KAAK,aAAa,KAAKD,MAAM;CAC1D;CAEA,QAAQ;EACP,KAAKC,eAAe;EACpB,KAAKA,eAAe,KAAK,OAAO,gBAAgB,KAAKC,MAAM,CAAC,KAAK;EACjE,KAAKA,MAAM;CACZ;CAEA,QAAQ;EACP,KAAK,QAAQ,KAAK,OAAO,KAAK,KAAK,CAAC;CACrC;CAEA,YAAY,QAAgB;EAC3B,KAAK,OAAO,OAAO,MAAM;EACzB,KAAKA,MAAM;CACZ;CAEA,SAAkB;EACjB,OAAO,IAAI;;KAER,KAAK,MAAM,WAAW,IACrB,IAAI,gDACJ,IAAI;QACF,KAAK,MAAM,KACX,QACA,IAAI;;qCAEyB,IAAI,KAAK,GAAG,IAAI,QAAQ,SAAS,IAAI,MAAM,EAAE;qCAC7C,IAAI,OAAO,GAAG,KAAKC,UAAU,GAAG,EAAE;;;;;uBAKhD,cAAc,IAAI,SAAS;yBACzB,KAAKC,YAAY,IAAI,MAAM,EAAE;;;;cAKhD,EAAE;YACI;;CAEX;CAEA,UAAU,KAAmB;EAM5B,OAAO,GALM,SAAS,IAAI,MAKhB,EAAK,KAHd,IAAI,SAAS,WAAW,IACrB,cAAc,IAAI,SAAS,EAAE,IAC7B,GAAG,IAAI,SAAS,OAAO;CAE5B;AACD;YAzEE,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,uBAAA,WAAA,SAAA,KAAA,CAAA;YAG7B,MAAM,CAAA,GAAA,uBAAA,WAAA,SAAA,KAAA,CAAA;qCA5FP,cAAc,2BAA2B,CAAA,GAAA,sBAAA;AAoK1C,SAAS,SAAS,QAAwB;CACzC,IAAI;EACH,OAAO,IAAI,IAAI,MAAM,CAAC,CAAC;CACxB,QAAQ;EACP,OAAO;CACR;AACD"}
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;EAwOtB,MAAA,EAAQ,SAAA;EA5OqB;AAAA;AAE9B;EAgPC,KAAA,EAAO,UAAA;;;;;;EAQP,SAAA,EAAW,SAAA;EAvPwB;;;EA6PnC,YAAA;EAGA,SAAA,EAAW,kBAAA;EAAA,QAGH,OAAA;EAKC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAe9B,OAAA;EAsBA,MAAA,kBAAM,cAAA;EAqFN,iBAAA;EAKA,oBAAA;AAAA;AAAA,QAMF,MAAA;EAAA,UACG,qBAAA;IACT,kBAAA,EAAoB,cAAc;EAAA;AAAA"}
|
|
@@ -199,14 +199,6 @@ let DevWalletPanel = class DevWalletPanel extends LitElement {
|
|
|
199
199
|
text-overflow: ellipsis;
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
.version {
|
|
203
|
-
font-family: var(--dev-wallet-font-mono);
|
|
204
|
-
font-size: 9px;
|
|
205
|
-
letter-spacing: 0.12em;
|
|
206
|
-
text-transform: uppercase;
|
|
207
|
-
color: var(--dev-wallet-text-3);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
202
|
.header-spacer {
|
|
211
203
|
flex: 1;
|
|
212
204
|
min-width: 8px;
|
|
@@ -317,7 +309,6 @@ let DevWalletPanel = class DevWalletPanel extends LitElement {
|
|
|
317
309
|
<span class="logo-mark">${this.#walletIcon}</span>
|
|
318
310
|
<span class="title-stack">
|
|
319
311
|
<span class="sidebar-title">${this.wallet?.name ?? "Dev Wallet"}</span>
|
|
320
|
-
<span class="version">v0.1.0</span>
|
|
321
312
|
</span>
|
|
322
313
|
</div>
|
|
323
314
|
<span class="header-spacer"></span>
|