@mysten-incubation/dev-wallet 0.0.1 → 0.3.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 (182) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/LICENSE +189 -0
  3. package/dist/_virtual/{_@oxc-project_runtime@0.107.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.mjs +2 -3
  4. package/dist/adapters/base-adapter.mjs +6 -7
  5. package/dist/adapters/base-adapter.mjs.map +1 -1
  6. package/dist/adapters/browser.d.mts +4 -1
  7. package/dist/adapters/browser.mjs +4 -2
  8. package/dist/adapters/build-managed-account.mjs +8 -10
  9. package/dist/adapters/build-managed-account.mjs.map +1 -1
  10. package/dist/adapters/devstack-adapter.d.mts +111 -0
  11. package/dist/adapters/devstack-adapter.d.mts.map +1 -0
  12. package/dist/adapters/devstack-adapter.mjs +224 -0
  13. package/dist/adapters/devstack-adapter.mjs.map +1 -0
  14. package/dist/adapters/devstack-paths.d.mts +11 -0
  15. package/dist/adapters/devstack-paths.d.mts.map +1 -0
  16. package/dist/adapters/devstack-paths.mjs +11 -0
  17. package/dist/adapters/devstack-paths.mjs.map +1 -0
  18. package/dist/adapters/fork-relay.d.mts +109 -0
  19. package/dist/adapters/fork-relay.d.mts.map +1 -0
  20. package/dist/adapters/fork-relay.mjs +208 -0
  21. package/dist/adapters/fork-relay.mjs.map +1 -0
  22. package/dist/adapters/idb-store.mjs +12 -16
  23. package/dist/adapters/idb-store.mjs.map +1 -1
  24. package/dist/adapters/in-memory-adapter.mjs +4 -10
  25. package/dist/adapters/in-memory-adapter.mjs.map +1 -1
  26. package/dist/adapters/passkey-adapter.mjs +4 -12
  27. package/dist/adapters/passkey-adapter.mjs.map +1 -1
  28. package/dist/adapters/remote-cli-adapter.mjs +37 -72
  29. package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
  30. package/dist/adapters/webcrypto-adapter.mjs +2 -4
  31. package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
  32. package/dist/bin/cli.mjs +9 -22
  33. package/dist/bin/cli.mjs.map +1 -1
  34. package/dist/client/dev-wallet-client.mjs +13 -28
  35. package/dist/client/dev-wallet-client.mjs.map +1 -1
  36. package/dist/client/index.mjs +1 -2
  37. package/dist/client/request-handler.mjs +36 -42
  38. package/dist/client/request-handler.mjs.map +1 -1
  39. package/dist/index.mjs +1 -2
  40. package/dist/react/components.d.mts +9 -9
  41. package/dist/react/components.d.mts.map +1 -1
  42. package/dist/react/components.mjs +2 -5
  43. package/dist/react/components.mjs.map +1 -1
  44. package/dist/react/context.d.mts +3 -3
  45. package/dist/react/context.d.mts.map +1 -1
  46. package/dist/react/context.mjs +3 -8
  47. package/dist/react/context.mjs.map +1 -1
  48. package/dist/react/index.mjs +1 -2
  49. package/dist/react/useDevWallet.d.mts +3 -0
  50. package/dist/react/useDevWallet.d.mts.map +1 -1
  51. package/dist/react/useDevWallet.mjs +9 -14
  52. package/dist/react/useDevWallet.mjs.map +1 -1
  53. package/dist/server/cli-signing-middleware.mjs +7 -20
  54. package/dist/server/cli-signing-middleware.mjs.map +1 -1
  55. package/dist/server/index.mjs +1 -2
  56. package/dist/standalone/assets/{in-memory-adapter-CBF4h2KD.js → in-memory-adapter-qRkNfj9O.js} +1 -1
  57. package/dist/standalone/assets/main-DDltQnzR.js +3954 -0
  58. package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js} +1 -1
  59. package/dist/standalone/index.html +11 -12
  60. package/dist/ui/copy-controller.mjs +3 -3
  61. package/dist/ui/copy-controller.mjs.map +1 -1
  62. package/dist/ui/dev-wallet-account-selector.d.mts +3 -4
  63. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
  64. package/dist/ui/dev-wallet-account-selector.mjs +48 -25
  65. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
  66. package/dist/ui/dev-wallet-accounts.d.mts +9 -4
  67. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
  68. package/dist/ui/dev-wallet-accounts.mjs +62 -140
  69. package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
  70. package/dist/ui/dev-wallet-balances.d.mts +10 -3
  71. package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
  72. package/dist/ui/dev-wallet-balances.mjs +241 -43
  73. package/dist/ui/dev-wallet-balances.mjs.map +1 -1
  74. package/dist/ui/dev-wallet-connect.d.mts +3 -3
  75. package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
  76. package/dist/ui/dev-wallet-connect.mjs +24 -16
  77. package/dist/ui/dev-wallet-connect.mjs.map +1 -1
  78. package/dist/ui/dev-wallet-dropdown.d.mts +3 -3
  79. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
  80. package/dist/ui/dev-wallet-dropdown.mjs +37 -47
  81. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
  82. package/dist/ui/dev-wallet-fork-panel.d.mts +43 -0
  83. package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -0
  84. package/dist/ui/dev-wallet-fork-panel.mjs +500 -0
  85. package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -0
  86. package/dist/ui/dev-wallet-network-badge.d.mts +3 -4
  87. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
  88. package/dist/ui/dev-wallet-network-badge.mjs +52 -21
  89. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
  90. package/dist/ui/dev-wallet-new-account.d.mts +3 -4
  91. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
  92. package/dist/ui/dev-wallet-new-account.mjs +31 -105
  93. package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
  94. package/dist/ui/dev-wallet-objects.d.mts +3 -3
  95. package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
  96. package/dist/ui/dev-wallet-objects.mjs +76 -39
  97. package/dist/ui/dev-wallet-objects.mjs.map +1 -1
  98. package/dist/ui/dev-wallet-panel.d.mts +24 -4
  99. package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
  100. package/dist/ui/dev-wallet-panel.mjs +247 -64
  101. package/dist/ui/dev-wallet-panel.mjs.map +1 -1
  102. package/dist/ui/dev-wallet-popup.d.mts +3 -5
  103. package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
  104. package/dist/ui/dev-wallet-popup.mjs +19 -15
  105. package/dist/ui/dev-wallet-popup.mjs.map +1 -1
  106. package/dist/ui/dev-wallet-settings.d.mts +3 -4
  107. package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
  108. package/dist/ui/dev-wallet-settings.mjs +149 -97
  109. package/dist/ui/dev-wallet-settings.mjs.map +1 -1
  110. package/dist/ui/dev-wallet-signing-modal.d.mts +11 -4
  111. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
  112. package/dist/ui/dev-wallet-signing-modal.mjs +46 -18
  113. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
  114. package/dist/ui/dev-wallet-signing.d.mts +9 -3
  115. package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
  116. package/dist/ui/dev-wallet-signing.mjs +119 -130
  117. package/dist/ui/dev-wallet-signing.mjs.map +1 -1
  118. package/dist/ui/dev-wallet-standalone.d.mts +8 -3
  119. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
  120. package/dist/ui/dev-wallet-standalone.mjs +303 -38
  121. package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
  122. package/dist/ui/dev-wallet-tab-bar.d.mts +13 -5
  123. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
  124. package/dist/ui/dev-wallet-tab-bar.mjs +143 -82
  125. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
  126. package/dist/ui/index.d.mts +3 -2
  127. package/dist/ui/index.mjs +2 -2
  128. package/dist/ui/mount.d.mts +14 -1
  129. package/dist/ui/mount.d.mts.map +1 -1
  130. package/dist/ui/mount.mjs +5 -2
  131. package/dist/ui/mount.mjs.map +1 -1
  132. package/dist/ui/styles.mjs +428 -66
  133. package/dist/ui/styles.mjs.map +1 -1
  134. package/dist/ui/transaction-analyzer.mjs +19 -30
  135. package/dist/ui/transaction-analyzer.mjs.map +1 -1
  136. package/dist/ui/utils.d.mts +59 -0
  137. package/dist/ui/utils.d.mts.map +1 -0
  138. package/dist/ui/utils.mjs +42 -15
  139. package/dist/ui/utils.mjs.map +1 -1
  140. package/dist/ui/wallet-controller.mjs +89 -20
  141. package/dist/ui/wallet-controller.mjs.map +1 -1
  142. package/dist/wallet/constants.d.mts +9 -0
  143. package/dist/wallet/constants.d.mts.map +1 -0
  144. package/dist/wallet/constants.mjs +1 -1
  145. package/dist/wallet/dev-wallet.mjs +42 -99
  146. package/dist/wallet/dev-wallet.mjs.map +1 -1
  147. package/dist/wallet/initializer.d.mts +3 -0
  148. package/dist/wallet/initializer.d.mts.map +1 -1
  149. package/dist/wallet/initializer.mjs +9 -14
  150. package/dist/wallet/initializer.mjs.map +1 -1
  151. package/dist/wallet/signing.mjs +8 -21
  152. package/dist/wallet/signing.mjs.map +1 -1
  153. package/package.json +8 -6
  154. package/src/adapters/browser.ts +21 -0
  155. package/src/adapters/devstack-adapter.ts +342 -0
  156. package/src/adapters/devstack-paths.ts +15 -0
  157. package/src/adapters/fork-relay.ts +321 -0
  158. package/src/app/index.html +10 -11
  159. package/src/react/useDevWallet.ts +5 -1
  160. package/src/ui/dev-wallet-account-selector.ts +44 -17
  161. package/src/ui/dev-wallet-accounts.ts +87 -124
  162. package/src/ui/dev-wallet-balances.ts +248 -27
  163. package/src/ui/dev-wallet-connect.ts +19 -8
  164. package/src/ui/dev-wallet-dropdown.ts +7 -5
  165. package/src/ui/dev-wallet-fork-panel.ts +591 -0
  166. package/src/ui/dev-wallet-network-badge.ts +49 -10
  167. package/src/ui/dev-wallet-new-account.ts +21 -62
  168. package/src/ui/dev-wallet-objects.ts +59 -19
  169. package/src/ui/dev-wallet-panel.ts +261 -42
  170. package/src/ui/dev-wallet-popup.ts +12 -6
  171. package/src/ui/dev-wallet-settings.ts +159 -94
  172. package/src/ui/dev-wallet-signing-modal.ts +47 -7
  173. package/src/ui/dev-wallet-signing.ts +124 -97
  174. package/src/ui/dev-wallet-standalone.ts +310 -22
  175. package/src/ui/dev-wallet-tab-bar.ts +132 -70
  176. package/src/ui/index.ts +3 -0
  177. package/src/ui/mount.ts +23 -1
  178. package/src/ui/styles.ts +434 -58
  179. package/src/ui/utils.ts +66 -0
  180. package/src/ui/wallet-controller.ts +103 -5
  181. package/src/wallet/initializer.ts +7 -1
  182. package/dist/standalone/assets/main-VE4olb-Q.js +0 -2841
