@mysten-incubation/dev-wallet 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/README.md +250 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs +10 -0
  3. package/dist/adapters/base-adapter.d.mts +33 -0
  4. package/dist/adapters/base-adapter.d.mts.map +1 -0
  5. package/dist/adapters/base-adapter.mjs +77 -0
  6. package/dist/adapters/base-adapter.mjs.map +1 -0
  7. package/dist/adapters/browser.d.mts +8 -0
  8. package/dist/adapters/browser.mjs +8 -0
  9. package/dist/adapters/build-managed-account.d.mts +12 -0
  10. package/dist/adapters/build-managed-account.d.mts.map +1 -0
  11. package/dist/adapters/build-managed-account.mjs +30 -0
  12. package/dist/adapters/build-managed-account.mjs.map +1 -0
  13. package/dist/adapters/idb-store.mjs +73 -0
  14. package/dist/adapters/idb-store.mjs.map +1 -0
  15. package/dist/adapters/in-memory-adapter.d.mts +16 -0
  16. package/dist/adapters/in-memory-adapter.d.mts.map +1 -0
  17. package/dist/adapters/in-memory-adapter.mjs +44 -0
  18. package/dist/adapters/in-memory-adapter.mjs.map +1 -0
  19. package/dist/adapters/passkey-adapter.d.mts +31 -0
  20. package/dist/adapters/passkey-adapter.d.mts.map +1 -0
  21. package/dist/adapters/passkey-adapter.mjs +87 -0
  22. package/dist/adapters/passkey-adapter.mjs.map +1 -0
  23. package/dist/adapters/remote-cli-adapter.d.mts +65 -0
  24. package/dist/adapters/remote-cli-adapter.d.mts.map +1 -0
  25. package/dist/adapters/remote-cli-adapter.mjs +299 -0
  26. package/dist/adapters/remote-cli-adapter.mjs.map +1 -0
  27. package/dist/adapters/webcrypto-adapter.d.mts +20 -0
  28. package/dist/adapters/webcrypto-adapter.d.mts.map +1 -0
  29. package/dist/adapters/webcrypto-adapter.mjs +68 -0
  30. package/dist/adapters/webcrypto-adapter.mjs.map +1 -0
  31. package/dist/bin/cli.d.mts +1 -0
  32. package/dist/bin/cli.mjs +183 -0
  33. package/dist/bin/cli.mjs.map +1 -0
  34. package/dist/client/dev-wallet-client.d.mts +57 -0
  35. package/dist/client/dev-wallet-client.d.mts.map +1 -0
  36. package/dist/client/dev-wallet-client.mjs +223 -0
  37. package/dist/client/dev-wallet-client.mjs.map +1 -0
  38. package/dist/client/index.d.mts +3 -0
  39. package/dist/client/index.mjs +4 -0
  40. package/dist/client/request-handler.d.mts +42 -0
  41. package/dist/client/request-handler.d.mts.map +1 -0
  42. package/dist/client/request-handler.mjs +115 -0
  43. package/dist/client/request-handler.mjs.map +1 -0
  44. package/dist/index.d.mts +5 -0
  45. package/dist/index.mjs +4 -0
  46. package/dist/react/components.d.mts +32 -0
  47. package/dist/react/components.d.mts.map +1 -0
  48. package/dist/react/components.mjs +53 -0
  49. package/dist/react/components.mjs.map +1 -0
  50. package/dist/react/context.d.mts +22 -0
  51. package/dist/react/context.d.mts.map +1 -0
  52. package/dist/react/context.mjs +25 -0
  53. package/dist/react/context.mjs.map +1 -0
  54. package/dist/react/index.d.mts +4 -0
  55. package/dist/react/index.mjs +5 -0
  56. package/dist/react/useDevWallet.d.mts +38 -0
  57. package/dist/react/useDevWallet.d.mts.map +1 -0
  58. package/dist/react/useDevWallet.mjs +89 -0
  59. package/dist/react/useDevWallet.mjs.map +1 -0
  60. package/dist/server/cli-signing-middleware.d.mts +22 -0
  61. package/dist/server/cli-signing-middleware.d.mts.map +1 -0
  62. package/dist/server/cli-signing-middleware.mjs +117 -0
  63. package/dist/server/cli-signing-middleware.mjs.map +1 -0
  64. package/dist/server/index.d.mts +2 -0
  65. package/dist/server/index.mjs +3 -0
  66. package/dist/standalone/assets/in-memory-adapter-CBF4h2KD.js +1 -0
  67. package/dist/standalone/assets/main-VE4olb-Q.js +2841 -0
  68. package/dist/standalone/assets/webcrypto-adapter-DysAubFb.js +1 -0
  69. package/dist/standalone/bookmarklet.js +5 -0
  70. package/dist/standalone/index.html +48 -0
  71. package/dist/types.d.mts +55 -0
  72. package/dist/types.d.mts.map +1 -0
  73. package/dist/ui/copy-controller.mjs +43 -0
  74. package/dist/ui/copy-controller.mjs.map +1 -0
  75. package/dist/ui/dev-wallet-account-selector.d.mts +24 -0
  76. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -0
  77. package/dist/ui/dev-wallet-account-selector.mjs +268 -0
  78. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -0
  79. package/dist/ui/dev-wallet-accounts.d.mts +29 -0
  80. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -0
  81. package/dist/ui/dev-wallet-accounts.mjs +524 -0
  82. package/dist/ui/dev-wallet-accounts.mjs.map +1 -0
  83. package/dist/ui/dev-wallet-balances.d.mts +26 -0
  84. package/dist/ui/dev-wallet-balances.d.mts.map +1 -0
  85. package/dist/ui/dev-wallet-balances.mjs +130 -0
  86. package/dist/ui/dev-wallet-balances.mjs.map +1 -0
  87. package/dist/ui/dev-wallet-connect.d.mts +31 -0
  88. package/dist/ui/dev-wallet-connect.d.mts.map +1 -0
  89. package/dist/ui/dev-wallet-connect.mjs +225 -0
  90. package/dist/ui/dev-wallet-connect.mjs.map +1 -0
  91. package/dist/ui/dev-wallet-dropdown.d.mts +27 -0
  92. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -0
  93. package/dist/ui/dev-wallet-dropdown.mjs +121 -0
  94. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -0
  95. package/dist/ui/dev-wallet-network-badge.d.mts +21 -0
  96. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -0
  97. package/dist/ui/dev-wallet-network-badge.mjs +121 -0
  98. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -0
  99. package/dist/ui/dev-wallet-new-account.d.mts +31 -0
  100. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -0
  101. package/dist/ui/dev-wallet-new-account.mjs +577 -0
  102. package/dist/ui/dev-wallet-new-account.mjs.map +1 -0
  103. package/dist/ui/dev-wallet-objects.d.mts +26 -0
  104. package/dist/ui/dev-wallet-objects.d.mts.map +1 -0
  105. package/dist/ui/dev-wallet-objects.mjs +276 -0
  106. package/dist/ui/dev-wallet-objects.mjs.map +1 -0
  107. package/dist/ui/dev-wallet-panel.d.mts +22 -0
  108. package/dist/ui/dev-wallet-panel.d.mts.map +1 -0
  109. package/dist/ui/dev-wallet-panel.mjs +192 -0
  110. package/dist/ui/dev-wallet-panel.mjs.map +1 -0
  111. package/dist/ui/dev-wallet-popup.d.mts +36 -0
  112. package/dist/ui/dev-wallet-popup.d.mts.map +1 -0
  113. package/dist/ui/dev-wallet-popup.mjs +137 -0
  114. package/dist/ui/dev-wallet-popup.mjs.map +1 -0
  115. package/dist/ui/dev-wallet-settings.d.mts +33 -0
  116. package/dist/ui/dev-wallet-settings.d.mts.map +1 -0
  117. package/dist/ui/dev-wallet-settings.mjs +635 -0
  118. package/dist/ui/dev-wallet-settings.mjs.map +1 -0
  119. package/dist/ui/dev-wallet-signing-modal.d.mts +32 -0
  120. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -0
  121. package/dist/ui/dev-wallet-signing-modal.mjs +115 -0
  122. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -0
  123. package/dist/ui/dev-wallet-signing.d.mts +25 -0
  124. package/dist/ui/dev-wallet-signing.d.mts.map +1 -0
  125. package/dist/ui/dev-wallet-signing.mjs +544 -0
  126. package/dist/ui/dev-wallet-signing.mjs.map +1 -0
  127. package/dist/ui/dev-wallet-standalone.d.mts +23 -0
  128. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -0
  129. package/dist/ui/dev-wallet-standalone.mjs +129 -0
  130. package/dist/ui/dev-wallet-standalone.mjs.map +1 -0
  131. package/dist/ui/dev-wallet-tab-bar.d.mts +19 -0
  132. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -0
  133. package/dist/ui/dev-wallet-tab-bar.mjs +143 -0
  134. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -0
  135. package/dist/ui/index.d.mts +17 -0
  136. package/dist/ui/index.mjs +18 -0
  137. package/dist/ui/mount.d.mts +11 -0
  138. package/dist/ui/mount.d.mts.map +1 -0
  139. package/dist/ui/mount.mjs +17 -0
  140. package/dist/ui/mount.mjs.map +1 -0
  141. package/dist/ui/styles.mjs +250 -0
  142. package/dist/ui/styles.mjs.map +1 -0
  143. package/dist/ui/transaction-analyzer.mjs +58 -0
  144. package/dist/ui/transaction-analyzer.mjs.map +1 -0
  145. package/dist/ui/utils.mjs +98 -0
  146. package/dist/ui/utils.mjs.map +1 -0
  147. package/dist/ui/wallet-controller.mjs +275 -0
  148. package/dist/ui/wallet-controller.mjs.map +1 -0
  149. package/dist/wallet/constants.mjs +11 -0
  150. package/dist/wallet/constants.mjs.map +1 -0
  151. package/dist/wallet/dev-wallet.d.mts +118 -0
  152. package/dist/wallet/dev-wallet.d.mts.map +1 -0
  153. package/dist/wallet/dev-wallet.mjs +424 -0
  154. package/dist/wallet/dev-wallet.mjs.map +1 -0
  155. package/dist/wallet/initializer.d.mts +63 -0
  156. package/dist/wallet/initializer.d.mts.map +1 -0
  157. package/dist/wallet/initializer.mjs +75 -0
  158. package/dist/wallet/initializer.mjs.map +1 -0
  159. package/dist/wallet/signing.d.mts +35 -0
  160. package/dist/wallet/signing.d.mts.map +1 -0
  161. package/dist/wallet/signing.mjs +69 -0
  162. package/dist/wallet/signing.mjs.map +1 -0
  163. package/package.json +124 -0
  164. package/src/adapters/base-adapter.ts +93 -0
  165. package/src/adapters/browser.ts +15 -0
  166. package/src/adapters/build-managed-account.ts +33 -0
  167. package/src/adapters/idb-store.ts +87 -0
  168. package/src/adapters/in-memory-adapter.ts +51 -0
  169. package/src/adapters/passkey-adapter.ts +120 -0
  170. package/src/adapters/remote-cli-adapter.ts +388 -0
  171. package/src/adapters/webcrypto-adapter.ts +96 -0
  172. package/src/app/bookmarklet-entry.ts +77 -0
  173. package/src/app/index.html +48 -0
  174. package/src/app/main.ts +245 -0
  175. package/src/app/tsconfig.json +3 -0
  176. package/src/bin/cli.ts +214 -0
  177. package/src/client/dev-wallet-client.ts +280 -0
  178. package/src/client/index.ts +7 -0
  179. package/src/client/request-handler.ts +161 -0
  180. package/src/index.ts +19 -0
  181. package/src/react/components.ts +64 -0
  182. package/src/react/context.ts +38 -0
  183. package/src/react/index.ts +16 -0
  184. package/src/react/useDevWallet.ts +118 -0
  185. package/src/server/cli-signing-middleware.ts +146 -0
  186. package/src/server/index.ts +8 -0
  187. package/src/types.ts +58 -0
  188. package/src/ui/copy-controller.ts +49 -0
  189. package/src/ui/dev-wallet-account-selector.ts +283 -0
  190. package/src/ui/dev-wallet-accounts.ts +578 -0
  191. package/src/ui/dev-wallet-balances.ts +171 -0
  192. package/src/ui/dev-wallet-connect.ts +259 -0
  193. package/src/ui/dev-wallet-dropdown.ts +138 -0
  194. package/src/ui/dev-wallet-network-badge.ts +128 -0
  195. package/src/ui/dev-wallet-new-account.ts +662 -0
  196. package/src/ui/dev-wallet-objects.ts +336 -0
  197. package/src/ui/dev-wallet-panel.ts +207 -0
  198. package/src/ui/dev-wallet-popup.ts +169 -0
  199. package/src/ui/dev-wallet-settings.ts +692 -0
  200. package/src/ui/dev-wallet-signing-modal.ts +137 -0
  201. package/src/ui/dev-wallet-signing.ts +624 -0
  202. package/src/ui/dev-wallet-standalone.ts +136 -0
  203. package/src/ui/dev-wallet-tab-bar.ts +151 -0
  204. package/src/ui/index.ts +26 -0
  205. package/src/ui/mount.ts +21 -0
  206. package/src/ui/styles.ts +252 -0
  207. package/src/ui/transaction-analyzer.ts +60 -0
  208. package/src/ui/utils.ts +118 -0
  209. package/src/ui/wallet-controller.ts +340 -0
  210. package/src/wallet/constants.ts +17 -0
  211. package/src/wallet/dev-wallet.ts +597 -0
  212. package/src/wallet/initializer.ts +124 -0
  213. package/src/wallet/signing.ts +85 -0
