@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
@@ -1,12 +1,11 @@
1
1
  import { sectionHeaderStyles, sharedStyles, stateStyles } from "./styles.mjs";
2
2
  import { getTypeName, isCoinType } from "./utils.mjs";
3
3
  import { CopyController } from "./copy-controller.mjs";
4
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs";
4
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
5
5
  import { LitElement, css, html, nothing } from "lit";
6
6
  import { customElement, property, state } from "lit/decorators.js";
7
-
8
7
  //#region src/ui/dev-wallet-objects.ts
9
- let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
8
+ let DevWalletObjects = class DevWalletObjects extends LitElement {
10
9
  constructor(..._args) {
11
10
  super(..._args);
12
11
  this.address = "";
@@ -16,6 +15,11 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
16
15
  this._loadingMore = false;
17
16
  this._error = null;
18
17
  this._hasNextPage = false;
18
+ this.#copy = new CopyController(this);
19
+ this.#cursor = null;
20
+ this.#lastFetchedAddress = "";
21
+ this.#lastFetchedClient = null;
22
+ this.#fetchGeneration = 0;
19
23
  }
20
24
  static {
21
25
  this.styles = [
@@ -28,29 +32,54 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
28
32
  }
29
33
 
30
34
  .object-list {
31
- display: flex;
32
- flex-direction: column;
33
- gap: 4px;
35
+ display: grid;
36
+ grid-template-columns: repeat(2, minmax(0, 1fr));
37
+ gap: 8px;
34
38
  }
35
39
 
36
40
  .object-item {
37
41
  display: flex;
38
42
  gap: 10px;
39
- padding: 10px 12px;
40
- border-radius: var(--dev-wallet-radius-sm);
43
+ padding: 10px;
44
+ border-radius: var(--dev-wallet-radius-lg);
41
45
  border: 1px solid var(--dev-wallet-border);
42
- background: var(--dev-wallet-secondary);
46
+ background: var(--dev-wallet-surface);
43
47
  align-items: flex-start;
48
+ min-width: 0;
49
+ transition:
50
+ background 120ms,
51
+ border-color 120ms;
52
+ }
53
+
54
+ .object-item:hover {
55
+ background: var(--dev-wallet-bg-hover);
56
+ border-color: var(--dev-wallet-border-strong);
44
57
  }
45
58
 
46
59
  .object-thumb {
47
- width: 40px;
48
- height: 40px;
60
+ width: 28px;
61
+ height: 28px;
49
62
  border-radius: var(--dev-wallet-radius-xs);
50
63
  object-fit: cover;
51
64
  flex-shrink: 0;
52
65
  }
53
66
 
67
+ .object-fallback {
68
+ width: 28px;
69
+ height: 28px;
70
+ border-radius: var(--dev-wallet-radius-xs);
71
+ display: inline-flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ flex-shrink: 0;
75
+ background: linear-gradient(135deg, var(--dev-wallet-bg-4), var(--dev-wallet-bg-2));
76
+ border: 1px solid var(--dev-wallet-border);
77
+ color: var(--dev-wallet-primary);
78
+ font-family: var(--dev-wallet-font-mono);
79
+ font-size: 11px;
80
+ font-weight: var(--dev-wallet-font-weight-semibold);
81
+ }
82
+
54
83
  .object-body {
55
84
  display: flex;
56
85
  flex-direction: column;
@@ -66,9 +95,10 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
66
95
  }
67
96
 
68
97
  .object-type {
69
- font-size: 13px;
98
+ font-size: 11px;
70
99
  font-weight: var(--dev-wallet-font-weight-medium);
71
100
  color: var(--dev-wallet-foreground);
101
+ font-family: var(--dev-wallet-font-mono);
72
102
  white-space: nowrap;
73
103
  overflow: hidden;
74
104
  text-overflow: ellipsis;
@@ -76,8 +106,10 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
76
106
 
77
107
  .object-type-badge {
78
108
  font-size: 10px;
79
- color: var(--dev-wallet-muted-foreground);
80
- opacity: 0.8;
109
+ color: var(--dev-wallet-text-3);
110
+ overflow: hidden;
111
+ text-overflow: ellipsis;
112
+ white-space: nowrap;
81
113
  }
82
114
 
83
115
  .object-description {
@@ -89,15 +121,21 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
89
121
  }
90
122
 
91
123
  .object-version {
92
- font-size: 11px;
93
- color: var(--dev-wallet-muted-foreground);
124
+ height: 16px;
125
+ padding: 0 5px;
126
+ border-radius: 999px;
127
+ border: 1px solid var(--dev-wallet-border);
128
+ background: var(--dev-wallet-bg-3);
129
+ font-family: var(--dev-wallet-font-mono);
130
+ font-size: 9px;
131
+ color: var(--dev-wallet-text-3);
94
132
  flex-shrink: 0;
95
133
  }
96
134
 
97
135
  .object-id {
98
136
  font-size: 11px;
99
137
  font-family: var(--dev-wallet-font-mono);
100
- color: var(--dev-wallet-muted-foreground);
138
+ color: var(--dev-wallet-text-3);
101
139
  cursor: pointer;
102
140
  border-radius: var(--dev-wallet-radius-2xs);
103
141
  padding: 1px 2px;
@@ -116,13 +154,13 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
116
154
  .load-more {
117
155
  margin-top: 8px;
118
156
  width: 100%;
119
- padding: 8px;
120
- border-radius: var(--dev-wallet-radius-sm);
157
+ height: 30px;
158
+ border-radius: var(--dev-wallet-radius);
121
159
  font-size: 12px;
122
160
  font-weight: var(--dev-wallet-font-weight-medium);
123
161
  color: var(--dev-wallet-primary);
124
162
  background: transparent;
125
- border: 1px solid var(--dev-wallet-border);
163
+ border: 1px solid var(--dev-wallet-border-2);
126
164
  transition: background 0.15s;
127
165
  }
128
166
 
@@ -134,25 +172,27 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
134
172
  opacity: 0.5;
135
173
  cursor: default;
136
174
  }
175
+
176
+ @media (max-width: 380px) {
177
+ .object-list {
178
+ grid-template-columns: 1fr;
179
+ }
180
+ }
137
181
  `
138
182
  ];
139
183
  }
140
- #copy = new CopyController(this);
141
- #cursor = null;
142
- #lastFetchedAddress = "";
143
- #lastFetchedClient = null;
144
- #fetchGeneration = 0;
184
+ #copy;
185
+ #cursor;
186
+ #lastFetchedAddress;
187
+ #lastFetchedClient;
188
+ #fetchGeneration;
145
189
  willUpdate(changedProperties) {
146
- if ((changedProperties.has("address") || changedProperties.has("client")) && this.address && this.client && (this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)) {
147
- this.#fetchObjects(false);
148
- }
190
+ if ((changedProperties.has("address") || changedProperties.has("client")) && this.address && this.client && (this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)) this.#fetchObjects(false);
149
191
  }
150
192
  render() {
151
- if (!this.address || !this.client) {
152
- return nothing;
153
- }
193
+ if (!this.address || !this.client) return nothing;
154
194
  return html`
155
- <h3 class="section-header">Objects</h3>
195
+ <h3 class="section-header">Owned Objects</h3>
156
196
  ${this._loading ? html`<div class="loading" part="loading" aria-live="polite">Loading...</div>` : this._error ? html`<div class="error-state" part="error-message" aria-live="polite">
157
197
  ${this._error}
158
198
  </div>` : this._objects.length === 0 ? html`<div class="empty-state" part="empty-state">No objects found</div>` : html`
@@ -164,7 +204,7 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
164
204
  src=${obj.imageUrl}
165
205
  alt=${obj.displayName ?? obj.typeName}
166
206
  @error=${(e) => e.target.style.display = "none"}
167
- />` : nothing}
207
+ />` : html`<span class="object-fallback">O</span>`}
168
208
  <div class="object-body">
169
209
  <div class="object-top">
170
210
  <span class="object-type"> ${obj.displayName ?? obj.typeName} </span>
@@ -213,11 +253,8 @@ let DevWalletObjects = class DevWalletObjects$1 extends LitElement {
213
253
  this._objects = [];
214
254
  }
215
255
  const generation = ++this.#fetchGeneration;
216
- if (append) {
217
- this._loadingMore = true;
218
- } else {
219
- this._loading = true;
220
- }
256
+ if (append) this._loadingMore = true;
257
+ else this._loading = true;
221
258
  this._error = null;
222
259
  try {
223
260
  const result = await this.client.core.listOwnedObjects({
@@ -270,7 +307,7 @@ function extractString(json, key) {
270
307
  const val = json[key];
271
308
  return typeof val === "string" && val.length > 0 ? val : null;
272
309
  }
273
-
274
310
  //#endregion
275
311
  export { DevWalletObjects };
312
+
276
313
  //# sourceMappingURL=dev-wallet-objects.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-objects.mjs","names":["DevWalletObjects","#lastFetchedAddress","#lastFetchedClient","#fetchObjects","#copy","#loadMore","#cursor","#fetchGeneration"],"sources":["../../src/ui/dev-wallet-objects.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { CopyController } from './copy-controller.js';\nimport { sectionHeaderStyles, sharedStyles, stateStyles } from './styles.js';\nimport { getTypeName, isCoinType } from './utils.js';\n\ninterface OwnedObject {\n\tobjectId: string;\n\ttype: string;\n\ttypeName: string;\n\tversion: string;\n\tdisplayName: string | null;\n\tdescription: string | null;\n\timageUrl: string | null;\n}\n\n@customElement('dev-wallet-objects')\nexport class DevWalletObjects extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tstateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.object-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.object-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 10px 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\talign-items: flex-start;\n\t\t\t}\n\n\t\t\t.object-thumb {\n\t\t\t\twidth: 40px;\n\t\t\t\theight: 40px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tobject-fit: cover;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-body {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.object-top {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.object-type {\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\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.object-type-badge {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\n\t\t\t.object-description {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\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.object-version {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-id {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tpadding: 1px 2px;\n\t\t\t\tmargin: -1px -2px;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.object-id:hover {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t\t\t}\n\n\t\t\t.object-id.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.load-more {\n\t\t\t\tmargin-top: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.load-more:hover {\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.load-more:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t\tcursor: default;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@state()\n\tprivate _objects: OwnedObject[] = [];\n\n\t@state()\n\tprivate _loading = false;\n\n\t@state()\n\tprivate _loadingMore = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _hasNextPage = false;\n\n\t#copy = new CopyController(this);\n\t#cursor: string | null = null;\n\t#lastFetchedAddress = '';\n\t#lastFetchedClient: ClientWithCoreApi | null = null;\n\t#fetchGeneration = 0;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (\n\t\t\t(changedProperties.has('address') || changedProperties.has('client')) &&\n\t\t\tthis.address &&\n\t\t\tthis.client &&\n\t\t\t(this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)\n\t\t) {\n\t\t\tthis.#fetchObjects(false);\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.address || !this.client) {\n\t\t\treturn nothing;\n\t\t}\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Objects</h3>\n\t\t\t${this._loading\n\t\t\t\t? html`<div class=\"loading\" part=\"loading\" aria-live=\"polite\">Loading...</div>`\n\t\t\t\t: this._error\n\t\t\t\t\t? html`<div class=\"error-state\" part=\"error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t\t${this._error}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: this._objects.length === 0\n\t\t\t\t\t\t? html`<div class=\"empty-state\" part=\"empty-state\">No objects found</div>`\n\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t<div class=\"object-list\" part=\"object-list\">\n\t\t\t\t\t\t\t\t\t${this._objects.map(\n\t\t\t\t\t\t\t\t\t\t(obj) => html`\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t${obj.imageUrl && /^https?:\\/\\//i.test(obj.imageUrl)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-thumb\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc=${obj.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talt=${obj.displayName ?? obj.typeName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@error=${(e: Event) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t((e.target as HTMLImageElement).style.display = 'none')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-type\"> ${obj.displayName ?? obj.typeName} </span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-version\">v${obj.version}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t${obj.displayName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-type-badge\">${obj.typeName}</span>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t${obj.description\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-description\">${obj.description}</span>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-id ${this.#copy.isCopied(obj.objectId) ? 'copied' : ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Copy object ID\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#copy.copy(obj.objectId)}\n\t\t\t\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\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(obj.objectId);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\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${this.#copy.isCopied(obj.objectId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${obj.objectId.slice(0, 10)}...${obj.objectId.slice(-8)}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t${this._hasNextPage\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=\"load-more\"\n\t\t\t\t\t\t\t\t\t\t\t\tpart=\"load-more-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t?disabled=${this._loadingMore}\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${this.#loadMore}\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${this._loadingMore ? 'Loading...' : 'Load More'}\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: nothing}\n\t\t\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\tasync #fetchObjects(append: boolean) {\n\t\tthis.#lastFetchedAddress = this.address;\n\t\tthis.#lastFetchedClient = this.client;\n\n\t\tif (!append) {\n\t\t\tthis.#cursor = null;\n\t\t\tthis._objects = [];\n\t\t}\n\n\t\tconst generation = ++this.#fetchGeneration;\n\t\tif (append) {\n\t\t\tthis._loadingMore = true;\n\t\t} else {\n\t\t\tthis._loading = true;\n\t\t}\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst result = await this.client!.core.listOwnedObjects({\n\t\t\t\towner: this.address,\n\t\t\t\tlimit: 20,\n\t\t\t\tcursor: this.#cursor,\n\t\t\t\tinclude: { json: true },\n\t\t\t});\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\n\t\t\t// Filter out Coin types — those are shown in the balances tab\n\t\t\tconst nonCoinObjects: OwnedObject[] = result.objects\n\t\t\t\t.filter((obj) => !isCoinType(obj.type))\n\t\t\t\t.map((obj) => {\n\t\t\t\t\tconst json = obj.json;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tobjectId: obj.objectId,\n\t\t\t\t\t\ttype: obj.type,\n\t\t\t\t\t\ttypeName: getTypeName(obj.type),\n\t\t\t\t\t\tversion: obj.version,\n\t\t\t\t\t\tdisplayName: extractString(json, 'name'),\n\t\t\t\t\t\tdescription: extractString(json, 'description'),\n\t\t\t\t\t\timageUrl: extractString(json, 'image_url') ?? extractString(json, 'img_url'),\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\tthis._objects = append ? [...this._objects, ...nonCoinObjects] : nonCoinObjects;\n\t\t\tthis._hasNextPage = result.hasNextPage;\n\t\t\tthis.#cursor = result.cursor;\n\t\t} catch {\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._error = 'Failed to load objects';\n\t\t\tif (!append) this._objects = [];\n\t\t} finally {\n\t\t\tif (generation === this.#fetchGeneration) {\n\t\t\t\tthis._loading = false;\n\t\t\t\tthis._loadingMore = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t#loadMore() {\n\t\tthis.#fetchObjects(true);\n\t}\n}\n\nfunction extractString(\n\tjson: Record<string, unknown> | null | undefined,\n\tkey: string,\n): string | null {\n\tif (!json) return null;\n\tconst val = json[key];\n\treturn typeof val === 'string' && val.length > 0 ? val : null;\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-objects': DevWalletObjects;\n\t}\n}\n"],"mappings":";;;;;;;;AAsBO,6BAAMA,2BAAyB,WAAW;;;iBAyHtC;gBAGyB;kBAGD,EAAE;kBAGjB;sBAGI;gBAGS;sBAGT;;;gBA1IE;GACxB;GACA;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiHH;;CAuBD,QAAQ,IAAI,eAAe,KAAK;CAChC,UAAyB;CACzB,sBAAsB;CACtB,qBAA+C;CAC/C,mBAAmB;CAEnB,AAAS,WAAW,mBAAyC;AAC5D,OACE,kBAAkB,IAAI,UAAU,IAAI,kBAAkB,IAAI,SAAS,KACpE,KAAK,WACL,KAAK,WACJ,KAAK,YAAY,MAAKC,sBAAuB,KAAK,WAAW,MAAKC,oBAClE;AACD,SAAKC,aAAc,MAAM;;;CAI3B,AAAS,SAAS;AACjB,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AAClC,UAAO;;AAGR,SAAO,IAAI;;KAER,KAAK,WACJ,IAAI,4EACJ,KAAK,SACJ,IAAI;SACF,KAAK,OAAO;gBAEd,KAAK,SAAS,WAAW,IACxB,IAAI,uEACJ,IAAI;;WAED,KAAK,SAAS,KACd,QAAQ,IAAI;;cAET,IAAI,YAAY,gBAAgB,KAAK,IAAI,SAAS,GACjD,IAAI;;qBAEE,IAAI,SAAS;qBACb,IAAI,eAAe,IAAI,SAAS;yBAC5B,MACR,AAAC,EAAE,OAA4B,MAAM,UAAU,OAAQ;oBAEzD,QAAQ;;;2CAGoB,IAAI,eAAe,IAAI,SAAS;8CAC7B,IAAI,QAAQ;;eAE3C,IAAI,cACH,IAAI,mCAAmC,IAAI,SAAS,WACpD,QAAQ;eACT,IAAI,cACH,IAAI,oCAAoC,IAAI,YAAY,WACxD,QAAQ;;iCAES,MAAKC,KAAM,SAAS,IAAI,SAAS,GAAG,WAAW,GAAG;;;;;6BAKtD,MAAKA,KAAM,KAAK,IAAI,SAAS,CAAC;0BACjC,MAAqB;AAChC,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACvC,MAAE,gBAAgB;AAClB,UAAKA,KAAM,KAAK,IAAI,SAAS;;IAE7B;;gBAEA,MAAKA,KAAM,SAAS,IAAI,SAAS,GAChC,YACA,GAAG,IAAI,SAAS,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,SAAS,MAAM,CAAC,EAAE,GAAG;;;;YAKlE,CAAC;;UAED,KAAK,eACJ,IAAI;;;;wBAIS,KAAK,aAAa;qBACrB,MAAKC,SAAU;;cAEtB,KAAK,eAAe,eAAe,YAAY;;cAGlD,QAAQ;SACV;;;CAIR,OAAMF,aAAc,QAAiB;AACpC,QAAKF,qBAAsB,KAAK;AAChC,QAAKC,oBAAqB,KAAK;AAE/B,MAAI,CAAC,QAAQ;AACZ,SAAKI,SAAU;AACf,QAAK,WAAW,EAAE;;EAGnB,MAAM,aAAa,EAAE,MAAKC;AAC1B,MAAI,QAAQ;AACX,QAAK,eAAe;SACd;AACN,QAAK,WAAW;;AAEjB,OAAK,SAAS;AAEd,MAAI;GACH,MAAM,SAAS,MAAM,KAAK,OAAQ,KAAK,iBAAiB;IACvD,OAAO,KAAK;IACZ,OAAO;IACP,QAAQ,MAAKD;IACb,SAAS,EAAE,MAAM,MAAM;IACvB,CAAC;AAEF,OAAI,eAAe,MAAKC,gBAAkB;GAG1C,MAAM,iBAAgC,OAAO,QAC3C,QAAQ,QAAQ,CAAC,WAAW,IAAI,KAAK,CAAC,CACtC,KAAK,QAAQ;IACb,MAAM,OAAO,IAAI;AACjB,WAAO;KACN,UAAU,IAAI;KACd,MAAM,IAAI;KACV,UAAU,YAAY,IAAI,KAAK;KAC/B,SAAS,IAAI;KACb,aAAa,cAAc,MAAM,OAAO;KACxC,aAAa,cAAc,MAAM,cAAc;KAC/C,UAAU,cAAc,MAAM,YAAY,IAAI,cAAc,MAAM,UAAU;KAC5E;KACA;AAEH,QAAK,WAAW,SAAS,CAAC,GAAG,KAAK,UAAU,GAAG,eAAe,GAAG;AACjE,QAAK,eAAe,OAAO;AAC3B,SAAKD,SAAU,OAAO;UACf;AACP,OAAI,eAAe,MAAKC,gBAAkB;AAC1C,QAAK,SAAS;AACd,OAAI,CAAC,OAAQ,MAAK,WAAW,EAAE;YACtB;AACT,OAAI,eAAe,MAAKA,iBAAkB;AACzC,SAAK,WAAW;AAChB,SAAK,eAAe;;;;CAKvB,YAAY;AACX,QAAKJ,aAAc,KAAK;;;YAhLxB,SAAS,EAAE,MAAM,QAAQ,CAAC;YAG1B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,OAAO;YAGP,OAAO;YAGP,OAAO;YAGP,OAAO;YAGP,OAAO;+BA3IR,cAAc,qBAAqB;AA6SpC,SAAS,cACR,MACA,KACgB;AAChB,KAAI,CAAC,KAAM,QAAO;CAClB,MAAM,MAAM,KAAK;AACjB,QAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,IAAI,MAAM"}
1
+ {"version":3,"file":"dev-wallet-objects.mjs","names":["#lastFetchedAddress","#lastFetchedClient","#fetchObjects","#copy","#loadMore","#cursor","#fetchGeneration"],"sources":["../../src/ui/dev-wallet-objects.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { CopyController } from './copy-controller.js';\nimport { sectionHeaderStyles, sharedStyles, stateStyles } from './styles.js';\nimport { getTypeName, isCoinType } from './utils.js';\n\ninterface OwnedObject {\n\tobjectId: string;\n\ttype: string;\n\ttypeName: string;\n\tversion: string;\n\tdisplayName: string | null;\n\tdescription: string | null;\n\timageUrl: string | null;\n}\n\n@customElement('dev-wallet-objects')\nexport class DevWalletObjects extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tstateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.object-list {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.object-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 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: var(--dev-wallet-surface);\n\t\t\t\talign-items: flex-start;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttransition:\n\t\t\t\t\tbackground 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t}\n\n\t\t\t.object-item:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.object-thumb {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tobject-fit: cover;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-fallback {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\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\tflex-shrink: 0;\n\t\t\t\tbackground: linear-gradient(135deg, var(--dev-wallet-bg-4), var(--dev-wallet-bg-2));\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.object-body {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.object-top {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.object-type {\n\t\t\t\tfont-size: 11px;\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\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.object-type-badge {\n\t\t\t\tfont-size: 10px;\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.object-description {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\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.object-version {\n\t\t\t\theight: 16px;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.object-id {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tpadding: 1px 2px;\n\t\t\t\tmargin: -1px -2px;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.object-id:hover {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t\t\t}\n\n\t\t\t.object-id.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.load-more {\n\t\t\t\tmargin-top: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 30px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.load-more:hover {\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.load-more:disabled {\n\t\t\t\topacity: 0.5;\n\t\t\t\tcursor: default;\n\t\t\t}\n\n\t\t\t@media (max-width: 380px) {\n\t\t\t\t.object-list {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@state()\n\tprivate _objects: OwnedObject[] = [];\n\n\t@state()\n\tprivate _loading = false;\n\n\t@state()\n\tprivate _loadingMore = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t@state()\n\tprivate _hasNextPage = false;\n\n\t#copy = new CopyController(this);\n\t#cursor: string | null = null;\n\t#lastFetchedAddress = '';\n\t#lastFetchedClient: ClientWithCoreApi | null = null;\n\t#fetchGeneration = 0;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (\n\t\t\t(changedProperties.has('address') || changedProperties.has('client')) &&\n\t\t\tthis.address &&\n\t\t\tthis.client &&\n\t\t\t(this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)\n\t\t) {\n\t\t\tthis.#fetchObjects(false);\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.address || !this.client) {\n\t\t\treturn nothing;\n\t\t}\n\n\t\treturn html`\n\t\t\t<h3 class=\"section-header\">Owned Objects</h3>\n\t\t\t${this._loading\n\t\t\t\t? html`<div class=\"loading\" part=\"loading\" aria-live=\"polite\">Loading...</div>`\n\t\t\t\t: this._error\n\t\t\t\t\t? html`<div class=\"error-state\" part=\"error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t\t${this._error}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: this._objects.length === 0\n\t\t\t\t\t\t? html`<div class=\"empty-state\" part=\"empty-state\">No objects found</div>`\n\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t<div class=\"object-list\" part=\"object-list\">\n\t\t\t\t\t\t\t\t\t${this._objects.map(\n\t\t\t\t\t\t\t\t\t\t(obj) => html`\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t${obj.imageUrl && /^https?:\\/\\//i.test(obj.imageUrl)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-thumb\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc=${obj.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talt=${obj.displayName ?? obj.typeName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@error=${(e: Event) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t((e.target as HTMLImageElement).style.display = 'none')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: html`<span class=\"object-fallback\">O</span>`}\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"object-top\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-type\"> ${obj.displayName ?? obj.typeName} </span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"object-version\">v${obj.version}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t${obj.displayName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-type-badge\">${obj.typeName}</span>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t${obj.description\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<span class=\"object-description\">${obj.description}</span>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"object-id ${this.#copy.isCopied(obj.objectId) ? 'copied' : ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Copy object ID\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.#copy.copy(obj.objectId)}\n\t\t\t\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\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(obj.objectId);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\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${this.#copy.isCopied(obj.objectId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${obj.objectId.slice(0, 10)}...${obj.objectId.slice(-8)}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t${this._hasNextPage\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=\"load-more\"\n\t\t\t\t\t\t\t\t\t\t\t\tpart=\"load-more-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t?disabled=${this._loadingMore}\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${this.#loadMore}\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${this._loadingMore ? 'Loading...' : 'Load More'}\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: nothing}\n\t\t\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\tasync #fetchObjects(append: boolean) {\n\t\tthis.#lastFetchedAddress = this.address;\n\t\tthis.#lastFetchedClient = this.client;\n\n\t\tif (!append) {\n\t\t\tthis.#cursor = null;\n\t\t\tthis._objects = [];\n\t\t}\n\n\t\tconst generation = ++this.#fetchGeneration;\n\t\tif (append) {\n\t\t\tthis._loadingMore = true;\n\t\t} else {\n\t\t\tthis._loading = true;\n\t\t}\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst result = await this.client!.core.listOwnedObjects({\n\t\t\t\towner: this.address,\n\t\t\t\tlimit: 20,\n\t\t\t\tcursor: this.#cursor,\n\t\t\t\tinclude: { json: true },\n\t\t\t});\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\n\t\t\t// Filter out Coin types — those are shown in the balances tab\n\t\t\tconst nonCoinObjects: OwnedObject[] = result.objects\n\t\t\t\t.filter((obj) => !isCoinType(obj.type))\n\t\t\t\t.map((obj) => {\n\t\t\t\t\tconst json = obj.json;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tobjectId: obj.objectId,\n\t\t\t\t\t\ttype: obj.type,\n\t\t\t\t\t\ttypeName: getTypeName(obj.type),\n\t\t\t\t\t\tversion: obj.version,\n\t\t\t\t\t\tdisplayName: extractString(json, 'name'),\n\t\t\t\t\t\tdescription: extractString(json, 'description'),\n\t\t\t\t\t\timageUrl: extractString(json, 'image_url') ?? extractString(json, 'img_url'),\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\tthis._objects = append ? [...this._objects, ...nonCoinObjects] : nonCoinObjects;\n\t\t\tthis._hasNextPage = result.hasNextPage;\n\t\t\tthis.#cursor = result.cursor;\n\t\t} catch {\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._error = 'Failed to load objects';\n\t\t\tif (!append) this._objects = [];\n\t\t} finally {\n\t\t\tif (generation === this.#fetchGeneration) {\n\t\t\t\tthis._loading = false;\n\t\t\t\tthis._loadingMore = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t#loadMore() {\n\t\tthis.#fetchObjects(true);\n\t}\n}\n\nfunction extractString(\n\tjson: Record<string, unknown> | null | undefined,\n\tkey: string,\n): string | null {\n\tif (!json) return null;\n\tconst val = json[key];\n\treturn typeof val === 'string' && val.length > 0 ? val : null;\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-objects': DevWalletObjects;\n\t}\n}\n"],"mappings":";;;;;;;AAsBO,IAAA,mBAAA,MAAM,yBAAyB,WAAW;;;iBAiKtC;gBAGyB;kBAGD,EAAE;kBAGjB;sBAGI;gBAGS;sBAGT;eAEf,IAAI,eAAe,KAAK;iBACP;6BACH;4BACyB;0BAC5B;;;gBAxLM;GACxB;GACA;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyJH;;CAuBD;CACA;CACA;CACA;CACA;CAEA,WAAoB,mBAAyC;AAC5D,OACE,kBAAkB,IAAI,UAAU,IAAI,kBAAkB,IAAI,SAAS,KACpE,KAAK,WACL,KAAK,WACJ,KAAK,YAAY,MAAA,sBAA4B,KAAK,WAAW,MAAA,mBAE9D,OAAA,aAAmB,MAAM;;CAI3B,SAAkB;AACjB,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,OAC1B,QAAO;AAGR,SAAO,IAAI;;KAER,KAAK,WACJ,IAAI,4EACJ,KAAK,SACJ,IAAI;SACF,KAAK,OAAO;gBAEd,KAAK,SAAS,WAAW,IACxB,IAAI,uEACJ,IAAI;;WAED,KAAK,SAAS,KACd,QAAQ,IAAI;;cAET,IAAI,YAAY,gBAAgB,KAAK,IAAI,SAAS,GACjD,IAAI;;qBAEE,IAAI,SAAS;qBACb,IAAI,eAAe,IAAI,SAAS;yBAC5B,MACR,EAAG,OAA4B,MAAM,UAAU,OAAQ;oBAEzD,IAAI,yCAAyC;;;2CAGjB,IAAI,eAAe,IAAI,SAAS;8CAC7B,IAAI,QAAQ;;eAE3C,IAAI,cACH,IAAI,mCAAmC,IAAI,SAAS,WACpD,QAAQ;eACT,IAAI,cACH,IAAI,oCAAoC,IAAI,YAAY,WACxD,QAAQ;;iCAES,MAAA,KAAW,SAAS,IAAI,SAAS,GAAG,WAAW,GAAG;;;;;6BAKtD,MAAA,KAAW,KAAK,IAAI,SAAS,CAAC;0BACjC,MAAqB;AAChC,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACvC,MAAE,gBAAgB;AAClB,UAAA,KAAW,KAAK,IAAI,SAAS;;IAE7B;;gBAEA,MAAA,KAAW,SAAS,IAAI,SAAS,GAChC,YACA,GAAG,IAAI,SAAS,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,SAAS,MAAM,GAAG,GAAG;;;;YAKlE,CAAC;;UAED,KAAK,eACJ,IAAI;;;;wBAIS,KAAK,aAAa;qBACrB,MAAA,SAAe;;cAEtB,KAAK,eAAe,eAAe,YAAY;;cAGlD,QAAQ;SACV;;;CAIR,OAAA,aAAoB,QAAiB;AACpC,QAAA,qBAA2B,KAAK;AAChC,QAAA,oBAA0B,KAAK;AAE/B,MAAI,CAAC,QAAQ;AACZ,SAAA,SAAe;AACf,QAAK,WAAW,EAAE;;EAGnB,MAAM,aAAa,EAAE,MAAA;AACrB,MAAI,OACH,MAAK,eAAe;MAEpB,MAAK,WAAW;AAEjB,OAAK,SAAS;AAEd,MAAI;GACH,MAAM,SAAS,MAAM,KAAK,OAAQ,KAAK,iBAAiB;IACvD,OAAO,KAAK;IACZ,OAAO;IACP,QAAQ,MAAA;IACR,SAAS,EAAE,MAAM,MAAM;IACvB,CAAC;AAEF,OAAI,eAAe,MAAA,gBAAuB;GAG1C,MAAM,iBAAgC,OAAO,QAC3C,QAAQ,QAAQ,CAAC,WAAW,IAAI,KAAK,CAAC,CACtC,KAAK,QAAQ;IACb,MAAM,OAAO,IAAI;AACjB,WAAO;KACN,UAAU,IAAI;KACd,MAAM,IAAI;KACV,UAAU,YAAY,IAAI,KAAK;KAC/B,SAAS,IAAI;KACb,aAAa,cAAc,MAAM,OAAO;KACxC,aAAa,cAAc,MAAM,cAAc;KAC/C,UAAU,cAAc,MAAM,YAAY,IAAI,cAAc,MAAM,UAAU;KAC5E;KACA;AAEH,QAAK,WAAW,SAAS,CAAC,GAAG,KAAK,UAAU,GAAG,eAAe,GAAG;AACjE,QAAK,eAAe,OAAO;AAC3B,SAAA,SAAe,OAAO;UACf;AACP,OAAI,eAAe,MAAA,gBAAuB;AAC1C,QAAK,SAAS;AACd,OAAI,CAAC,OAAQ,MAAK,WAAW,EAAE;YACtB;AACT,OAAI,eAAe,MAAA,iBAAuB;AACzC,SAAK,WAAW;AAChB,SAAK,eAAe;;;;CAKvB,YAAY;AACX,QAAA,aAAmB,KAAK;;;YAhLxB,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,iBAAA,WAAA,WAAA,KAAA,EAAA;YAG1B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,iBAAA,WAAA,UAAA,KAAA,EAAA;YAG9B,OAAO,CAAA,EAAA,iBAAA,WAAA,YAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,iBAAA,WAAA,YAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,iBAAA,WAAA,gBAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,iBAAA,WAAA,UAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,iBAAA,WAAA,gBAAA,KAAA,EAAA;+BAnLR,cAAc,qBAAqB,CAAA,EAAA,iBAAA;AAqVpC,SAAS,cACR,MACA,KACgB;AAChB,KAAI,CAAC,KAAM,QAAO;CAClB,MAAM,MAAM,KAAK;AACjB,QAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,IAAI,MAAM"}
@@ -1,16 +1,36 @@
1
+ import { ForkRelay } from "../adapters/fork-relay.mjs";
1
2
  import { DevWallet } from "../wallet/dev-wallet.mjs";
2
- import * as lit0 from "lit";
3
+ import { CoinRecord } from "./utils.mjs";
4
+ import * as _$lit from "lit";
3
5
  import { LitElement } from "lit";
4
6
 
5
7
  //#region src/ui/dev-wallet-panel.d.ts
8
+ type DevWalletDockStyle = 'corner-pill' | 'side-tab';
6
9
  declare class DevWalletPanel extends LitElement {
7
10
  #private;
8
- static styles: (lit0.CSSResult | lit0.CSSResult[])[];
11
+ static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
9
12
  wallet: DevWallet | null;
13
+ /** Optional pre-seeded coin metadata. Pass the generated `coins`
14
+ * constant from devstack codegen (`src/generated/coins.ts`) to skip
15
+ * per-coin RPC fetches in the balances list and signing modal. */
16
+ coins: CoinRecord | null;
17
+ /** Phase 5 Subtopic 6 — fork admin relay. When set, the panel
18
+ * surfaces a "Fork" tab that drives advance-clock,
19
+ * advance-checkpoint, and impersonation slot management against
20
+ * the devstack wallet-app server. Construct from the manifest
21
+ * with `createForkRelayFromManifest(manifest)`. */
22
+ forkRelay: ForkRelay | null;
23
+ /** Optional upstream label (`'mainnet'`, `'testnet'`, …) sourced
24
+ * from `meta.upstream` on the manifest. Falls back to inferring
25
+ * from the active network literal when not provided. */
26
+ forkUpstream: string;
27
+ dockStyle: DevWalletDockStyle;
10
28
  private _isOpen;
11
29
  willUpdate(changedProperties: Map<string, unknown>): void;
12
30
  updated(): void;
13
- render(): lit0.TemplateResult<1>;
31
+ render(): _$lit.TemplateResult<1>;
32
+ connectedCallback(): void;
33
+ disconnectedCallback(): void;
14
34
  }
15
35
  declare global {
16
36
  interface HTMLElementTagNameMap {
@@ -18,5 +38,5 @@ declare global {
18
38
  }
19
39
  } //# sourceMappingURL=dev-wallet-panel.d.ts.map
20
40
  //#endregion
21
- export { DevWalletPanel };
41
+ export { DevWalletDockStyle, DevWalletPanel };
22
42
  //# sourceMappingURL=dev-wallet-panel.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-panel.d.mts","names":[],"sources":["../../src/ui/dev-wallet-panel.ts"],"mappings":";;;;;cAWa,cAAA,SAAuB,UAAA;EAAA;SACnB,MAAA,GADW,IAAA,CACL,SAAA,GAAA,IAAA,CAAA,SAAA;EAqGtB,MAAA,EAAQ,SAAA;EAAA,QAGA,OAAA;EAKC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAM9B,OAAA,CAAA;EAsBA,MAAA,CAAA,GA5BiC,IAAA,CA4B3B,cAAA;AAAA;AAAA,QAqDR,MAAA;EAAA,UACG,qBAAA;IACT,kBAAA,EAAoB,cAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"dev-wallet-panel.d.mts","names":[],"sources":["../../src/ui/dev-wallet-panel.ts"],"mappings":";;;;;;;KAYY,kBAAA;AAAA,cAGC,cAAA,SAAuB,UAAA;EAAA;SACnB,MAAA,GADW,KAAA,CACL,SAAA,GAAA,KAAA,CAAA,SAAA;EAgPtB,MAAA,EAAQ,SAAA;;;;EAMR,KAAA,EAAO,UAAA;EAvPoB;;;;;EA+P3B,SAAA,EAAW,SAAA;EAAA;;;EAMX,YAAA;EAGA,SAAA,EAAW,kBAAA;EAAA,QAGH,OAAA;EAKC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAe9B,OAAA,CAAA;EAsBA,MAAA,CAAA,GArCiC,KAAA,CAqC3B,cAAA;EAsFN,iBAAA,CAAA;EAKA,oBAAA,CAAA;AAAA;AAAA,QAMF,MAAA;EAAA,UACG,qBAAA;IACT,kBAAA,EAAoB,cAAA;EAAA;AAAA"}