@@ -4,10 +4,14 @@
4
4
  import { css, html, LitElement, nothing } from 'lit';
5
5
  import { customElement, property, state } from 'lit/decorators.js';
6
6
 
7
+ import type { ForkRelay } from '../adapters/fork-relay.js';
7
8
  import type { DevWallet } from '../wallet/dev-wallet.js';
8
9
  import { connectDialogStyles, sharedStyles } from './styles.js';
10
+ import type { CoinRecord } from './utils.js';
9
11
  import { WalletController } from './wallet-controller.js';
10
12
 
13
+ export type DevWalletDockStyle = 'corner-pill' | 'side-tab';
14
+
11
15
  @customElement('dev-wallet-panel')
12
16
  export class DevWalletPanel extends LitElement {
13
17
  static override styles = [
@@ -17,95 +21,234 @@ export class DevWalletPanel extends LitElement {
17
21
  :host {
18
22
  display: block;
19
23
  position: fixed;
20
- bottom: 16px;
21
- right: 16px;
24
+ inset: 0;
22
25
  z-index: 999999;
23
- font-size: 14px;
26
+ font-size: 13px;
27
+ pointer-events: none;
24
28
  }
25
29
 
26
30
  .trigger {
27
- width: 48px;
28
- height: 48px;
29
- border-radius: 50%;
30
- background: var(--dev-wallet-primary);
31
- color: var(--dev-wallet-primary-foreground);
31
+ position: fixed;
32
+ right: 20px;
33
+ bottom: 20px;
34
+ width: 40px;
35
+ height: 40px;
36
+ border-radius: 999px;
37
+ background: var(--dev-wallet-surface);
38
+ color: var(--dev-wallet-primary);
39
+ border: 1px solid var(--dev-wallet-border-2);
32
40
  display: flex;
33
41
  align-items: center;
34
42
  justify-content: center;
35
43
  box-shadow: var(--dev-wallet-shadow-md);
36
- transition: transform 0.15s;
37
- position: relative;
44
+ transition:
45
+ transform 120ms,
46
+ box-shadow 120ms,
47
+ border-color 120ms;
48
+ pointer-events: auto;
49
+ z-index: 2;
38
50
  }
39
51
 
40
52
  .trigger:hover {
41
- transform: scale(1.05);
53
+ transform: translateY(-1px);
54
+ border-color: var(--dev-wallet-border-strong);
55
+ box-shadow:
56
+ var(--dev-wallet-shadow-md),
57
+ 0 0 0 4px var(--dev-wallet-accent-fade);
58
+ }
59
+
60
+ .trigger.side-tab {
61
+ top: 50%;
62
+ right: 0;
63
+ bottom: auto;
64
+ width: 34px;
65
+ height: 88px;
66
+ border-radius: 12px 0 0 12px;
67
+ transform: translateY(-50%);
68
+ }
69
+
70
+ .trigger.side-tab:hover {
71
+ transform: translateY(calc(-50% - 1px));
42
72
  }
43
73
 
44
74
  .trigger svg {
45
- width: 24px;
46
- height: 24px;
75
+ width: 20px;
76
+ height: 20px;
47
77
  }
48
78
 
49
- .sidebar {
79
+ .status-dot {
50
80
  position: absolute;
51
- bottom: 56px;
52
- right: 0;
53
- width: 360px;
54
- max-width: calc(100vw - 32px);
55
- max-height: 520px;
81
+ right: 3px;
82
+ bottom: 3px;
83
+ width: 10px;
84
+ height: 10px;
85
+ border-radius: 999px;
86
+ border: 2px solid var(--dev-wallet-surface);
87
+ background: var(--dev-wallet-status-connected);
88
+ }
89
+
90
+ .status-dot.notice {
91
+ background: var(--dev-wallet-primary);
92
+ animation: pulse-ring 1.6s ease-out infinite;
93
+ }
94
+
95
+ .scrim {
96
+ position: fixed;
97
+ inset: 0;
98
+ background: rgba(2, 6, 14, 0.4);
99
+ pointer-events: auto;
100
+ animation: fadein 160ms ease-out;
101
+ }
102
+
103
+ .sidebar {
104
+ position: fixed;
105
+ top: 12px;
106
+ right: 12px;
107
+ bottom: 76px;
108
+ width: 400px;
109
+ max-width: calc(100vw - 24px);
56
110
  border-radius: var(--dev-wallet-radius-xl);
57
- background: var(--dev-wallet-background);
58
- border: 1px solid var(--dev-wallet-border);
59
- box-shadow: var(--dev-wallet-shadow-lg);
111
+ background: var(--dev-wallet-surface);
112
+ border: 1px solid var(--dev-wallet-border-2);
113
+ box-shadow: var(--dev-wallet-shadow-drawer);
60
114
  display: flex;
61
115
  flex-direction: column;
116
+ overflow: hidden;
117
+ pointer-events: auto;
118
+ animation: slidein-right 240ms cubic-bezier(0.2, 0.7, 0.2, 1);
119
+ }
120
+
121
+ .status-strip {
122
+ display: flex;
123
+ align-items: center;
124
+ gap: 8px;
125
+ min-height: 30px;
126
+ padding: 6px 10px 6px 12px;
127
+ border-bottom: 1px solid var(--dev-wallet-border);
128
+ background: var(--dev-wallet-bg-2);
129
+ }
130
+
131
+ .status-strip .host-origin {
132
+ flex: 1;
133
+ min-width: 0;
134
+ font-family: var(--dev-wallet-font-mono);
135
+ font-size: 10.5px;
136
+ color: var(--dev-wallet-text-3);
137
+ overflow: hidden;
138
+ text-overflow: ellipsis;
139
+ white-space: nowrap;
62
140
  }
63
141
 
64
142
  .sidebar-header {
65
143
  display: flex;
66
- justify-content: space-between;
67
144
  align-items: center;
68
- padding: 14px 16px;
145
+ gap: 8px;
146
+ padding: 10px 14px;
69
147
  border-bottom: 1px solid var(--dev-wallet-border);
148
+ background: var(--dev-wallet-bg-1);
70
149
  position: relative;
71
150
  z-index: 1;
72
151
  }
73
152
 
153
+ .brand {
154
+ display: flex;
155
+ align-items: center;
156
+ gap: 8px;
157
+ min-width: 0;
158
+ }
159
+
160
+ .logo-mark {
161
+ width: 20px;
162
+ height: 20px;
163
+ border-radius: 7px;
164
+ display: inline-flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ color: var(--dev-wallet-primary-foreground);
168
+ background:
169
+ radial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 22px),
170
+ linear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));
171
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);
172
+ flex-shrink: 0;
173
+ }
174
+
175
+ .logo-mark svg {
176
+ width: 14px;
177
+ height: 14px;
178
+ }
179
+
180
+ .title-stack {
181
+ display: flex;
182
+ flex-direction: column;
183
+ line-height: 1.1;
184
+ min-width: 0;
185
+ }
186
+
74
187
  .sidebar-title {
75
- font-size: 15px;
188
+ font-size: 12.5px;
76
189
  font-weight: var(--dev-wallet-font-weight-semibold);
77
190
  color: var(--dev-wallet-foreground);
191
+ white-space: nowrap;
192
+ overflow: hidden;
193
+ text-overflow: ellipsis;
194
+ }
195
+
196
+ .version {
197
+ font-family: var(--dev-wallet-font-mono);
198
+ font-size: 9px;
199
+ letter-spacing: 0.12em;
200
+ text-transform: uppercase;
201
+ color: var(--dev-wallet-text-3);
202
+ }
203
+
204
+ .header-spacer {
205
+ flex: 1;
206
+ min-width: 8px;
78
207
  }
