@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.
Files changed (73) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +12 -8
  3. package/dist/client/connected-apps.d.mts +35 -0
  4. package/dist/client/connected-apps.d.mts.map +1 -0
  5. package/dist/client/connected-apps.mjs +50 -0
  6. package/dist/client/connected-apps.mjs.map +1 -0
  7. package/dist/client/dev-wallet-client.mjs +1 -1
  8. package/dist/client/dev-wallet-client.mjs.map +1 -1
  9. package/dist/client/index.d.mts +2 -1
  10. package/dist/client/index.mjs +2 -1
  11. package/dist/client/request-handler.d.mts +7 -0
  12. package/dist/client/request-handler.d.mts.map +1 -1
  13. package/dist/client/request-handler.mjs +17 -2
  14. package/dist/client/request-handler.mjs.map +1 -1
  15. package/dist/inject/index.d.mts +4 -0
  16. package/dist/inject/index.d.mts.map +1 -1
  17. package/dist/inject/index.mjs +31 -0
  18. package/dist/inject/index.mjs.map +1 -1
  19. package/dist/standalone/assets/{in-memory-adapter-Ban2kRYS.js → in-memory-adapter-uuWG4K4k.js} +1 -1
  20. package/dist/standalone/assets/main-CKYv0eR6.js +7 -0
  21. package/dist/standalone/assets/{webcrypto-adapter-Ddqn-RAu.js → webcrypto-adapter-5ShaPc_M.js} +1 -1
  22. package/dist/standalone/bookmarklet.js +1 -1
  23. package/dist/standalone/index.html +1 -1
  24. package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
  25. package/dist/ui/dev-wallet-balances.mjs +20 -13
  26. package/dist/ui/dev-wallet-balances.mjs.map +1 -1
  27. package/dist/ui/dev-wallet-connect-guide.d.mts +29 -0
  28. package/dist/ui/dev-wallet-connect-guide.d.mts.map +1 -0
  29. package/dist/ui/dev-wallet-connect-guide.mjs +386 -0
  30. package/dist/ui/dev-wallet-connect-guide.mjs.map +1 -0
  31. package/dist/ui/dev-wallet-connected-apps.d.mts +27 -0
  32. package/dist/ui/dev-wallet-connected-apps.d.mts.map +1 -0
  33. package/dist/ui/dev-wallet-connected-apps.mjs +164 -0
  34. package/dist/ui/dev-wallet-connected-apps.mjs.map +1 -0
  35. package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
  36. package/dist/ui/dev-wallet-panel.mjs +0 -9
  37. package/dist/ui/dev-wallet-panel.mjs.map +1 -1
  38. package/dist/ui/dev-wallet-settings.d.mts +8 -2
  39. package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
  40. package/dist/ui/dev-wallet-settings.mjs +86 -171
  41. package/dist/ui/dev-wallet-settings.mjs.map +1 -1
  42. package/dist/ui/dev-wallet-standalone.d.mts +7 -2
  43. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
  44. package/dist/ui/dev-wallet-standalone.mjs +68 -222
  45. package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
  46. package/dist/ui/index.d.mts +3 -1
  47. package/dist/ui/index.mjs +3 -1
  48. package/dist/ui/wallet-controller.mjs +15 -3
  49. package/dist/ui/wallet-controller.mjs.map +1 -1
  50. package/dist/wallet/dev-wallet.d.mts +15 -3
  51. package/dist/wallet/dev-wallet.d.mts.map +1 -1
  52. package/dist/wallet/dev-wallet.mjs +94 -30
  53. package/dist/wallet/dev-wallet.mjs.map +1 -1
  54. package/dist/wallet/persisted.mjs +20 -0
  55. package/dist/wallet/persisted.mjs.map +1 -0
  56. package/package.json +6 -6
  57. package/src/app/main.ts +6 -2
  58. package/src/client/connected-apps.ts +79 -0
  59. package/src/client/dev-wallet-client.ts +2 -1
  60. package/src/client/index.ts +2 -0
  61. package/src/client/request-handler.ts +24 -1
  62. package/src/inject/index.ts +55 -0
  63. package/src/ui/dev-wallet-balances.ts +25 -13
  64. package/src/ui/dev-wallet-connect-guide.ts +428 -0
  65. package/src/ui/dev-wallet-connected-apps.ts +191 -0
  66. package/src/ui/dev-wallet-panel.ts +0 -9
  67. package/src/ui/dev-wallet-settings.ts +101 -179
  68. package/src/ui/dev-wallet-standalone.ts +80 -231
  69. package/src/ui/index.ts +2 -0
  70. package/src/ui/wallet-controller.ts +23 -3
  71. package/src/wallet/dev-wallet.ts +130 -39
  72. package/src/wallet/persisted.ts +24 -0
  73. package/dist/standalone/assets/main-xfzarPod.js +0 -7
@@ -1,3 +1,4 @@
1
+ import { ConnectedAppsStore } from "../client/connected-apps.mjs";
1
2
  import { DevWallet } from "../wallet/dev-wallet.mjs";
2
3
  import { CoinRecord } from "./utils.mjs";
3
4
  import { LitElement } from "lit";