@@ -0,0 +1,635 @@
1
+ import { sectionHeaderStyles, sharedStyles } from "./styles.mjs";
2
+ import { NETWORK_COLORS, emitEvent, formatAddress, getErrorMessage } from "./utils.mjs";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs";
4
+ import "./dev-wallet-accounts.mjs";
5
+ import { LitElement, css, html, nothing } from "lit";
6
+ import { customElement, property, state } from "lit/decorators.js";
7
+
8
+ //#region src/ui/dev-wallet-settings.ts
9
+ let DevWalletSettings = class DevWalletSettings$1 extends LitElement {
10
+ constructor(..._args) {
11
+ super(..._args);
12
+ this.wallet = null;
13
+ this.accounts = [];
14
+ this.adapters = [];
15
+ this.activeAddress = "";
16
+ this.bookmarkletOrigin = "";
17
+ this._showAddNetwork = false;
18
+ this._networkName = "";
19
+ this._networkUrl = "";
20
+ this._error = null;
21
+ this._editingNetwork = null;
22
+ this._editingUrl = "";
23
+ this._copied = false;
24
+ }
25
+ static {
26
+ this.styles = [
27
+ sharedStyles,
28
+ sectionHeaderStyles,
29
+ css`
30
+ :host {
31
+ display: block;
32
+ }
33
+
34
+ .section {
35
+ margin-bottom: 20px;
36
+ }
37
+
38
+ .section:last-child {
39
+ margin-bottom: 0;
40
+ }
41
+
42
+ .network-list {
43
+ display: flex;
44
+ flex-direction: column;
45
+ gap: 4px;
46
+ }
47
+
48
+ .network-item {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 8px;
52
+ padding: 8px 12px;
53
+ border-radius: var(--dev-wallet-radius-sm);
54
+ border: 1px solid var(--dev-wallet-border);
55
+ background: var(--dev-wallet-secondary);
56
+ }
57
+
58
+ .network-item.active {
59
+ border-color: var(--dev-wallet-primary);
60
+ }
61
+
62
+ .network-dot {
63
+ width: 8px;
64
+ height: 8px;
65
+ border-radius: 50%;
66
+ flex-shrink: 0;
67
+ }
68
+
69
+ .network-name {
70
+ flex: 1;
71
+ font-size: 13px;
72
+ font-weight: var(--dev-wallet-font-weight-medium);
73
+ color: var(--dev-wallet-foreground);
74
+ }
75
+
76
+ .network-info {
77
+ flex: 1;
78
+ min-width: 0;
79
+ }
80
+
81
+ .network-url {
82
+ font-size: 10px;
83
+ color: var(--dev-wallet-muted-foreground);
84
+ font-family: var(--dev-wallet-font-mono);
85
+ overflow: hidden;
86
+ text-overflow: ellipsis;
87
+ white-space: nowrap;
88
+ }
89
+
90
+ .network-url-input {
91
+ width: 100%;
92
+ padding: 3px 6px;
93
+ border-radius: var(--dev-wallet-radius-xs);
94
+ border: 1px solid var(--dev-wallet-primary);
95
+ background: var(--dev-wallet-background);
96
+ color: var(--dev-wallet-foreground);
97
+ font-size: 10px;
98
+ font-family: var(--dev-wallet-font-mono);
99
+ outline: none;
100
+ box-sizing: border-box;
101
+ }
102
+
103
+ .network-actions {
104
+ display: flex;
105
+ gap: 2px;
106
+ flex-shrink: 0;
107
+ }
108
+
109
+ .btn-icon {
110
+ width: 22px;
111
+ height: 22px;
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ border-radius: var(--dev-wallet-radius-xs);
116
+ font-size: 11px;
117
+ color: var(--dev-wallet-muted-foreground);
118
+ }
119
+
120
+ .btn-icon:hover {
121
+ background: var(--dev-wallet-border);
122
+ color: var(--dev-wallet-foreground);
123
+ }
124
+
125
+ .btn-icon-danger:hover {
126
+ color: var(--dev-wallet-destructive);
127
+ }
128
+
129
+ .network-active-badge {
130
+ font-size: 9px;
131
+ padding: 1px 5px;
132
+ border-radius: var(--dev-wallet-radius-2xs);
133
+ background: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);
134
+ color: var(--dev-wallet-primary);
135
+ font-weight: var(--dev-wallet-font-weight-semibold);
136
+ text-transform: uppercase;
137
+ }
138
+
139
+ .add-network-form {
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 8px;
143
+ margin-top: 8px;
144
+ padding: 12px;
145
+ border-radius: var(--dev-wallet-radius-sm);
146
+ border: 1px dashed var(--dev-wallet-border);
147
+ background: var(--dev-wallet-secondary);
148
+ }
149
+
150
+ .form-input {
151
+ width: 100%;
152
+ padding: 6px 8px;
153
+ border-radius: var(--dev-wallet-radius-xs);
154
+ border: 1px solid var(--dev-wallet-input);
155
+ background: var(--dev-wallet-background);
156
+ color: var(--dev-wallet-foreground);
157
+ font-size: 12px;
158
+ font-family: inherit;
159
+ outline: none;
160
+ box-sizing: border-box;
161
+ }
162
+
163
+ .form-input:focus {
164
+ border-color: var(--dev-wallet-primary);
165
+ }
166
+
167
+ .form-input::placeholder {
168
+ color: var(--dev-wallet-muted-foreground);
169
+ }
170
+
171
+ .form-actions {
172
+ display: flex;
173
+ gap: 6px;
174
+ }
175
+
176
+ .btn-sm {
177
+ padding: 5px 10px;
178
+ border-radius: var(--dev-wallet-radius-xs);
179
+ font-size: 11px;
180
+ font-weight: var(--dev-wallet-font-weight-medium);
181
+ }
182
+
183
+ .btn-add {
184
+ background: var(--dev-wallet-primary);
185
+ color: var(--dev-wallet-primary-foreground);
186
+ }
187
+
188
+ .btn-add:disabled {
189
+ opacity: 0.5;
190
+ }
191
+
192
+ .btn-cancel {
193
+ background: var(--dev-wallet-secondary);
194
+ color: var(--dev-wallet-foreground);
195
+ border: 1px solid var(--dev-wallet-border);
196
+ }
197
+
198
+ .btn-toggle {
199
+ font-size: 12px;
200
+ color: var(--dev-wallet-primary);
201
+ padding: 4px 0;
202
+ margin-top: 4px;
203
+ }
204
+
205
+ .btn-toggle:hover {
206
+ text-decoration: underline;
207
+ }
208
+
209
+ .cli-section-column {
210
+ flex-direction: column;
211
+ align-items: flex-start;
212
+ gap: 6px;
213
+ }
214
+
215
+ .cli-header-row {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 8px;
219
+ width: 100%;
220
+ }
221
+
222
+ .cli-accounts-list {
223
+ width: 100%;
224
+ padding-left: 16px;
225
+ }
226
+
227
+ .cli-accounts-list .network-url {
228
+ padding: 2px 0;
229
+ }
230
+
231
+ .cli-hint {
232
+ padding-left: 16px;
233
+ margin-top: 0;
234
+ font-size: 12px;
235
+ }
236
+
237
+ .cli-unpaired-hint {
238
+ margin-top: 8px;
239
+ }
240
+
241
+ .about {
242
+ font-size: 12px;
243
+ color: var(--dev-wallet-muted-foreground);
244
+ line-height: 1.5;
245
+ }
246
+
247
+ .error {
248
+ font-size: 11px;
249
+ color: var(--dev-wallet-destructive);
250
+ margin-top: 4px;
251
+ }
252
+
253
+ .bookmarklet-link-wrapper {
254
+ margin-top: 8px;
255
+ }
256
+
257
+ .bookmarklet-link {
258
+ display: inline-flex;
259
+ align-items: center;
260
+ gap: 6px;
261
+ padding: 8px 14px;
262
+ border-radius: var(--dev-wallet-radius-sm);
263
+ background: var(--dev-wallet-primary);
264
+ color: var(--dev-wallet-primary-foreground);
265
+ font-size: 13px;
266
+ font-weight: var(--dev-wallet-font-weight-semibold);
267
+ text-decoration: none;
268
+ cursor: grab;
269
+ user-select: none;
270
+ }
271
+
272
+ .bookmarklet-link:hover {
273
+ opacity: 0.9;
274
+ }
275
+
276
+ .bookmarklet-link:active {
277
+ cursor: grabbing;
278
+ }
279
+
280
+ .bookmarklet-url {
281
+ font-family: var(--dev-wallet-font-mono);
282
+ font-size: 10px;
283
+ color: var(--dev-wallet-muted-foreground);
284
+ word-break: break-all;
285
+ user-select: all;
286
+ }
287
+
288
+ .console-snippet {
289
+ position: relative;
290
+ margin-top: 8px;
291
+ padding: 10px 12px;
292
+ border-radius: var(--dev-wallet-radius-sm);
293
+ background: var(--dev-wallet-secondary);
294
+ border: 1px solid var(--dev-wallet-border);
295
+ font-family: var(--dev-wallet-font-mono);
296
+ font-size: 11px;
297
+ color: var(--dev-wallet-foreground);
298
+ line-height: 1.5;
299
+ white-space: pre-wrap;
300
+ word-break: break-all;
301
+ user-select: all;
302
+ }
303
+
304
+ .btn-copy {
305
+ position: absolute;
306
+ top: 6px;
307
+ right: 6px;
308
+ padding: 3px 8px;
309
+ border-radius: var(--dev-wallet-radius-xs);
310
+ background: var(--dev-wallet-border);
311
+ color: var(--dev-wallet-muted-foreground);
312
+ font-size: 10px;
313
+ font-family: inherit;
314
+ cursor: pointer;
315
+ }
316
+
317
+ .btn-copy:hover {
318
+ background: var(--dev-wallet-input);
319
+ color: var(--dev-wallet-foreground);
320
+ }
321
+ `
322
+ ];
323
+ }
324
+ render() {
325
+ return html`
326
+ <div class="section">${this.#renderNetworks()}</div>
327
+ ${this.#hasCliAdapter() ? html`<div class="section">${this.#renderCliSigner()}</div>` : nothing}
328
+ <div class="section">${this.#renderAccounts()}</div>
329
+ <div class="section">${this.#renderBookmarklet()}</div>
330
+ <div class="section">${this.#renderAbout()}</div>
331
+ `;
332
+ }
333
+ #renderNetworks() {
334
+ if (!this.wallet) return nothing;
335
+ const networks = this.wallet.availableNetworks;
336
+ const activeNetwork = this.wallet.activeNetwork;
337
+ const urls = this.wallet.networkUrls;
338
+ return html`
339
+ <h3 class="section-header">Networks</h3>
340
+ <div class="network-list">
341
+ ${networks.map((name) => {
342
+ const color = NETWORK_COLORS[name] ?? "#6b7280";
343
+ const isActive = name === activeNetwork;
344
+ const isEditing = this._editingNetwork === name;
345
+ return html`
346
+ <div class="network-item ${isActive ? "active" : ""}">
347
+ <span class="network-dot" style="background: ${color}"></span>
348
+ <div class="network-info">
349
+ <span class="network-name">${name}</span>
350
+ ${isEditing ? html`<input
351
+ class="network-url-input"
352
+ type="text"
353
+ .value=${this._editingUrl}
354
+ @input=${(e) => {
355
+ this._editingUrl = e.target.value;
356
+ }}
357
+ @keydown=${(e) => {
358
+ if (e.key === "Enter") this.#saveNetworkUrl(name);
359
+ if (e.key === "Escape") this.#cancelEditNetwork();
360
+ }}
361
+ />` : html`<span class="network-url" title=${urls[name] ?? ""}
362
+ >${urls[name] ?? ""}</span
363
+ >`}
364
+ </div>
365
+ <div class="network-actions">
366
+ ${isEditing ? html`
367
+ <button
368
+ class="btn-icon"
369
+ title="Save"
370
+ aria-label="Save URL"
371
+ @click=${() => this.#saveNetworkUrl(name)}
372
+ >
373
+ &#10003;
374
+ </button>
375
+ <button
376
+ class="btn-icon"
377
+ title="Cancel"
378
+ aria-label="Cancel editing"
379
+ @click=${this.#cancelEditNetwork}
380
+ >
381
+ &#10005;
382
+ </button>
383
+ ` : html`
384
+ <button
385
+ class="btn-icon"
386
+ title="Edit URL"
387
+ aria-label="Edit network URL"
388
+ @click=${() => this.#startEditNetwork(name, urls[name] ?? "")}
389
+ >
390
+ &#9998;
391
+ </button>
392
+ ${!isActive ? html`<button
393
+ class="btn-icon btn-icon-danger"
394
+ title="Remove"
395
+ aria-label="Remove network"
396
+ @click=${() => this.#removeNetwork(name)}
397
+ >
398
+ &#10005;
399
+ </button>` : nothing}
400
+ `}
401
+ ${isActive ? html`<span class="network-active-badge">Active</span>` : nothing}
402
+ </div>
403
+ </div>
404
+ `;
405
+ })}
406
+ </div>
407
+ ${this._showAddNetwork ? this.#renderAddNetworkForm() : html`
408
+ <button
409
+ class="btn-toggle"
410
+ @click=${() => {
411
+ this._showAddNetwork = true;
412
+ }}
413
+ >
414
+ + Add Network
415
+ </button>
416
+ `}
417
+ `;
418
+ }
419
+ #renderAddNetworkForm() {
420
+ return html`
421
+ <div class="add-network-form">
422
+ <input
423
+ class="form-input"
424
+ type="text"
425
+ placeholder="Network name (e.g. custom)"
426
+ .value=${this._networkName}
427
+ @input=${(e) => {
428
+ this._networkName = e.target.value;
429
+ this._error = null;
430
+ }}
431
+ />
432
+ <input
433
+ class="form-input"
434
+ type="text"
435
+ placeholder="gRPC URL (e.g. http://localhost:9000)"
436
+ .value=${this._networkUrl}
437
+ @input=${(e) => {
438
+ this._networkUrl = e.target.value;
439
+ this._error = null;
440
+ }}
441
+ @keydown=${(e) => {
442
+ if (e.key === "Enter") this.#addNetwork();
443
+ if (e.key === "Escape") this.#cancelAddNetwork();
444
+ }}
445
+ />
446
+ ${this._error ? html`<div class="error">${this._error}</div>` : nothing}
447
+ <div class="form-actions">
448
+ <button
449
+ class="btn-sm btn-add"
450
+ ?disabled=${!this._networkName.trim() || !this._networkUrl.trim()}
451
+ @click=${this.#addNetwork}
452
+ >
453
+ Add
454
+ </button>
455
+ <button class="btn-sm btn-cancel" @click=${this.#cancelAddNetwork}>Cancel</button>
456
+ </div>
457
+ </div>
458
+ `;
459
+ }
460
+ #hasCliAdapter() {
461
+ return this.adapters.some((a) => a.id === "remote-cli");
462
+ }
463
+ #renderCliSigner() {
464
+ const cliAdapter = this.adapters.find((a) => a.id === "remote-cli");
465
+ if (!cliAdapter) return nothing;
466
+ const isPaired = "isPaired" in cliAdapter && cliAdapter.isPaired;
467
+ const cliAccounts = cliAdapter.getAccounts();
468
+ return html`
469
+ <h3 class="section-header">CLI Signer</h3>
470
+ ${isPaired ? html`
471
+ <div class="network-item active cli-section-column">
472
+ <div class="cli-header-row">
473
+ <span
474
+ class="network-dot"
475
+ style="background: var(--dev-wallet-status-connected)"
476
+ ></span>
477
+ <span class="network-name">Connected</span>
478
+ ${cliAccounts.length > 0 ? html`<span class="network-active-badge">${cliAccounts.length} imported</span>` : nothing}
479
+ </div>
480
+ ${cliAccounts.length > 0 ? html`<div class="cli-accounts-list">
481
+ ${cliAccounts.map((acc) => html`
482
+ <div class="network-url">${acc.label} (${formatAddress(acc.address)})</div>
483
+ `)}
484
+ </div>` : html`<div class="about cli-hint">Use + Add above to import CLI accounts.</div>`}
485
+ </div>
486
+ ` : html`
487
+ <div class="network-item">
488
+ <span
489
+ class="network-dot"
490
+ style="background: var(--dev-wallet-status-disconnected)"
491
+ ></span>
492
+ <span class="network-name" style="color: var(--dev-wallet-muted-foreground)"
493
+ >Not connected</span
494
+ >
495
+ </div>
496
+ <div class="about cli-unpaired-hint">
497
+ Open the token URL from your terminal to connect CLI accounts.
498
+ </div>
499
+ `}
500
+ `;
501
+ }
502
+ #renderAccounts() {
503
+ return html`
504
+ <dev-wallet-accounts
505
+ exportparts="account-list: accounts-account-list, add-button: accounts-add-button, empty-state: accounts-empty-state"
506
+ .accounts=${this.accounts}
507
+ .adapters=${this.adapters}
508
+ .activeAddress=${this.activeAddress}
509
+ ></dev-wallet-accounts>
510
+ `;
511
+ }
512
+ #renderBookmarklet() {
513
+ if (!this.bookmarkletOrigin) return nothing;
514
+ const origin = this.bookmarkletOrigin;
515
+ const bookmarkletJs = `${origin}/bookmarklet.js`;
516
+ const bookmarkletHref = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${bookmarkletJs}'})))`;
517
+ const consoleSnippet = `var s=document.createElement('script');s.src='${bookmarkletJs}';document.head.appendChild(s);`;
518
+ return html`
519
+ <h3 class="section-header">Bookmarklet</h3>
520
+ <div class="about">
521
+ Drag this link to your bookmarks bar, then click it on any dApp to inject the wallet:
522
+ </div>
523
+ <div class="bookmarklet-link-wrapper">
524
+ <a
525
+ class="bookmarklet-link"
526
+ href=${bookmarkletHref}
527
+ title="Drag to bookmarks bar"
528
+ @click=${(e) => e.preventDefault()}
529
+ >
530
+ Dev Wallet
531
+ </a>
532
+ </div>
533
+ <div class="about" style="margin-top: 12px">Or paste this in the browser console:</div>
534
+ <div class="console-snippet">
535
+ ${consoleSnippet}
536
+ <button class="btn-copy" @click=${() => this.#copySnippet(consoleSnippet)}>
537
+ ${this._copied ? "Copied!" : "Copy"}
538
+ </button>
539
+ </div>
540
+ <div class="about" style="margin-top: 8px">
541
+ Or add this script to your page:<br />
542
+ <code class="bookmarklet-url">${bookmarkletJs}</code>
543
+ </div>
544
+ `;
545
+ }
546
+ #copySnippet(text) {
547
+ navigator.clipboard.writeText(text).then(() => {
548
+ this._copied = true;
549
+ setTimeout(() => {
550
+ this._copied = false;
551
+ }, 2e3);
552
+ });
553
+ }
554
+ #renderAbout() {
555
+ return html`
556
+ <h3 class="section-header">About</h3>
557
+ <div class="about">
558
+ <strong>${this.wallet?.name ?? "Dev Wallet"}</strong><br />
559
+ A development wallet for testing Sui dApps.<br />
560
+ ${this.wallet ? html`${this.wallet.accounts.length} account(s) across ${this.wallet.adapters.length}
561
+ adapter(s)` : nothing}
562
+ </div>
563
+ `;
564
+ }
565
+ #addNetwork() {
566
+ if (!this.wallet) return;
567
+ const name = this._networkName.trim();
568
+ const url = this._networkUrl.trim();
569
+ if (!name || !url) return;
570
+ if (this.wallet.availableNetworks.includes(name)) {
571
+ this._error = `Network "${name}" already exists`;
572
+ return;
573
+ }
574
+ try {
575
+ this.wallet.addNetwork(name, url);
576
+ this._networkName = "";
577
+ this._networkUrl = "";
578
+ this._showAddNetwork = false;
579
+ this._error = null;
580
+ emitEvent(this, "network-added", {
581
+ name,
582
+ url
583
+ });
584
+ } catch (err) {
585
+ this._error = getErrorMessage(err, "Failed to add network");
586
+ }
587
+ }
588
+ #cancelAddNetwork() {
589
+ this._showAddNetwork = false;
590
+ this._networkName = "";
591
+ this._networkUrl = "";
592
+ this._error = null;
593
+ }
594
+ #startEditNetwork(name, url) {
595
+ this._editingNetwork = name;
596
+ this._editingUrl = url;
597
+ }
598
+ #saveNetworkUrl(name) {
599
+ if (!this.wallet) return;
600
+ const url = this._editingUrl.trim();
601
+ if (!url) return;
602
+ try {
603
+ this.wallet.addNetwork(name, url);
604
+ this._editingNetwork = null;
605
+ this._editingUrl = "";
606
+ } catch (error) {
607
+ this._error = error instanceof Error ? error.message : "Invalid URL";
608
+ }
609
+ }
610
+ #cancelEditNetwork() {
611
+ this._editingNetwork = null;
612
+ this._editingUrl = "";
613
+ }
614
+ #removeNetwork(name) {
615
+ if (!this.wallet) return;
616
+ this.wallet.removeNetwork(name);
617
+ }
618
+ };
619
+ __decorate([property({ attribute: false })], DevWalletSettings.prototype, "wallet", void 0);
620
+ __decorate([property({ attribute: false })], DevWalletSettings.prototype, "accounts", void 0);
621
+ __decorate([property({ attribute: false })], DevWalletSettings.prototype, "adapters", void 0);
622
+ __decorate([property({ type: String })], DevWalletSettings.prototype, "activeAddress", void 0);
623
+ __decorate([property({ type: String })], DevWalletSettings.prototype, "bookmarkletOrigin", void 0);
624
+ __decorate([state()], DevWalletSettings.prototype, "_showAddNetwork", void 0);
625
+ __decorate([state()], DevWalletSettings.prototype, "_networkName", void 0);
626
+ __decorate([state()], DevWalletSettings.prototype, "_networkUrl", void 0);
627
+ __decorate([state()], DevWalletSettings.prototype, "_error", void 0);
628
+ __decorate([state()], DevWalletSettings.prototype, "_editingNetwork", void 0);
629
+ __decorate([state()], DevWalletSettings.prototype, "_editingUrl", void 0);
630
+ __decorate([state()], DevWalletSettings.prototype, "_copied", void 0);
631
+ DevWalletSettings = __decorate([customElement("dev-wallet-settings")], DevWalletSettings);
632
+
633
+ //#endregion
634
+ export { DevWalletSettings };
635
+ //# sourceMappingURL=dev-wallet-settings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-wallet-settings.mjs","names":["DevWalletSettings","#renderNetworks","#hasCliAdapter","#renderCliSigner","#renderAccounts","#renderBookmarklet","#renderAbout","#saveNetworkUrl","#cancelEditNetwork","#startEditNetwork","#removeNetwork","#renderAddNetworkForm","#addNetwork","#cancelAddNetwork","#copySnippet"],"sources":["../../src/ui/dev-wallet-settings.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport type { SignerAdapter } from '../types.js';\nimport { sectionHeaderStyles, sharedStyles } from './styles.js';\nimport { emitEvent, formatAddress, getErrorMessage, NETWORK_COLORS } from './utils.js';\nimport './dev-wallet-accounts.js';\n\n@customElement('dev-wallet-settings')\nexport class DevWalletSettings extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.network-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t.network-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.network-item.active {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.network-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.network-name {\n\t\t\t\tflex: 1;\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.network-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.network-url {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.network-url-input {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 3px 6px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-primary);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\toutline: none;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\n\t\t\t.network-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 2px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.btn-icon {\n\t\t\t\twidth: 22px;\n\t\t\t\theight: 22px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.btn-icon:hover {\n\t\t\t\tbackground: var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.btn-icon-danger:hover {\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.network-active-badge {\n\t\t\t\tfont-size: 9px;\n\t\t\t\tpadding: 1px 5px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t}\n\n\t\t\t.add-network-form {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tpadding: 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px dashed var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.form-input {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 6px 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-input);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\toutline: none;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\n\t\t\t.form-input:focus {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.form-input::placeholder {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.form-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.btn-sm {\n\t\t\t\tpadding: 5px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.btn-add {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t}\n\n\t\t\t.btn-add:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t}\n\n\t\t\t.btn-cancel {\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.btn-toggle {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tpadding: 4px 0;\n\t\t\t\tmargin-top: 4px;\n\t\t\t}\n\n\t\t\t.btn-toggle:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\n\t\t\t.cli-section-column {\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: flex-start;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.cli-header-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.cli-accounts-list {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding-left: 16px;\n\t\t\t}\n\n\t\t\t.cli-accounts-list .network-url {\n\t\t\t\tpadding: 2px 0;\n\t\t\t}\n\n\t\t\t.cli-hint {\n\t\t\t\tpadding-left: 16px;\n\t\t\t\tmargin-top: 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.cli-unpaired-hint {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.about {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tline-height: 1.5;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t\tmargin-top: 4px;\n\t\t\t}\n\n\t\t\t.bookmarklet-link-wrapper {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.bookmarklet-link {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tpadding: 8px 14px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\ttext-decoration: none;\n\t\t\t\tcursor: grab;\n\t\t\t\tuser-select: none;\n\t\t\t}\n\n\t\t\t.bookmarklet-link:hover {\n\t\t\t\topacity: 0.9;\n\t\t\t}\n\n\t\t\t.bookmarklet-link:active {\n\t\t\t\tcursor: grabbing;\n\t\t\t}\n\n\t\t\t.bookmarklet-url {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t\tuser-select: all;\n\t\t\t}\n\n\t\t\t.console-snippet {\n\t\t\t\tposition: relative;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tline-height: 1.5;\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\tword-break: break-all;\n\t\t\t\tuser-select: all;\n\t\t\t}\n\n\t\t\t.btn-copy {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 6px;\n\t\t\t\tright: 6px;\n\t\t\t\tpadding: 3px 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t.btn-copy:hover {\n\t\t\t\tbackground: var(--dev-wallet-input);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t@property({ attribute: false })\n\taccounts: readonly ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t@state()\n\tprivate _showAddNetwork = false;\n\n\t@state()\n\tprivate _networkName = '';\n\n\t@state()\n\tprivate _networkUrl = '';\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _editingNetwork: string | null = null;\n\n\t@state()\n\tprivate _editingUrl = '';\n\n\t@state()\n\tprivate _copied = false;\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"section\">${this.#renderNetworks()}</div>\n\t\t\t${this.#hasCliAdapter()\n\t\t\t\t? html`<div class=\"section\">${this.#renderCliSigner()}</div>`\n\t\t\t\t: nothing}\n\t\t\t<div class=\"section\">${this.#renderAccounts()}</div>\n\t\t\t<div class=\"section\">${this.#renderBookmarklet()}</div>\n\t\t\t<div class=\"section\">${this.#renderAbout()}</div>\n\t\t`;\n\t}\n\n\t#renderNetworks() {\n\t\tif (!this.wallet) return nothing;\n\n\t\tconst networks = this.wallet.availableNetworks;\n\t\tconst activeNetwork = this.wallet.activeNetwork;\n\t\tconst urls = this.wallet.networkUrls;\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Networks</h3>\n\t\t\t<div class=\"network-list\">\n\t\t\t\t${networks.map((name) => {\n\t\t\t\t\tconst color = NETWORK_COLORS[name] ?? '#6b7280';\n\t\t\t\t\tconst isActive = name === activeNetwork;\n\t\t\t\t\tconst isEditing = this._editingNetwork === name;\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"network-item ${isActive ? 'active' : ''}\">\n\t\t\t\t\t\t\t<span class=\"network-dot\" style=\"background: ${color}\"></span>\n\t\t\t\t\t\t\t<div class=\"network-info\">\n\t\t\t\t\t\t\t\t<span class=\"network-name\">${name}</span>\n\t\t\t\t\t\t\t\t${isEditing\n\t\t\t\t\t\t\t\t\t? html`<input\n\t\t\t\t\t\t\t\t\t\t\tclass=\"network-url-input\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t.value=${this._editingUrl}\n\t\t\t\t\t\t\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\tthis._editingUrl = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') this.#saveNetworkUrl(name);\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelEditNetwork();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t: html`<span class=\"network-url\" title=${urls[name] ?? ''}\n\t\t\t\t\t\t\t\t\t\t\t>${urls[name] ?? ''}</span\n\t\t\t\t\t\t\t\t\t\t>`}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"network-actions\">\n\t\t\t\t\t\t\t\t${isEditing\n\t\t\t\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Save\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Save URL\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#saveNetworkUrl(name)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t&#10003;\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Cancel\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Cancel editing\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${this.#cancelEditNetwork}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t&#10005;\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Edit URL\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Edit network URL\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#startEditNetwork(name, urls[name] ?? '')}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t&#9998;\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t${!isActive\n\t\t\t\t\t\t\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn-icon btn-icon-danger\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Remove network\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#removeNetwork(name)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t&#10005;\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t`}\n\t\t\t\t\t\t\t\t${isActive ? html`<span class=\"network-active-badge\">Active</span>` : nothing}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t${this._showAddNetwork\n\t\t\t\t? this.#renderAddNetworkForm()\n\t\t\t\t: html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"btn-toggle\"\n\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\tthis._showAddNetwork = true;\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+ Add Network\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\t#renderAddNetworkForm() {\n\t\treturn html`\n\t\t\t<div class=\"add-network-form\">\n\t\t\t\t<input\n\t\t\t\t\tclass=\"form-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"Network name (e.g. custom)\"\n\t\t\t\t\t.value=${this._networkName}\n\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\tthis._networkName = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"form-input\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"gRPC URL (e.g. http://localhost:9000)\"\n\t\t\t\t\t.value=${this._networkUrl}\n\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\tthis._networkUrl = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis._error = null;\n\t\t\t\t\t}}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter') this.#addNetwork();\n\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelAddNetwork();\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t${this._error ? html`<div class=\"error\">${this._error}</div>` : nothing}\n\t\t\t\t<div class=\"form-actions\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-sm btn-add\"\n\t\t\t\t\t\t?disabled=${!this._networkName.trim() || !this._networkUrl.trim()}\n\t\t\t\t\t\t@click=${this.#addNetwork}\n\t\t\t\t\t>\n\t\t\t\t\t\tAdd\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"btn-sm btn-cancel\" @click=${this.#cancelAddNetwork}>Cancel</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#hasCliAdapter(): boolean {\n\t\treturn this.adapters.some((a) => a.id === 'remote-cli');\n\t}\n\n\t#renderCliSigner() {\n\t\tconst cliAdapter = this.adapters.find((a) => a.id === 'remote-cli');\n\t\tif (!cliAdapter) return nothing;\n\n\t\tconst isPaired = 'isPaired' in cliAdapter && (cliAdapter as { isPaired: boolean }).isPaired;\n\t\tconst cliAccounts = cliAdapter.getAccounts();\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">CLI Signer</h3>\n\t\t\t${isPaired\n\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"network-item active cli-section-column\">\n\t\t\t\t\t\t\t<div class=\"cli-header-row\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"network-dot\"\n\t\t\t\t\t\t\t\t\tstyle=\"background: var(--dev-wallet-status-connected)\"\n\t\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t\t<span class=\"network-name\">Connected</span>\n\t\t\t\t\t\t\t\t${cliAccounts.length > 0\n\t\t\t\t\t\t\t\t\t? html`<span class=\"network-active-badge\">${cliAccounts.length} imported</span>`\n\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t${cliAccounts.length > 0\n\t\t\t\t\t\t\t\t? html`<div class=\"cli-accounts-list\">\n\t\t\t\t\t\t\t\t\t\t${cliAccounts.map(\n\t\t\t\t\t\t\t\t\t\t\t(acc) => html`\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"network-url\">${acc.label} (${formatAddress(acc.address)})</div>\n\t\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: html`<div class=\"about cli-hint\">Use + Add above to import CLI accounts.</div>`}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t: html`\n\t\t\t\t\t\t<div class=\"network-item\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"network-dot\"\n\t\t\t\t\t\t\t\tstyle=\"background: var(--dev-wallet-status-disconnected)\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t<span class=\"network-name\" style=\"color: var(--dev-wallet-muted-foreground)\"\n\t\t\t\t\t\t\t\t>Not connected</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"about cli-unpaired-hint\">\n\t\t\t\t\t\t\tOpen the token URL from your terminal to connect CLI accounts.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\t#renderAccounts() {\n\t\treturn html`\n\t\t\t<dev-wallet-accounts\n\t\t\t\texportparts=\"account-list: accounts-account-list, add-button: accounts-add-button, empty-state: accounts-empty-state\"\n\t\t\t\t.accounts=${this.accounts}\n\t\t\t\t.adapters=${this.adapters}\n\t\t\t\t.activeAddress=${this.activeAddress}\n\t\t\t></dev-wallet-accounts>\n\t\t`;\n\t}\n\n\t#renderBookmarklet() {\n\t\tif (!this.bookmarkletOrigin) return nothing;\n\t\tconst origin = this.bookmarkletOrigin;\n\n\t\tconst bookmarkletJs = `${origin}/bookmarklet.js`;\n\t\tconst bookmarkletHref = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${bookmarkletJs}'})))`;\n\t\tconst consoleSnippet = `var s=document.createElement('script');s.src='${bookmarkletJs}';document.head.appendChild(s);`;\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Bookmarklet</h3>\n\t\t\t<div class=\"about\">\n\t\t\t\tDrag this link to your bookmarks bar, then click it on any dApp to inject the wallet:\n\t\t\t</div>\n\t\t\t<div class=\"bookmarklet-link-wrapper\">\n\t\t\t\t<a\n\t\t\t\t\tclass=\"bookmarklet-link\"\n\t\t\t\t\thref=${bookmarkletHref}\n\t\t\t\t\ttitle=\"Drag to bookmarks bar\"\n\t\t\t\t\t@click=${(e: MouseEvent) => e.preventDefault()}\n\t\t\t\t>\n\t\t\t\t\tDev Wallet\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<div class=\"about\" style=\"margin-top: 12px\">Or paste this in the browser console:</div>\n\t\t\t<div class=\"console-snippet\">\n\t\t\t\t${consoleSnippet}\n\t\t\t\t<button class=\"btn-copy\" @click=${() => this.#copySnippet(consoleSnippet)}>\n\t\t\t\t\t${this._copied ? 'Copied!' : 'Copy'}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div class=\"about\" style=\"margin-top: 8px\">\n\t\t\t\tOr add this script to your page:<br />\n\t\t\t\t<code class=\"bookmarklet-url\">${bookmarkletJs}</code>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#copySnippet(text: string) {\n\t\tnavigator.clipboard.writeText(text).then(() => {\n\t\t\tthis._copied = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._copied = false;\n\t\t\t}, 2000);\n\t\t});\n\t}\n\n\t#renderAbout() {\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">About</h3>\n\t\t\t<div class=\"about\">\n\t\t\t\t<strong>${this.wallet?.name ?? 'Dev Wallet'}</strong><br />\n\t\t\t\tA development wallet for testing Sui dApps.<br />\n\t\t\t\t${this.wallet\n\t\t\t\t\t? html`${this.wallet.accounts.length} account(s) across ${this.wallet.adapters.length}\n\t\t\t\t\t\tadapter(s)`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#addNetwork() {\n\t\tif (!this.wallet) return;\n\n\t\tconst name = this._networkName.trim();\n\t\tconst url = this._networkUrl.trim();\n\n\t\tif (!name || !url) return;\n\n\t\tif (this.wallet.availableNetworks.includes(name)) {\n\t\t\tthis._error = `Network \"${name}\" already exists`;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.wallet.addNetwork(name, url);\n\t\t\tthis._networkName = '';\n\t\t\tthis._networkUrl = '';\n\t\t\tthis._showAddNetwork = false;\n\t\t\tthis._error = null;\n\t\t\temitEvent(this, 'network-added', { name, url });\n\t\t} catch (err) {\n\t\t\tthis._error = getErrorMessage(err, 'Failed to add network');\n\t\t}\n\t}\n\n\t#cancelAddNetwork() {\n\t\tthis._showAddNetwork = false;\n\t\tthis._networkName = '';\n\t\tthis._networkUrl = '';\n\t\tthis._error = null;\n\t}\n\n\t#startEditNetwork(name: string, url: string) {\n\t\tthis._editingNetwork = name;\n\t\tthis._editingUrl = url;\n\t}\n\n\t#saveNetworkUrl(name: string) {\n\t\tif (!this.wallet) return;\n\t\tconst url = this._editingUrl.trim();\n\t\tif (!url) return;\n\n\t\ttry {\n\t\t\tthis.wallet.addNetwork(name, url);\n\t\t\tthis._editingNetwork = null;\n\t\t\tthis._editingUrl = '';\n\t\t} catch (error) {\n\t\t\tthis._error = error instanceof Error ? error.message : 'Invalid URL';\n\t\t}\n\t}\n\n\t#cancelEditNetwork() {\n\t\tthis._editingNetwork = null;\n\t\tthis._editingUrl = '';\n\t}\n\n\t#removeNetwork(name: string) {\n\t\tif (!this.wallet) return;\n\t\tthis.wallet.removeNetwork(name);\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-settings': DevWalletSettings;\n\t}\n}\n"],"mappings":";;;;;;;;AAcO,8BAAMA,4BAA0B,WAAW;;;gBA4StB;kBAGkB,EAAE;kBAGnB,EAAE;uBAGd;2BAGI;yBAGM;sBAGH;qBAGD;gBAGU;yBAGS;qBAGnB;iBAGJ;;;gBA5UO;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqSH;;CAsCD,AAAS,SAAS;AACjB,SAAO,IAAI;0BACa,MAAKC,gBAAiB,CAAC;KAC5C,MAAKC,eAAgB,GACpB,IAAI,wBAAwB,MAAKC,iBAAkB,CAAC,UACpD,QAAQ;0BACY,MAAKC,gBAAiB,CAAC;0BACvB,MAAKC,mBAAoB,CAAC;0BAC1B,MAAKC,aAAc,CAAC;;;CAI7C,kBAAkB;AACjB,MAAI,CAAC,KAAK,OAAQ,QAAO;EAEzB,MAAM,WAAW,KAAK,OAAO;EAC7B,MAAM,gBAAgB,KAAK,OAAO;EAClC,MAAM,OAAO,KAAK,OAAO;AAEzB,SAAO,IAAI;;;MAGP,SAAS,KAAK,SAAS;GACxB,MAAM,QAAQ,eAAe,SAAS;GACtC,MAAM,WAAW,SAAS;GAC1B,MAAM,YAAY,KAAK,oBAAoB;AAC3C,UAAO,IAAI;iCACiB,WAAW,WAAW,GAAG;sDACJ,MAAM;;qCAEvB,KAAK;UAChC,YACC,IAAI;;;oBAGK,KAAK,YAAY;qBAChB,MAAkB;AAC3B,SAAK,cAAe,EAAE,OAA4B;KACjD;uBACU,MAAqB;AAChC,QAAI,EAAE,QAAQ,QAAS,OAAKC,eAAgB,KAAK;AACjD,QAAI,EAAE,QAAQ,SAAU,OAAKC,mBAAoB;KAChD;gBAEF,IAAI,mCAAmC,KAAK,SAAS,GAAG;cACrD,KAAK,SAAS,GAAG;aAClB;;;UAGH,YACC,IAAI;;;;;2BAKY,MAAKD,eAAgB,KAAK,CAAC;;;;;;;;qBAQjC,MAAKC,kBAAmB;;;;cAKlC,IAAI;;;;;2BAKY,MAAKC,iBAAkB,MAAM,KAAK,SAAS,GAAG,CAAC;;;;aAI7D,CAAC,WACA,IAAI;;;;6BAIW,MAAKC,cAAe,KAAK,CAAC;;;0BAIzC,QAAQ;YACV;UACF,WAAW,IAAI,qDAAqD,QAAQ;;;;IAIhF,CAAC;;KAEF,KAAK,kBACJ,MAAKC,sBAAuB,GAC5B,IAAI;;;sBAGY;AACd,QAAK,kBAAkB;IACtB;;;;OAIF;;;CAIN,wBAAwB;AACvB,SAAO,IAAI;;;;;;cAMC,KAAK,aAAa;eACjB,MAAkB;AAC3B,QAAK,eAAgB,EAAE,OAA4B;AACnD,QAAK,SAAS;IACb;;;;;;cAMO,KAAK,YAAY;eAChB,MAAkB;AAC3B,QAAK,cAAe,EAAE,OAA4B;AAClD,QAAK,SAAS;IACb;iBACU,MAAqB;AAChC,OAAI,EAAE,QAAQ,QAAS,OAAKC,YAAa;AACzC,OAAI,EAAE,QAAQ,SAAU,OAAKC,kBAAmB;IAC/C;;MAED,KAAK,SAAS,IAAI,sBAAsB,KAAK,OAAO,UAAU,QAAQ;;;;kBAI1D,CAAC,KAAK,aAAa,MAAM,IAAI,CAAC,KAAK,YAAY,MAAM,CAAC;eACzD,MAAKD,WAAY;;;;gDAIgB,MAAKC,iBAAkB;;;;;CAMtE,iBAA0B;AACzB,SAAO,KAAK,SAAS,MAAM,MAAM,EAAE,OAAO,aAAa;;CAGxD,mBAAmB;EAClB,MAAM,aAAa,KAAK,SAAS,MAAM,MAAM,EAAE,OAAO,aAAa;AACnE,MAAI,CAAC,WAAY,QAAO;EAExB,MAAM,WAAW,cAAc,cAAe,WAAqC;EACnF,MAAM,cAAc,WAAW,aAAa;AAE5C,SAAO,IAAI;;KAER,WACC,IAAI;;;;;;;;UAQA,YAAY,SAAS,IACpB,IAAI,sCAAsC,YAAY,OAAO,oBAC7D,QAAQ;;SAEV,YAAY,SAAS,IACpB,IAAI;YACF,YAAY,KACZ,QAAQ,IAAI;uCACe,IAAI,MAAM,IAAI,cAAc,IAAI,QAAQ,CAAC;aAErE,CAAC;mBAEF,IAAI,4EAA4E;;SAGpF,IAAI;;;;;;;;;;;;;OAaH;;;CAIN,kBAAkB;AACjB,SAAO,IAAI;;;gBAGG,KAAK,SAAS;gBACd,KAAK,SAAS;qBACT,KAAK,cAAc;;;;CAKvC,qBAAqB;AACpB,MAAI,CAAC,KAAK,kBAAmB,QAAO;EACpC,MAAM,SAAS,KAAK;EAEpB,MAAM,gBAAgB,GAAG,OAAO;EAChC,MAAM,kBAAkB,kGAAkG,cAAc;EACxI,MAAM,iBAAiB,iDAAiD,cAAc;AAEtF,SAAO,IAAI;;;;;;;;YAQD,gBAAgB;;eAEb,MAAkB,EAAE,gBAAgB,CAAC;;;;;;;MAO9C,eAAe;4CACuB,MAAKC,YAAa,eAAe,CAAC;OACvE,KAAK,UAAU,YAAY,OAAO;;;;;oCAKL,cAAc;;;;CAKjD,aAAa,MAAc;AAC1B,YAAU,UAAU,UAAU,KAAK,CAAC,WAAW;AAC9C,QAAK,UAAU;AACf,oBAAiB;AAChB,SAAK,UAAU;MACb,IAAK;IACP;;CAGH,eAAe;AACd,SAAO,IAAI;;;cAGC,KAAK,QAAQ,QAAQ,aAAa;;MAE1C,KAAK,SACJ,IAAI,GAAG,KAAK,OAAO,SAAS,OAAO,qBAAqB,KAAK,OAAO,SAAS,OAAO;oBAEpF,QAAQ;;;;CAKd,cAAc;AACb,MAAI,CAAC,KAAK,OAAQ;EAElB,MAAM,OAAO,KAAK,aAAa,MAAM;EACrC,MAAM,MAAM,KAAK,YAAY,MAAM;AAEnC,MAAI,CAAC,QAAQ,CAAC,IAAK;AAEnB,MAAI,KAAK,OAAO,kBAAkB,SAAS,KAAK,EAAE;AACjD,QAAK,SAAS,YAAY,KAAK;AAC/B;;AAGD,MAAI;AACH,QAAK,OAAO,WAAW,MAAM,IAAI;AACjC,QAAK,eAAe;AACpB,QAAK,cAAc;AACnB,QAAK,kBAAkB;AACvB,QAAK,SAAS;AACd,aAAU,MAAM,iBAAiB;IAAE;IAAM;IAAK,CAAC;WACvC,KAAK;AACb,QAAK,SAAS,gBAAgB,KAAK,wBAAwB;;;CAI7D,oBAAoB;AACnB,OAAK,kBAAkB;AACvB,OAAK,eAAe;AACpB,OAAK,cAAc;AACnB,OAAK,SAAS;;CAGf,kBAAkB,MAAc,KAAa;AAC5C,OAAK,kBAAkB;AACvB,OAAK,cAAc;;CAGpB,gBAAgB,MAAc;AAC7B,MAAI,CAAC,KAAK,OAAQ;EAClB,MAAM,MAAM,KAAK,YAAY,MAAM;AACnC,MAAI,CAAC,IAAK;AAEV,MAAI;AACH,QAAK,OAAO,WAAW,MAAM,IAAI;AACjC,QAAK,kBAAkB;AACvB,QAAK,cAAc;WACX,OAAO;AACf,QAAK,SAAS,iBAAiB,QAAQ,MAAM,UAAU;;;CAIzD,qBAAqB;AACpB,OAAK,kBAAkB;AACvB,OAAK,cAAc;;CAGpB,eAAe,MAAc;AAC5B,MAAI,CAAC,KAAK,OAAQ;AAClB,OAAK,OAAO,cAAc,KAAK;;;YAlX/B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC;YAG1B,SAAS,EAAE,MAAM,QAAQ,CAAC;YAG1B,OAAO;YAGP,OAAO;YAGP,OAAO;YAGP,OAAO;YAGP,OAAO;YAGP,OAAO;YAGP,OAAO;gCA7UR,cAAc,sBAAsB"}