79
208
 
80
209
  .close-btn {
81
- font-size: 18px;
82
- color: var(--dev-wallet-muted-foreground);
83
- width: 28px;
84
- height: 28px;
210
+ color: var(--dev-wallet-text-3);
211
+ width: 24px;
212
+ height: 24px;
85
213
  display: flex;
86
214
  align-items: center;
87
215
  justify-content: center;
88
- border-radius: var(--dev-wallet-radius-xs);
216
+ border-radius: var(--dev-wallet-radius);
217
+ flex-shrink: 0;
89
218
  }
90
219
 
91
220
  .close-btn:hover {
92
- background: var(--dev-wallet-secondary);
221
+ background: var(--dev-wallet-bg-hover);
222
+ color: var(--dev-wallet-foreground);
223
+ }
224
+
225
+ .close-btn svg {
226
+ width: 14px;
227
+ height: 14px;
93
228
  }
94
229
 
95
230
  .sidebar-body {
96
- padding: 16px;
97
231
  overflow-y: auto;
98
232
  overflow-x: hidden;
99
233
  flex: 1;
100
234
  min-height: 0;
235
+ background: var(--dev-wallet-bg-0);
101
236
  }
102
237
 
103
238
  .section {
104
- margin-bottom: 16px;
239
+ padding: 14px;
240
+ border-bottom: 1px solid var(--dev-wallet-border);
105
241
  }