@@ -7,12 +8,16 @@ declare class DevWalletStandalone extends LitElement {
7
8
  #private;
8
9
  static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
9
10
  wallet: DevWallet | null;
10
- /** When set, the settings tab shows a bookmarklet section pointing to this origin. */
11
- bookmarkletOrigin: string;
11
+ /** Origin this wallet is served from. Drives the bookmarklet, console
12
+ * script, and dApp Kit snippet. Defaults to the page's own origin. */
13
+ walletOrigin: string;
12
14
  /** Optional pre-seeded coin metadata. Pass the generated `coins`
13
15
  * constant from devstack codegen to skip per-coin RPC fetches in the
14
16
  * balances list and signing modal. */
15
17
  coins: CoinRecord | null;
18
+ /** Connected-dApps store shared with the signing popup. Pass the same
19
+ * store to `parseWalletRequest` so Disconnect takes effect. */
20
+ connectedApps: ConnectedAppsStore | null;
16
21
  willUpdate(changedProperties: Map<string, unknown>): void;
17
22
  updated(): void;
18
23
  render(): import("lit").TemplateResult<1>;
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-standalone.d.mts","names":[],"sources":["../../src/ui/dev-wallet-standalone.ts"],"mappings":";;;;;cAYa,mBAAA,SAA4B,UAAA;EAAA;SACxB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAgQtB,MAAA,EAAQ,SAAA;;EAIR,iBAAA;EAMO;;;EAAP,KAAA,EAAO,UAAA;EAIE,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAY9B,OAAA;EASA,MAAA,kBAAM,cAAA;AAAA;AAAA,QAmHR,MAAA;EAAA,UACG,qBAAA;IACT,uBAAA,EAAyB,mBAAmB;EAAA;AAAA"}
1
+ {"version":3,"file":"dev-wallet-standalone.d.mts","names":[],"sources":["../../src/ui/dev-wallet-standalone.ts"],"mappings":";;;;;;cAiBa,mBAAA,SAA4B,UAAA;EAAA;SACxB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAsKtB,MAAA,EAAQ,SAAA;;;EAKR,YAAA;EAWe;;;EALf,KAAA,EAAO,UAAA;EAlL2C;;EAuLlD,aAAA,EAAe,kBAAA;EAIN,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAe9B,OAAA;EASA,MAAA,kBAAM,cAAA;AAAA;AAAA,QAwCR,MAAA;EAAA,UACG,qBAAA;IACT,uBAAA,EAAyB,mBAAmB;EAAA;AAAA"}
@@ -1,15 +1,19 @@
1
1
  import { connectDialogStyles, sharedStyles } from "./styles.mjs";
2
2
  import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
3
+ import "./dev-wallet-connect-guide.mjs";
4
+ import "./dev-wallet-connected-apps.mjs";
3
5
  import { WalletController } from "./wallet-controller.mjs";
4
- import { LitElement, css, html } from "lit";
6
+ import { LitElement, css, html, nothing } from "lit";
5
7
  import { customElement, property } from "lit/decorators.js";
6
8
  //#region src/ui/dev-wallet-standalone.ts
9
+ const DOCS_URL = "https://ts-sdks-incubation.vercel.app/dev-wallet";
7
10
  let DevWalletStandalone = class DevWalletStandalone extends LitElement {
8
11
  constructor(..._args) {
9
12
  super(..._args);
10
13
  this.wallet = null;
11
- this.bookmarkletOrigin = "";
14
+ this.walletOrigin = globalThis.location?.origin ?? "";
12
15
  this.coins = null;
16
+ this.connectedApps = null;
13
17
  this.#ctrl = new WalletController(this);
14
18
  }
15
19
  static {
@@ -31,147 +35,65 @@ let DevWalletStandalone = class DevWalletStandalone extends LitElement {
31
35
  background-position: -1px -1px;
32
36
  }
33
37
 
38
+ /* Wallet centered: connect help on the left, connected apps on the right. */
34
39
  .standalone-layout {
35
40
  width: 100%;
36
- max-width: 1220px;
37
- min-height: calc(100vh - 48px);
38
41
  margin: 0 auto;
39
42
  padding: 24px 0;
40
43
  display: grid;
41
- grid-template-columns: minmax(240px, 1fr) 480px minmax(260px, 1fr);
42
- gap: 20px;
44
+ grid-template-columns: minmax(0, 1fr) 480px minmax(0, 1fr);
45
+ gap: 36px;
43
46
  align-items: start;
44
47
  }
45
48
 
46
- .rail {
47
- min-width: 0;
48
- display: flex;
49
- flex-direction: column;
50
- gap: 16px;
51
- padding-top: 6px;
52
- }
53
-
54
- .wordmark {
55
- display: flex;
56
- align-items: center;
57
- gap: 10px;
58
- }
59
-
60
- .logo-mark {
61
- width: 28px;
62
- height: 28px;
63
- border-radius: 9px;
64
- display: inline-flex;
65
- align-items: center;
66
- justify-content: center;
67
- color: var(--dev-wallet-primary-foreground);
68
- background:
69
- radial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 24px),
70
- linear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));
71
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);
72
- }
73
-
74
- .logo-mark svg {
75
- width: 18px;
76
- height: 18px;
49
+ .card {
50
+ grid-column: 2;
77
51
  }
78
52
 
79
- .wordmark-title {
80
- display: flex;
81
- flex-direction: column;
82
- line-height: 1.1;
53
+ .rail-left {
54
+ grid-column: 1;
55
+ justify-self: end;
56
+ width: 100%;
83
57
  }
84
58
 
85
- .wordmark-title strong {
86
- font-size: 16px;
87
- font-weight: var(--dev-wallet-font-weight-semibold);
59
+ .rail-right {
60
+ grid-column: 3;
88
61
  }
89
62
 
90
- .version {
91
- font-family: var(--dev-wallet-font-mono);
92
- font-size: 9px;
93
- letter-spacing: 0.12em;
94
- text-transform: uppercase;
95
- color: var(--dev-wallet-text-3);
96
- }
97
-
98
- .rail-section {
63
+ .rail {
64
+ max-width: 348px;
65
+ min-width: 0;
99
66
  display: flex;
100
67
  flex-direction: column;
101
- gap: 8px;
102
- }
103
-
104
- .rail-title {
105
- font-family: var(--dev-wallet-font-mono);
106
- font-size: 10px;
107
- font-weight: var(--dev-wallet-font-weight-medium);
108
- letter-spacing: 0.14em;
109
- text-transform: uppercase;
110
- color: var(--dev-wallet-text-3);
111
- }
112
-
113
- .code {
114
- margin: 0;
115
- overflow: auto;
116
- white-space: pre;
117
- padding: 10px 12px;
118
- border-radius: var(--dev-wallet-radius);
119
- border: 1px solid var(--dev-wallet-border);
120
- background: var(--dev-wallet-bg-0);
121
- color: var(--dev-wallet-foreground);
122
- font-family: var(--dev-wallet-font-mono);
123
- font-size: 11.5px;
68
+ gap: 24px;
69
+ padding-top: 8px;
70
+ font-size: 12px;
124
71
  line-height: 1.55;
72
+ color: var(--dev-wallet-muted-foreground);
125
73
  }
126
74
 
127
- .status-list {
75
+ .about {
76
+ padding-top: 16px;
77
+ border-top: 1px solid var(--dev-wallet-border);
128
78
  display: flex;
129
79
  flex-direction: column;
130
80
  gap: 6px;
81
+ font-size: 11px;
82
+ color: var(--dev-wallet-text-3);
131
83
  }
132
84
 
133
- .status-row {
134
- display: flex;
135
- align-items: center;
136
- gap: 8px;
137
- min-width: 0;
138
- padding: 8px 10px;
139
- border-radius: var(--dev-wallet-radius-lg);
140
- border: 1px solid var(--dev-wallet-border);
141
- background: color-mix(in srgb, var(--dev-wallet-bg-1) 88%, transparent);
142
- }
143
-
144
- .status-dot {
145
- width: 7px;
146
- height: 7px;
147
- border-radius: 999px;
148
- background: var(--dev-wallet-status-connected);
149
- flex-shrink: 0;
150
- }
151
-
152
- .status-dot.mute {
153
- background: var(--dev-wallet-text-3);
154
- }
155
-
156
- .status-copy {
157
- min-width: 0;
158
- display: flex;
159
- flex-direction: column;
160
- gap: 1px;
85
+ .about code {
86
+ font-family: var(--dev-wallet-font-mono);
87
+ font-size: 10.5px;
88
+ color: var(--dev-wallet-muted-foreground);
161
89
  }
162
90
 
163
- .status-copy strong {
164
- font-size: 12px;
165
- font-weight: var(--dev-wallet-font-weight-medium);
91
+ .about a {
92
+ color: var(--dev-wallet-muted-foreground);
166
93
  }
167
94
 
168
- .status-copy span {
169
- font-family: var(--dev-wallet-font-mono);
170
- font-size: 10.5px;
171
- color: var(--dev-wallet-text-3);
172
- overflow: hidden;
173
- text-overflow: ellipsis;
174
- white-space: nowrap;
95
+ .about a:hover {
96
+ color: var(--dev-wallet-foreground);
175
97
  }
176
98
 
177
99
  .card {
@@ -210,19 +132,6 @@ let DevWalletStandalone = class DevWalletStandalone extends LitElement {
210
132
  margin-left: auto;
211
133
  }
212
134
 
213
- .status-dot {
214
- width: 8px;
215
- height: 8px;
216
- border-radius: 50%;
217
- background: var(--dev-wallet-status-connected);
218
- }
219
-
220
- .status-text {
221
- font-family: var(--dev-wallet-font-mono);
222
- font-size: 10.5px;
223
- color: var(--dev-wallet-muted-foreground);
224
- }
225
-
226
135
  .card-body {
227
136
  overflow-y: auto;
228
137
  flex: 1;
@@ -239,12 +148,18 @@ let DevWalletStandalone = class DevWalletStandalone extends LitElement {
239
148
  border-bottom: 0;
240
149
  }
241
150
 
242
- @media (max-width: 1020px) {
151
+ /* Too narrow to keep the wallet centered with the aside beside it:
152
+ hide the aside. The Settings tab carries the same connect guide. */
153
+ @media (max-width: 1240px) {
243
154
  .standalone-layout {
244
155
  grid-template-columns: minmax(0, 480px);
245
156
  justify-content: center;
246
157
  }
247
158
 
159
+ .card {
160
+ grid-column: 1;
161
+ }
162
+
248
163
  .rail {
249
164
  display: none;
250
165
  }
@@ -256,7 +171,6 @@ let DevWalletStandalone = class DevWalletStandalone extends LitElement {
256
171
  }
257
172
 
258
173
  .standalone-layout {
259
- min-height: calc(100vh - 24px);
260
174
  padding: 0;
261
175
  }
262
176
 
@@ -271,7 +185,8 @@ let DevWalletStandalone = class DevWalletStandalone extends LitElement {
271
185
  #ctrl;
272
186
  willUpdate(changedProperties) {
273
187
  if (changedProperties.has("wallet")) this.#ctrl.wallet = this.wallet;
274
- if (changedProperties.has("bookmarkletOrigin")) this.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;
188
+ if (changedProperties.has("walletOrigin")) this.#ctrl.walletOrigin = this.walletOrigin;
189
+ if (changedProperties.has("connectedApps")) this.#ctrl.connectedApps = this.connectedApps;
275
190
  if (changedProperties.has("coins")) this.#ctrl.coins = this.coins;
276
191
  }
277
192
  updated() {
@@ -282,111 +197,42 @@ let DevWalletStandalone = class DevWalletStandalone extends LitElement {
282
197
  render() {
283
198
  return html`
284
199
  <div class="standalone-layout">
285
- <aside class="rail">${this.#renderLeftRail()}</aside>
286
- <div class="card" part="card">
200
+ <aside class="rail rail-left">
201
+ <dev-wallet-connect-guide .origin=${this.walletOrigin}></dev-wallet-connect-guide>
202
+ ${this.#renderAbout()}
203
+ </aside>
204
+ <main class="card" part="card">
287
205
  <div class="card-header">
288
- <span class="logo-mark">${this.#walletIcon}</span>
289
- <span class="wordmark-title">
290
- <span class="card-title">${this.wallet?.name ?? "Dev Wallet"}</span>
291
- <span class="version">v0.1.0</span>
292
- </span>
293
- <div class="header-right">
294
- ${this.#ctrl.renderNetworkBadge()}
295
- <span class="status-dot"></span>
296
- <span class="status-text">Running</span>
297
- </div>
206
+ <span class="card-title">${this.wallet?.name ?? "Dev Wallet"}</span>
207
+ <div class="header-right">${this.#ctrl.renderNetworkBadge()}</div>
298
208
  </div>
299
209
  ${this.#ctrl.renderTabBar()}
300
210
  <div class="card-body">${this.#ctrl.renderTabContent()}</div>
301
- </div>
302
- <aside class="rail">${this.#renderRightRail()}</aside>
211
+ </main>
212
+ <aside class="rail rail-right">
213
+ <dev-wallet-connected-apps .store=${this.connectedApps}></dev-wallet-connected-apps>
214
+ </aside>
303
215
  </div>
304
216
  ${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}
305
217
  `;
306
218
  }
307
- #renderLeftRail() {
308
- const origin = this.bookmarkletOrigin || globalThis.location?.origin || "http://localhost:5174";
309
- const quickStart = `npx @mysten-incubation/dev-wallet serve\n${origin}`;
310
- const clientSnippet = `createDAppKit({
311
- walletInitializers: [
312
- devWalletClientInitializer({
313
- origin: '${origin}'
314
- })
315
- ]
316
- })`;
317
- return html`
318
- <div class="wordmark">
319
- <span class="logo-mark">${this.#walletIcon}</span>
320
- <span class="wordmark-title">
321
- <strong>Dev Wallet</strong>
322
- <span class="version">v0.1.0</span>
323
- </span>
324
- </div>
325
- <div class="rail-section">
326
- <div class="rail-title">Quick Start</div>
327
- <pre class="code">${quickStart}</pre>
328
- </div>
329
- <div class="rail-section">
330
- <div class="rail-title">Embed Wallet</div>
331
- <pre class="code">${`createDAppKit({
332
- networks: ['devnet'],
333
- walletInitializers: [
334
- devWalletInitializer({
335
- adapters: [
336
- new WebCryptoSignerAdapter()
337
- ],
338
- autoConnect: true,
339
- mountUI: true
340
- })
341
- ]
342
- })`}</pre>
343
- </div>
344
- <div class="rail-section">
345
- <div class="rail-title">Standalone Client</div>
346
- <pre class="code">${clientSnippet}</pre>
347
- </div>
348
- <div class="rail-section">
349
- <div class="rail-title">Bookmarklet Endpoint</div>
350
- <pre class="code">${origin}/bookmarklet.js</pre>
351
- </div>
352
- `;
353
- }
354
- #renderRightRail() {
355
- const activeNetwork = this.wallet?.activeNetwork ?? "devnet";
219
+ #renderAbout() {
356
220
  return html`
357
- <div class="rail-section">
358
- <div class="rail-title">Wallet Status</div>
359
- <div class="status-list">
360
- <div class="status-row">
361
- <span class="status-dot"></span>
362
- <span class="status-copy">
363
- <strong>Network: ${activeNetwork}</strong>
364
- <span>${this.wallet?.networkUrls[activeNetwork] ?? "client configured by dApp Kit"}</span>
365
- </span>
366
- </div>
367
- <div class="status-row">
368
- <span class="status-dot mute"></span>
369
- <span class="status-copy">
370
- <strong>${this.wallet?.accounts.length ?? 0} account(s)</strong>
371
- <span>${this.wallet?.adapters.length ?? 0} adapter(s): ${this.wallet?.adapters.map((adapter) => adapter.name).join(", ") ?? "No adapters"}</span>
372
- </span>
373
- </div>
374
- </div>
375
- </div>
221
+ <footer class="about">
222
+ <span>Keys are stored in this browser only. Don't hold real funds here.</span>
223
+ ${/^https?:\/\/(localhost|127\.0\.0\.1)(:|$)/.test(this.walletOrigin) ? nothing : html`<span>
224
+ For your <code>sui</code> CLI keys or localnet, run it locally:
225
+ <code>npx @mysten-incubation/dev-wallet serve</code>
226
+ </span>`}
227
+ <a href=${DOCS_URL} target="_blank" rel="noopener noreferrer">Documentation ↗</a>
228
+ </footer>
376
229
  `;
377
230
  }
378
- get #walletIcon() {
379
- return html`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7">
380
- <rect x="2" y="6" width="20" height="14" rx="2.5" />
381
- <path d="M2 10h20" />
382
- <rect x="15" y="12" width="5" height="4" rx="1" />
383
- <circle cx="17.5" cy="14" r="0.5" fill="currentColor" stroke="none" />
384
- </svg>`;
385
- }
386
231
  };
387
232
  __decorate([property({ attribute: false })], DevWalletStandalone.prototype, "wallet", void 0);
388
- __decorate([property({ type: String })], DevWalletStandalone.prototype, "bookmarkletOrigin", void 0);
233
+ __decorate([property({ type: String })], DevWalletStandalone.prototype, "walletOrigin", void 0);
389
234
  __decorate([property({ attribute: false })], DevWalletStandalone.prototype, "coins", void 0);
235
+ __decorate([property({ attribute: false })], DevWalletStandalone.prototype, "connectedApps", void 0);
390
236
  DevWalletStandalone = __decorate([customElement("dev-wallet-standalone")], DevWalletStandalone);
391
237
  //#endregion
392
238
  export { DevWalletStandalone };
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-standalone.mjs","names":["#ctrl","#renderLeftRail","#walletIcon","#renderRightRail"],"sources":["../../src/ui/dev-wallet-standalone.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { WalletController } from './wallet-controller.js';\n\n@customElement('dev-wallet-standalone')\nexport class DevWalletStandalone extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground-color: var(--dev-wallet-bg-0);\n\t\t\t\tbackground-image:\n\t\t\t\t\tlinear-gradient(var(--dev-wallet-border) 1px, transparent 1px),\n\t\t\t\t\tlinear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);\n\t\t\t\tbackground-size: 32px 32px;\n\t\t\t\tbackground-position: -1px -1px;\n\t\t\t}\n\n\t\t\t.standalone-layout {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 1220px;\n\t\t\t\tmin-height: calc(100vh - 48px);\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tpadding: 24px 0;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(240px, 1fr) 480px minmax(260px, 1fr);\n\t\t\t\tgap: 20px;\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t.rail {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 16px;\n\t\t\t\tpadding-top: 6px;\n\t\t\t}\n\n\t\t\t.wordmark {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t}\n\n\t\t\t.logo-mark {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 9px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 24px),\n\t\t\t\t\tlinear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);\n\t\t\t}\n\n\t\t\t.logo-mark svg {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t}\n\n\t\t\t.wordmark-title {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tline-height: 1.1;\n\t\t\t}\n\n\t\t\t.wordmark-title strong {\n\t\t\t\tfont-size: 16px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.version {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.rail-section {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.rail-title {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tletter-spacing: 0.14em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.code {\n\t\t\t\tmargin: 0;\n\t\t\t\toverflow: auto;\n\t\t\t\twhite-space: pre;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11.5px;\n\t\t\t\tline-height: 1.55;\n\t\t\t}\n\n\t\t\t.status-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.status-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: color-mix(in srgb, var(--dev-wallet-bg-1) 88%, transparent);\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 7px;\n\t\t\t\theight: 7px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.status-dot.mute {\n\t\t\t\tbackground: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.status-copy {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 1px;\n\t\t\t}\n\n\t\t\t.status-copy strong {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.status-copy span {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 480px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-drawer);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: min(640px, calc(100vh - 48px));\n\t\t\t\tmin-height: 540px;\n\t\t\t}\n\n\t\t\t.card-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 10px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.card-title {\n\t\t\t\tfont-size: 12.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.header-right {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t}\n\n\t\t\t.status-text {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.card-body {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tpadding: 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\t@media (max-width: 1020px) {\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tgrid-template-columns: minmax(0, 480px);\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\t.rail {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (max-width: 560px) {\n\t\t\t\t:host {\n\t\t\t\t\tpadding: 12px;\n\t\t\t\t}\n\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tmin-height: calc(100vh - 24px);\n\t\t\t\t\tpadding: 0;\n\t\t\t\t}\n\n\t\t\t\t.card {\n\t\t\t\t\theight: calc(100vh - 24px);\n\t\t\t\t\tmin-height: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** When set, the settings tab shows a bookmarklet section pointing to this origin. */\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t/** Optional pre-seeded coin metadata. Pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin RPC fetches in the\n\t * balances list and signing modal. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t#ctrl = new WalletController(this);\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('bookmarkletOrigin')) {\n\t\t\tthis.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;\n\t\t}\n\t\tif (changedProperties.has('coins')) {\n\t\t\tthis.#ctrl.coins = this.coins;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"standalone-layout\">\n\t\t\t\t<aside class=\"rail\">${this.#renderLeftRail()}</aside>\n\t\t\t\t<div class=\"card\" part=\"card\">\n\t\t\t\t\t<div class=\"card-header\">\n\t\t\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t\t\t<span class=\"card-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"header-right\">\n\t\t\t\t\t\t\t${this.#ctrl.renderNetworkBadge()}\n\t\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t\t<span class=\"status-text\">Running</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t\t\t<div class=\"card-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t\t</div>\n\t\t\t\t<aside class=\"rail\">${this.#renderRightRail()}</aside>\n\t\t\t</div>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n\n\t#renderLeftRail() {\n\t\tconst origin = this.bookmarkletOrigin || globalThis.location?.origin || 'http://localhost:5174';\n\t\tconst quickStart = `npx @mysten-incubation/dev-wallet serve\\n${origin}`;\n\t\tconst clientSnippet = `createDAppKit({\n walletInitializers: [\n devWalletClientInitializer({\n origin: '${origin}'\n })\n ]\n})`;\n\t\tconst embeddingSnippet = `createDAppKit({\n networks: ['devnet'],\n walletInitializers: [\n devWalletInitializer({\n adapters: [\n new WebCryptoSignerAdapter()\n ],\n autoConnect: true,\n mountUI: true\n })\n ]\n})`;\n\t\treturn html`\n\t\t\t<div class=\"wordmark\">\n\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t<strong>Dev Wallet</strong>\n\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Quick Start</div>\n\t\t\t\t<pre class=\"code\">${quickStart}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Embed Wallet</div>\n\t\t\t\t<pre class=\"code\">${embeddingSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Standalone Client</div>\n\t\t\t\t<pre class=\"code\">${clientSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Bookmarklet Endpoint</div>\n\t\t\t\t<pre class=\"code\">${origin}/bookmarklet.js</pre>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderRightRail() {\n\t\tconst activeNetwork = this.wallet?.activeNetwork ?? 'devnet';\n\t\tconst networkUrl = this.wallet?.networkUrls[activeNetwork] ?? 'client configured by dApp Kit';\n\t\tconst accountCount = this.wallet?.accounts.length ?? 0;\n\t\tconst adapterCount = this.wallet?.adapters.length ?? 0;\n\t\tconst adapterNames =\n\t\t\tthis.wallet?.adapters.map((adapter) => adapter.name).join(', ') ?? 'No adapters';\n\t\treturn html`\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Wallet Status</div>\n\t\t\t\t<div class=\"status-list\">\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>Network: ${activeNetwork}</strong>\n\t\t\t\t\t\t\t<span>${networkUrl}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot mute\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>${accountCount} account(s)</strong>\n\t\t\t\t\t\t\t<span>${adapterCount} adapter(s): ${adapterNames}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget #walletIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.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-standalone': DevWalletStandalone;\n\t}\n}\n"],"mappings":";;;;;;AAYO,IAAA,sBAAA,MAAM,4BAA4B,WAAW;;;gBAiQxB;2BAIP;eAMO;eAEnB,IAAI,iBAAiB,IAAI;;;gBA5QR;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0PJ;;CAeA;CAEA,WAAoB,mBAAyC;EAC5D,IAAI,kBAAkB,IAAI,QAAQ,GACjC,KAAKA,MAAM,SAAS,KAAK;EAE1B,IAAI,kBAAkB,IAAI,mBAAmB,GAC5C,KAAKA,MAAM,oBAAoB,KAAK;EAErC,IAAI,kBAAkB,IAAI,OAAO,GAChC,KAAKA,MAAM,QAAQ,KAAK;CAE1B;CAEA,UAAmB;EAClB,MAAM,SAAS,KAAK,YAAY,cAAiC,iBAAiB;EAClF,IAAI,KAAKA,MAAM,kBAAkB,UAAU,CAAC,OAAO,MAClD,OAAO,UAAU;OACX,IAAI,CAAC,KAAKA,MAAM,kBAAkB,QAAQ,MAChD,OAAO,MAAM;CAEf;CAEA,SAAkB;EACjB,OAAO,IAAI;;0BAEa,KAAKC,gBAAgB,EAAE;;;gCAGjB,KAAKC,YAAY;;kCAEf,KAAK,QAAQ,QAAQ,aAAa;;;;SAI3D,KAAKF,MAAM,mBAAmB,EAAE;;;;;OAKlC,KAAKA,MAAM,aAAa,EAAE;8BACH,KAAKA,MAAM,iBAAiB,EAAE;;0BAElC,KAAKG,iBAAiB,EAAE;;KAE7C,KAAKH,MAAM,mBAAmB,EAAE,GAAG,KAAKA,MAAM,oBAAoB,EAAE;;CAExE;CAEA,kBAAkB;EACjB,MAAM,SAAS,KAAK,qBAAqB,WAAW,UAAU,UAAU;EACxE,MAAM,aAAa,4CAA4C;EAC/D,MAAM,gBAAgB;;;iBAGP,OAAO;;;;EAgBtB,OAAO,IAAI;;8BAEiB,KAAKE,YAAY;;;;;;;;wBAQvB,WAAW;;;;wBAIX;;;;;;;;;;;IAAiB;;;;wBAIjB,cAAc;;;;wBAId,OAAO;;;CAG9B;CAEA,mBAAmB;EAClB,MAAM,gBAAgB,KAAK,QAAQ,iBAAiB;EAMpD,OAAO,IAAI;;;;;;;0BAOa,cAAc;eAZnB,KAAK,QAAQ,YAAY,kBAAkB,gCAatC;;;;;;iBAZH,KAAK,QAAQ,SAAS,UAAU,EAkBzB;eAjBP,KAAK,QAAQ,SAAS,UAAU,EAkB3B,eAhBzB,KAAK,QAAQ,SAAS,KAAK,YAAY,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,cAgBd;;;;;;CAMvD;CAEA,IAAIA,cAAc;EACjB,OAAO,IAAI;;;;;;CAMZ;AACD;YArJE,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,oBAAA,WAAA,UAAA,KAAA,CAAA;YAI7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,oBAAA,WAAA,qBAAA,KAAA,CAAA;YAMzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,oBAAA,WAAA,SAAA,KAAA,CAAA;kCA3Q9B,cAAc,uBAAuB,CAAA,GAAA,mBAAA"}
1
+ {"version":3,"file":"dev-wallet-standalone.mjs","names":["#ctrl","#renderAbout"],"sources":["../../src/ui/dev-wallet-standalone.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport type { ConnectedAppsStore } from '../client/connected-apps.js';\nimport './dev-wallet-connect-guide.js';\nimport './dev-wallet-connected-apps.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { WalletController } from './wallet-controller.js';\n\nconst DOCS_URL = 'https://ts-sdks-incubation.vercel.app/dev-wallet';\n\n@customElement('dev-wallet-standalone')\nexport class DevWalletStandalone extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground-color: var(--dev-wallet-bg-0);\n\t\t\t\tbackground-image:\n\t\t\t\t\tlinear-gradient(var(--dev-wallet-border) 1px, transparent 1px),\n\t\t\t\t\tlinear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);\n\t\t\t\tbackground-size: 32px 32px;\n\t\t\t\tbackground-position: -1px -1px;\n\t\t\t}\n\n\t\t\t/* Wallet centered: connect help on the left, connected apps on the right. */\n\t\t\t.standalone-layout {\n\t\t\t\twidth: 100%;\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tpadding: 24px 0;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(0, 1fr) 480px minmax(0, 1fr);\n\t\t\t\tgap: 36px;\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\tgrid-column: 2;\n\t\t\t}\n\n\t\t\t.rail-left {\n\t\t\t\tgrid-column: 1;\n\t\t\t\tjustify-self: end;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.rail-right {\n\t\t\t\tgrid-column: 3;\n\t\t\t}\n\n\t\t\t.rail {\n\t\t\t\tmax-width: 348px;\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 24px;\n\t\t\t\tpadding-top: 8px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tline-height: 1.55;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.about {\n\t\t\t\tpadding-top: 16px;\n\t\t\t\tborder-top: 1px solid var(--dev-wallet-border);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.about code {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.about a {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.about a:hover {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 480px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-drawer);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: min(640px, calc(100vh - 48px));\n\t\t\t\tmin-height: 540px;\n\t\t\t}\n\n\t\t\t.card-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 10px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.card-title {\n\t\t\t\tfont-size: 12.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.header-right {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.card-body {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tpadding: 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\t/* Too narrow to keep the wallet centered with the aside beside it:\n\t\t\t hide the aside. The Settings tab carries the same connect guide. */\n\t\t\t@media (max-width: 1240px) {\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tgrid-template-columns: minmax(0, 480px);\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\t.card {\n\t\t\t\t\tgrid-column: 1;\n\t\t\t\t}\n\n\t\t\t\t.rail {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (max-width: 560px) {\n\t\t\t\t:host {\n\t\t\t\t\tpadding: 12px;\n\t\t\t\t}\n\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tpadding: 0;\n\t\t\t\t}\n\n\t\t\t\t.card {\n\t\t\t\t\theight: calc(100vh - 24px);\n\t\t\t\t\tmin-height: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** Origin this wallet is served from. Drives the bookmarklet, console\n\t * script, and dApp Kit snippet. Defaults to the page's own origin. */\n\t@property({ type: String })\n\twalletOrigin = globalThis.location?.origin ?? '';\n\n\t/** Optional pre-seeded coin metadata. Pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin RPC fetches in the\n\t * balances list and signing modal. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t/** Connected-dApps store shared with the signing popup. Pass the same\n\t * store to `parseWalletRequest` so Disconnect takes effect. */\n\t@property({ attribute: false })\n\tconnectedApps: ConnectedAppsStore | null = null;\n\n\t#ctrl = new WalletController(this);\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('walletOrigin')) {\n\t\t\tthis.#ctrl.walletOrigin = this.walletOrigin;\n\t\t}\n\t\tif (changedProperties.has('connectedApps')) {\n\t\t\tthis.#ctrl.connectedApps = this.connectedApps;\n\t\t}\n\t\tif (changedProperties.has('coins')) {\n\t\t\tthis.#ctrl.coins = this.coins;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"standalone-layout\">\n\t\t\t\t<aside class=\"rail rail-left\">\n\t\t\t\t\t<dev-wallet-connect-guide .origin=${this.walletOrigin}></dev-wallet-connect-guide>\n\t\t\t\t\t${this.#renderAbout()}\n\t\t\t\t</aside>\n\t\t\t\t<main class=\"card\" part=\"card\">\n\t\t\t\t\t<div class=\"card-header\">\n\t\t\t\t\t\t<span class=\"card-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t\t<div class=\"header-right\">${this.#ctrl.renderNetworkBadge()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t\t\t<div class=\"card-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t\t</main>\n\t\t\t\t<aside class=\"rail rail-right\">\n\t\t\t\t\t<dev-wallet-connected-apps .store=${this.connectedApps}></dev-wallet-connected-apps>\n\t\t\t\t</aside>\n\t\t\t</div>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n\n\t#renderAbout() {\n\t\tconst isLocal = /^https?:\\/\\/(localhost|127\\.0\\.0\\.1)(:|$)/.test(this.walletOrigin);\n\t\treturn html`\n\t\t\t<footer class=\"about\">\n\t\t\t\t<span>Keys are stored in this browser only. Don't hold real funds here.</span>\n\t\t\t\t${isLocal\n\t\t\t\t\t? nothing\n\t\t\t\t\t: html`<span>\n\t\t\t\t\t\t\tFor your <code>sui</code> CLI keys or localnet, run it locally:\n\t\t\t\t\t\t\t<code>npx @mysten-incubation/dev-wallet serve</code>\n\t\t\t\t\t\t</span>`}\n\t\t\t\t<a href=${DOCS_URL} target=\"_blank\" rel=\"noopener noreferrer\">Documentation ↗</a>\n\t\t\t</footer>\n\t\t`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-standalone': DevWalletStandalone;\n\t}\n}\n"],"mappings":";;;;;;;;AAcA,MAAM,WAAW;AAGV,IAAA,sBAAA,MAAM,4BAA4B,WAAW;;;gBAuKxB;sBAKZ,WAAW,UAAU,UAAU;eAMnB;uBAKgB;eAEnC,IAAI,iBAAiB,IAAI;;;gBAxLR;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgKJ;;CAqBA;CAEA,WAAoB,mBAAyC;EAC5D,IAAI,kBAAkB,IAAI,QAAQ,GACjC,KAAKA,MAAM,SAAS,KAAK;EAE1B,IAAI,kBAAkB,IAAI,cAAc,GACvC,KAAKA,MAAM,eAAe,KAAK;EAEhC,IAAI,kBAAkB,IAAI,eAAe,GACxC,KAAKA,MAAM,gBAAgB,KAAK;EAEjC,IAAI,kBAAkB,IAAI,OAAO,GAChC,KAAKA,MAAM,QAAQ,KAAK;CAE1B;CAEA,UAAmB;EAClB,MAAM,SAAS,KAAK,YAAY,cAAiC,iBAAiB;EAClF,IAAI,KAAKA,MAAM,kBAAkB,UAAU,CAAC,OAAO,MAClD,OAAO,UAAU;OACX,IAAI,CAAC,KAAKA,MAAM,kBAAkB,QAAQ,MAChD,OAAO,MAAM;CAEf;CAEA,SAAkB;EACjB,OAAO,IAAI;;;yCAG4B,KAAK,aAAa;OACpD,KAAKC,aAAa,EAAE;;;;iCAIM,KAAK,QAAQ,QAAQ,aAAa;kCACjC,KAAKD,MAAM,mBAAmB,EAAE;;OAE3D,KAAKA,MAAM,aAAa,EAAE;8BACH,KAAKA,MAAM,iBAAiB,EAAE;;;yCAGnB,KAAK,cAAc;;;KAGvD,KAAKA,MAAM,mBAAmB,EAAE,GAAG,KAAKA,MAAM,oBAAoB,EAAE;;CAExE;CAEA,eAAe;EAEd,OAAO,IAAI;;;MADK,4CAA4C,KAAK,KAAK,YAIlE,IACC,UACA,IAAI;;;eAGI;cACD,SAAS;;;CAGtB;AACD;YAnFE,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,oBAAA,WAAA,UAAA,KAAA,CAAA;YAK7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,oBAAA,WAAA,gBAAA,KAAA,CAAA;YAMzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,oBAAA,WAAA,SAAA,KAAA,CAAA;YAK7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,oBAAA,WAAA,iBAAA,KAAA,CAAA;kCAvL9B,cAAc,uBAAuB,CAAA,GAAA,mBAAA"}
@@ -5,6 +5,8 @@ import { DevWalletAccounts } from "./dev-wallet-accounts.mjs";
5
5
  import { DevWalletBalances } from "./dev-wallet-balances.mjs";
6
6
  import { DevWalletSigning } from "./dev-wallet-signing.mjs";
7
7
  import { DevWalletConnect } from "./dev-wallet-connect.mjs";
8
+ import { DevWalletConnectGuide } from "./dev-wallet-connect-guide.mjs";
9
+ import { DevWalletConnectedApps } from "./dev-wallet-connected-apps.mjs";
8
10
  import { DevWalletObjects } from "./dev-wallet-objects.mjs";
9
11
  import { DevWalletPopup } from "./dev-wallet-popup.mjs";
10
12
  import { DevWalletSettings } from "./dev-wallet-settings.mjs";
@@ -15,4 +17,4 @@ import { DevWalletNetworkBadge } from "./dev-wallet-network-badge.mjs";
15
17
  import { DevWalletTabBar } from "./dev-wallet-tab-bar.mjs";
16
18
  import { DevWalletForkPanel } from "./dev-wallet-fork-panel.mjs";
17
19
  import { mountDevWallet } from "./mount.mjs";
18
- export { DevWalletAccountSelector, DevWalletAccounts, DevWalletBalances, DevWalletConnect, DevWalletDropdown, DevWalletForkPanel, DevWalletNetworkBadge, DevWalletNewAccount, DevWalletObjects, DevWalletPanel, DevWalletPopup, DevWalletSettings, DevWalletSigning, DevWalletSigningModal, DevWalletStandalone, DevWalletTabBar, mountDevWallet };
20
+ export { DevWalletAccountSelector, DevWalletAccounts, DevWalletBalances, DevWalletConnect, DevWalletConnectGuide, DevWalletConnectedApps, DevWalletDropdown, DevWalletForkPanel, DevWalletNetworkBadge, DevWalletNewAccount, DevWalletObjects, DevWalletPanel, DevWalletPopup, DevWalletSettings, DevWalletSigning, DevWalletSigningModal, DevWalletStandalone, DevWalletTabBar, mountDevWallet };
package/dist/ui/index.mjs CHANGED
@@ -7,6 +7,8 @@ import { DevWalletNetworkBadge } from "./dev-wallet-network-badge.mjs";
7
7
  import { DevWalletObjects } from "./dev-wallet-objects.mjs";
8
8
  import { DevWalletNewAccount } from "./dev-wallet-new-account.mjs";
9
9
  import { DevWalletAccounts } from "./dev-wallet-accounts.mjs";
10
+ import { DevWalletConnectGuide } from "./dev-wallet-connect-guide.mjs";
11
+ import { DevWalletConnectedApps } from "./dev-wallet-connected-apps.mjs";
10
12
  import { DevWalletSettings } from "./dev-wallet-settings.mjs";
11
13
  import { DevWalletSigning } from "./dev-wallet-signing.mjs";
12
14
  import { DevWalletSigningModal } from "./dev-wallet-signing-modal.mjs";
@@ -15,4 +17,4 @@ import { DevWalletPanel } from "./dev-wallet-panel.mjs";
15
17
  import { DevWalletPopup } from "./dev-wallet-popup.mjs";
16
18
  import { DevWalletStandalone } from "./dev-wallet-standalone.mjs";
17
19
  import { mountDevWallet } from "./mount.mjs";
18
- export { DevWalletAccountSelector, DevWalletAccounts, DevWalletBalances, DevWalletConnect, DevWalletDropdown, DevWalletForkPanel, DevWalletNetworkBadge, DevWalletNewAccount, DevWalletObjects, DevWalletPanel, DevWalletPopup, DevWalletSettings, DevWalletSigning, DevWalletSigningModal, DevWalletStandalone, DevWalletTabBar, mountDevWallet };
20
+ export { DevWalletAccountSelector, DevWalletAccounts, DevWalletBalances, DevWalletConnect, DevWalletConnectGuide, DevWalletConnectedApps, DevWalletDropdown, DevWalletForkPanel, DevWalletNetworkBadge, DevWalletNewAccount, DevWalletObjects, DevWalletPanel, DevWalletPopup, DevWalletSettings, DevWalletSigning, DevWalletSigningModal, DevWalletStandalone, DevWalletTabBar, mountDevWallet };
@@ -20,6 +20,7 @@ import { html, nothing } from "lit";
20
20
  */
21
21
  var WalletController = class {
22
22
  #wallet;
23
+ #networkKey;
23
24
  #unsubscribeEvents;
24
25
  #unsubscribeRequests;
25
26
  #unsubscribeConnect;
@@ -29,11 +30,13 @@ var WalletController = class {
29
30
  this.activeAccountIndex = 0;
30
31
  this.pendingRequest = null;
31
32
  this.pendingConnect = null;
32
- this.bookmarkletOrigin = "";
33
+ this.walletOrigin = "";
34
+ this.connectedApps = null;
33
35
  this.coins = null;
34
36
  this.forkRelay = null;
35
37
  this.forkUpstream = "";
36
38
  this.#wallet = null;
39
+ this.#networkKey = "";
37
40
  this.#unsubscribeEvents = null;
38
41
  this.#unsubscribeRequests = null;
39
42
  this.#unsubscribeConnect = null;
@@ -66,9 +69,16 @@ var WalletController = class {
66
69
  const newPending = this.#wallet.pendingRequest;
67
70
  const accountsChanged = newAccounts.length !== this.accounts.length || newAccounts.some((a, i) => a.address !== this.accounts[i]?.address);
68
71
  const pendingChanged = newPending !== this.pendingRequest;
69
- if (!accountsChanged && !pendingChanged) return;
72
+ const networkKey = `${this.#wallet.activeNetwork}|${this.#wallet.availableNetworks.join(",")}`;
73
+ const networkChanged = networkKey !== this.#networkKey;
74
+ this.#networkKey = networkKey;
75
+ if (!accountsChanged && !pendingChanged && !networkChanged) return;
70
76
  if (accountsChanged) {
77
+ const hadAccounts = this.accounts.length > 0;
71
78
  this.accounts = [...newAccounts];
79
+ const persisted = this.#wallet.activeAccount;
80
+ const restored = persisted ? newAccounts.findIndex((a) => a.address === persisted) : -1;
81
+ if (!hadAccounts && restored !== -1) this.activeAccountIndex = restored;
72
82
  if (this.activeAccountIndex >= newAccounts.length && newAccounts.length > 0) this.activeAccountIndex = newAccounts.length - 1;
73
83
  }
74
84
  this.pendingRequest = newPending;
@@ -120,6 +130,7 @@ var WalletController = class {
120
130
  const index = this.accounts.findIndex((a) => a.address === e.detail.account.address);
121
131
  if (index !== -1) {
122
132
  this.activeAccountIndex = index;
133
+ this.#wallet?.setActiveAccount(e.detail.account.address);
123
134
  this.host.requestUpdate();
124
135
  }
125
136
  }
@@ -194,7 +205,8 @@ var WalletController = class {
194
205
  .accounts=${this.accounts}
195
206
  .adapters=${this.#wallet ? [...this.#wallet.adapters] : []}
196
207
  .activeAddress=${this.activeAddress}
197
- .bookmarkletOrigin=${this.bookmarkletOrigin}
208
+ .walletOrigin=${this.walletOrigin}
209
+ .connectedApps=${this.connectedApps}
198
210
  @account-selected=${(e) => this.handleAccountSelected(e)}
199
211
  ></dev-wallet-settings>
200
212
  `;