106
242
 
107
243
  .section:last-child {
108
- margin-bottom: 0;
244
+ border-bottom: 0;
245
+ }
246
+
247
+ @media (max-width: 520px) {
248
+ .sidebar {
249
+ left: 12px;
250
+ width: auto;
251
+ }
109
252
  }
110
253
  `,
111
254
  ];
@@ -113,6 +256,29 @@ export class DevWalletPanel extends LitElement {
113
256
  @property({ attribute: false })
114
257
  wallet: DevWallet | null = null;
115
258
 
259
+ /** Optional pre-seeded coin metadata. Pass the generated `coins`
260
+ * constant from devstack codegen (`src/generated/coins.ts`) to skip
261
+ * per-coin RPC fetches in the balances list and signing modal. */
262
+ @property({ attribute: false })
263
+ coins: CoinRecord | null = null;
264
+
265
+ /** Phase 5 Subtopic 6 — fork admin relay. When set, the panel
266
+ * surfaces a "Fork" tab that drives advance-clock,
267
+ * advance-checkpoint, and impersonation slot management against
268
+ * the devstack wallet-app server. Construct from the manifest
269
+ * with `createForkRelayFromManifest(manifest)`. */
270
+ @property({ attribute: false })
271
+ forkRelay: ForkRelay | null = null;
272
+
273
+ /** Optional upstream label (`'mainnet'`, `'testnet'`, …) sourced
274
+ * from `meta.upstream` on the manifest. Falls back to inferring
275
+ * from the active network literal when not provided. */
276
+ @property({ type: String })
277
+ forkUpstream = '';
278
+
279
+ @property({ type: String, attribute: 'dock-style' })
280
+ dockStyle: DevWalletDockStyle = 'corner-pill';
281
+
116
282
  @state()
117
283
  private _isOpen = false;
118
284
 
@@ -123,6 +289,15 @@ export class DevWalletPanel extends LitElement {
123
289
  if (changedProperties.has('wallet')) {
124
290
  this.#ctrl.wallet = this.wallet;
125
291
  }
292
+ if (changedProperties.has('coins')) {
293
+ this.#ctrl.coins = this.coins;
294
+ }
295
+ if (changedProperties.has('forkRelay')) {
296
+ this.#ctrl.forkRelay = this.forkRelay;
297
+ }
298
+ if (changedProperties.has('forkUpstream')) {
299
+ this.#ctrl.forkUpstream = this.forkUpstream;
300
+ }
126
301
  }
127
302
 
128
303
  override updated() {
@@ -151,12 +326,17 @@ export class DevWalletPanel extends LitElement {
151
326
  return html`
152
327
  ${this._isOpen ? this.#renderSidebar() : nothing}
153
328
  <button
154
- class="trigger"
329
+ class="trigger ${this.dockStyle === 'side-tab' ? 'side-tab' : 'corner-pill'}"
155
330
  part="trigger"
156
- aria-label="Open Dev Wallet"
331
+ aria-label=${this._isOpen ? 'Close Dev Wallet' : 'Open Dev Wallet'}
332
+ aria-expanded=${this._isOpen}
157
333
  @click=${this.#togglePanel}
158
334
  >
159
335
  ${this.#walletIcon}
336
+ <span
337
+ class="status-dot ${this.#ctrl.pendingRequest ? 'notice' : ''}"
338
+ aria-hidden="true"
339
+ ></span>
160
340
  </button>
161
341
  ${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}
162
342
  `;
@@ -164,21 +344,33 @@ export class DevWalletPanel extends LitElement {
164
344
 
165
345
  #renderSidebar() {
166
346
  return html`
347
+ <button class="scrim" aria-label="Close Dev Wallet" @click=${this.#closePanel}></button>
167
348
  <div class="sidebar" part="sidebar">
168
- <div class="sidebar-header">
169
- <span class="sidebar-title">${this.wallet?.name ?? 'Dev Wallet'}</span>
170
- ${this.#ctrl.renderNetworkBadge()}
349
+ <div class="status-strip">
350
+ <span class="chip chip-success">connected</span>
351
+ <span class="host-origin">${globalThis.location?.origin ?? 'embedded host'}</span>
171
352
  <button
172
353
  class="close-btn"
173
354
  part="close-button"
174
355
  aria-label="Close"
175
- @click=${this.#togglePanel}
356
+ @click=${this.#closePanel}
176
357
  >
177
- &times;
358
+ ${this.#closeIcon}
178
359
  </button>
179
360
  </div>
180
- <div class="sidebar-body">${this.#ctrl.renderTabContent()}</div>
361
+ <div class="sidebar-header">
362
+ <div class="brand">
363
+ <span class="logo-mark">${this.#walletIcon}</span>
364
+ <span class="title-stack">
365
+ <span class="sidebar-title">${this.wallet?.name ?? 'Dev Wallet'}</span>
366
+ <span class="version">v0.1.0</span>
367
+ </span>
368
+ </div>
369
+ <span class="header-spacer"></span>
370
+ ${this.#ctrl.renderNetworkBadge()}
371
+ </div>
181
372
  ${this.#ctrl.renderTabBar()}
373
+ <div class="sidebar-body">${this.#ctrl.renderTabContent()}</div>
182
374
  </div>
183
375
  `;
184
376
  }
@@ -192,12 +384,39 @@ export class DevWalletPanel extends LitElement {
192
384
  </svg>`;
193
385
  }
194
386
 
387
+ get #closeIcon() {
388
+ return html`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
389
+ <path d="M18 6L6 18" />
390
+ <path d="M6 6l12 12" />
391
+ </svg>`;
392
+ }
393
+
195
394
  #togglePanel() {
196
395
  this._isOpen = !this._isOpen;
197
396
  if (this._isOpen) {
198
397
  this.#ctrl.syncState();
199
398
  }
200
399
  }
400
+
401
+ #closePanel() {
402
+ this._isOpen = false;
403
+ }
404
+
405
+ #handleKeydown = (event: KeyboardEvent) => {
406
+ if (event.key === 'Escape' && this._isOpen) {
407
+ this.#closePanel();
408
+ }
409
+ };
410
+
411
+ override connectedCallback() {
412
+ super.connectedCallback();
413
+ window.addEventListener('keydown', this.#handleKeydown);
414
+ }
415
+
416
+ override disconnectedCallback() {
417
+ window.removeEventListener('keydown', this.#handleKeydown);
418
+ super.disconnectedCallback();
419
+ }
201
420
  }
202
421
 
203
422
  declare global {
@@ -21,14 +21,19 @@ export class DevWalletPopup extends LitElement {
21
21
  justify-content: center;
22
22
  min-height: 100vh;
23
23
  padding: 20px;
24
+ background-color: var(--dev-wallet-bg-0);
25
+ background-image:
26
+ linear-gradient(var(--dev-wallet-border) 1px, transparent 1px),
27
+ linear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);
28
+ background-size: 32px 32px;
24
29
  }
25
30
 
26
31
  .popup-card {
27
- width: 360px;
28
- max-height: min(600px, 80vh);
32
+ width: 440px;
33
+ max-height: min(680px, 86vh);
29
34
  border-radius: var(--dev-wallet-radius-xl);
30
- background: var(--dev-wallet-background);
31
- border: 1px solid var(--dev-wallet-border);
35
+ background: var(--dev-wallet-surface);
36
+ border: 1px solid var(--dev-wallet-border-2);
32
37
  box-shadow: var(--dev-wallet-shadow-lg);
33
38
  overflow: hidden;
34
39
  display: flex;
@@ -39,12 +44,13 @@ export class DevWalletPopup extends LitElement {
39
44
  display: flex;
40
45
  justify-content: space-between;
41
46
  align-items: center;
42
- padding: 14px 16px;
47
+ padding: 12px 14px;
43
48
  border-bottom: 1px solid var(--dev-wallet-border);
49
+ background: var(--dev-wallet-bg-1);
44
50
  }
45
51
 
46
52
  .popup-title {
47
- font-size: 15px;
53
+ font-size: 13px;
48
54
  font-weight: var(--dev-wallet-font-weight-semibold);
49
55
  color: var(--dev-wallet-foreground);
50
56
  }