@lukso/transaction-view-core 0.3.1-dev.a8c9315

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 (62) hide show
  1. package/.turbo/turbo-build.log +33 -0
  2. package/CHANGELOG.md +104 -0
  3. package/LICENSE +201 -0
  4. package/README.md +264 -0
  5. package/dist/index.cjs +4573 -0
  6. package/dist/index.cjs.map +1 -0
  7. package/dist/index.d.cts +493 -0
  8. package/dist/index.d.ts +493 -0
  9. package/dist/index.js +4534 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/shared/index.cjs +2480 -0
  12. package/dist/shared/index.cjs.map +1 -0
  13. package/dist/shared/index.d.cts +887 -0
  14. package/dist/shared/index.d.ts +887 -0
  15. package/dist/shared/index.js +2437 -0
  16. package/dist/shared/index.js.map +1 -0
  17. package/dist/styles/index.cjs +58 -0
  18. package/dist/styles/index.cjs.map +1 -0
  19. package/dist/styles/index.d.cts +9 -0
  20. package/dist/styles/index.d.ts +9 -0
  21. package/dist/styles/index.js +31 -0
  22. package/dist/styles/index.js.map +1 -0
  23. package/package.json +57 -0
  24. package/publish.log +0 -0
  25. package/src/components/asset-card.ts +426 -0
  26. package/src/components/contract-card.ts +238 -0
  27. package/src/components/description-view.ts +605 -0
  28. package/src/components/index.ts +20 -0
  29. package/src/components/info-panel.ts +437 -0
  30. package/src/components/permissions-block.ts +138 -0
  31. package/src/components/transaction-playback.ts +429 -0
  32. package/src/components/universal-token-view.ts +281 -0
  33. package/src/declaration.d.ts +4 -0
  34. package/src/examples/INTEGRATION_GUIDE.md +240 -0
  35. package/src/examples/TransactionContentWithReplacement.vue +269 -0
  36. package/src/index.ts +38 -0
  37. package/src/registry/index.ts +31 -0
  38. package/src/registry/lit-view-loader.ts +191 -0
  39. package/src/shared/address-display.ts +370 -0
  40. package/src/shared/address-view.ts +385 -0
  41. package/src/shared/custom-select.ts +164 -0
  42. package/src/shared/function-name-view.ts +89 -0
  43. package/src/shared/gas-provider-view.ts +218 -0
  44. package/src/shared/icon-view.ts +288 -0
  45. package/src/shared/image-list.ts +261 -0
  46. package/src/shared/image-loader-controller.ts +160 -0
  47. package/src/shared/index.ts +34 -0
  48. package/src/shared/load-web-components.ts +56 -0
  49. package/src/shared/notification-view.ts +132 -0
  50. package/src/shared/progress-view.ts +86 -0
  51. package/src/shared/safe-custom-element.ts +35 -0
  52. package/src/shared/scroll-to-bottom-button.ts +55 -0
  53. package/src/shared/signal-controller.ts +124 -0
  54. package/src/shared/transaction-view-controller.ts +345 -0
  55. package/src/shared/url-view.ts +129 -0
  56. package/src/shared/value-view.ts +510 -0
  57. package/src/styles/index.ts +28 -0
  58. package/src/styles/styles.css +1 -0
  59. package/src/vue-entry.ts +15 -0
  60. package/tailwind.config.cjs +9 -0
  61. package/tsconfig.json +22 -0
  62. package/tsup.config.ts +90 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,4573 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var __decorateClass = (decorators, target, key, kind) => {
30
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
31
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
32
+ if (decorator = decorators[i])
33
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
34
+ if (kind && result) __defProp(target, key, result);
35
+ return result;
36
+ };
37
+
38
+ // src/index.ts
39
+ var index_exports = {};
40
+ __export(index_exports, {
41
+ AddressDisplay: () => AddressDisplay,
42
+ AddressView: () => AddressView,
43
+ CustomOption: () => CustomOption,
44
+ CustomSelect: () => CustomSelect,
45
+ DefaultViewRegistry: () => import_transaction_view_headless12.DefaultViewRegistry,
46
+ FunctionNameView: () => FunctionNameView,
47
+ GasProviderView: () => GasProviderView,
48
+ IconView: () => IconView,
49
+ ImageLoaderController: () => ImageLoaderController,
50
+ LitViewLoader: () => LitViewLoader,
51
+ MultiSignalController: () => MultiSignalController,
52
+ NotificationView: () => NotificationView,
53
+ ProgressView: () => ProgressView,
54
+ ScrollToBottomButton: () => ScrollToBottomButton,
55
+ SignalController: () => SignalController,
56
+ TransactionSignalController: () => TransactionSignalController,
57
+ TransactionViewController: () => TransactionViewController,
58
+ UrlView: () => UrlView,
59
+ ValueView: () => ValueView,
60
+ getGlobalLitLoader: () => getGlobalLitLoader,
61
+ getGlobalRegistry: () => import_transaction_view_headless12.getGlobalRegistry,
62
+ resetGlobalLitLoader: () => resetGlobalLitLoader,
63
+ resetGlobalRegistry: () => import_transaction_view_headless12.resetGlobalRegistry,
64
+ setGlobalLitLoader: () => setGlobalLitLoader,
65
+ setGlobalRegistry: () => import_transaction_view_headless12.setGlobalRegistry,
66
+ useImageLoader: () => useImageLoader3,
67
+ useSignal: () => useSignal,
68
+ useSignals: () => useSignals,
69
+ useTransactionSignal: () => useTransactionSignal,
70
+ useTransactionView: () => useTransactionView
71
+ });
72
+ module.exports = __toCommonJS(index_exports);
73
+
74
+ // src/shared/address-display.ts
75
+ var import_task = require("@lit/task");
76
+ var import_transaction_view_headless = require("@lukso/transaction-view-headless");
77
+ var import_lit = require("lit");
78
+ var import_decorators = require("lit/decorators.js");
79
+
80
+ // src/shared/safe-custom-element.ts
81
+ function safeCustomElement(tagName) {
82
+ return (classOrDescriptor) => {
83
+ if (typeof customElements !== "undefined" && !customElements.get(tagName)) {
84
+ customElements.define(tagName, classOrDescriptor);
85
+ }
86
+ return classOrDescriptor;
87
+ };
88
+ }
89
+
90
+ // src/shared/address-display.ts
91
+ var AddressDisplay = class extends import_lit.LitElement {
92
+ constructor() {
93
+ super(...arguments);
94
+ this.size = "small";
95
+ this.showCopyButton = false;
96
+ this.nameOnly = false;
97
+ this.maxWidth = 200;
98
+ this.isLoadingImage = false;
99
+ // Composables
100
+ this.imageLoader = (0, import_transaction_view_headless.useImageLoader)();
101
+ this.addressResolver = (0, import_transaction_view_headless.useAddressResolver)();
102
+ // Task for loading profile image
103
+ this.imageTask = new import_task.Task(this, {
104
+ task: async ([resolved], { signal }) => {
105
+ if (!resolved) return null;
106
+ this.isLoadingImage = true;
107
+ try {
108
+ const image = await this.imageLoader.loadProfileImage(resolved, {
109
+ width: this.getSizePixels(),
110
+ height: this.getSizePixels(),
111
+ dpr: window.devicePixelRatio || 1
112
+ });
113
+ return image || this.imageLoader.getFallbackImage(resolved);
114
+ } catch (error) {
115
+ console.warn("Failed to load address image:", error);
116
+ return this.imageLoader.getFallbackImage(resolved || {});
117
+ } finally {
118
+ this.isLoadingImage = false;
119
+ }
120
+ },
121
+ args: () => [this.resolved]
122
+ });
123
+ }
124
+ /**
125
+ * Get the effective address value (supports both `value` and legacy `address` props)
126
+ */
127
+ get effectiveAddress() {
128
+ return this.value || this.address || "";
129
+ }
130
+ /**
131
+ * Get pixel size for the current size setting
132
+ */
133
+ getSizePixels() {
134
+ switch (this.size) {
135
+ case "x-small":
136
+ return 16;
137
+ case "small":
138
+ return 24;
139
+ case "medium":
140
+ return 32;
141
+ case "large":
142
+ return 48;
143
+ default:
144
+ return 24;
145
+ }
146
+ }
147
+ /**
148
+ * Get display name for the address
149
+ */
150
+ getDisplayName() {
151
+ if (!this.resolved) return "Anonymous";
152
+ const computedName = this.addressResolver.formatDisplayName(this.resolved);
153
+ return computedName || "Anonymous";
154
+ }
155
+ /**
156
+ * Check if this is a contract address (shows square icon)
157
+ */
158
+ get isContract() {
159
+ return this.resolved ? this.imageLoader.isContractAddress(this.resolved) : false;
160
+ }
161
+ /**
162
+ * Get prefix for the address display
163
+ */
164
+ get addressPrefix() {
165
+ return this.resolved ? this.addressResolver.getAddressPrefix(this.resolved) : "@";
166
+ }
167
+ /**
168
+ * Check if should show name colors
169
+ */
170
+ get shouldShowNameColor() {
171
+ return this.resolved ? this.addressResolver.shouldShowNameColor(this.resolved) : true;
172
+ }
173
+ /**
174
+ * Handle copy button click
175
+ */
176
+ handleCopy() {
177
+ if (navigator.clipboard) {
178
+ navigator.clipboard.writeText(this.effectiveAddress);
179
+ this.dispatchEvent(
180
+ new CustomEvent("address-copied", {
181
+ detail: { address: this.effectiveAddress },
182
+ bubbles: true
183
+ })
184
+ );
185
+ }
186
+ }
187
+ /**
188
+ * Handle address click
189
+ */
190
+ handleAddressClick() {
191
+ this.dispatchEvent(
192
+ new CustomEvent("address-click", {
193
+ detail: {
194
+ address: this.effectiveAddress,
195
+ resolved: this.resolved
196
+ },
197
+ bubbles: true
198
+ })
199
+ );
200
+ }
201
+ render() {
202
+ const imageResult = this.imageTask.value;
203
+ return import_lit.html`
204
+ <div class="address-container">
205
+ ${this.label ? import_lit.html`<div class="label">${this.label}</div>` : ""}
206
+
207
+ <div class="address-display" @click=${this.handleAddressClick}>
208
+ <!-- Identity prefix (if present) -->
209
+ ${this.resolved?.__identity ? import_lit.html`
210
+ <span class="identity">
211
+ ${this.resolved.__identity}
212
+ <lukso-username
213
+ address=${this.resolved.identity}
214
+ size=${this.size}
215
+ max-width="200"
216
+ has-name-color="false"
217
+ has-address-color="false"
218
+ ></lukso-username>
219
+ of
220
+ </span>
221
+ ` : ""}
222
+
223
+ <!-- Profile image and name -->
224
+ <lukso-profile
225
+ size=${this.size}
226
+ profile-address=${this.effectiveAddress}
227
+ profile-url=${imageResult?.src || ""}
228
+ has-identicon
229
+ ?is-square=${this.isContract}
230
+ ></lukso-profile>
231
+
232
+ <!-- Address/Name display -->
233
+ ${this.nameOnly ? import_lit.html`
234
+ <lukso-username
235
+ name=${this.getDisplayName()}
236
+ size=${this.size}
237
+ max-width=${this.maxWidth}
238
+ prefix=${this.addressPrefix}
239
+ ?has-name-color=${this.shouldShowNameColor}
240
+ has-address-color="false"
241
+ ></lukso-username>
242
+ ` : import_lit.html`
243
+ <lukso-username
244
+ name=${this.getDisplayName()}
245
+ address=${!this.isContract ? this.effectiveAddress : void 0}
246
+ size=${this.size}
247
+ max-width=${this.maxWidth}
248
+ prefix=${this.addressPrefix}
249
+ ?has-name-color=${this.shouldShowNameColor}
250
+ ?has-address-color=${this.shouldShowNameColor}
251
+ ></lukso-username>
252
+ `}
253
+
254
+
255
+ <!-- Copy button -->
256
+ ${this.showCopyButton ? import_lit.html`
257
+ <button
258
+ class="copy-button"
259
+ @click=${this.handleCopy}
260
+ title="Copy address"
261
+ >
262
+ 📋
263
+ </button>
264
+ ` : ""}
265
+ </div>
266
+ </div>
267
+ `;
268
+ }
269
+ };
270
+ AddressDisplay.styles = import_lit.css`
271
+ :host {
272
+ display: inline-block;
273
+ }
274
+
275
+ .address-container {
276
+ display: flex;
277
+ flex-direction: column;
278
+ gap: 4px;
279
+ }
280
+
281
+ .label {
282
+ font-size: 12px;
283
+ color: var(--neutral-60, #666);
284
+ font-weight: 500;
285
+ }
286
+
287
+ .address-display {
288
+ display: inline-flex;
289
+ align-items: center;
290
+ gap: 8px;
291
+ cursor: pointer;
292
+ padding: 4px;
293
+ border-radius: 4px;
294
+ transition: background-color 0.2s;
295
+ min-width: 200px;
296
+ }
297
+
298
+ .address-display:hover {
299
+ background-color: var(--neutral-95, #f5f5f5);
300
+ }
301
+
302
+ .identity {
303
+ font-size: 12px;
304
+ color: var(--neutral-60, #666);
305
+ margin-right: 4px;
306
+ }
307
+
308
+ .copy-button {
309
+ background: none;
310
+ border: 1px solid var(--neutral-80, #ccc);
311
+ border-radius: 4px;
312
+ padding: 2px 4px;
313
+ cursor: pointer;
314
+ font-size: 12px;
315
+ opacity: 0;
316
+ transition: opacity 0.2s;
317
+ }
318
+
319
+ .copy-button:hover {
320
+ background-color: var(--neutral-90, #eee);
321
+ }
322
+
323
+ .address-display:hover .copy-button {
324
+ opacity: 1;
325
+ }
326
+
327
+
328
+ /* Ensure LUKSO web components are properly styled */
329
+ lukso-profile,
330
+ lukso-username {
331
+ display: inline-flex;
332
+ align-items: center;
333
+ }
334
+ `;
335
+ __decorateClass([
336
+ (0, import_decorators.property)()
337
+ ], AddressDisplay.prototype, "value", 2);
338
+ __decorateClass([
339
+ (0, import_decorators.property)()
340
+ ], AddressDisplay.prototype, "address", 2);
341
+ __decorateClass([
342
+ (0, import_decorators.property)({ type: Object })
343
+ ], AddressDisplay.prototype, "resolved", 2);
344
+ __decorateClass([
345
+ (0, import_decorators.property)()
346
+ ], AddressDisplay.prototype, "size", 2);
347
+ __decorateClass([
348
+ (0, import_decorators.property)()
349
+ ], AddressDisplay.prototype, "label", 2);
350
+ __decorateClass([
351
+ (0, import_decorators.property)({ type: Boolean, attribute: "show-copy-button" })
352
+ ], AddressDisplay.prototype, "showCopyButton", 2);
353
+ __decorateClass([
354
+ (0, import_decorators.property)({ type: Boolean, attribute: "name-only" })
355
+ ], AddressDisplay.prototype, "nameOnly", 2);
356
+ __decorateClass([
357
+ (0, import_decorators.property)({ type: Number, attribute: "max-width" })
358
+ ], AddressDisplay.prototype, "maxWidth", 2);
359
+ __decorateClass([
360
+ (0, import_decorators.state)()
361
+ ], AddressDisplay.prototype, "imageData", 2);
362
+ __decorateClass([
363
+ (0, import_decorators.state)()
364
+ ], AddressDisplay.prototype, "isLoadingImage", 2);
365
+ AddressDisplay = __decorateClass([
366
+ safeCustomElement("address-display")
367
+ ], AddressDisplay);
368
+
369
+ // src/shared/address-view.ts
370
+ var import_task2 = require("@lit/task");
371
+ var import_transaction_view_headless2 = require("@lukso/transaction-view-headless");
372
+ var import_ethereum_blockies_base64 = __toESM(require("ethereum-blockies-base64"), 1);
373
+ var import_lit3 = require("lit");
374
+ var import_decorators2 = require("lit/decorators.js");
375
+
376
+ // src/shared/load-web-components.ts
377
+ var originalDefine = typeof customElements !== "undefined" ? customElements.define.bind(customElements) : null;
378
+ if (typeof customElements !== "undefined" && originalDefine) {
379
+ customElements.define = function(name, constructor, options) {
380
+ if (!customElements.get(name)) {
381
+ originalDefine(name, constructor, options);
382
+ }
383
+ };
384
+ }
385
+ if (originalDefine && typeof customElements !== "undefined") {
386
+ customElements.define = originalDefine;
387
+ }
388
+
389
+ // src/styles/styles.css?__raw__
390
+ var styles_default = '/**\n * @file Main styles\n *\n * This file contain general styles that should be applied to host page.\n */\n:root {\n --neutral-10: #121b21;\n --neutral-15: #1b2832;\n --neutral-20: #243542;\n --neutral-25: #2d4253;\n --neutral-30: #365063;\n --neutral-35: #3e5d74;\n --neutral-40: #476a85;\n --neutral-45: #507795;\n --neutral-50: #5985a6;\n --neutral-55: #6a91af;\n --neutral-60: #7a9db8;\n --neutral-65: #8ba9c1;\n --neutral-70: #9cb6c9;\n --neutral-75: #acc2d2;\n --neutral-80: #bdcedb;\n --neutral-85: #cddae4;\n --neutral-90: #dee7ed;\n --neutral-95: #eef3f6;\n --neutral-97: #f5f8fa;\n --neutral-98: #f8fafb;\n --neutral-100: #ffffff;\n --honey-72: #fad275;\n --honey-75: #fbd784;\n --honey-82: #fce2a6;\n --honey-85: #fce7b5;\n --honey-92: #fef2d8;\n --coral-65: #f37c58;\n --coral-74: #f69e83;\n --coral-75: #f7a288;\n --coral-84: #fac3b3;\n --coral-85: #fac7b7;\n --coral-94: #fde9e2;\n --warm-77: #ffbb8a;\n --warm-87: #ffd8bd;\n --warm-97: #fff6f0;\n --sea-salt-57: #7fa4a4;\n --sea-salt-67: #9db9b9;\n --sea-salt-88: #dbe6e6;\n --cloud-43: #447c97;\n --cloud-75: #a7c7d7;\n --cloud-88: #d5e4ec;\n --ocean-38: #3c6286;\n --ocean-75: #a7c0d7;\n --ocean-88: #d5e1ec;\n --sky-64: #68a5de;\n --sky-75: #96c1e8;\n --sky-85: #c0daf1;\n --lukso-50: #aa5578;\n --lukso-60: #bb7793;\n --lukso-70: #cc99ae;\n --lukso-80: #ddbbc9;\n --lukso-90: #eedde4;\n --yellow-25: #804d00;\n --yellow-55: #ffa31a;\n --yellow-65: #ffb84d;\n --yellow-75: #ffcc80;\n --yellow-85: #ffe0b3;\n --yellow-95: #fff5e5;\n --green-45: #31b452;\n --green-54: #47cd68;\n --green-63: #6bd686;\n --green-75: #9be4ad;\n --green-85: #c3efce;\n --green-95: #ebfaef;\n --blue-40: #0452c8;\n --blue-50: #0567fa;\n --blue-60: #3785fb;\n --blue-75: #82b3fc;\n --blue-85: #b4d1fd;\n --blue-95: #e6f0fe;\n --red-55: #e23636;\n --red-65: #e96363;\n --red-75: #ef8f8f;\n --red-85: #f5bcbc;\n --red-95: #fce9e9;\n --purple-15: #1d202f;\n --purple-18: #232739;\n --purple-31: #3c4262;\n --purple-41: #4f5882;\n --purple-51: #646ea0;\n --purple-58: #7a83ae;\n --purple-63: #8a92b7;\n --purple-82: #c6cadc;\n --purple-94: #ecedf3;\n --pink-90: #f8dad3;\n --pink-91: #f9ddd7;\n --pink-92: #f9e1dc;\n --pink-93: #fae5e0;\n --pink-94: #fbe9e5;\n --pink-95: #fcece9;\n --pink-96: #fcf0ed;\n --pink-97: #fdf4f2;\n --measure-50: #e8178a;\n --measure-70: #f174b9;\n --measure-80: #f6a2d0;\n --measure-97: #fef1f8;\n --grey-10: #1a1a1a;\n --grey-15: #262626;\n --grey-20: #333333;\n --grey-25: #404040;\n --grey-30: #4d4d4d;\n --grey-35: #595959;\n --grey-40: #666666;\n --grey-45: #737373;\n --grey-50: #808080;\n --grey-55: #8c8c8c;\n --grey-60: #999999;\n --grey-65: #a6a6a6;\n --grey-70: #b3b3b3;\n --grey-75: #bfbfbf;\n --grey-80: #cccccc;\n --gradient-1-start: #D39B9D;\n --gradient-1-end: #9071D1;\n --gradient-2-start: #F8DAD3;\n --gradient-2-end: #CC99AE;\n --gradient-3-start: #393e56;\n --gradient-3-end: #646ea0;\n}\n/**\n * @file Fonts\n *\n * This file contains all fonts used in designs.\n */\n@font-face {\n font-family: Inter;\n src: url("/assets/fonts/Inter-Regular.woff2") format("woff2");\n font-weight: normal;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: Inter;\n src: url("/assets/fonts/Inter-ExtraBold.woff2") format("woff2");\n font-weight: 800;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: Inter;\n src: url("/assets/fonts/Inter-Bold.woff2") format("woff2");\n font-weight: bold;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: Inter;\n src: url("/assets/fonts/Inter-SemiBold.woff2") format("woff2");\n font-weight: 600;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: Inter;\n src: url("/assets/fonts/Inter-Medium.woff2") format("woff2");\n font-weight: 500;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: Inter;\n src: url("/assets/fonts/Inter-Thin.woff2") format("woff2");\n font-weight: 100;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: "PT Mono";\n src: url("/assets/fonts/PT-Mono-Regular.woff2") format("woff2");\n font-weight: normal;\n font-style: normal;\n}\n@font-face {\n font-family: "PT Mono";\n src: url("/assets/fonts/PT-Mono-Bold.woff2") format("woff2");\n font-weight: bold;\n font-style: normal;\n}\n/**\n * @file Typography\n *\n * This file contains all typography classes used in designs.\n * They should be used instead of individual font attributes.\n *\n * You can use them same as the normal Tailwind classes, e.g.: class="heading-inter-26-semi-bold"\n */\n/**\n * @file Variables\n *\n * This file contains all CSS variables used in designs.\n */\n.tippy-box[data-animation=fade][data-state=hidden] {\n opacity: 0;\n}\n.tippy-arrow::before {\n content: "";\n position: absolute;\n border-color: transparent;\n border-style: solid;\n}\n.tippy-box[data-placement^=top] > .tippy-arrow::before {\n border-top-color: initial;\n transform-origin: center top;\n}\n.tippy-box[data-placement^=bottom] > .tippy-arrow::before {\n border-bottom-color: initial;\n transform-origin: center bottom;\n}\n.tippy-box[data-placement^=left] > .tippy-arrow::before {\n border-left-color: initial;\n transform-origin: center left;\n}\n.tippy-box[data-placement^=right] > .tippy-arrow::before {\n border-right-color: initial;\n transform-origin: center right;\n}\n.tippy-box[data-inertia][data-state=visible] {\n transition-timing-function: cubic-bezier(0.54, 1.5, 0.38, 1.11);\n}\n.tippy-arrow {\n width: 16px;\n height: 16px;\n}\n.tippy-size-medium {\n border-radius: 4px;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 10px;\n font-weight: 600;\n font-style: normal;\n line-height: 12px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-size-medium[data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-size-medium[data-placement^=top] > .tippy-arrow::before {\n bottom: -6px;\n left: 2px;\n border-width: 6px 6px 0;\n}\n.tippy-size-medium[data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-size-medium[data-placement^=bottom] > .tippy-arrow::before {\n top: -6px;\n left: 2px;\n border-width: 0 6px 6px;\n}\n.tippy-size-medium[data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-size-medium[data-placement^=left] > .tippy-arrow::before {\n border-width: 6px 0 6px 6px;\n right: -6px;\n top: 2px;\n}\n.tippy-size-medium[data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-size-medium[data-placement^=right] > .tippy-arrow::before {\n left: -6px;\n top: 2px;\n border-width: 6px 6px 6px 0;\n}\n.tippy-size-large {\n border-radius: 8px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 400;\n font-style: normal;\n line-height: 20px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-size-large[data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-size-large[data-placement^=top] > .tippy-arrow::before {\n bottom: -8px;\n left: 0;\n border-width: 8px 8px 0;\n}\n.tippy-size-large[data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-size-large[data-placement^=bottom] > .tippy-arrow::before {\n top: -8px;\n left: 0;\n border-width: 0 8px 8px;\n}\n.tippy-size-large[data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-size-large[data-placement^=left] > .tippy-arrow::before {\n border-width: 8px 0 8px 8px;\n right: -8px;\n}\n.tippy-size-large[data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-size-large[data-placement^=right] > .tippy-arrow::before {\n left: -8px;\n border-width: 8px 8px 8px 0;\n}\n.tippy-variant-dark {\n --tw-bg-opacity: 1;\n background-color: rgb(54 80 99 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-variant-dark[data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-dark[data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-dark[data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-dark[data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-dark > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(54 80 99 / var(--tw-bg-opacity, 1));\n}\n.tippy-variant-dark > .tippy-svg-arrow {\n fill: #365063;\n}\n.tippy-variant-light {\n --tw-bg-opacity: 1;\n background-color: rgb(245 248 250 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(36 53 66 / var(--tw-text-opacity, 1));\n}\n.tippy-variant-light[data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-light[data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-light[data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-light[data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-light > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(245 248 250 / var(--tw-bg-opacity, 1));\n}\n.tippy-variant-light > .tippy-svg-arrow {\n fill: #f5f8fa;\n}\n.tippy-variant-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(36 53 66 / var(--tw-text-opacity, 1));\n}\n.tippy-variant-white[data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-white[data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-white[data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-white[data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-white > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.tippy-variant-white > .tippy-svg-arrow {\n fill: #ffffff;\n}\n.tippy-variant-success {\n --tw-bg-opacity: 1;\n background-color: rgb(71 205 104 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-variant-success[data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-success[data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-success[data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-success[data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-success > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(71 205 104 / var(--tw-bg-opacity, 1));\n}\n.tippy-variant-success > .tippy-svg-arrow {\n fill: #47cd68;\n}\n.tippy-variant-danger {\n --tw-bg-opacity: 1;\n background-color: rgb(233 99 99 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-variant-danger[data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-danger[data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-danger[data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-danger[data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-variant-danger > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(233 99 99 / var(--tw-bg-opacity, 1));\n}\n.tippy-variant-danger > .tippy-svg-arrow {\n fill: #e96363;\n}\n.tippy-box[data-theme~=dark-medium] {\n border-radius: 4px;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 10px;\n font-weight: 600;\n font-style: normal;\n line-height: 12px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=top] > .tippy-arrow::before {\n bottom: -6px;\n left: 2px;\n border-width: 6px 6px 0;\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=bottom] > .tippy-arrow::before {\n top: -6px;\n left: 2px;\n border-width: 0 6px 6px;\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=left] > .tippy-arrow::before {\n border-width: 6px 0 6px 6px;\n right: -6px;\n top: 2px;\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=right] > .tippy-arrow::before {\n left: -6px;\n top: 2px;\n border-width: 6px 6px 6px 0;\n}\n.tippy-box[data-theme~=dark-medium] {\n --tw-bg-opacity: 1;\n background-color: rgb(54 80 99 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-medium][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-medium] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(54 80 99 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=dark-medium] > .tippy-svg-arrow {\n fill: #365063;\n}\n.tippy-box[data-theme~=dark-large] {\n border-radius: 8px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 400;\n font-style: normal;\n line-height: 20px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=dark-large][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=dark-large][data-placement^=top] > .tippy-arrow::before {\n bottom: -8px;\n left: 0;\n border-width: 8px 8px 0;\n}\n.tippy-box[data-theme~=dark-large][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=dark-large][data-placement^=bottom] > .tippy-arrow::before {\n top: -8px;\n left: 0;\n border-width: 0 8px 8px;\n}\n.tippy-box[data-theme~=dark-large][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=dark-large][data-placement^=left] > .tippy-arrow::before {\n border-width: 8px 0 8px 8px;\n right: -8px;\n}\n.tippy-box[data-theme~=dark-large][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=dark-large][data-placement^=right] > .tippy-arrow::before {\n left: -8px;\n border-width: 8px 8px 8px 0;\n}\n.tippy-box[data-theme~=dark-large] {\n --tw-bg-opacity: 1;\n background-color: rgb(54 80 99 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=dark-large][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-large][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-large][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-large][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(54 80 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=dark-large] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(54 80 99 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=dark-large] > .tippy-svg-arrow {\n fill: #365063;\n}\n.tippy-box[data-theme~=light-medium] {\n border-radius: 4px;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 10px;\n font-weight: 600;\n font-style: normal;\n line-height: 12px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=light-medium][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=light-medium][data-placement^=top] > .tippy-arrow::before {\n bottom: -6px;\n left: 2px;\n border-width: 6px 6px 0;\n}\n.tippy-box[data-theme~=light-medium][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=light-medium][data-placement^=bottom] > .tippy-arrow::before {\n top: -6px;\n left: 2px;\n border-width: 0 6px 6px;\n}\n.tippy-box[data-theme~=light-medium][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=light-medium][data-placement^=left] > .tippy-arrow::before {\n border-width: 6px 0 6px 6px;\n right: -6px;\n top: 2px;\n}\n.tippy-box[data-theme~=light-medium][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=light-medium][data-placement^=right] > .tippy-arrow::before {\n left: -6px;\n top: 2px;\n border-width: 6px 6px 6px 0;\n}\n.tippy-box[data-theme~=light-medium] {\n --tw-bg-opacity: 1;\n background-color: rgb(245 248 250 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(36 53 66 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=light-medium][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-medium][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-medium][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-medium][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-medium] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(245 248 250 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=light-medium] > .tippy-svg-arrow {\n fill: #f5f8fa;\n}\n.tippy-box[data-theme~=light-large] {\n border-radius: 8px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 400;\n font-style: normal;\n line-height: 20px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=light-large][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=light-large][data-placement^=top] > .tippy-arrow::before {\n bottom: -8px;\n left: 0;\n border-width: 8px 8px 0;\n}\n.tippy-box[data-theme~=light-large][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=light-large][data-placement^=bottom] > .tippy-arrow::before {\n top: -8px;\n left: 0;\n border-width: 0 8px 8px;\n}\n.tippy-box[data-theme~=light-large][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=light-large][data-placement^=left] > .tippy-arrow::before {\n border-width: 8px 0 8px 8px;\n right: -8px;\n}\n.tippy-box[data-theme~=light-large][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=light-large][data-placement^=right] > .tippy-arrow::before {\n left: -8px;\n border-width: 8px 8px 8px 0;\n}\n.tippy-box[data-theme~=light-large] {\n --tw-bg-opacity: 1;\n background-color: rgb(245 248 250 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(36 53 66 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=light-large][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-large][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-large][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-large][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(245 248 250 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=light-large] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(245 248 250 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=light-large] > .tippy-svg-arrow {\n fill: #f5f8fa;\n}\n.tippy-box[data-theme~=white-medium] {\n border-radius: 4px;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 10px;\n font-weight: 600;\n font-style: normal;\n line-height: 12px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=white-medium][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=white-medium][data-placement^=top] > .tippy-arrow::before {\n bottom: -6px;\n left: 2px;\n border-width: 6px 6px 0;\n}\n.tippy-box[data-theme~=white-medium][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=white-medium][data-placement^=bottom] > .tippy-arrow::before {\n top: -6px;\n left: 2px;\n border-width: 0 6px 6px;\n}\n.tippy-box[data-theme~=white-medium][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=white-medium][data-placement^=left] > .tippy-arrow::before {\n border-width: 6px 0 6px 6px;\n right: -6px;\n top: 2px;\n}\n.tippy-box[data-theme~=white-medium][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=white-medium][data-placement^=right] > .tippy-arrow::before {\n left: -6px;\n top: 2px;\n border-width: 6px 6px 6px 0;\n}\n.tippy-box[data-theme~=white-medium] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(36 53 66 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=white-medium][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-medium][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-medium][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-medium][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-medium] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=white-medium] > .tippy-svg-arrow {\n fill: #ffffff;\n}\n.tippy-box[data-theme~=white-large] {\n border-radius: 8px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 400;\n font-style: normal;\n line-height: 20px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=white-large][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=white-large][data-placement^=top] > .tippy-arrow::before {\n bottom: -8px;\n left: 0;\n border-width: 8px 8px 0;\n}\n.tippy-box[data-theme~=white-large][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=white-large][data-placement^=bottom] > .tippy-arrow::before {\n top: -8px;\n left: 0;\n border-width: 0 8px 8px;\n}\n.tippy-box[data-theme~=white-large][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=white-large][data-placement^=left] > .tippy-arrow::before {\n border-width: 8px 0 8px 8px;\n right: -8px;\n}\n.tippy-box[data-theme~=white-large][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=white-large][data-placement^=right] > .tippy-arrow::before {\n left: -8px;\n border-width: 8px 8px 8px 0;\n}\n.tippy-box[data-theme~=white-large] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(36 53 66 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=white-large][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-large][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-large][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-large][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=white-large] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=white-large] > .tippy-svg-arrow {\n fill: #ffffff;\n}\n.tippy-box[data-theme~=success-medium] {\n border-radius: 4px;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 10px;\n font-weight: 600;\n font-style: normal;\n line-height: 12px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=success-medium][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=success-medium][data-placement^=top] > .tippy-arrow::before {\n bottom: -6px;\n left: 2px;\n border-width: 6px 6px 0;\n}\n.tippy-box[data-theme~=success-medium][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=success-medium][data-placement^=bottom] > .tippy-arrow::before {\n top: -6px;\n left: 2px;\n border-width: 0 6px 6px;\n}\n.tippy-box[data-theme~=success-medium][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=success-medium][data-placement^=left] > .tippy-arrow::before {\n border-width: 6px 0 6px 6px;\n right: -6px;\n top: 2px;\n}\n.tippy-box[data-theme~=success-medium][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=success-medium][data-placement^=right] > .tippy-arrow::before {\n left: -6px;\n top: 2px;\n border-width: 6px 6px 6px 0;\n}\n.tippy-box[data-theme~=success-medium] {\n --tw-bg-opacity: 1;\n background-color: rgb(71 205 104 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=success-medium][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-medium][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-medium][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-medium][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-medium] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(71 205 104 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=success-medium] > .tippy-svg-arrow {\n fill: #47cd68;\n}\n.tippy-box[data-theme~=success-large] {\n border-radius: 8px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 400;\n font-style: normal;\n line-height: 20px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=success-large][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=success-large][data-placement^=top] > .tippy-arrow::before {\n bottom: -8px;\n left: 0;\n border-width: 8px 8px 0;\n}\n.tippy-box[data-theme~=success-large][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=success-large][data-placement^=bottom] > .tippy-arrow::before {\n top: -8px;\n left: 0;\n border-width: 0 8px 8px;\n}\n.tippy-box[data-theme~=success-large][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=success-large][data-placement^=left] > .tippy-arrow::before {\n border-width: 8px 0 8px 8px;\n right: -8px;\n}\n.tippy-box[data-theme~=success-large][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=success-large][data-placement^=right] > .tippy-arrow::before {\n left: -8px;\n border-width: 8px 8px 8px 0;\n}\n.tippy-box[data-theme~=success-large] {\n --tw-bg-opacity: 1;\n background-color: rgb(71 205 104 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=success-large][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-large][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-large][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-large][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(71 205 104 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=success-large] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(71 205 104 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=success-large] > .tippy-svg-arrow {\n fill: #47cd68;\n}\n.tippy-box[data-theme~=danger-medium] {\n border-radius: 4px;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 10px;\n font-weight: 600;\n font-style: normal;\n line-height: 12px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=top] > .tippy-arrow::before {\n bottom: -6px;\n left: 2px;\n border-width: 6px 6px 0;\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=bottom] > .tippy-arrow::before {\n top: -6px;\n left: 2px;\n border-width: 0 6px 6px;\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=left] > .tippy-arrow::before {\n border-width: 6px 0 6px 6px;\n right: -6px;\n top: 2px;\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=right] > .tippy-arrow::before {\n left: -6px;\n top: 2px;\n border-width: 6px 6px 6px 0;\n}\n.tippy-box[data-theme~=danger-medium] {\n --tw-bg-opacity: 1;\n background-color: rgb(233 99 99 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-medium][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-medium] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(233 99 99 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=danger-medium] > .tippy-svg-arrow {\n fill: #e96363;\n}\n.tippy-box[data-theme~=danger-large] {\n border-radius: 8px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 400;\n font-style: normal;\n line-height: 20px;\n --tw-shadow: 0px 27px 12px 0px rgba(63, 93, 116, 0.00), 0px 18px 7px 0px rgba(63, 93, 116, 0.02), 0px 10px 6px 0px rgba(63, 93, 116, 0.08), 0px 4px 4px 0px rgba(63, 93, 116, 0.13), 0px 1px 2px 0px rgba(63, 93, 116, 0.15), 0px 0px 14px 0px rgba(63, 93, 116, 0.16);\n --tw-shadow-colored: 0px 27px 12px 0px var(--tw-shadow-color), 0px 18px 7px 0px var(--tw-shadow-color), 0px 10px 6px 0px var(--tw-shadow-color), 0px 4px 4px 0px var(--tw-shadow-color), 0px 1px 2px 0px var(--tw-shadow-color), 0px 0px 14px 0px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tippy-box[data-theme~=danger-large][data-placement^=top] > .tippy-arrow {\n bottom: 0;\n}\n.tippy-box[data-theme~=danger-large][data-placement^=top] > .tippy-arrow::before {\n bottom: -8px;\n left: 0;\n border-width: 8px 8px 0;\n}\n.tippy-box[data-theme~=danger-large][data-placement^=bottom] > .tippy-arrow {\n top: 0;\n}\n.tippy-box[data-theme~=danger-large][data-placement^=bottom] > .tippy-arrow::before {\n top: -8px;\n left: 0;\n border-width: 0 8px 8px;\n}\n.tippy-box[data-theme~=danger-large][data-placement^=left] > .tippy-arrow {\n right: 0;\n}\n.tippy-box[data-theme~=danger-large][data-placement^=left] > .tippy-arrow::before {\n border-width: 8px 0 8px 8px;\n right: -8px;\n}\n.tippy-box[data-theme~=danger-large][data-placement^=right] > .tippy-arrow {\n left: 0;\n}\n.tippy-box[data-theme~=danger-large][data-placement^=right] > .tippy-arrow::before {\n left: -8px;\n border-width: 8px 8px 8px 0;\n}\n.tippy-box[data-theme~=danger-large] {\n --tw-bg-opacity: 1;\n background-color: rgb(233 99 99 / var(--tw-bg-opacity, 1));\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.tippy-box[data-theme~=danger-large][data-placement^=top] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-top-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-large][data-placement^=bottom] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-bottom-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-large][data-placement^=left] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-left-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-large][data-placement^=right] .tippy-arrow::before {\n --tw-border-opacity: 1;\n border-right-color: rgb(233 99 99 / var(--tw-border-opacity, 1));\n}\n.tippy-box[data-theme~=danger-large] > .tippy-backdrop {\n --tw-bg-opacity: 1;\n background-color: rgb(233 99 99 / var(--tw-bg-opacity, 1));\n}\n.tippy-box[data-theme~=danger-large] > .tippy-svg-arrow {\n fill: #e96363;\n}\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n */\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n::before,\n::after {\n --tw-content: \'\';\n}\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user\'s configured `sans` font-family by default.\n5. Use the user\'s configured `sans` font-feature-settings by default.\n6. Use the user\'s configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n/*\nRemove the default font size and weight for headings.\n*/\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\na {\n color: inherit;\n text-decoration: inherit;\n}\n/*\nAdd the correct font weight in Edge and Safari.\n*/\nb,\nstrong {\n font-weight: bolder;\n}\n/*\n1. Use the user\'s configured `mono` font-family by default.\n2. Use the user\'s configured `mono` font-feature-settings by default.\n3. Use the user\'s configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\ncode,\nkbd,\nsamp,\npre {\n font-family: "PT Mono", sans-serif; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n/*\nAdd the correct font size in all browsers.\n*/\nsmall {\n font-size: 80%;\n}\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\nbutton,\nselect {\n text-transform: none;\n}\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\nbutton,\ninput:where([type=\'button\']),\ninput:where([type=\'reset\']),\ninput:where([type=\'submit\']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n:-moz-focusring {\n outline: auto;\n}\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n:-moz-ui-invalid {\n box-shadow: none;\n}\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\nprogress {\n vertical-align: baseline;\n}\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n[type=\'search\'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n/*\nAdd the correct display in Chrome and Safari.\n*/\nsummary {\n display: list-item;\n}\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n/*\nPrevent resizing textareas horizontally by default.\n*/\ntextarea {\n resize: vertical;\n}\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user\'s configured gray 400 color.\n*/\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n/*\nSet the default cursor for buttons.\n*/\nbutton,\n[role="button"] {\n cursor: pointer;\n}\n/*\nMake sure disabled buttons don\'t get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden]:where(:not([hidden="until-found"])) {\n display: none;\n}\n.heading-inter-21-semi-bold {\n font-family: Inter, sans-serif;\n font-size: 21px;\n font-weight: 600;\n font-style: normal;\n line-height: 26px;\n}\n.heading-inter-17-semi-bold {\n font-family: Inter, sans-serif;\n font-size: 17px;\n font-weight: 600;\n font-style: normal;\n line-height: 22px;\n}\n.heading-inter-14-bold {\n font-family: Inter, sans-serif;\n font-size: 14px;\n font-weight: 700;\n font-style: normal;\n line-height: 17px;\n}\n.paragraph-inter-20-regular {\n font-family: Inter, sans-serif;\n font-size: 20px;\n font-weight: 400;\n font-style: normal;\n line-height: 32px;\n}\n.paragraph-inter-16-regular {\n font-family: Inter, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-style: normal;\n line-height: 24px;\n}\n.paragraph-inter-14-regular {\n font-family: Inter, sans-serif;\n font-size: 14px;\n font-weight: 400;\n font-style: normal;\n line-height: 22px;\n}\n.paragraph-inter-14-semi-bold {\n font-family: Inter, sans-serif;\n font-size: 14px;\n font-weight: 600;\n font-style: normal;\n line-height: 22px;\n}\n.paragraph-inter-12-regular {\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 400;\n font-style: normal;\n line-height: 20px;\n}\n.paragraph-inter-12-medium {\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 500;\n font-style: normal;\n line-height: 20px;\n}\n.paragraph-inter-12-semi-bold {\n font-family: Inter, sans-serif;\n font-size: 12px;\n font-weight: 600;\n font-style: normal;\n line-height: 20px;\n}\n.paragraph-ptmono-24-bold {\n font-family: "PT Mono", sans-serif;\n font-size: 24px;\n font-weight: 700;\n font-style: normal;\n line-height: 26px;\n}\n.paragraph-ptmono-16-bold {\n font-family: "PT Mono", sans-serif;\n font-size: 16px;\n font-weight: 700;\n font-style: normal;\n line-height: 22px;\n}\n.paragraph-ptmono-14-bold {\n font-family: "PT Mono", sans-serif;\n font-size: 14px;\n font-weight: 700;\n font-style: normal;\n line-height: 20px;\n}\n.paragraph-ptmono-12-bold {\n font-family: "PT Mono", sans-serif;\n font-size: 12px;\n font-weight: 700;\n font-style: normal;\n line-height: 14px;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n.prose {\n color: var(--tw-prose-body);\n max-width: 65ch;\n}\n.prose :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n margin-bottom: 1.25em;\n}\n.prose :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-lead);\n font-size: 1.25em;\n line-height: 1.6;\n margin-top: 1.2em;\n margin-bottom: 1.2em;\n}\n.prose :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-links);\n text-decoration: underline;\n font-weight: 500;\n}\n.prose :where(strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-bold);\n font-weight: 600;\n}\n.prose :where(a strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(blockquote strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(thead th strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: decimal;\n margin-top: 1.25em;\n margin-bottom: 1.25em;\n padding-inline-start: 1.625em;\n}\n.prose :where(ol[type="A"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: upper-alpha;\n}\n.prose :where(ol[type="a"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: lower-alpha;\n}\n.prose :where(ol[type="A" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: upper-alpha;\n}\n.prose :where(ol[type="a" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: lower-alpha;\n}\n.prose :where(ol[type="I"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: upper-roman;\n}\n.prose :where(ol[type="i"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: lower-roman;\n}\n.prose :where(ol[type="I" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: upper-roman;\n}\n.prose :where(ol[type="i" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: lower-roman;\n}\n.prose :where(ol[type="1"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: decimal;\n}\n.prose :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n list-style-type: disc;\n margin-top: 1.25em;\n margin-bottom: 1.25em;\n padding-inline-start: 1.625em;\n}\n.prose :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker {\n font-weight: 400;\n color: var(--tw-prose-counters);\n}\n.prose :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker {\n color: var(--tw-prose-bullets);\n}\n.prose :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-headings);\n font-weight: 600;\n margin-top: 1.25em;\n}\n.prose :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n border-color: var(--tw-prose-hr);\n border-top-width: 1px;\n margin-top: 3em;\n margin-bottom: 3em;\n}\n.prose :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-weight: 500;\n font-style: italic;\n color: var(--tw-prose-quotes);\n border-inline-start-width: 0.25rem;\n border-inline-start-color: var(--tw-prose-quote-borders);\n quotes: "\\201C""\\201D""\\2018""\\2019";\n margin-top: 1.6em;\n margin-bottom: 1.6em;\n padding-inline-start: 1em;\n}\n.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::before {\n content: open-quote;\n}\n.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::after {\n content: close-quote;\n}\n.prose :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-headings);\n font-weight: 800;\n font-size: 2.25em;\n margin-top: 0;\n margin-bottom: 0.8888889em;\n line-height: 1.1111111;\n}\n.prose :where(h1 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-weight: 900;\n color: inherit;\n}\n.prose :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-headings);\n font-weight: 700;\n font-size: 1.5em;\n margin-top: 2em;\n margin-bottom: 1em;\n line-height: 1.3333333;\n}\n.prose :where(h2 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-weight: 800;\n color: inherit;\n}\n.prose :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-headings);\n font-weight: 600;\n font-size: 1.25em;\n margin-top: 1.6em;\n margin-bottom: 0.6em;\n line-height: 1.6;\n}\n.prose :where(h3 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-weight: 700;\n color: inherit;\n}\n.prose :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-headings);\n font-weight: 600;\n margin-top: 1.5em;\n margin-bottom: 0.5em;\n line-height: 1.5;\n}\n.prose :where(h4 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-weight: 700;\n color: inherit;\n}\n.prose :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n display: block;\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-weight: 500;\n font-family: inherit;\n color: var(--tw-prose-kbd);\n box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows);\n font-size: 0.875em;\n border-radius: 0.3125rem;\n padding-top: 0.1875em;\n padding-inline-end: 0.375em;\n padding-bottom: 0.1875em;\n padding-inline-start: 0.375em;\n}\n.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-code);\n font-weight: 600;\n font-size: 0.875em;\n}\n.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before {\n content: "`";\n}\n.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after {\n content: "`";\n}\n.prose :where(a code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(h1 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n font-size: 0.875em;\n}\n.prose :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n font-size: 0.9em;\n}\n.prose :where(h4 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(blockquote code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(thead th code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: inherit;\n}\n.prose :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-pre-code);\n background-color: var(--tw-prose-pre-bg);\n overflow-x: auto;\n font-weight: 400;\n font-size: 0.875em;\n line-height: 1.7142857;\n margin-top: 1.7142857em;\n margin-bottom: 1.7142857em;\n border-radius: 0.375rem;\n padding-top: 0.8571429em;\n padding-inline-end: 1.1428571em;\n padding-bottom: 0.8571429em;\n padding-inline-start: 1.1428571em;\n}\n.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n background-color: transparent;\n border-width: 0;\n border-radius: 0;\n padding: 0;\n font-weight: inherit;\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n}\n.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before {\n content: none;\n}\n.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after {\n content: none;\n}\n.prose :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n width: 100%;\n table-layout: auto;\n margin-top: 2em;\n margin-bottom: 2em;\n font-size: 0.875em;\n line-height: 1.7142857;\n}\n.prose :where(thead):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n border-bottom-width: 1px;\n border-bottom-color: var(--tw-prose-th-borders);\n}\n.prose :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-headings);\n font-weight: 600;\n vertical-align: bottom;\n padding-inline-end: 0.5714286em;\n padding-bottom: 0.5714286em;\n padding-inline-start: 0.5714286em;\n}\n.prose :where(tbody tr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n border-bottom-width: 1px;\n border-bottom-color: var(--tw-prose-td-borders);\n}\n.prose :where(tbody tr:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n border-bottom-width: 0;\n}\n.prose :where(tbody td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n vertical-align: baseline;\n}\n.prose :where(tfoot):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n border-top-width: 1px;\n border-top-color: var(--tw-prose-th-borders);\n}\n.prose :where(tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n vertical-align: top;\n}\n.prose :where(th, td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n text-align: start;\n}\n.prose :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-captions);\n font-size: 0.875em;\n line-height: 1.4285714;\n margin-top: 0.8571429em;\n}\n.prose {\n --tw-prose-body: #374151;\n --tw-prose-headings: #111827;\n --tw-prose-lead: #4b5563;\n --tw-prose-links: #111827;\n --tw-prose-bold: #111827;\n --tw-prose-counters: #6b7280;\n --tw-prose-bullets: #d1d5db;\n --tw-prose-hr: #e5e7eb;\n --tw-prose-quotes: #111827;\n --tw-prose-quote-borders: #e5e7eb;\n --tw-prose-captions: #6b7280;\n --tw-prose-kbd: #111827;\n --tw-prose-kbd-shadows: rgb(17 24 39 / 10%);\n --tw-prose-code: #111827;\n --tw-prose-pre-code: #e5e7eb;\n --tw-prose-pre-bg: #1f2937;\n --tw-prose-th-borders: #d1d5db;\n --tw-prose-td-borders: #e5e7eb;\n --tw-prose-invert-body: #d1d5db;\n --tw-prose-invert-headings: #fff;\n --tw-prose-invert-lead: #9ca3af;\n --tw-prose-invert-links: #fff;\n --tw-prose-invert-bold: #fff;\n --tw-prose-invert-counters: #9ca3af;\n --tw-prose-invert-bullets: #4b5563;\n --tw-prose-invert-hr: #374151;\n --tw-prose-invert-quotes: #f3f4f6;\n --tw-prose-invert-quote-borders: #374151;\n --tw-prose-invert-captions: #9ca3af;\n --tw-prose-invert-kbd: #fff;\n --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);\n --tw-prose-invert-code: #fff;\n --tw-prose-invert-pre-code: #d1d5db;\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\n --tw-prose-invert-th-borders: #4b5563;\n --tw-prose-invert-td-borders: #374151;\n font-size: 1rem;\n line-height: 1.75;\n}\n.prose :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n}\n.prose :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.375em;\n}\n.prose :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.375em;\n}\n.prose :where(.prose > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.75em;\n margin-bottom: 0.75em;\n}\n.prose :where(.prose > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n}\n.prose :where(.prose > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.25em;\n}\n.prose :where(.prose > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n}\n.prose :where(.prose > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.25em;\n}\n.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.75em;\n margin-bottom: 0.75em;\n}\n.prose :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n margin-bottom: 1.25em;\n}\n.prose :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n padding-inline-start: 1.625em;\n}\n.prose :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-top: 0.5714286em;\n padding-inline-end: 0.5714286em;\n padding-bottom: 0.5714286em;\n padding-inline-start: 0.5714286em;\n}\n.prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose :where(.prose > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose :where(.prose > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 0;\n}\n.prose-sm {\n font-size: 0.875rem;\n line-height: 1.6;\n}\n.prose-sm :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n line-height: 1.5;\n}\n.prose-sm :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.2857143em;\n line-height: 1.5555556;\n margin-top: 0.8888889em;\n margin-bottom: 0.8888889em;\n}\n.prose-sm :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.1111111em;\n padding-left: 1em;\n border-left-width: 0.25rem;\n font-style: italic;\n color: inherit;\n}\n.prose-sm :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 2.1428571em;\n margin-top: 0.75em;\n margin-bottom: 0.5em;\n line-height: 1.2;\n}\n.prose-sm :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.4285714em;\n margin-top: 0.65em;\n margin-bottom: 0.45em;\n line-height: 1.25;\n}\n.prose-sm :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.2857143em;\n margin-top: 0.6em;\n margin-bottom: 0.4em;\n line-height: 1.3;\n}\n.prose-sm :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.35em;\n line-height: 1.35;\n}\n.prose-sm :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7142857em;\n margin-bottom: 1.7142857em;\n}\n.prose-sm :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7142857em;\n margin-bottom: 1.7142857em;\n}\n.prose-sm :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-sm :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7142857em;\n margin-bottom: 1.7142857em;\n}\n.prose-sm :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8571429em;\n border-radius: 0.3125rem;\n padding-top: 0.1428571em;\n padding-inline-end: 0.3571429em;\n padding-bottom: 0.1428571em;\n padding-inline-start: 0.3571429em;\n}\n.prose-sm :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8571429em;\n}\n.prose-sm :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n}\n.prose-sm :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8888889em;\n}\n.prose-sm :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8571429em;\n line-height: 1.45;\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n border-radius: 0.25rem;\n padding-top: 0.6666667em;\n padding-inline-end: 1em;\n padding-bottom: 0.6666667em;\n padding-inline-start: 1em;\n box-sizing: border-box;\n max-width: 100%;\n overflow-x: auto;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n.prose-sm :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.5714286em;\n padding-left: 1.25em;\n}\n.prose-sm :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.5714286em;\n padding-left: 1.25em;\n}\n.prose-sm :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-sm :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4285714em;\n}\n.prose-sm :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4285714em;\n}\n.prose-sm :where(.prose-sm > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5714286em;\n margin-bottom: 0.5714286em;\n}\n.prose-sm :where(.prose-sm > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.1428571em;\n}\n.prose-sm :where(.prose-sm > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.1428571em;\n}\n.prose-sm :where(.prose-sm > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.1428571em;\n}\n.prose-sm :where(.prose-sm > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.1428571em;\n}\n.prose-sm :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-sm :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.1428571em;\n margin-bottom: 1.1428571em;\n}\n.prose-sm :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.1428571em;\n}\n.prose-sm :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.2857143em;\n padding-inline-start: 1.5714286em;\n}\n.prose-sm :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-sm :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-sm :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-sm :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-sm :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-sm :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8571429em;\n line-height: 1.5;\n}\n.prose-sm :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 1em;\n padding-bottom: 0.6666667em;\n padding-inline-start: 1em;\n}\n.prose-sm :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-sm :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-sm :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-top: 0.6666667em;\n padding-inline-end: 1em;\n padding-bottom: 0.6666667em;\n padding-inline-start: 1em;\n}\n.prose-sm :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-sm :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-sm :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7142857em;\n margin-bottom: 1.7142857em;\n}\n.prose-sm :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-sm :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8571429em;\n line-height: 1.3333333;\n margin-top: 0.6666667em;\n}\n.prose-sm :where(.prose-sm > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-sm :where(.prose-sm > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 0;\n}\n.prose-sm {\n max-width: none;\n}\n.prose-sm :where(h5):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.45em;\n margin-bottom: 0.3em;\n line-height: 1.4;\n}\n.prose-sm :where(h6):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.4em;\n margin-bottom: 0.25em;\n line-height: 1.45;\n}\n.prose-sm :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-links);\n text-decoration: underline;\n font-weight: 500;\n}\n.prose-sm :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)):hover {\n color: var(--tw-prose-links-hover, var(--tw-prose-links));\n text-decoration: none;\n}\n.prose-base {\n font-size: 1rem;\n line-height: 1.6;\n}\n.prose-base :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n line-height: 1.5;\n}\n.prose-base :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.25em;\n line-height: 1.6;\n margin-top: 1.2em;\n margin-bottom: 1.2em;\n}\n.prose-base :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1em;\n padding-left: 1em;\n border-left-width: 0.25rem;\n font-style: italic;\n color: inherit;\n}\n.prose-base :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 2.25em;\n margin-top: 0.75em;\n margin-bottom: 0.5em;\n line-height: 1.2;\n}\n.prose-base :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.5em;\n margin-top: 0.65em;\n margin-bottom: 0.45em;\n line-height: 1.25;\n}\n.prose-base :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.25em;\n margin-top: 0.6em;\n margin-bottom: 0.4em;\n line-height: 1.3;\n}\n.prose-base :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.35em;\n line-height: 1.35;\n}\n.prose-base :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-base :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-base :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-base :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-base :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n border-radius: 0.3125rem;\n padding-top: 0.1875em;\n padding-inline-end: 0.375em;\n padding-bottom: 0.1875em;\n padding-inline-start: 0.375em;\n}\n.prose-base :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n}\n.prose-base :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n}\n.prose-base :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n}\n.prose-base :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n line-height: 1.45;\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n border-radius: 0.375rem;\n padding-top: 0.8571429em;\n padding-inline-end: 1.1428571em;\n padding-bottom: 0.8571429em;\n padding-inline-start: 1.1428571em;\n box-sizing: border-box;\n max-width: 100%;\n overflow-x: auto;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n.prose-base :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.625em;\n padding-left: 1.25em;\n}\n.prose-base :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.625em;\n padding-left: 1.25em;\n}\n.prose-base :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-base :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.375em;\n}\n.prose-base :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.375em;\n}\n.prose-base :where(.prose-base > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.75em;\n margin-bottom: 0.75em;\n}\n.prose-base :where(.prose-base > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n}\n.prose-base :where(.prose-base > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.25em;\n}\n.prose-base :where(.prose-base > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n}\n.prose-base :where(.prose-base > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.25em;\n}\n.prose-base :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-base :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n margin-bottom: 1.25em;\n}\n.prose-base :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.25em;\n}\n.prose-base :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n padding-inline-start: 1.625em;\n}\n.prose-base :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-base :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-base :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-base :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-base :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-base :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n line-height: 1.7142857;\n}\n.prose-base :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0.5714286em;\n padding-bottom: 0.5714286em;\n padding-inline-start: 0.5714286em;\n}\n.prose-base :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-base :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-base :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-top: 0.5714286em;\n padding-inline-end: 0.5714286em;\n padding-bottom: 0.5714286em;\n padding-inline-start: 0.5714286em;\n}\n.prose-base :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-base :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-base :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-base :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-base :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n line-height: 1.4285714;\n margin-top: 0.8571429em;\n}\n.prose-base :where(.prose-base > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-base :where(.prose-base > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 0;\n}\n.prose-base {\n max-width: none;\n}\n.prose-base :where(h5):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.45em;\n margin-bottom: 0.3em;\n line-height: 1.4;\n}\n.prose-base :where(h6):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.4em;\n margin-bottom: 0.25em;\n line-height: 1.45;\n}\n.prose-base :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-links);\n text-decoration: underline;\n font-weight: 500;\n}\n.prose-base :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)):hover {\n color: var(--tw-prose-links-hover, var(--tw-prose-links));\n text-decoration: none;\n}\n.prose-lg {\n font-size: 1.125rem;\n line-height: 1.6;\n}\n.prose-lg :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n line-height: 1.5;\n}\n.prose-lg :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.2222222em;\n line-height: 1.4545455;\n margin-top: 1.0909091em;\n margin-bottom: 1.0909091em;\n}\n.prose-lg :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1em;\n padding-left: 1em;\n border-left-width: 0.25rem;\n font-style: italic;\n color: inherit;\n}\n.prose-lg :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 2.6666667em;\n margin-top: 0.75em;\n margin-bottom: 0.5em;\n line-height: 1.2;\n}\n.prose-lg :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.6666667em;\n margin-top: 0.65em;\n margin-bottom: 0.45em;\n line-height: 1.25;\n}\n.prose-lg :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.3333333em;\n margin-top: 0.6em;\n margin-bottom: 0.4em;\n line-height: 1.3;\n}\n.prose-lg :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.35em;\n line-height: 1.35;\n}\n.prose-lg :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7777778em;\n margin-bottom: 1.7777778em;\n}\n.prose-lg :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7777778em;\n margin-bottom: 1.7777778em;\n}\n.prose-lg :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-lg :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7777778em;\n margin-bottom: 1.7777778em;\n}\n.prose-lg :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8888889em;\n border-radius: 0.3125rem;\n padding-top: 0.2222222em;\n padding-inline-end: 0.4444444em;\n padding-bottom: 0.2222222em;\n padding-inline-start: 0.4444444em;\n}\n.prose-lg :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8888889em;\n}\n.prose-lg :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8666667em;\n}\n.prose-lg :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n}\n.prose-lg :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8888889em;\n line-height: 1.45;\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n border-radius: 0.375rem;\n padding-top: 1em;\n padding-inline-end: 1.5em;\n padding-bottom: 1em;\n padding-inline-start: 1.5em;\n box-sizing: border-box;\n max-width: 100%;\n overflow-x: auto;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n.prose-lg :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.5555556em;\n padding-left: 1.25em;\n}\n.prose-lg :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.5555556em;\n padding-left: 1.25em;\n}\n.prose-lg :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-lg :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4444444em;\n}\n.prose-lg :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4444444em;\n}\n.prose-lg :where(.prose-lg > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.8888889em;\n margin-bottom: 0.8888889em;\n}\n.prose-lg :where(.prose-lg > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n}\n.prose-lg :where(.prose-lg > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.3333333em;\n}\n.prose-lg :where(.prose-lg > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n}\n.prose-lg :where(.prose-lg > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.3333333em;\n}\n.prose-lg :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-lg :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n margin-bottom: 1.3333333em;\n}\n.prose-lg :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n}\n.prose-lg :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.6666667em;\n padding-inline-start: 1.5555556em;\n}\n.prose-lg :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-lg :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-lg :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-lg :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-lg :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-lg :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8888889em;\n line-height: 1.5;\n}\n.prose-lg :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0.75em;\n padding-bottom: 0.75em;\n padding-inline-start: 0.75em;\n}\n.prose-lg :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-lg :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-lg :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-top: 0.75em;\n padding-inline-end: 0.75em;\n padding-bottom: 0.75em;\n padding-inline-start: 0.75em;\n}\n.prose-lg :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-lg :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-lg :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7777778em;\n margin-bottom: 1.7777778em;\n}\n.prose-lg :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-lg :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8888889em;\n line-height: 1.5;\n margin-top: 1em;\n}\n.prose-lg :where(.prose-lg > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-lg :where(.prose-lg > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 0;\n}\n.prose-lg {\n max-width: none;\n}\n.prose-lg :where(h5):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.45em;\n margin-bottom: 0.3em;\n line-height: 1.4;\n}\n.prose-lg :where(h6):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.4em;\n margin-bottom: 0.25em;\n line-height: 1.45;\n}\n.prose-lg :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-links);\n text-decoration: underline;\n font-weight: 500;\n}\n.prose-lg :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)):hover {\n color: var(--tw-prose-links-hover, var(--tw-prose-links));\n text-decoration: none;\n}\n.prose-xl {\n font-size: 1.25rem;\n line-height: 1.6;\n}\n.prose-xl :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n line-height: 1.5;\n}\n.prose-xl :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.2em;\n line-height: 1.5;\n margin-top: 1em;\n margin-bottom: 1em;\n}\n.prose-xl :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.0666667em;\n padding-left: 1em;\n border-left-width: 0.25rem;\n font-style: italic;\n color: inherit;\n}\n.prose-xl :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 2.8em;\n margin-top: 0.75em;\n margin-bottom: 0.5em;\n line-height: 1.2;\n}\n.prose-xl :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.8em;\n margin-top: 0.65em;\n margin-bottom: 0.45em;\n line-height: 1.25;\n}\n.prose-xl :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.5em;\n margin-top: 0.6em;\n margin-bottom: 0.4em;\n line-height: 1.3;\n}\n.prose-xl :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.35em;\n line-height: 1.35;\n}\n.prose-xl :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-xl :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-xl :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-xl :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-xl :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n border-radius: 0.3125rem;\n padding-top: 0.25em;\n padding-inline-end: 0.4em;\n padding-bottom: 0.25em;\n padding-inline-start: 0.4em;\n}\n.prose-xl :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n}\n.prose-xl :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8611111em;\n}\n.prose-xl :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n}\n.prose-xl :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n line-height: 1.45;\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n border-radius: 0.5rem;\n padding-top: 1.1111111em;\n padding-inline-end: 1.3333333em;\n padding-bottom: 1.1111111em;\n padding-inline-start: 1.3333333em;\n box-sizing: border-box;\n max-width: 100%;\n overflow-x: auto;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n.prose-xl :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.6em;\n padding-left: 1.25em;\n}\n.prose-xl :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n padding-inline-start: 1.6em;\n padding-left: 1.25em;\n}\n.prose-xl :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-xl :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4em;\n}\n.prose-xl :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4em;\n}\n.prose-xl :where(.prose-xl > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.8em;\n margin-bottom: 0.8em;\n}\n.prose-xl :where(.prose-xl > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.2em;\n}\n.prose-xl :where(.prose-xl > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.2em;\n}\n.prose-xl :where(.prose-xl > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.2em;\n}\n.prose-xl :where(.prose-xl > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.2em;\n}\n.prose-xl :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n.prose-xl :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.2em;\n margin-bottom: 1.2em;\n}\n.prose-xl :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.2em;\n}\n.prose-xl :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.6em;\n padding-inline-start: 1.6em;\n}\n.prose-xl :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-xl :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-xl :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-xl :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-xl :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-xl :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n line-height: 1.5555556;\n}\n.prose-xl :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0.6666667em;\n padding-bottom: 0.8888889em;\n padding-inline-start: 0.6666667em;\n}\n.prose-xl :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-xl :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-xl :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-top: 0.8888889em;\n padding-inline-end: 0.6666667em;\n padding-bottom: 0.8888889em;\n padding-inline-start: 0.6666667em;\n}\n.prose-xl :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-xl :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-xl :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-xl :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-xl :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.9em;\n line-height: 1.5555556;\n margin-top: 1em;\n}\n.prose-xl :where(.prose-xl > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-xl :where(.prose-xl > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 0;\n}\n.prose-xl {\n max-width: none;\n}\n.prose-xl :where(h5):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.45em;\n margin-bottom: 0.3em;\n line-height: 1.4;\n}\n.prose-xl :where(h6):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.4em;\n margin-bottom: 0.25em;\n line-height: 1.45;\n}\n.prose-xl :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n color: var(--tw-prose-links);\n text-decoration: underline;\n font-weight: 500;\n}\n.prose-xl :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)):hover {\n color: var(--tw-prose-links-hover, var(--tw-prose-links));\n text-decoration: none;\n}\n.prose-2xl {\n font-size: 1.5rem;\n line-height: 1.6666667;\n}\n.prose-2xl :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n margin-bottom: 1.3333333em;\n}\n.prose-2xl :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.25em;\n line-height: 1.4666667;\n margin-top: 1.0666667em;\n margin-bottom: 1.0666667em;\n}\n.prose-2xl :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.7777778em;\n margin-bottom: 1.7777778em;\n padding-inline-start: 1.1111111em;\n}\n.prose-2xl :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 2.6666667em;\n margin-top: 0;\n margin-bottom: 0.875em;\n line-height: 1;\n}\n.prose-2xl :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 2em;\n margin-top: 1.5em;\n margin-bottom: 0.8333333em;\n line-height: 1.0833333;\n}\n.prose-2xl :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 1.5em;\n margin-top: 1.5555556em;\n margin-bottom: 0.6666667em;\n line-height: 1.2222222;\n}\n.prose-2xl :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.6666667em;\n margin-bottom: 0.6666667em;\n line-height: 1.5;\n}\n.prose-2xl :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-2xl :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-2xl :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-2xl :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-2xl :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8333333em;\n border-radius: 0.375rem;\n padding-top: 0.25em;\n padding-inline-end: 0.3333333em;\n padding-bottom: 0.25em;\n padding-inline-start: 0.3333333em;\n}\n.prose-2xl :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8333333em;\n}\n.prose-2xl :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.875em;\n}\n.prose-2xl :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8888889em;\n}\n.prose-2xl :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8333333em;\n line-height: 1.8;\n margin-top: 2em;\n margin-bottom: 2em;\n border-radius: 0.5rem;\n padding-top: 1.2em;\n padding-inline-end: 1.6em;\n padding-bottom: 1.2em;\n padding-inline-start: 1.6em;\n}\n.prose-2xl :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n margin-bottom: 1.3333333em;\n padding-inline-start: 1.5833333em;\n}\n.prose-2xl :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n margin-bottom: 1.3333333em;\n padding-inline-start: 1.5833333em;\n}\n.prose-2xl :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n}\n.prose-2xl :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4166667em;\n}\n.prose-2xl :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0.4166667em;\n}\n.prose-2xl :where(.prose-2xl > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.8333333em;\n margin-bottom: 0.8333333em;\n}\n.prose-2xl :where(.prose-2xl > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n}\n.prose-2xl :where(.prose-2xl > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.3333333em;\n}\n.prose-2xl :where(.prose-2xl > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n}\n.prose-2xl :where(.prose-2xl > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 1.3333333em;\n}\n.prose-2xl :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.6666667em;\n margin-bottom: 0.6666667em;\n}\n.prose-2xl :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n margin-bottom: 1.3333333em;\n}\n.prose-2xl :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 1.3333333em;\n}\n.prose-2xl :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0.5em;\n padding-inline-start: 1.5833333em;\n}\n.prose-2xl :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 3em;\n margin-bottom: 3em;\n}\n.prose-2xl :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-2xl :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-2xl :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-2xl :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-2xl :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8333333em;\n line-height: 1.4;\n}\n.prose-2xl :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0.6em;\n padding-bottom: 0.8em;\n padding-inline-start: 0.6em;\n}\n.prose-2xl :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-2xl :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-2xl :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-top: 0.8em;\n padding-inline-end: 0.6em;\n padding-bottom: 0.8em;\n padding-inline-start: 0.6em;\n}\n.prose-2xl :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-start: 0;\n}\n.prose-2xl :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n padding-inline-end: 0;\n}\n.prose-2xl :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 2em;\n margin-bottom: 2em;\n}\n.prose-2xl :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n margin-bottom: 0;\n}\n.prose-2xl :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n font-size: 0.8333333em;\n line-height: 1.6;\n margin-top: 1em;\n}\n.prose-2xl :where(.prose-2xl > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-top: 0;\n}\n.prose-2xl :where(.prose-2xl > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {\n margin-bottom: 0;\n}\n.prose-slate {\n --tw-prose-body: #334155;\n --tw-prose-headings: #0f172a;\n --tw-prose-lead: #475569;\n --tw-prose-links: #0f172a;\n --tw-prose-bold: #0f172a;\n --tw-prose-counters: #64748b;\n --tw-prose-bullets: #cbd5e1;\n --tw-prose-hr: #e2e8f0;\n --tw-prose-quotes: #0f172a;\n --tw-prose-quote-borders: #e2e8f0;\n --tw-prose-captions: #64748b;\n --tw-prose-kbd: #0f172a;\n --tw-prose-kbd-shadows: rgb(15 23 42 / 10%);\n --tw-prose-code: #0f172a;\n --tw-prose-pre-code: #e2e8f0;\n --tw-prose-pre-bg: #1e293b;\n --tw-prose-th-borders: #cbd5e1;\n --tw-prose-td-borders: #e2e8f0;\n --tw-prose-invert-body: #cbd5e1;\n --tw-prose-invert-headings: #fff;\n --tw-prose-invert-lead: #94a3b8;\n --tw-prose-invert-links: #fff;\n --tw-prose-invert-bold: #fff;\n --tw-prose-invert-counters: #94a3b8;\n --tw-prose-invert-bullets: #475569;\n --tw-prose-invert-hr: #334155;\n --tw-prose-invert-quotes: #f1f5f9;\n --tw-prose-invert-quote-borders: #334155;\n --tw-prose-invert-captions: #94a3b8;\n --tw-prose-invert-kbd: #fff;\n --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);\n --tw-prose-invert-code: #fff;\n --tw-prose-invert-pre-code: #cbd5e1;\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\n --tw-prose-invert-th-borders: #475569;\n --tw-prose-invert-td-borders: #334155;\n}\n.prose-gray {\n --tw-prose-body: #374151;\n --tw-prose-headings: #111827;\n --tw-prose-lead: #4b5563;\n --tw-prose-links: #111827;\n --tw-prose-bold: #111827;\n --tw-prose-counters: #6b7280;\n --tw-prose-bullets: #d1d5db;\n --tw-prose-hr: #e5e7eb;\n --tw-prose-quotes: #111827;\n --tw-prose-quote-borders: #e5e7eb;\n --tw-prose-captions: #6b7280;\n --tw-prose-kbd: #111827;\n --tw-prose-kbd-shadows: rgb(17 24 39 / 10%);\n --tw-prose-code: #111827;\n --tw-prose-pre-code: #e5e7eb;\n --tw-prose-pre-bg: #1f2937;\n --tw-prose-th-borders: #d1d5db;\n --tw-prose-td-borders: #e5e7eb;\n --tw-prose-invert-body: #d1d5db;\n --tw-prose-invert-headings: #fff;\n --tw-prose-invert-lead: #9ca3af;\n --tw-prose-invert-links: #fff;\n --tw-prose-invert-bold: #fff;\n --tw-prose-invert-counters: #9ca3af;\n --tw-prose-invert-bullets: #4b5563;\n --tw-prose-invert-hr: #374151;\n --tw-prose-invert-quotes: #f3f4f6;\n --tw-prose-invert-quote-borders: #374151;\n --tw-prose-invert-captions: #9ca3af;\n --tw-prose-invert-kbd: #fff;\n --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);\n --tw-prose-invert-code: #fff;\n --tw-prose-invert-pre-code: #d1d5db;\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\n --tw-prose-invert-th-borders: #4b5563;\n --tw-prose-invert-td-borders: #374151;\n}\n.prose-zinc {\n --tw-prose-body: #3f3f46;\n --tw-prose-headings: #18181b;\n --tw-prose-lead: #52525b;\n --tw-prose-links: #18181b;\n --tw-prose-bold: #18181b;\n --tw-prose-counters: #71717a;\n --tw-prose-bullets: #d4d4d8;\n --tw-prose-hr: #e4e4e7;\n --tw-prose-quotes: #18181b;\n --tw-prose-quote-borders: #e4e4e7;\n --tw-prose-captions: #71717a;\n --tw-prose-kbd: #18181b;\n --tw-prose-kbd-shadows: rgb(24 24 27 / 10%);\n --tw-prose-code: #18181b;\n --tw-prose-pre-code: #e4e4e7;\n --tw-prose-pre-bg: #27272a;\n --tw-prose-th-borders: #d4d4d8;\n --tw-prose-td-borders: #e4e4e7;\n --tw-prose-invert-body: #d4d4d8;\n --tw-prose-invert-headings: #fff;\n --tw-prose-invert-lead: #a1a1aa;\n --tw-prose-invert-links: #fff;\n --tw-prose-invert-bold: #fff;\n --tw-prose-invert-counters: #a1a1aa;\n --tw-prose-invert-bullets: #52525b;\n --tw-prose-invert-hr: #3f3f46;\n --tw-prose-invert-quotes: #f4f4f5;\n --tw-prose-invert-quote-borders: #3f3f46;\n --tw-prose-invert-captions: #a1a1aa;\n --tw-prose-invert-kbd: #fff;\n --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);\n --tw-prose-invert-code: #fff;\n --tw-prose-invert-pre-code: #d4d4d8;\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\n --tw-prose-invert-th-borders: #52525b;\n --tw-prose-invert-td-borders: #3f3f46;\n}\n.prose-neutral {\n --tw-prose-body: #404040;\n --tw-prose-headings: #171717;\n --tw-prose-lead: #525252;\n --tw-prose-links: #171717;\n --tw-prose-bold: #171717;\n --tw-prose-counters: #737373;\n --tw-prose-bullets: #d4d4d4;\n --tw-prose-hr: #e5e5e5;\n --tw-prose-quotes: #171717;\n --tw-prose-quote-borders: #e5e5e5;\n --tw-prose-captions: #737373;\n --tw-prose-kbd: #171717;\n --tw-prose-kbd-shadows: rgb(23 23 23 / 10%);\n --tw-prose-code: #171717;\n --tw-prose-pre-code: #e5e5e5;\n --tw-prose-pre-bg: #262626;\n --tw-prose-th-borders: #d4d4d4;\n --tw-prose-td-borders: #e5e5e5;\n --tw-prose-invert-body: #d4d4d4;\n --tw-prose-invert-headings: #fff;\n --tw-prose-invert-lead: #a3a3a3;\n --tw-prose-invert-links: #fff;\n --tw-prose-invert-bold: #fff;\n --tw-prose-invert-counters: #a3a3a3;\n --tw-prose-invert-bullets: #525252;\n --tw-prose-invert-hr: #404040;\n --tw-prose-invert-quotes: #f5f5f5;\n --tw-prose-invert-quote-borders: #404040;\n --tw-prose-invert-captions: #a3a3a3;\n --tw-prose-invert-kbd: #fff;\n --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);\n --tw-prose-invert-code: #fff;\n --tw-prose-invert-pre-code: #d4d4d4;\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\n --tw-prose-invert-th-borders: #525252;\n --tw-prose-invert-td-borders: #404040;\n}\n.prose-stone {\n --tw-prose-body: #44403c;\n --tw-prose-headings: #1c1917;\n --tw-prose-lead: #57534e;\n --tw-prose-links: #1c1917;\n --tw-prose-bold: #1c1917;\n --tw-prose-counters: #78716c;\n --tw-prose-bullets: #d6d3d1;\n --tw-prose-hr: #e7e5e4;\n --tw-prose-quotes: #1c1917;\n --tw-prose-quote-borders: #e7e5e4;\n --tw-prose-captions: #78716c;\n --tw-prose-kbd: #1c1917;\n --tw-prose-kbd-shadows: rgb(28 25 23 / 10%);\n --tw-prose-code: #1c1917;\n --tw-prose-pre-code: #e7e5e4;\n --tw-prose-pre-bg: #292524;\n --tw-prose-th-borders: #d6d3d1;\n --tw-prose-td-borders: #e7e5e4;\n --tw-prose-invert-body: #d6d3d1;\n --tw-prose-invert-headings: #fff;\n --tw-prose-invert-lead: #a8a29e;\n --tw-prose-invert-links: #fff;\n --tw-prose-invert-bold: #fff;\n --tw-prose-invert-counters: #a8a29e;\n --tw-prose-invert-bullets: #57534e;\n --tw-prose-invert-hr: #44403c;\n --tw-prose-invert-quotes: #f5f5f4;\n --tw-prose-invert-quote-borders: #44403c;\n --tw-prose-invert-captions: #a8a29e;\n --tw-prose-invert-kbd: #fff;\n --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);\n --tw-prose-invert-code: #fff;\n --tw-prose-invert-pre-code: #d6d3d1;\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\n --tw-prose-invert-th-borders: #57534e;\n --tw-prose-invert-td-borders: #44403c;\n}\n.prose-red {\n --tw-prose-links: #dc2626;\n --tw-prose-invert-links: #ef4444;\n}\n.prose-orange {\n --tw-prose-links: #ea580c;\n --tw-prose-invert-links: #f97316;\n}\n.prose-amber {\n --tw-prose-links: #d97706;\n --tw-prose-invert-links: #f59e0b;\n}\n.prose-yellow {\n --tw-prose-links: #ca8a04;\n --tw-prose-invert-links: #eab308;\n}\n.prose-lime {\n --tw-prose-links: #65a30d;\n --tw-prose-invert-links: #84cc16;\n}\n.prose-green {\n --tw-prose-links: #16a34a;\n --tw-prose-invert-links: #22c55e;\n}\n.prose-emerald {\n --tw-prose-links: #059669;\n --tw-prose-invert-links: #10b981;\n}\n.prose-teal {\n --tw-prose-links: #0d9488;\n --tw-prose-invert-links: #14b8a6;\n}\n.prose-cyan {\n --tw-prose-links: #0891b2;\n --tw-prose-invert-links: #06b6d4;\n}\n.prose-sky {\n --tw-prose-links: #0284c7;\n --tw-prose-invert-links: #0ea5e9;\n}\n.prose-blue {\n --tw-prose-links: #2563eb;\n --tw-prose-invert-links: #3b82f6;\n}\n.prose-indigo {\n --tw-prose-links: #4f46e5;\n --tw-prose-invert-links: #6366f1;\n}\n.prose-violet {\n --tw-prose-links: #7c3aed;\n --tw-prose-invert-links: #8b5cf6;\n}\n.prose-purple {\n --tw-prose-links: #9333ea;\n --tw-prose-invert-links: #a855f7;\n}\n.prose-fuchsia {\n --tw-prose-links: #c026d3;\n --tw-prose-invert-links: #d946ef;\n}\n.prose-pink {\n --tw-prose-links: #db2777;\n --tw-prose-invert-links: #ec4899;\n}\n.prose-rose {\n --tw-prose-links: #e11d48;\n --tw-prose-invert-links: #f43f5e;\n}\n.prose-invert {\n --tw-prose-body: var(--tw-prose-invert-body);\n --tw-prose-headings: var(--tw-prose-invert-headings);\n --tw-prose-lead: var(--tw-prose-invert-lead);\n --tw-prose-links: var(--tw-prose-invert-links);\n --tw-prose-bold: var(--tw-prose-invert-bold);\n --tw-prose-counters: var(--tw-prose-invert-counters);\n --tw-prose-bullets: var(--tw-prose-invert-bullets);\n --tw-prose-hr: var(--tw-prose-invert-hr);\n --tw-prose-quotes: var(--tw-prose-invert-quotes);\n --tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);\n --tw-prose-captions: var(--tw-prose-invert-captions);\n --tw-prose-kbd: var(--tw-prose-invert-kbd);\n --tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);\n --tw-prose-code: var(--tw-prose-invert-code);\n --tw-prose-pre-code: var(--tw-prose-invert-pre-code);\n --tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);\n --tw-prose-th-borders: var(--tw-prose-invert-th-borders);\n --tw-prose-td-borders: var(--tw-prose-invert-td-borders);\n}\n.prose-inherit {\n --tw-prose-body: inherit;\n --tw-prose-headings: inherit;\n --tw-prose-lead: inherit;\n --tw-prose-links: inherit;\n --tw-prose-bold: inherit;\n --tw-prose-counters: inherit;\n --tw-prose-bullets: inherit;\n}\n.visible {\n visibility: visible;\n}\n.static {\n position: static;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.left-0 {\n left: 0px;\n}\n.left-3 {\n left: 0.75rem;\n}\n.right-4 {\n right: 1rem;\n}\n.top-0 {\n top: 0px;\n}\n.top-3 {\n top: 0.75rem;\n}\n.top-\\[calc\\(100\\%\\+8px\\)\\] {\n top: calc(100% + 8px);\n}\n.-z-10 {\n z-index: -10;\n}\n.z-10 {\n z-index: 10;\n}\n.z-\\[1000\\] {\n z-index: 1000;\n}\n.z-\\[99\\] {\n z-index: 99;\n}\n.col-\\[1\\] {\n grid-column: 1;\n}\n.row-\\[1\\] {\n grid-row: 1;\n}\n.my-3 {\n margin-top: 0.75rem;\n margin-bottom: 0.75rem;\n}\n.my-4 {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n.ml-1 {\n margin-left: 0.25rem;\n}\n.ml-2 {\n margin-left: 0.5rem;\n}\n.mt-1 {\n margin-top: 0.25rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-4 {\n margin-top: 1rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.box-border {\n box-sizing: border-box;\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.inline {\n display: inline;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.contents {\n display: contents;\n}\n.hidden {\n display: none;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-12 {\n height: 3rem;\n}\n.h-14 {\n height: 3.5rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-7 {\n height: 1.75rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-\\[29px\\] {\n height: 29px;\n}\n.h-full {\n height: 100%;\n}\n.h-px {\n height: 1px;\n}\n.min-h-20 {\n min-height: 5rem;\n}\n.w-10 {\n width: 2.5rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-\\[140px\\] {\n width: 140px;\n}\n.w-\\[48\\%\\] {\n width: 48%;\n}\n.w-\\[51\\%\\] {\n width: 51%;\n}\n.w-full {\n width: 100%;\n}\n.min-w-0 {\n min-width: 0px;\n}\n.min-w-20 {\n min-width: 5rem;\n}\n.min-w-\\[280px\\] {\n min-width: 280px;\n}\n.min-w-\\[320px\\] {\n min-width: 320px;\n}\n.min-w-\\[360px\\] {\n min-width: 360px;\n}\n.max-w-\\[60px\\] {\n max-width: 60px;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-none {\n flex: none;\n}\n.flex-shrink {\n flex-shrink: 1;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.rotate-180 {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8,0,1,1);\n }\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0,0,0.2,1);\n }\n}\n.animate-bounce {\n animation: bounce 1s infinite;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.grid-cols-\\[24px_1fr\\] {\n grid-template-columns: 24px 1fr;\n}\n.grid-cols-\\[40px\\2c 1fr\\2c 20px\\] {\n grid-template-columns: 40px 1fr 20px;\n}\n.grid-cols-\\[repeat\\(auto-fill\\2c minmax\\(\\$\\{this\\.getImageMinSizePx\\(\\)\\}px\\2c 300px\\)\\)\\] {\n grid-template-columns: repeat(auto-fill,minmax(${this.getImageMinSizePx()}px,300px));\n}\n.flex-row {\n flex-direction: row;\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-wrap {\n flex-wrap: wrap;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-1\\.5 {\n gap: 0.375rem;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.gap-x-2 {\n -moz-column-gap: 0.5rem;\n column-gap: 0.5rem;\n}\n.self-center {\n align-self: center;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-visible {\n overflow: visible;\n}\n.text-ellipsis {\n text-overflow: ellipsis;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.text-wrap {\n text-wrap: wrap;\n}\n.break-words {\n overflow-wrap: break-word;\n}\n.break-all {\n word-break: break-all;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-xl {\n border-radius: 0.75rem;\n}\n.rounded-t-\\[120px\\] {\n border-top-left-radius: 120px;\n border-top-right-radius: 120px;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-\\[var\\(--neutral-90\\)\\] {\n border-color: var(--neutral-90);\n}\n.border-neutral-90 {\n --tw-border-opacity: 1;\n border-color: rgb(222 231 237 / var(--tw-border-opacity, 1));\n}\n.bg-\\[var\\(--neutral-100\\)\\] {\n background-color: var(--neutral-100);\n}\n.bg-\\[var\\(--neutral-90\\)\\] {\n background-color: var(--neutral-90);\n}\n.bg-blue-85 {\n --tw-bg-opacity: 1;\n background-color: rgb(180 209 253 / var(--tw-bg-opacity, 1));\n}\n.bg-green-85 {\n --tw-bg-opacity: 1;\n background-color: rgb(195 239 206 / var(--tw-bg-opacity, 1));\n}\n.bg-neutral-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-neutral-90 {\n --tw-bg-opacity: 1;\n background-color: rgb(222 231 237 / var(--tw-bg-opacity, 1));\n}\n.bg-neutral-95 {\n --tw-bg-opacity: 1;\n background-color: rgb(238 243 246 / var(--tw-bg-opacity, 1));\n}\n.bg-neutral-98 {\n --tw-bg-opacity: 1;\n background-color: rgb(248 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-red-85 {\n --tw-bg-opacity: 1;\n background-color: rgb(245 188 188 / var(--tw-bg-opacity, 1));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-yellow-85 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 224 179 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[radial-gradient\\(ellipse_75px_52px_at_bottom_center\\2c rgba\\(255\\2c 255\\2c 255\\2c 0\\.78\\)_0\\%\\2c rgba\\(255\\2c 255\\2c 255\\2c 0\\)_112\\.5\\%\\)\\] {\n background-image: radial-gradient(ellipse 75px 52px at bottom center,rgba(255,255,255,0.78) 0%,rgba(255,255,255,0) 112.5%);\n}\n.object-cover {\n -o-object-fit: cover;\n object-fit: cover;\n}\n.p-0 {\n padding: 0px;\n}\n.p-0\\.5 {\n padding: 0.125rem;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-2\\.5 {\n padding: 0.625rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.px-1 {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-5 {\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n}\n.py-0\\.5 {\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-10 {\n padding-top: 2.5rem;\n padding-bottom: 2.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.pt-4 {\n padding-top: 1rem;\n}\n.text-center {\n text-align: center;\n}\n.align-middle {\n vertical-align: middle;\n}\n.font-mono {\n font-family: "PT Mono", sans-serif;\n}\n.text-\\[10px\\] {\n font-size: 10px;\n}\n.text-\\[12px\\] {\n font-size: 12px;\n}\n.text-\\[13px\\] {\n font-size: 13px;\n}\n.text-\\[14px\\] {\n font-size: 14px;\n}\n.text-\\[16px\\] {\n font-size: 16px;\n}\n.text-\\[17px\\] {\n font-size: 17px;\n}\n.text-\\[18px\\] {\n font-size: 18px;\n}\n.text-\\[24px\\] {\n font-size: 24px;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-normal {\n font-weight: 400;\n}\n.font-semibold {\n font-weight: 600;\n}\n.uppercase {\n text-transform: uppercase;\n}\n.italic {\n font-style: italic;\n}\n.leading-none {\n line-height: 1;\n}\n.leading-snug {\n line-height: 1.375;\n}\n.leading-tight {\n line-height: 1.25;\n}\n.text-\\[var\\(--neutral-40\\)\\] {\n color: var(--neutral-40);\n}\n.text-neutral-10 {\n --tw-text-opacity: 1;\n color: rgb(18 27 33 / var(--tw-text-opacity, 1));\n}\n.text-neutral-20 {\n --tw-text-opacity: 1;\n color: rgb(36 53 66 / var(--tw-text-opacity, 1));\n}\n.text-neutral-30 {\n --tw-text-opacity: 1;\n color: rgb(54 80 99 / var(--tw-text-opacity, 1));\n}\n.text-neutral-60 {\n --tw-text-opacity: 1;\n color: rgb(122 157 184 / var(--tw-text-opacity, 1));\n}\n.text-neutral-70 {\n --tw-text-opacity: 1;\n color: rgb(156 182 201 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.underline {\n text-decoration-line: underline;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.mix-blend-difference {\n mix-blend-mode: difference;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-\\[0_0_16px_rgba\\(189\\2c 206\\2c 219\\2c 0\\.4\\)\\] {\n --tw-shadow: 0 0 16px rgba(189,206,219,0.4);\n --tw-shadow-colored: 0 0 16px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.ring-1 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.ring-neutral-90 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(222 231 237 / var(--tw-ring-opacity, 1));\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-700 {\n transition-duration: 700ms;\n}\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\nstrong {\n font-weight: 600;\n}\n.hover\\:scale-105:hover {\n --tw-scale-x: 1.05;\n --tw-scale-y: 1.05;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:bg-neutral-90:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(222 231 237 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-neutral-95:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(238 243 246 / var(--tw-bg-opacity, 1));\n}\n';
391
+
392
+ // src/styles/index.ts
393
+ var import_lit2 = require("lit");
394
+ var style = import_lit2.css`
395
+ ${(0, import_lit2.unsafeCSS)(styles_default)}
396
+
397
+ :host([is-inline]) {
398
+ display: inline-flex;
399
+ align-items: center;
400
+ }
401
+
402
+ :host([is-full-width]) {
403
+ width: 100%;
404
+ flex: 1;
405
+ display: flex;
406
+ }
407
+
408
+ `;
409
+ var CoreLitElement = class extends import_lit2.LitElement {
410
+ static {
411
+ this.styles = [style];
412
+ }
413
+ };
414
+
415
+ // src/shared/address-view.ts
416
+ var AddressView = class extends CoreLitElement {
417
+ constructor() {
418
+ super(...arguments);
419
+ this.size = "small";
420
+ this.nameOnly = false;
421
+ this.addressOnly = false;
422
+ this.isCardView = false;
423
+ this.showCopyButton = false;
424
+ this.maxWidth = 200;
425
+ this.showIdenticon = true;
426
+ this.isLoadingAddress = false;
427
+ // Composables
428
+ this.addressResolver = (0, import_transaction_view_headless2.useAddressResolver)();
429
+ // Task for resolving address data
430
+ this.addressTask = new import_task2.Task(this, {
431
+ task: async ([address], { signal }) => {
432
+ if (!address) return null;
433
+ this.isLoadingAddress = true;
434
+ try {
435
+ const resolved = await this.addressResolver.resolveAddress(address);
436
+ this.requestUpdate();
437
+ return resolved;
438
+ } catch (error) {
439
+ return null;
440
+ } finally {
441
+ this.isLoadingAddress = false;
442
+ }
443
+ },
444
+ args: () => [this.address]
445
+ });
446
+ }
447
+ /**
448
+ * Get the display address (first segment only for compound addresses)
449
+ * e.g., "0x123...-0x456..." becomes "0x123..."
450
+ */
451
+ get displayAddress() {
452
+ return this.address.split("-")[0];
453
+ }
454
+ /**
455
+ * Get display name for the address
456
+ */
457
+ getDisplayName() {
458
+ const resolved = this.addressTask.value;
459
+ if (!resolved) {
460
+ return this.isLoadingAddress ? "Loading..." : "Anonymous";
461
+ }
462
+ const computedName = this.addressResolver.formatDisplayName(resolved);
463
+ return this.label || computedName || "Anonymous";
464
+ }
465
+ /**
466
+ * Check if this is a contract address (non-profile)
467
+ */
468
+ get isContract() {
469
+ const resolved = this.addressTask.value;
470
+ return resolved ? resolved.__gqltype !== "Profile" : false;
471
+ }
472
+ /**
473
+ * Check if this should show the address hash (profiles show hash, contracts don't)
474
+ */
475
+ get shouldShowAddressHash() {
476
+ const resolved = this.addressTask.value;
477
+ return resolved ? resolved.__gqltype === "Profile" : true;
478
+ }
479
+ /**
480
+ * Get prefix for the address display
481
+ */
482
+ get addressPrefix() {
483
+ const resolved = this.addressTask.value;
484
+ return resolved?.hasProfile ? "@" : "";
485
+ }
486
+ /**
487
+ * Check if should show name colors
488
+ */
489
+ get shouldShowNameColor() {
490
+ const resolved = this.addressTask.value;
491
+ return resolved ? this.addressResolver.shouldShowNameColor(resolved) : true;
492
+ }
493
+ /**
494
+ * Handle address click
495
+ */
496
+ handleClick() {
497
+ this.dispatchEvent(
498
+ new CustomEvent("address-click", {
499
+ detail: {
500
+ address: this.address,
501
+ resolved: this.addressTask.value
502
+ },
503
+ bubbles: true
504
+ })
505
+ );
506
+ }
507
+ /** Generate identicon when address changes */
508
+ willUpdate(changed) {
509
+ if (changed.has("address") && this.address) {
510
+ try {
511
+ this.identicon = (0, import_ethereum_blockies_base64.default)(this.displayAddress.toLowerCase());
512
+ } catch {
513
+ this.identicon = void 0;
514
+ }
515
+ }
516
+ }
517
+ /** Copy the display address to clipboard (card view) */
518
+ handleCopy(event) {
519
+ if (event) event.stopPropagation();
520
+ if (navigator.clipboard) {
521
+ navigator.clipboard.writeText(this.displayAddress);
522
+ this.dispatchEvent(
523
+ new CustomEvent("address-copied", {
524
+ detail: { address: this.displayAddress },
525
+ bubbles: true
526
+ })
527
+ );
528
+ }
529
+ }
530
+ /** ========== RENDER HELPERS (Use Cases) ========== */
531
+ /** Pixel size mapping for identicon based on component size */
532
+ getIdenticonSizePx() {
533
+ switch (this.size) {
534
+ case "x-small":
535
+ return 10;
536
+ case "small":
537
+ return 12;
538
+ case "medium":
539
+ return 14;
540
+ case "large":
541
+ return 16;
542
+ default:
543
+ return 14;
544
+ }
545
+ }
546
+ /**
547
+ * Render only the name (and optionally the address hash when allowed for profiles)
548
+ */
549
+ renderNameOnly(displayName) {
550
+ return import_lit3.html`
551
+ <!-- Name Only Use Case -->
552
+ <lukso-username
553
+ class="inline-block align-middle"
554
+ name=${displayName}
555
+ address=${this.address}
556
+ size=${this.size}
557
+ max-width=${this.maxWidth}
558
+ prefix=${this.addressPrefix}
559
+ address-color=${this.addressColor}
560
+ name-color=${this.nameColor}
561
+ ></lukso-username>
562
+ `;
563
+ }
564
+ /**
565
+ * Render only the raw address (no name)
566
+ */
567
+ renderAddressOnly() {
568
+ return import_lit3.html`
569
+ <!-- Address Only Use Case -->
570
+ <lukso-username
571
+ class="inline-block align-middle"
572
+ address=${this.displayAddress}
573
+ size=${this.size}
574
+ max-width=${this.maxWidth}
575
+ has-name-color="false"
576
+ ?has-address-color=${this.shouldShowNameColor}
577
+ ></lukso-username>
578
+ `;
579
+ }
580
+ /**
581
+ * Render both name and (conditionally) the address hash (profiles show hash, contracts may hide it)
582
+ */
583
+ renderNameAndAddress(displayName) {
584
+ return import_lit3.html`
585
+ <!-- Name + Address Use Case -->
586
+ <lukso-username
587
+ class="inline-block align-middle"
588
+ name=${displayName}
589
+ address=${this.address}
590
+ size=${this.size}
591
+ max-width=${this.maxWidth}
592
+ prefix=${this.addressPrefix}
593
+ address-color=${this.addressColor}
594
+ name-color=${this.nameColor}
595
+ ></lukso-username>
596
+ `;
597
+ }
598
+ renderIdenticon() {
599
+ if (!this.showIdenticon || !this.identicon) return "";
600
+ const size = this.getIdenticonSizePx();
601
+ return import_lit3.html`
602
+ <div class="inline-flex items-center justify-center align-middle">
603
+ <img
604
+ class="inline-block rounded-full ring-1 ring-neutral-90 shrink-0"
605
+ src=${this.identicon}
606
+ alt="identicon"
607
+ style="width:${size}px;height:${size}px;image-rendering:pixelated;"
608
+ />
609
+ </div>
610
+ `;
611
+ }
612
+ /** Map size to a typography class for the label */
613
+ getLabelClass() {
614
+ switch (this.size) {
615
+ case "x-small":
616
+ return "paragraph-inter-12-semi-bold";
617
+ case "small":
618
+ return "heading-inter-14-bold";
619
+ case "medium":
620
+ return "heading-inter-17-semi-bold";
621
+ case "large":
622
+ return "heading-inter-21-semi-bold";
623
+ default:
624
+ return "heading-inter-17-semi-bold";
625
+ }
626
+ }
627
+ renderDisplayName() {
628
+ const displayName = this.getDisplayName();
629
+ return this.label ? import_lit3.html`<div class="inline-flex items-center gap-2 font-semibold text-neutral-20 ${this.getLabelClass()}">${this.label}</div>` : import_lit3.html`<lukso-username
630
+ class="inline-block align-middle"
631
+ name=${displayName}
632
+ size=${this.size}
633
+ ?has-name-color=${this.shouldShowNameColor}
634
+ ></lukso-username>`;
635
+ }
636
+ /**
637
+ * Decide which of the three core inline variants to render
638
+ */
639
+ renderInlineVariant(displayName) {
640
+ if (this.nameOnly) return this.renderNameOnly(displayName);
641
+ if (this.addressOnly) return this.renderAddressOnly();
642
+ return this.renderNameAndAddress(displayName);
643
+ }
644
+ render() {
645
+ const displayName = this.getDisplayName();
646
+ if (this.isCardView) {
647
+ return import_lit3.html`
648
+ <div class="block border border-neutral-90 rounded-xl py-3 px-4 bg-neutral-100 min-w-[280px]" @click=${this.handleClick}>
649
+ <div class="flex items-center justify-between mb-2">
650
+ <div class="inline-flex items-center font-normal gap-1">
651
+ ${this.renderIdenticon()}
652
+ ${this.renderDisplayName()}
653
+ </div>
654
+ ${this.showCopyButton ? import_lit3.html`<button
655
+ class="bg-neutral-100 border-0 rounded-lg w-6 h-6 flex items-center justify-center cursor-pointer text-neutral-20 hover:bg-neutral-95"
656
+ @click=${(e) => this.handleCopy(e)}
657
+ title="Copy address"
658
+ >
659
+ <lukso-icon name="copy" size="small"></lukso-icon>
660
+ </button>` : import_lit3.html``}
661
+ </div>
662
+ <div class="font-semibold text-neutral-20 break-all flex items-center gap-2">
663
+
664
+ <lukso-username
665
+ address=${this.displayAddress}
666
+ size=${this.size}
667
+ max-width=${this.maxWidth}
668
+ has-name-color="false"
669
+ slice-by="24"
670
+ ?has-address-color=${this.shouldShowNameColor}
671
+ ></lukso-username>
672
+ </div>
673
+ </div>
674
+ `;
675
+ }
676
+ return import_lit3.html`
677
+ <div class="inline-flex items-center cursor-pointer gap-1" @click=${this.handleClick}>
678
+ ${this.renderIdenticon()}
679
+ <!-- Inline Variants -->
680
+ ${this.renderInlineVariant(displayName)}
681
+ </div>
682
+ `;
683
+ }
684
+ };
685
+ __decorateClass([
686
+ (0, import_decorators2.property)()
687
+ ], AddressView.prototype, "address", 2);
688
+ __decorateClass([
689
+ (0, import_decorators2.property)()
690
+ ], AddressView.prototype, "size", 2);
691
+ __decorateClass([
692
+ (0, import_decorators2.property)({ type: Boolean, attribute: "name-only" })
693
+ ], AddressView.prototype, "nameOnly", 2);
694
+ __decorateClass([
695
+ (0, import_decorators2.property)({ type: Boolean, attribute: "address-only" })
696
+ ], AddressView.prototype, "addressOnly", 2);
697
+ __decorateClass([
698
+ (0, import_decorators2.property)({ type: Boolean, attribute: "is-card-view" })
699
+ ], AddressView.prototype, "isCardView", 2);
700
+ __decorateClass([
701
+ (0, import_decorators2.property)()
702
+ ], AddressView.prototype, "label", 2);
703
+ __decorateClass([
704
+ (0, import_decorators2.property)({ type: Boolean, attribute: "show-copy-button" })
705
+ ], AddressView.prototype, "showCopyButton", 2);
706
+ __decorateClass([
707
+ (0, import_decorators2.property)({ type: Number, attribute: "max-width" })
708
+ ], AddressView.prototype, "maxWidth", 2);
709
+ __decorateClass([
710
+ (0, import_decorators2.property)({ type: Boolean, attribute: "show-identicon" })
711
+ ], AddressView.prototype, "showIdenticon", 2);
712
+ __decorateClass([
713
+ (0, import_decorators2.property)({ type: String, attribute: "address-color" })
714
+ ], AddressView.prototype, "addressColor", 2);
715
+ __decorateClass([
716
+ (0, import_decorators2.property)({ type: String, attribute: "name-color" })
717
+ ], AddressView.prototype, "nameColor", 2);
718
+ __decorateClass([
719
+ (0, import_decorators2.state)()
720
+ ], AddressView.prototype, "isLoadingAddress", 2);
721
+ __decorateClass([
722
+ (0, import_decorators2.state)()
723
+ ], AddressView.prototype, "identicon", 2);
724
+ AddressView = __decorateClass([
725
+ safeCustomElement("address-view")
726
+ ], AddressView);
727
+
728
+ // src/shared/custom-select.ts
729
+ var import_lit4 = require("lit");
730
+ var import_decorators3 = require("lit/decorators.js");
731
+ var import_ethereum_blockies_base642 = __toESM(require("ethereum-blockies-base64"), 1);
732
+ var CustomOption = class extends CoreLitElement {
733
+ constructor() {
734
+ super(...arguments);
735
+ this.selected = false;
736
+ this.disabled = false;
737
+ this.hoverable = true;
738
+ }
739
+ render() {
740
+ const base = "flex flex-row flex-1 items-center px-2 py-1 gap-2 h-7 rounded-md border-0 cursor-pointer text-[14px] text-neutral-20 w-full justify-between";
741
+ const hover = this.hoverable ? " hover:bg-neutral-95" : "";
742
+ const selected = this.selected ? " bg-neutral-90 rounded" : "";
743
+ const disabled = this.disabled ? " text-neutral-60 cursor-not-allowed" : "";
744
+ return import_lit4.html`<button class="${base}${hover}${selected}${disabled}" ?disabled=${this.disabled}><slot></slot></button>`;
745
+ }
746
+ };
747
+ __decorateClass([
748
+ (0, import_decorators3.property)({ type: Boolean, reflect: true })
749
+ ], CustomOption.prototype, "selected", 2);
750
+ __decorateClass([
751
+ (0, import_decorators3.property)({ type: Boolean, reflect: true })
752
+ ], CustomOption.prototype, "disabled", 2);
753
+ __decorateClass([
754
+ (0, import_decorators3.property)({ type: Boolean, reflect: true })
755
+ ], CustomOption.prototype, "hoverable", 2);
756
+ CustomOption = __decorateClass([
757
+ safeCustomElement("custom-option")
758
+ ], CustomOption);
759
+ var CustomSelect = class extends CoreLitElement {
760
+ constructor() {
761
+ super(...arguments);
762
+ this.open = false;
763
+ this.options = [];
764
+ this.size = "small";
765
+ this.onOutsideClick = (e) => {
766
+ if (!this.open) return;
767
+ const path = e.composedPath();
768
+ if (!path.includes(this)) this.close();
769
+ };
770
+ }
771
+ toggleOpen() {
772
+ this.open = !this.open;
773
+ }
774
+ close() {
775
+ this.open = false;
776
+ }
777
+ onOptionClick(opt) {
778
+ if (opt.disabled) return;
779
+ this.value = opt.value;
780
+ this.dispatchEvent(new Event("change", { bubbles: true }));
781
+ this.close();
782
+ }
783
+ onKeyDown(e) {
784
+ if (e.key === "Escape") this.close();
785
+ }
786
+ connectedCallback() {
787
+ super.connectedCallback();
788
+ window.addEventListener("click", this.onOutsideClick, { capture: true });
789
+ }
790
+ disconnectedCallback() {
791
+ window.removeEventListener("click", this.onOutsideClick, { capture: true });
792
+ super.disconnectedCallback();
793
+ }
794
+ updated() {
795
+ const selectedOption = this.getSelectedOption();
796
+ if (selectedOption) {
797
+ this.value = selectedOption.value;
798
+ }
799
+ }
800
+ getSelectedOption() {
801
+ return this.options.find((o) => o.value === this.value);
802
+ }
803
+ getIdenticonSizePx() {
804
+ switch (this.size) {
805
+ case "x-small":
806
+ return 10;
807
+ case "small":
808
+ return 12;
809
+ case "medium":
810
+ return 14;
811
+ case "large":
812
+ return 16;
813
+ default:
814
+ return 14;
815
+ }
816
+ }
817
+ renderIdenticon(address) {
818
+ const size = this.getIdenticonSizePx();
819
+ const identicon = (0, import_ethereum_blockies_base642.default)(address.toLowerCase());
820
+ return import_lit4.html`
821
+ <div class="inline-flex items-center p-1 justify-center rounded-lg bg-neutral-100 border border-neutral-90 overflow-hidden flex-none">
822
+ <img
823
+ class="block"
824
+ src=${identicon}
825
+ alt="identicon"
826
+ style="width:${size}px;height:${size}px;"
827
+ />
828
+ </div>
829
+ `;
830
+ }
831
+ renderOptionLabel(option) {
832
+ return option.value.startsWith("0x") ? import_lit4.html`<div class="inline-flex items-center gap-2 px-2.5 py-1.5 text-neutral-20 leading-tight font-semibold">${this.renderIdenticon(
833
+ option.value
834
+ )} <span class="whitespace-nowrap overflow-hidden text-ellipsis text-[14px]">${option.label}</span></div>` : import_lit4.html`<url-view url=${option.value} label=${option.label} size="x-small"></url-view>`;
835
+ }
836
+ render() {
837
+ const selectedOption = this.getSelectedOption();
838
+ return import_lit4.html`
839
+ <div class="relative w-full min-w-[360px]" @keydown=${this.onKeyDown}>
840
+ <button class="box-border flex flex-row flex-1 w-full items-center h-[29px] bg-white border border-neutral-90 rounded-lg text-neutral-20 cursor-pointer justify-between" @click=${this.toggleOpen} aria-haspopup="listbox" aria-expanded=${this.open}>
841
+ <custom-option is-full-width .hoverable=${false}>
842
+ <div class="flex flex-row flex-1 items-center justify-between">
843
+ <span>${selectedOption ? this.renderOptionLabel(selectedOption) : "Select option"}</span>
844
+ <lukso-icon class="transition-transform ${this.open ? "rotate-180" : ""}" name="arrow-down-sm" size="small" color="neutral-20" aria-hidden="true">
845
+ </lukso-icon>
846
+ </div>
847
+ </custom-option>
848
+ </button>
849
+
850
+ ${this.open && this.options.length > 0 ? import_lit4.html`<div class="absolute left-0 top-[calc(100%+8px)] w-full bg-white border border-neutral-90 shadow-[0_0_16px_rgba(189,206,219,0.4)] rounded-xl p-2.5 flex flex-col gap-1 z-[1000] overflow-hidden box-border" role="listbox">
851
+ ${this.options.map(
852
+ (opt) => import_lit4.html`<custom-option .selected=${opt.value === this.value} .disabled=${opt.disabled} @click=${() => this.onOptionClick(opt)}>
853
+ ${this.renderOptionLabel(opt)}
854
+ </custom-option>`
855
+ )}
856
+ </div>` : ""}
857
+ </div>
858
+ `;
859
+ }
860
+ };
861
+ __decorateClass([
862
+ (0, import_decorators3.property)()
863
+ ], CustomSelect.prototype, "value", 2);
864
+ __decorateClass([
865
+ (0, import_decorators3.property)({ type: Boolean })
866
+ ], CustomSelect.prototype, "open", 2);
867
+ __decorateClass([
868
+ (0, import_decorators3.property)({ type: Array })
869
+ ], CustomSelect.prototype, "options", 2);
870
+ __decorateClass([
871
+ (0, import_decorators3.property)({ type: String })
872
+ ], CustomSelect.prototype, "size", 2);
873
+ CustomSelect = __decorateClass([
874
+ safeCustomElement("custom-select")
875
+ ], CustomSelect);
876
+
877
+ // src/shared/function-name-view.ts
878
+ var import_lit5 = require("lit");
879
+ var import_decorators4 = require("lit/decorators.js");
880
+ var FunctionNameView = class extends CoreLitElement {
881
+ constructor() {
882
+ super(...arguments);
883
+ this.label = "";
884
+ this.icon = "user";
885
+ this.size = "small";
886
+ }
887
+ getPadding() {
888
+ switch (this.size) {
889
+ case "x-small":
890
+ return "2px 8px";
891
+ case "small":
892
+ return "4px 10px";
893
+ case "medium":
894
+ return "6px 12px";
895
+ case "large":
896
+ return "8px 14px";
897
+ default:
898
+ return "4px 10px";
899
+ }
900
+ }
901
+ getFontSize() {
902
+ switch (this.size) {
903
+ case "x-small":
904
+ return "12px";
905
+ case "small":
906
+ return "14px";
907
+ case "medium":
908
+ return "16px";
909
+ case "large":
910
+ return "18px";
911
+ default:
912
+ return "14px";
913
+ }
914
+ }
915
+ getIconSize() {
916
+ return this.size;
917
+ }
918
+ getHeight() {
919
+ switch (this.size) {
920
+ case "x-small":
921
+ return "h-6";
922
+ case "small":
923
+ return "h-8";
924
+ case "medium":
925
+ return "h-10";
926
+ case "large":
927
+ return "h-12";
928
+ default:
929
+ return "h-8";
930
+ }
931
+ }
932
+ render() {
933
+ return import_lit5.html`
934
+ <div class="inline-flex ${this.getHeight()} items-center gap-2 bg-neutral-90 text-neutral-20 rounded-xl leading-none font-semibold" style="padding:${this.getPadding()}; font-size:${this.getFontSize()};">
935
+ <lukso-icon name=${this.icon} size=${this.getIconSize()} color=${this.color || ""}></lukso-icon>
936
+ <span class="whitespace-nowrap"><slot>${this.label}</slot></span>
937
+ </div>
938
+ `;
939
+ }
940
+ };
941
+ __decorateClass([
942
+ (0, import_decorators4.property)()
943
+ ], FunctionNameView.prototype, "label", 2);
944
+ __decorateClass([
945
+ (0, import_decorators4.property)()
946
+ ], FunctionNameView.prototype, "icon", 2);
947
+ __decorateClass([
948
+ (0, import_decorators4.property)()
949
+ ], FunctionNameView.prototype, "size", 2);
950
+ __decorateClass([
951
+ (0, import_decorators4.property)({ attribute: "color" })
952
+ ], FunctionNameView.prototype, "color", 2);
953
+ FunctionNameView = __decorateClass([
954
+ safeCustomElement("function-name-view")
955
+ ], FunctionNameView);
956
+
957
+ // src/shared/gas-provider-view.ts
958
+ var import_lit6 = require("lit");
959
+ var import_decorators5 = require("lit/decorators.js");
960
+ var GasProviderView = class extends CoreLitElement {
961
+ constructor() {
962
+ super(...arguments);
963
+ this.allRelayers = [];
964
+ this.balance = 0;
965
+ this.symbol = "LYX";
966
+ this.decimals = 18;
967
+ this.transactionFee = 0;
968
+ this.relayerAvailable = 0;
969
+ this.relayerUsed = 0;
970
+ this.relayerToBeUsed = 0;
971
+ this.relayerResetDate = "N/A";
972
+ }
973
+ formatToken(amount) {
974
+ return (amount / 10 ** this.decimals).toLocaleString(void 0, {
975
+ maximumFractionDigits: 6
976
+ });
977
+ }
978
+ onSelectChanged(e) {
979
+ const value = e.target.value;
980
+ if (!value) return;
981
+ if (this.controllerAddress && value === this.controllerAddress) {
982
+ const next = {
983
+ type: "controller",
984
+ id: this.controllerAddress
985
+ };
986
+ if (!this.selectedGasProvider || this.selectedGasProvider.id !== next.id || this.selectedGasProvider.type !== next.type) {
987
+ this.selectedGasProvider = next;
988
+ this.dispatchEvent(
989
+ new CustomEvent("on-gas-provider-change", {
990
+ detail: next,
991
+ bubbles: true
992
+ })
993
+ );
994
+ }
995
+ return;
996
+ }
997
+ const match = this.allRelayers.find(
998
+ (r) => r.website === value || r.apiUrl === value
999
+ );
1000
+ if (match) {
1001
+ const next = { type: "relayer", id: match.id };
1002
+ if (!this.selectedGasProvider || this.selectedGasProvider.id !== next.id || this.selectedGasProvider.type !== next.type) {
1003
+ this.selectedGasProvider = next;
1004
+ this.dispatchEvent(
1005
+ new CustomEvent("on-gas-provider-change", {
1006
+ detail: next,
1007
+ bubbles: true
1008
+ })
1009
+ );
1010
+ }
1011
+ return;
1012
+ }
1013
+ }
1014
+ renderProgress(totalAvailable, used, toBeUsed, symbol, hasError) {
1015
+ const usedPercent = totalAvailable ? used / totalAvailable * 100 : 0;
1016
+ const toBeUsedPercent = totalAvailable ? toBeUsed / totalAvailable * 100 : 0;
1017
+ const barOverHalf = usedPercent > 50;
1018
+ return import_lit6.html`<progress-view
1019
+ class=${hasError ? "error" : ""}
1020
+ .data=${[
1021
+ {
1022
+ value: usedPercent,
1023
+ color: "var(--green-54)",
1024
+ title: `${usedPercent}%`
1025
+ },
1026
+ {
1027
+ value: toBeUsedPercent,
1028
+ color: "var(--neutral-60)",
1029
+ title: `${toBeUsedPercent}%`
1030
+ }
1031
+ ]}
1032
+ label-position=${barOverHalf ? "left" : "right"}
1033
+ .label=${`${toBeUsed} / ${String(totalAvailable)} ${symbol}`}
1034
+ >
1035
+ </progress-view>`;
1036
+ }
1037
+ renderControllerProgress() {
1038
+ return this.renderProgress(
1039
+ this.balance,
1040
+ 0,
1041
+ this.transactionFee,
1042
+ this.symbol,
1043
+ this.transactionFee > this.balance
1044
+ );
1045
+ }
1046
+ renderRelayerProgress() {
1047
+ return this.renderProgress(
1048
+ this.relayerAvailable,
1049
+ this.relayerUsed,
1050
+ this.relayerToBeUsed,
1051
+ "M GAS",
1052
+ this.relayerToBeUsed > this.relayerAvailable
1053
+ );
1054
+ }
1055
+ displayRelayerResetDate() {
1056
+ const date = new Date(this.relayerResetDate);
1057
+ return isNaN(date.getTime()) ? "N/A" : date.toLocaleDateString();
1058
+ }
1059
+ render() {
1060
+ const formatted = this.formatToken(this.balance);
1061
+ const relayerOptions = this.allRelayers.map((r) => ({
1062
+ value: r.website || r.apiUrl || `relayer:${r.id}`,
1063
+ label: r.name,
1064
+ disabled: false
1065
+ }));
1066
+ const controllerOption = this.controllerAddress ? [
1067
+ {
1068
+ value: this.controllerAddress,
1069
+ label: this.controllerName ? `${this.controllerName} (${formatted} ${this.symbol})` : `UP Browser Extension (${formatted} ${this.symbol})`,
1070
+ disabled: false
1071
+ }
1072
+ ] : [];
1073
+ const options = [...relayerOptions, ...controllerOption];
1074
+ const selectedValue = this.selectedGasProvider ? this.selectedGasProvider.type === "controller" ? this.controllerAddress : (() => {
1075
+ const r = this.allRelayers.find(
1076
+ (x) => x.id === this.selectedGasProvider.id
1077
+ );
1078
+ return r?.website || r?.apiUrl || `relayer:${this.selectedGasProvider.id}`;
1079
+ })() : void 0;
1080
+ return import_lit6.html`
1081
+ <div class="w-full">
1082
+ <custom-select .value=${selectedValue} .options=${options} @change=${this.onSelectChanged}></custom-select>
1083
+ ${this.selectedGasProvider ? import_lit6.html`<div class="mt-2">
1084
+ ${this.selectedGasProvider?.type === "controller" ? this.renderControllerProgress() : this.renderRelayerProgress()}
1085
+ ${this.selectedGasProvider?.type === "relayer" ? import_lit6.html`<span class="text-[12px] text-neutral-60 mt-2 block">
1086
+ Your total of ${this.relayerAvailable}M resets on ${this.displayRelayerResetDate()}.
1087
+ </span>` : import_lit6.html``}
1088
+ </div>` : import_lit6.html``}
1089
+
1090
+ </div>
1091
+ `;
1092
+ }
1093
+ };
1094
+ __decorateClass([
1095
+ (0, import_decorators5.property)({ type: Array, reflect: true })
1096
+ ], GasProviderView.prototype, "allRelayers", 2);
1097
+ __decorateClass([
1098
+ (0, import_decorators5.property)({ type: Number, reflect: true })
1099
+ ], GasProviderView.prototype, "balance", 2);
1100
+ __decorateClass([
1101
+ (0, import_decorators5.property)({ type: Object, attribute: "selected-gas-provider", reflect: true })
1102
+ ], GasProviderView.prototype, "selectedGasProvider", 2);
1103
+ __decorateClass([
1104
+ (0, import_decorators5.property)({ attribute: "controller-address", reflect: true })
1105
+ ], GasProviderView.prototype, "controllerAddress", 2);
1106
+ __decorateClass([
1107
+ (0, import_decorators5.property)({ attribute: "controller-name", reflect: true })
1108
+ ], GasProviderView.prototype, "controllerName", 2);
1109
+ __decorateClass([
1110
+ (0, import_decorators5.property)({ attribute: "symbol", reflect: true })
1111
+ ], GasProviderView.prototype, "symbol", 2);
1112
+ __decorateClass([
1113
+ (0, import_decorators5.property)({ type: Number, reflect: true })
1114
+ ], GasProviderView.prototype, "decimals", 2);
1115
+ __decorateClass([
1116
+ (0, import_decorators5.property)({ type: Number, attribute: "transaction-fee", reflect: true })
1117
+ ], GasProviderView.prototype, "transactionFee", 2);
1118
+ __decorateClass([
1119
+ (0, import_decorators5.property)({ type: Number, attribute: "relayer-available", reflect: true })
1120
+ ], GasProviderView.prototype, "relayerAvailable", 2);
1121
+ __decorateClass([
1122
+ (0, import_decorators5.property)({ type: Number, attribute: "relayer-used", reflect: true })
1123
+ ], GasProviderView.prototype, "relayerUsed", 2);
1124
+ __decorateClass([
1125
+ (0, import_decorators5.property)({ type: Number, attribute: "relayer-to-be-used", reflect: true })
1126
+ ], GasProviderView.prototype, "relayerToBeUsed", 2);
1127
+ __decorateClass([
1128
+ (0, import_decorators5.property)({ attribute: "relayer-reset-date", reflect: true })
1129
+ ], GasProviderView.prototype, "relayerResetDate", 2);
1130
+ GasProviderView = __decorateClass([
1131
+ safeCustomElement("gas-provider-view")
1132
+ ], GasProviderView);
1133
+
1134
+ // src/shared/icon-view.ts
1135
+ var import_task3 = require("@lit/task");
1136
+ var import_transaction_view_headless3 = require("@lukso/transaction-view-headless");
1137
+ var import_lit7 = require("lit");
1138
+ var import_decorators6 = require("lit/decorators.js");
1139
+ var IconView = class extends CoreLitElement {
1140
+ constructor() {
1141
+ super(...arguments);
1142
+ this.size = "small";
1143
+ this.showName = true;
1144
+ this.namePosition = "below";
1145
+ this.maxWidth = 200;
1146
+ this.showIconIdenticon = true;
1147
+ this.showLabelIdenticon = false;
1148
+ this.forceUnresolved = false;
1149
+ this.isLoadingImage = false;
1150
+ this.isLoadingAddress = false;
1151
+ // Composables
1152
+ this.imageLoader = (0, import_transaction_view_headless3.useImageLoader)();
1153
+ this.addressResolver = (0, import_transaction_view_headless3.useAddressResolver)();
1154
+ // Task for resolving address data
1155
+ this.addressTask = new import_task3.Task(this, {
1156
+ task: async ([address], { signal }) => {
1157
+ if (!address) return null;
1158
+ this.isLoadingAddress = true;
1159
+ try {
1160
+ const resolved = await this.addressResolver.resolveAddress(address);
1161
+ this.requestUpdate();
1162
+ return resolved;
1163
+ } catch (error) {
1164
+ console.warn("\u274C IconView: Failed to resolve address:", error);
1165
+ return null;
1166
+ } finally {
1167
+ this.isLoadingAddress = false;
1168
+ }
1169
+ },
1170
+ args: () => [this.address]
1171
+ });
1172
+ // Task for loading profile image
1173
+ this.imageTask = new import_task3.Task(this, {
1174
+ task: async ([resolved], { signal }) => {
1175
+ if (!resolved) return null;
1176
+ this.isLoadingImage = true;
1177
+ try {
1178
+ let image;
1179
+ if (this.imageHint && resolved[this.imageHint]) {
1180
+ const imageArray = resolved[this.imageHint];
1181
+ if (Array.isArray(imageArray) && imageArray.length > 0) {
1182
+ image = await this.imageLoader.loadImage(imageArray, {
1183
+ width: this.getSizePixels(),
1184
+ height: this.getSizePixels(),
1185
+ dpr: window.devicePixelRatio || 1,
1186
+ index: this.imageIndex
1187
+ });
1188
+ }
1189
+ } else {
1190
+ image = await this.imageLoader.loadProfileImage(resolved, {
1191
+ width: this.getSizePixels(),
1192
+ height: this.getSizePixels(),
1193
+ dpr: window.devicePixelRatio || 1,
1194
+ index: this.imageIndex
1195
+ });
1196
+ }
1197
+ return image || this.imageLoader.getFallbackImage(resolved);
1198
+ } catch (error) {
1199
+ console.warn("Failed to load address image:", error);
1200
+ return this.imageLoader.getFallbackImage(resolved || {});
1201
+ } finally {
1202
+ this.isLoadingImage = false;
1203
+ }
1204
+ },
1205
+ args: () => [this.addressTask.value]
1206
+ });
1207
+ }
1208
+ /**
1209
+ * Get pixel size for the current size setting
1210
+ */
1211
+ getSizePixels() {
1212
+ switch (this.size) {
1213
+ case "x-small":
1214
+ return 16;
1215
+ case "small":
1216
+ return 24;
1217
+ case "medium":
1218
+ return 32;
1219
+ case "large":
1220
+ return 48;
1221
+ case "2x-large":
1222
+ return 124;
1223
+ default:
1224
+ return 24;
1225
+ }
1226
+ }
1227
+ /**
1228
+ * Check if this is a contract address (shows square icon)
1229
+ */
1230
+ get isContract() {
1231
+ const resolved = this.addressTask.value;
1232
+ return resolved ? this.imageLoader.isContractAddress(resolved) : false;
1233
+ }
1234
+ /**
1235
+ * Handle icon click
1236
+ */
1237
+ handleClick() {
1238
+ this.dispatchEvent(
1239
+ new CustomEvent("address-click", {
1240
+ detail: {
1241
+ address: this.address,
1242
+ resolved: this.addressTask.value
1243
+ },
1244
+ bubbles: true
1245
+ })
1246
+ );
1247
+ }
1248
+ render() {
1249
+ const imageResult = this.imageTask.value;
1250
+ const containerClass = this.namePosition === "beside" ? "row" : "column";
1251
+ return import_lit7.html`
1252
+ <div class="${containerClass === "row" ? "flex items-start gap-1" : "flex flex-col items-center gap-1"}">
1253
+ ${this.label ? import_lit7.html`<div class="text-[12px] text-neutral-60 font-medium">${this.label}</div>` : ""}
1254
+
1255
+ <div class="${this.namePosition === "beside" ? "inline-flex flex-row items-center gap-2" : "inline-flex flex-col items-center gap-1.5"}">
1256
+ <lukso-profile
1257
+ size=${this.size}
1258
+ profile-address=${this.address}
1259
+ profile-url=${imageResult?.src || ""}
1260
+ ?has-identicon=${this.showIconIdenticon}
1261
+ ?is-square=${this.isContract}
1262
+ class="inline-flex items-center cursor-pointer transition-transform duration-200 hover:scale-105"
1263
+ @click=${this.handleClick}
1264
+ ></lukso-profile>
1265
+
1266
+ ${this.showName ? import_lit7.html`
1267
+ <address-view
1268
+ class="leading-none"
1269
+ address=${this.address}
1270
+ .showIdenticon=${this.showLabelIdenticon}
1271
+ size=${this.size}
1272
+ max-width=${this.maxWidth}
1273
+ ></address-view>
1274
+ ` : ""}
1275
+ </div>
1276
+ </div>
1277
+ `;
1278
+ }
1279
+ };
1280
+ __decorateClass([
1281
+ (0, import_decorators6.property)()
1282
+ ], IconView.prototype, "address", 2);
1283
+ __decorateClass([
1284
+ (0, import_decorators6.property)({ type: Object })
1285
+ ], IconView.prototype, "resolved", 2);
1286
+ __decorateClass([
1287
+ (0, import_decorators6.property)()
1288
+ ], IconView.prototype, "size", 2);
1289
+ __decorateClass([
1290
+ (0, import_decorators6.property)()
1291
+ ], IconView.prototype, "label", 2);
1292
+ __decorateClass([
1293
+ (0, import_decorators6.property)({ type: Boolean, attribute: "show-name" })
1294
+ ], IconView.prototype, "showName", 2);
1295
+ __decorateClass([
1296
+ (0, import_decorators6.property)({ attribute: "name-position" })
1297
+ ], IconView.prototype, "namePosition", 2);
1298
+ __decorateClass([
1299
+ (0, import_decorators6.property)({ type: Number, attribute: "max-width" })
1300
+ ], IconView.prototype, "maxWidth", 2);
1301
+ __decorateClass([
1302
+ (0, import_decorators6.property)({ type: Boolean, attribute: "show-icon-identicon" })
1303
+ ], IconView.prototype, "showIconIdenticon", 2);
1304
+ __decorateClass([
1305
+ (0, import_decorators6.property)({ type: Boolean, attribute: "show-label-identicon" })
1306
+ ], IconView.prototype, "showLabelIdenticon", 2);
1307
+ __decorateClass([
1308
+ (0, import_decorators6.property)({ type: Boolean, attribute: "force-unresolved" })
1309
+ ], IconView.prototype, "forceUnresolved", 2);
1310
+ __decorateClass([
1311
+ (0, import_decorators6.property)({ type: String, attribute: "image-hint" })
1312
+ ], IconView.prototype, "imageHint", 2);
1313
+ __decorateClass([
1314
+ (0, import_decorators6.property)({ type: Number, attribute: "image-index" })
1315
+ ], IconView.prototype, "imageIndex", 2);
1316
+ __decorateClass([
1317
+ (0, import_decorators6.state)()
1318
+ ], IconView.prototype, "imageData", 2);
1319
+ __decorateClass([
1320
+ (0, import_decorators6.state)()
1321
+ ], IconView.prototype, "isLoadingImage", 2);
1322
+ __decorateClass([
1323
+ (0, import_decorators6.state)()
1324
+ ], IconView.prototype, "isLoadingAddress", 2);
1325
+ IconView = __decorateClass([
1326
+ safeCustomElement("icon-view")
1327
+ ], IconView);
1328
+
1329
+ // src/shared/image-loader-controller.ts
1330
+ var import_transaction_view_headless4 = require("@lukso/transaction-view-headless");
1331
+ var ImageLoaderController = class {
1332
+ constructor(host) {
1333
+ this.headlessLoader = (0, import_transaction_view_headless4.useImageLoader)();
1334
+ // Internal state
1335
+ this._state = {
1336
+ result: null,
1337
+ loading: false,
1338
+ error: null
1339
+ };
1340
+ this.host = host;
1341
+ host.addController(this);
1342
+ }
1343
+ hostConnected() {
1344
+ }
1345
+ hostDisconnected() {
1346
+ }
1347
+ get state() {
1348
+ return this._state;
1349
+ }
1350
+ get isLoading() {
1351
+ return this._state.loading;
1352
+ }
1353
+ get error() {
1354
+ return this._state.error;
1355
+ }
1356
+ get result() {
1357
+ return this._state.result;
1358
+ }
1359
+ /**
1360
+ * Load image from data array
1361
+ */
1362
+ async loadImage(imageData, options = {}) {
1363
+ this.updateState({ loading: true, error: null });
1364
+ try {
1365
+ const result = await this.headlessLoader.loadImage(imageData, options);
1366
+ this.updateState({ result, loading: false });
1367
+ return result;
1368
+ } catch (err) {
1369
+ const error = err instanceof Error ? err.message : "Failed to load image";
1370
+ this.updateState({ loading: false, error });
1371
+ return null;
1372
+ }
1373
+ }
1374
+ /**
1375
+ * Load profile image from address data
1376
+ */
1377
+ async loadProfileImage(addressData, options = {}) {
1378
+ this.updateState({ loading: true, error: null });
1379
+ try {
1380
+ const result = await this.headlessLoader.loadProfileImage(addressData, options) || this.headlessLoader.getFallbackImage(addressData);
1381
+ this.updateState({ result, loading: false });
1382
+ return result;
1383
+ } catch (err) {
1384
+ const error = err instanceof Error ? err.message : "Failed to load profile image";
1385
+ const fallback = this.headlessLoader.getFallbackImage(addressData);
1386
+ this.updateState({ result: fallback, loading: false, error });
1387
+ return fallback;
1388
+ }
1389
+ }
1390
+ /**
1391
+ * Load image from address signal (reactive)
1392
+ */
1393
+ loadFromSignal(addressSignal, options = {}) {
1394
+ const addressData = addressSignal.value?.data;
1395
+ if (!addressData) {
1396
+ const fallback = this.headlessLoader.getFallbackImage({});
1397
+ this.updateState({ result: fallback, loading: false, error: null });
1398
+ return;
1399
+ }
1400
+ this.loadProfileImage(addressData, options);
1401
+ }
1402
+ /**
1403
+ * Get fallback image synchronously
1404
+ */
1405
+ getFallbackImage(addressData) {
1406
+ return this.headlessLoader.getFallbackImage(addressData);
1407
+ }
1408
+ /**
1409
+ * Check if address is a contract
1410
+ */
1411
+ isContractAddress(addressData) {
1412
+ return this.headlessLoader.isContractAddress(addressData);
1413
+ }
1414
+ /**
1415
+ * Clear current state
1416
+ */
1417
+ clear() {
1418
+ this.updateState({ result: null, loading: false, error: null });
1419
+ }
1420
+ updateState(updates) {
1421
+ this._state = { ...this._state, ...updates };
1422
+ this.host.requestUpdate();
1423
+ }
1424
+ };
1425
+ function useImageLoader3(host) {
1426
+ return new ImageLoaderController(host);
1427
+ }
1428
+
1429
+ // src/shared/notification-view.ts
1430
+ var import_lit8 = require("lit");
1431
+ var import_decorators7 = require("lit/decorators.js");
1432
+ var NotificationView = class extends CoreLitElement {
1433
+ constructor() {
1434
+ super(...arguments);
1435
+ this.variant = "info";
1436
+ this.message = "";
1437
+ this.title = "";
1438
+ this.acknowledgeable = false;
1439
+ this.acknowledgeText = "I understand and want to continue";
1440
+ this.acknowledged = false;
1441
+ this.checked = false;
1442
+ }
1443
+ handleAcknowledgeChange(e) {
1444
+ e.stopPropagation();
1445
+ const target = e.target;
1446
+ const checked = !!(target?.checked ?? e.detail?.checked ?? false);
1447
+ if (checked !== this.checked) {
1448
+ this.checked = checked;
1449
+ }
1450
+ if (this.checked) {
1451
+ this.acknowledged = true;
1452
+ this.dispatchEvent(
1453
+ new CustomEvent("notification-acknowledged", {
1454
+ detail: {
1455
+ variant: this.variant,
1456
+ message: this.message,
1457
+ title: this.title,
1458
+ checked: this.checked
1459
+ },
1460
+ bubbles: true
1461
+ })
1462
+ );
1463
+ }
1464
+ }
1465
+ render() {
1466
+ if (this.acknowledged) return import_lit8.html``;
1467
+ return import_lit8.html`
1468
+ <div class="grid grid-cols-[24px_1fr] items-start gap-3 p-3 rounded-xl text-neutral-10 leading-snug ${this.getVariantBackgroundClass()}">
1469
+ <div class="flex items-center justify-center text-[16px] text-neutral-20 self-center" aria-hidden="true">
1470
+ <lukso-icon name="${this.renderIcon()}" size="large" color="${this.getVariantColor()}"></lukso-icon>
1471
+ </div>
1472
+ <div class="text-[14px] flex flex-col gap-1.5">
1473
+ ${this.title ? import_lit8.html`<div class="font-semibold text-neutral-20 paragraph-inter-14-semi-bold">${this.title}</div>` : ""}
1474
+ <div class="text-neutral-30"><slot>${this.message}</slot></div>
1475
+ ${this.acknowledgeable ? import_lit8.html`
1476
+ <div class="inline-flex items-center gap-2 mt-1 text-[12px] text-neutral-20 select-none cursor-pointer paragraph-inter-12-medium">
1477
+ <lukso-checkbox
1478
+ size="x-small"
1479
+ ?checked=${this.checked}
1480
+ @change=${this.handleAcknowledgeChange}
1481
+ ><span class="paragraph-inter-14-semi-bold">${this.acknowledgeText}</span></lukso-checkbox>
1482
+ </div>
1483
+ ` : ""}
1484
+ </div>
1485
+ </div>
1486
+ `;
1487
+ }
1488
+ renderIcon() {
1489
+ switch (this.variant) {
1490
+ case "success":
1491
+ return "bulb-outline";
1492
+ case "warning":
1493
+ return "warning-round";
1494
+ case "error":
1495
+ return "warning-triangle";
1496
+ default:
1497
+ return "bulb-outline";
1498
+ }
1499
+ }
1500
+ getVariantColor() {
1501
+ switch (this.variant) {
1502
+ case "success":
1503
+ return "green-45";
1504
+ case "warning":
1505
+ return "yellow-55";
1506
+ case "error":
1507
+ return "red-55";
1508
+ default:
1509
+ return "blue-50";
1510
+ }
1511
+ }
1512
+ getVariantBackgroundClass() {
1513
+ switch (this.variant) {
1514
+ case "success":
1515
+ return "bg-green-85";
1516
+ case "warning":
1517
+ return "bg-yellow-85";
1518
+ case "error":
1519
+ return "bg-red-85";
1520
+ default:
1521
+ return "bg-blue-85";
1522
+ }
1523
+ }
1524
+ };
1525
+ __decorateClass([
1526
+ (0, import_decorators7.property)()
1527
+ ], NotificationView.prototype, "variant", 2);
1528
+ __decorateClass([
1529
+ (0, import_decorators7.property)()
1530
+ ], NotificationView.prototype, "message", 2);
1531
+ __decorateClass([
1532
+ (0, import_decorators7.property)()
1533
+ ], NotificationView.prototype, "title", 2);
1534
+ __decorateClass([
1535
+ (0, import_decorators7.property)({ type: Boolean, attribute: "acknowledgeable" })
1536
+ ], NotificationView.prototype, "acknowledgeable", 2);
1537
+ __decorateClass([
1538
+ (0, import_decorators7.property)({ attribute: "acknowledge-text" })
1539
+ ], NotificationView.prototype, "acknowledgeText", 2);
1540
+ __decorateClass([
1541
+ (0, import_decorators7.state)()
1542
+ ], NotificationView.prototype, "acknowledged", 2);
1543
+ __decorateClass([
1544
+ (0, import_decorators7.property)({ type: Boolean, reflect: true })
1545
+ ], NotificationView.prototype, "checked", 2);
1546
+ NotificationView = __decorateClass([
1547
+ safeCustomElement("notification-view")
1548
+ ], NotificationView);
1549
+
1550
+ // src/shared/progress-view.ts
1551
+ var import_lit9 = require("lit");
1552
+ var import_decorators8 = require("lit/decorators.js");
1553
+ var ProgressView = class extends CoreLitElement {
1554
+ constructor() {
1555
+ super(...arguments);
1556
+ this.data = [];
1557
+ this.labelPosition = "right";
1558
+ }
1559
+ renderGasProviderLabel() {
1560
+ return import_lit9.html`
1561
+ ${this.label ? import_lit9.html`
1562
+ <span class="progress-label-value">${this.label}</span>
1563
+ ${this.unit ? import_lit9.html`<span class="progress-label-unit" data-testid="unit">${this.unit}</span>` : ""}
1564
+ ` : import_lit9.html`
1565
+ <slot></slot>
1566
+ ${this.unit ? import_lit9.html`<span class="progress-label-unit" data-testid="unit">${this.unit}</span>` : ""}
1567
+ `}
1568
+ `;
1569
+ }
1570
+ renderAddressLabel() {
1571
+ return import_lit9.html`
1572
+ <value-view
1573
+ .value=${this.address}
1574
+ .unit=${this.unit}
1575
+ ></value-view>
1576
+ `;
1577
+ }
1578
+ render() {
1579
+ const isError = (this.className || "").split(/\s+/).includes("error");
1580
+ return import_lit9.html`
1581
+ <div class="relative grid w-full ${this.className || ""}">
1582
+ <div class="flex bg-neutral-95 h-6 rounded-lg relative col-[1] row-[1] overflow-hidden" style=${isError ? "background-color: var(--red-65);" : ""} role="progressbar">
1583
+ ${this.data.map((seg, index) => {
1584
+ const width = `${Math.max(0, Math.min(100, Number(seg.value || 0)))}%`;
1585
+ const backgroundColor = seg.color || "var(--neutral-90)";
1586
+ const title = seg.title || "";
1587
+ return import_lit9.html`<div
1588
+ class="h-full flex items-center justify-center text-[10px] font-semibold"
1589
+ style=${`width:${width};background-color:${backgroundColor};`}
1590
+ data-testid=${`value-${index}`}
1591
+ >${title}</div>`;
1592
+ })}
1593
+ </div>
1594
+ <div class=${`flex items-center absolute h-6 rounded-lg overflow-visible w-full col-[1] row-[1] top-0 left-0 ${this.labelPosition === "left" ? "justify-start" : "justify-end"}`} data-testid="progress-labels">
1595
+ <div class="text-[13px] font-semibold text-white mix-blend-difference h-inherit flex items-center p-0 right-4 absolute" data-testid="label">
1596
+ ${this.renderGasProviderLabel()}
1597
+ </div>
1598
+ </div>
1599
+ </div>
1600
+ `;
1601
+ }
1602
+ };
1603
+ __decorateClass([
1604
+ (0, import_decorators8.property)({ type: Array })
1605
+ ], ProgressView.prototype, "data", 2);
1606
+ __decorateClass([
1607
+ (0, import_decorators8.property)()
1608
+ ], ProgressView.prototype, "label", 2);
1609
+ __decorateClass([
1610
+ (0, import_decorators8.property)()
1611
+ ], ProgressView.prototype, "unit", 2);
1612
+ __decorateClass([
1613
+ (0, import_decorators8.property)()
1614
+ ], ProgressView.prototype, "address", 2);
1615
+ __decorateClass([
1616
+ (0, import_decorators8.property)({ attribute: "label-position" })
1617
+ ], ProgressView.prototype, "labelPosition", 2);
1618
+ ProgressView = __decorateClass([
1619
+ safeCustomElement("progress-view")
1620
+ ], ProgressView);
1621
+
1622
+ // src/shared/scroll-to-bottom-button.ts
1623
+ var import_lit10 = require("lit");
1624
+ var import_decorators9 = require("lit/decorators.js");
1625
+ var ScrollToBottomButton = class extends CoreLitElement {
1626
+ constructor() {
1627
+ super(...arguments);
1628
+ this.show = false;
1629
+ this.color = "neutral-20";
1630
+ this.iconSize = "medium";
1631
+ this.iconName = "arrow-down-lg";
1632
+ }
1633
+ handleClick() {
1634
+ this.dispatchEvent(new CustomEvent("scroll-to-bottom", { bubbles: true }));
1635
+ }
1636
+ render() {
1637
+ return import_lit10.html`
1638
+ <div class="h-14 w-[140px] self-center rounded-t-[120px] bg-[radial-gradient(ellipse_75px_52px_at_bottom_center,rgba(255,255,255,0.78)_0%,rgba(255,255,255,0)_112.5%)] flex justify-center items-center transition-opacity duration-700 ease-in-out ${this.show ? "opacity-100 z-10" : "opacity-0 -z-10"}">
1639
+ <div class="flex justify-center items-center w-10 h-10 rounded-full border border-neutral-90 shadow-[0_0_16px_rgba(189,206,219,0.4)] bg-neutral-100 cursor-pointer animate-bounce" @click=${this.handleClick}>
1640
+ <lukso-icon
1641
+ name=${this.iconName}
1642
+ size=${this.iconSize}
1643
+ color=${this.color}
1644
+ ></lukso-icon>
1645
+ </div>
1646
+ </div>
1647
+ `;
1648
+ }
1649
+ };
1650
+ __decorateClass([
1651
+ (0, import_decorators9.property)({ type: Boolean, attribute: "show" })
1652
+ ], ScrollToBottomButton.prototype, "show", 2);
1653
+ __decorateClass([
1654
+ (0, import_decorators9.property)()
1655
+ ], ScrollToBottomButton.prototype, "color", 2);
1656
+ __decorateClass([
1657
+ (0, import_decorators9.property)({ attribute: "icon-size" })
1658
+ ], ScrollToBottomButton.prototype, "iconSize", 2);
1659
+ __decorateClass([
1660
+ (0, import_decorators9.property)({ attribute: "icon-name" })
1661
+ ], ScrollToBottomButton.prototype, "iconName", 2);
1662
+ ScrollToBottomButton = __decorateClass([
1663
+ safeCustomElement("scroll-to-bottom-button")
1664
+ ], ScrollToBottomButton);
1665
+
1666
+ // src/shared/signal-controller.ts
1667
+ var SignalController = class _SignalController {
1668
+ constructor(host, signal) {
1669
+ this.host = host;
1670
+ this.signal = signal;
1671
+ host.addController(this);
1672
+ }
1673
+ hostConnected() {
1674
+ let lastValue = this.signal.value;
1675
+ const check = () => {
1676
+ const currentValue = this.signal.value;
1677
+ if (currentValue !== lastValue) {
1678
+ lastValue = currentValue;
1679
+ this.host.requestUpdate();
1680
+ }
1681
+ };
1682
+ const interval = setInterval(check, 50);
1683
+ this.unsubscribe = () => clearInterval(interval);
1684
+ }
1685
+ hostDisconnected() {
1686
+ if (this.unsubscribe) {
1687
+ this.unsubscribe();
1688
+ this.unsubscribe = void 0;
1689
+ }
1690
+ }
1691
+ get value() {
1692
+ return this.signal.value;
1693
+ }
1694
+ /**
1695
+ * Create a new SignalController for a different signal
1696
+ */
1697
+ static create(host, signal) {
1698
+ return new _SignalController(host, signal);
1699
+ }
1700
+ };
1701
+ var MultiSignalController = class {
1702
+ constructor(host, signals) {
1703
+ this.unsubscribes = [];
1704
+ this.host = host;
1705
+ this.signals = signals;
1706
+ host.addController(this);
1707
+ }
1708
+ hostConnected() {
1709
+ this.signals.forEach((signal, index) => {
1710
+ let lastValue = signal.value;
1711
+ const check = () => {
1712
+ const currentValue = signal.value;
1713
+ if (currentValue !== lastValue) {
1714
+ lastValue = currentValue;
1715
+ this.host.requestUpdate();
1716
+ }
1717
+ };
1718
+ const interval = setInterval(check, 50);
1719
+ this.unsubscribes[index] = () => clearInterval(interval);
1720
+ });
1721
+ }
1722
+ hostDisconnected() {
1723
+ this.unsubscribes.forEach((unsubscribe) => unsubscribe());
1724
+ this.unsubscribes = [];
1725
+ }
1726
+ getValue(index) {
1727
+ return this.signals[index]?.value;
1728
+ }
1729
+ getValues() {
1730
+ return this.signals.map((signal) => signal.value);
1731
+ }
1732
+ };
1733
+ function useSignal(host, signal) {
1734
+ return new SignalController(host, signal);
1735
+ }
1736
+ function useSignals(host, signals) {
1737
+ return new MultiSignalController(host, signals);
1738
+ }
1739
+
1740
+ // src/shared/transaction-view-controller.ts
1741
+ var import_transaction_view_headless5 = require("@lukso/transaction-view-headless");
1742
+ var TransactionViewController = class {
1743
+ constructor(host, transaction, options) {
1744
+ this.transaction = transaction;
1745
+ this.options = options;
1746
+ this.headlessInstance = null;
1747
+ // Internal state
1748
+ this._state = {
1749
+ matches: [],
1750
+ bestMatch: null,
1751
+ component: null,
1752
+ loading: false,
1753
+ error: null,
1754
+ isResolvingAddresses: false,
1755
+ resolvedAddresses: {}
1756
+ };
1757
+ this.host = host;
1758
+ host.addController(this);
1759
+ this.initialize();
1760
+ }
1761
+ hostConnected() {
1762
+ this.setupSync();
1763
+ }
1764
+ hostDisconnected() {
1765
+ if (this.syncInterval) {
1766
+ clearInterval(this.syncInterval);
1767
+ this.syncInterval = void 0;
1768
+ }
1769
+ }
1770
+ get state() {
1771
+ return this._state;
1772
+ }
1773
+ get matches() {
1774
+ return this._state.matches;
1775
+ }
1776
+ get bestMatch() {
1777
+ return this._state.bestMatch;
1778
+ }
1779
+ get component() {
1780
+ return this._state.component;
1781
+ }
1782
+ get isLoading() {
1783
+ return this._state.loading;
1784
+ }
1785
+ get error() {
1786
+ return this._state.error;
1787
+ }
1788
+ get isResolvingAddresses() {
1789
+ return this._state.isResolvingAddresses;
1790
+ }
1791
+ get resolvedAddresses() {
1792
+ return this._state.resolvedAddresses;
1793
+ }
1794
+ /**
1795
+ * Load a specific match
1796
+ */
1797
+ async loadMatch(match) {
1798
+ if (!this.headlessInstance) {
1799
+ throw new Error("Transaction view not initialized");
1800
+ }
1801
+ try {
1802
+ const result = await this.headlessInstance.loadMatch(match);
1803
+ this.syncState();
1804
+ return result;
1805
+ } catch (err) {
1806
+ this.syncState();
1807
+ throw err;
1808
+ }
1809
+ }
1810
+ /**
1811
+ * Load the best match
1812
+ */
1813
+ async loadBestMatch() {
1814
+ if (!this.headlessInstance) {
1815
+ throw new Error("Transaction view not initialized");
1816
+ }
1817
+ try {
1818
+ const result = await this.headlessInstance.loadBestMatch();
1819
+ this.syncState();
1820
+ return result;
1821
+ } catch (err) {
1822
+ this.syncState();
1823
+ throw err;
1824
+ }
1825
+ }
1826
+ /**
1827
+ * Refresh matches
1828
+ */
1829
+ refreshMatches() {
1830
+ if (!this.headlessInstance) {
1831
+ console.warn("Transaction view not initialized, cannot refresh matches");
1832
+ return;
1833
+ }
1834
+ this.headlessInstance.refreshMatches();
1835
+ this.syncState();
1836
+ }
1837
+ /**
1838
+ * Resolve addresses
1839
+ */
1840
+ async resolveAddresses() {
1841
+ if (!this.headlessInstance) {
1842
+ throw new Error("Transaction view not initialized");
1843
+ }
1844
+ try {
1845
+ await this.headlessInstance.resolveAddresses();
1846
+ this.syncState();
1847
+ } catch (err) {
1848
+ this.syncState();
1849
+ throw err;
1850
+ }
1851
+ }
1852
+ /**
1853
+ * Update transaction and options
1854
+ */
1855
+ update(transaction, options) {
1856
+ this.transaction = transaction;
1857
+ this.options = options;
1858
+ this.initialize();
1859
+ }
1860
+ /**
1861
+ * Get the best matching view without loading
1862
+ */
1863
+ static findBestMatch(transaction, framework = "lit") {
1864
+ return (0, import_transaction_view_headless5.findBestTransactionView)(transaction, framework);
1865
+ }
1866
+ /**
1867
+ * Get all matching views without loading
1868
+ */
1869
+ static findAllMatches(transaction, framework = "lit") {
1870
+ return (0, import_transaction_view_headless5.findAllTransactionViews)(transaction, framework);
1871
+ }
1872
+ initialize() {
1873
+ try {
1874
+ this.headlessInstance = (0, import_transaction_view_headless5.useTransactionView)(
1875
+ this.transaction,
1876
+ this.options
1877
+ );
1878
+ this.syncState();
1879
+ } catch (err) {
1880
+ this.updateState({
1881
+ error: err instanceof Error ? err : new Error("Failed to initialize transaction view")
1882
+ });
1883
+ console.error("Failed to initialize transaction view:", err);
1884
+ }
1885
+ }
1886
+ setupSync() {
1887
+ this.syncState();
1888
+ this.syncInterval = setInterval(() => {
1889
+ this.syncState();
1890
+ }, 100);
1891
+ }
1892
+ syncState() {
1893
+ if (!this.headlessInstance) return;
1894
+ this.updateState({
1895
+ matches: this.headlessInstance.matches,
1896
+ bestMatch: this.headlessInstance.bestMatch,
1897
+ component: this.headlessInstance.component,
1898
+ loading: this.headlessInstance.isLoading,
1899
+ error: this.headlessInstance.error,
1900
+ isResolvingAddresses: this.headlessInstance.isResolvingAddresses,
1901
+ resolvedAddresses: this.headlessInstance.resolvedAddresses
1902
+ });
1903
+ }
1904
+ updateState(updates) {
1905
+ this._state = { ...this._state, ...updates };
1906
+ this.host.requestUpdate();
1907
+ }
1908
+ };
1909
+ function useTransactionView(host, transaction, options) {
1910
+ return new TransactionViewController(host, transaction, options);
1911
+ }
1912
+ var TransactionSignalController = class {
1913
+ constructor(host, signal) {
1914
+ this._data = null;
1915
+ this._loading = false;
1916
+ this._error = null;
1917
+ this.host = host;
1918
+ this.signal = signal;
1919
+ host.addController(this);
1920
+ }
1921
+ hostConnected() {
1922
+ this.setupSignalSync();
1923
+ }
1924
+ hostDisconnected() {
1925
+ if (this.unsubscribe) {
1926
+ this.unsubscribe();
1927
+ this.unsubscribe = void 0;
1928
+ }
1929
+ }
1930
+ get data() {
1931
+ return this._data;
1932
+ }
1933
+ get loading() {
1934
+ return this._loading;
1935
+ }
1936
+ get error() {
1937
+ return this._error;
1938
+ }
1939
+ get isReady() {
1940
+ return !this._loading && this._data !== null && !this._error;
1941
+ }
1942
+ setupSignalSync() {
1943
+ const sync = () => {
1944
+ const signalValue = this.signal.value;
1945
+ const newData = signalValue?.data || null;
1946
+ const newLoading = signalValue?.loading || false;
1947
+ const newError = signalValue?.error || null;
1948
+ if (newData !== this._data || newLoading !== this._loading || newError !== this._error) {
1949
+ this._data = newData;
1950
+ this._loading = newLoading;
1951
+ this._error = newError;
1952
+ this.host.requestUpdate();
1953
+ }
1954
+ };
1955
+ sync();
1956
+ const interval = setInterval(sync, 50);
1957
+ this.unsubscribe = () => clearInterval(interval);
1958
+ }
1959
+ };
1960
+ function useTransactionSignal(host, signal) {
1961
+ return new TransactionSignalController(host, signal);
1962
+ }
1963
+
1964
+ // src/shared/url-view.ts
1965
+ var import_lit11 = require("lit");
1966
+ var import_decorators10 = require("lit/decorators.js");
1967
+ var UrlView = class extends CoreLitElement {
1968
+ constructor() {
1969
+ super(...arguments);
1970
+ this.size = "small";
1971
+ this.showLogo = true;
1972
+ this.maxWidth = 240;
1973
+ this.displayName = "";
1974
+ this.faviconCandidates = [];
1975
+ this.faviconIndex = 0;
1976
+ }
1977
+ willUpdate(changed) {
1978
+ if (changed.has("url") || changed.has("label") || changed.has("logoUrl")) {
1979
+ this.computeMeta();
1980
+ }
1981
+ }
1982
+ computeMeta() {
1983
+ try {
1984
+ const u = new URL(this.url);
1985
+ const origin = u.origin;
1986
+ this.faviconCandidates = [];
1987
+ if (this.logoUrl) this.faviconCandidates.push(this.logoUrl);
1988
+ this.faviconCandidates.push(
1989
+ `${origin}/favicon.ico`,
1990
+ `${origin}/favicon.png`
1991
+ );
1992
+ this.faviconIndex = 0;
1993
+ this.favicon = this.faviconCandidates[this.faviconIndex];
1994
+ const hostname = u.hostname.replace(/^www\./, "");
1995
+ const hostnamePretty = hostname.split(".").filter(Boolean).slice(-2).join(" ").replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
1996
+ if (this.label && this.label.trim()) {
1997
+ this.displayName = this.label.trim();
1998
+ } else {
1999
+ this.displayName = hostnamePretty || this.url;
2000
+ }
2001
+ } catch {
2002
+ this.favicon = void 0;
2003
+ this.displayName = this.label && this.label.trim() ? this.label : this.url;
2004
+ }
2005
+ }
2006
+ handleImageError() {
2007
+ this.faviconIndex += 1;
2008
+ if (this.faviconIndex < this.faviconCandidates.length) {
2009
+ this.favicon = this.faviconCandidates[this.faviconIndex];
2010
+ } else {
2011
+ this.favicon = void 0;
2012
+ }
2013
+ }
2014
+ getSizePixels() {
2015
+ switch (this.size) {
2016
+ case "x-small":
2017
+ return 14;
2018
+ case "small":
2019
+ return 16;
2020
+ case "medium":
2021
+ return 20;
2022
+ case "large":
2023
+ return 24;
2024
+ default:
2025
+ return 16;
2026
+ }
2027
+ }
2028
+ render() {
2029
+ const sizePx = this.getSizePixels();
2030
+ return import_lit11.html`
2031
+ <div class="inline-flex flex-col gap-1">
2032
+ <div class="inline-flex items-center gap-2 px-2.5 py-1.5 text-neutral-20 leading-tight font-semibold">
2033
+ ${this.showLogo ? import_lit11.html`
2034
+ <div class="inline-flex items-center p-1 justify-center rounded-lg bg-neutral-100 border border-neutral-90 overflow-hidden flex-none">
2035
+ ${this.favicon ? import_lit11.html`<img
2036
+ src=${this.favicon}
2037
+ style="width:${sizePx}px;height:${sizePx}px;"
2038
+ alt="favicon"
2039
+ @error=${this.handleImageError}
2040
+ />` : import_lit11.html`<lukso-icon name="globe" size=${this.size} color="blue-85"></lukso-icon>`}
2041
+ </div>
2042
+ ` : ""}
2043
+ <span class="whitespace-nowrap overflow-hidden text-ellipsis leading-tight" style=${`max-width:${this.maxWidth}px;font-size: ${sizePx}px;`}>${this.displayName}</span>
2044
+ </div>
2045
+ </div>
2046
+ `;
2047
+ }
2048
+ };
2049
+ __decorateClass([
2050
+ (0, import_decorators10.property)()
2051
+ ], UrlView.prototype, "url", 2);
2052
+ __decorateClass([
2053
+ (0, import_decorators10.property)()
2054
+ ], UrlView.prototype, "size", 2);
2055
+ __decorateClass([
2056
+ (0, import_decorators10.property)()
2057
+ ], UrlView.prototype, "label", 2);
2058
+ __decorateClass([
2059
+ (0, import_decorators10.property)({ type: Boolean, attribute: "show-logo" })
2060
+ ], UrlView.prototype, "showLogo", 2);
2061
+ __decorateClass([
2062
+ (0, import_decorators10.property)({ attribute: "logo-url" })
2063
+ ], UrlView.prototype, "logoUrl", 2);
2064
+ __decorateClass([
2065
+ (0, import_decorators10.property)({ type: Number, attribute: "max-width" })
2066
+ ], UrlView.prototype, "maxWidth", 2);
2067
+ __decorateClass([
2068
+ (0, import_decorators10.state)()
2069
+ ], UrlView.prototype, "favicon", 2);
2070
+ __decorateClass([
2071
+ (0, import_decorators10.state)()
2072
+ ], UrlView.prototype, "displayName", 2);
2073
+ UrlView = __decorateClass([
2074
+ safeCustomElement("url-view")
2075
+ ], UrlView);
2076
+
2077
+ // src/shared/value-view.ts
2078
+ var import_task4 = require("@lit/task");
2079
+ var import_transaction_view_headless6 = require("@lukso/transaction-view-headless");
2080
+ var import_lit12 = require("lit");
2081
+ var import_decorators11 = require("lit/decorators.js");
2082
+ var import_when = require("lit/directives/when.js");
2083
+ function formatUnits(value, decimals = 18) {
2084
+ const divisor = 10n ** BigInt(decimals);
2085
+ const quotient = value / divisor;
2086
+ const remainder = value % divisor;
2087
+ if (remainder === 0n) {
2088
+ return quotient.toString();
2089
+ }
2090
+ const remainderStr = remainder.toString().padStart(decimals, "0");
2091
+ const trimmed = remainderStr.replace(/0+$/, "");
2092
+ return `${quotient}.${trimmed}`;
2093
+ }
2094
+ var ValueView = class extends CoreLitElement {
2095
+ constructor() {
2096
+ super(...arguments);
2097
+ this.type = "auto";
2098
+ this.currencySymbol = "LYX";
2099
+ this.decimals = 18;
2100
+ this.size = "medium";
2101
+ this.showCopyButton = false;
2102
+ this.isCardView = false;
2103
+ this._hasSlotContent = false;
2104
+ // Task for resolving address metadata
2105
+ this.addressTask = new import_task4.Task(this, {
2106
+ task: async ([address]) => {
2107
+ if (!address) return null;
2108
+ try {
2109
+ return this.addressResolver.resolveAddress(address);
2110
+ } catch (error) {
2111
+ console.warn("ValueView: Failed to resolve address metadata:", error);
2112
+ return null;
2113
+ }
2114
+ },
2115
+ args: () => [this.address]
2116
+ });
2117
+ }
2118
+ _onSlotChange(e) {
2119
+ const slot = e.target;
2120
+ const assigned = slot?.assignedNodes({ flatten: true }) ?? [];
2121
+ this._hasSlotContent = assigned.length > 0;
2122
+ }
2123
+ firstUpdated() {
2124
+ const slot = this.renderRoot.querySelector("slot");
2125
+ if (slot) {
2126
+ const assigned = slot.assignedNodes({ flatten: true });
2127
+ this._hasSlotContent = assigned.length > 0;
2128
+ }
2129
+ }
2130
+ // Address resolution utilities (lazy initialization)
2131
+ get addressResolver() {
2132
+ try {
2133
+ return (0, import_transaction_view_headless6.useAddressResolver)();
2134
+ } catch (error) {
2135
+ console.warn("ValueView: Address resolver not available:", error);
2136
+ return {
2137
+ resolveAddress: async () => null
2138
+ };
2139
+ }
2140
+ }
2141
+ /**
2142
+ * Get the effective type for the value
2143
+ */
2144
+ getEffectiveType() {
2145
+ if (this.type !== "auto") return this.type;
2146
+ const value = this.value;
2147
+ if (value === null || value === void 0) return "null";
2148
+ if (typeof value === "string") return "string";
2149
+ if (typeof value === "number") return "number";
2150
+ if (typeof value === "boolean") return "boolean";
2151
+ if (typeof value === "bigint") {
2152
+ if (this.keyName === "value") return "currency";
2153
+ return "bigint";
2154
+ }
2155
+ return "string";
2156
+ }
2157
+ /**
2158
+ * Get CSS class for the value type
2159
+ */
2160
+ getValueClass() {
2161
+ const effectiveType = this.getEffectiveType();
2162
+ switch (effectiveType) {
2163
+ case "string":
2164
+ return "text-success-60";
2165
+ case "number":
2166
+ return "text-info-60";
2167
+ case "boolean":
2168
+ return "text-error-60";
2169
+ case "currency":
2170
+ return "text-warning-60 font-medium";
2171
+ case "bigint":
2172
+ return "text-secondary-60";
2173
+ case "address":
2174
+ return "text-info-60 font-mono";
2175
+ case "null":
2176
+ return "text-neutral-70 italic";
2177
+ default:
2178
+ return "text-neutral-10";
2179
+ }
2180
+ }
2181
+ /**
2182
+ * Format the value for display
2183
+ */
2184
+ getFormattedValue() {
2185
+ const value = this.value;
2186
+ const effectiveType = this.getEffectiveType();
2187
+ if (value === null) return "null";
2188
+ if (value === void 0) return "undefined";
2189
+ switch (effectiveType) {
2190
+ case "currency":
2191
+ const { numeric, symbol } = this.getCurrencyParts();
2192
+ return `${numeric} ${symbol}`;
2193
+ case "bigint":
2194
+ if (typeof value === "bigint") {
2195
+ return value.toString() + "n";
2196
+ }
2197
+ return String(value) + "n";
2198
+ case "boolean":
2199
+ return value ? "true" : "false";
2200
+ case "number":
2201
+ if (typeof value === "number") {
2202
+ return value.toLocaleString();
2203
+ }
2204
+ return String(value);
2205
+ case "string":
2206
+ return String(value);
2207
+ case "null":
2208
+ return "null";
2209
+ default:
2210
+ return String(value);
2211
+ }
2212
+ }
2213
+ /**
2214
+ * Compute currency display parts: numeric portion and symbol
2215
+ */
2216
+ getCurrencyParts() {
2217
+ const value = this.value;
2218
+ const resolvedData = this.addressTask.value;
2219
+ const effectiveDecimals = resolvedData?.lsp4TokenSymbol ? resolvedData.baseAsset?.decimals ?? resolvedData.decimals ?? this.decimals : this.decimals;
2220
+ const effectiveSymbol = resolvedData?.lsp4TokenSymbol || resolvedData?.baseAsset?.lsp4TokenSymbol || this.currencySymbol;
2221
+ let numeric = String(value ?? "");
2222
+ try {
2223
+ if (typeof value === "bigint") {
2224
+ numeric = formatUnits(value, effectiveDecimals);
2225
+ } else if (typeof value === "string" && !isNaN(Number(value))) {
2226
+ const bigintValue = BigInt(value);
2227
+ numeric = formatUnits(bigintValue, effectiveDecimals);
2228
+ }
2229
+ } catch {
2230
+ numeric = String(value ?? "");
2231
+ }
2232
+ return { numeric, symbol: effectiveSymbol };
2233
+ }
2234
+ /** Typography class for numeric value based on size */
2235
+ getNumericClass() {
2236
+ switch (this.size) {
2237
+ case "x-small":
2238
+ return "paragraph-ptmono-12-bold";
2239
+ case "small":
2240
+ return "paragraph-ptmono-14-bold";
2241
+ case "medium":
2242
+ return "paragraph-ptmono-16-bold";
2243
+ case "large":
2244
+ return "paragraph-ptmono-24-bold";
2245
+ default:
2246
+ return "paragraph-ptmono-16-bold";
2247
+ }
2248
+ }
2249
+ /** Typography class for currency symbol based on size */
2250
+ getCurrencyClass() {
2251
+ switch (this.size) {
2252
+ case "x-small":
2253
+ return "paragraph-inter-12-regular";
2254
+ case "small":
2255
+ return "paragraph-inter-14-regular";
2256
+ case "medium":
2257
+ return "paragraph-inter-16-regular";
2258
+ case "large":
2259
+ return "paragraph-inter-20-regular";
2260
+ default:
2261
+ return "paragraph-inter-16-regular";
2262
+ }
2263
+ }
2264
+ /**
2265
+ * Get size-appropriate font size
2266
+ */
2267
+ getContainerTextClass() {
2268
+ switch (this.size) {
2269
+ case "x-small":
2270
+ return "text-[12px]";
2271
+ case "small":
2272
+ return "text-[14px]";
2273
+ case "medium":
2274
+ return "text-[16px]";
2275
+ case "large":
2276
+ return "text-[18px]";
2277
+ default:
2278
+ return "text-[16px]";
2279
+ }
2280
+ }
2281
+ /**
2282
+ * Handle copy to clipboard
2283
+ */
2284
+ async handleCopy(e) {
2285
+ if (e) e.stopPropagation();
2286
+ const textToCopy = String(this.value);
2287
+ try {
2288
+ await navigator.clipboard.writeText(textToCopy);
2289
+ this.dispatchEvent(
2290
+ new CustomEvent("value-copied", {
2291
+ detail: { value: textToCopy },
2292
+ bubbles: true
2293
+ })
2294
+ );
2295
+ } catch (error) {
2296
+ console.error("Failed to copy value:", error);
2297
+ }
2298
+ }
2299
+ /**
2300
+ * Handle value click
2301
+ */
2302
+ handleClick() {
2303
+ this.dispatchEvent(
2304
+ new CustomEvent("value-click", {
2305
+ detail: {
2306
+ value: this.value,
2307
+ formattedValue: this.getFormattedValue(),
2308
+ type: this.getEffectiveType()
2309
+ },
2310
+ bubbles: true
2311
+ })
2312
+ );
2313
+ }
2314
+ render() {
2315
+ const formattedValue = this.getFormattedValue();
2316
+ const valueClass = this.getValueClass();
2317
+ if (this.isCardView) {
2318
+ const effectiveType = this.getEffectiveType();
2319
+ let headerText = this.label || "";
2320
+ let contentTemplate = import_lit12.html`
2321
+ <span class="inline-block text-wrap min-w-0 text-center">${formattedValue}</span>
2322
+ `;
2323
+ if (effectiveType === "currency") {
2324
+ const { numeric, symbol } = this.getCurrencyParts();
2325
+ if (this.label && this.label.trim() !== "") {
2326
+ headerText = this.label;
2327
+ contentTemplate = import_lit12.html`
2328
+ <span class="inline-block overflow-hidden text-ellipsis whitespace-nowrap min-w-0 ${this.getNumericClass()}">${numeric}</span>
2329
+ <span class="inline-block ${this.getCurrencyClass()}"> ${symbol}</span>
2330
+ `;
2331
+ } else {
2332
+ headerText = symbol;
2333
+ contentTemplate = import_lit12.html`
2334
+ <span class="inline-block overflow-hidden text-ellipsis whitespace-nowrap min-w-0 ${this.getNumericClass()}">${numeric}</span>
2335
+ `;
2336
+ }
2337
+ }
2338
+ return import_lit12.html`
2339
+ <div
2340
+ class="block border border-neutral-90 rounded-xl bg-white py-3 px-4 min-w-[320px] ${this.containerClassNames || ""}"
2341
+ @click=${this.handleClick}
2342
+ style="${this.maxWidth ? `max-width: ${this.maxWidth}px` : ""}"
2343
+ >
2344
+ <div class="flex items-center justify-between mb-2">
2345
+ ${headerText ? import_lit12.html`<div class="${this.getLabelClass()} text-neutral-20 overflow-hidden text-ellipsis whitespace-nowrap">${headerText}</div>` : import_lit12.html``}
2346
+ ${this.showCopyButton ? import_lit12.html`
2347
+ <button
2348
+ class="bg-white rounded-lg w-6 h-6 flex items-center justify-center cursor-pointer text-neutral-20 hover:bg-neutral-95"
2349
+ @click=${(e) => this.handleCopy(e)}
2350
+ title="Copy value"
2351
+ aria-label="Copy"
2352
+ >
2353
+ <lukso-icon name="copy" size="small"></lukso-icon>
2354
+ </button>
2355
+ ` : import_lit12.html``}
2356
+ </div>
2357
+ ${(0, import_when.when)(
2358
+ !this._hasSlotContent,
2359
+ () => import_lit12.html`
2360
+ <div class="font-semibold text-neutral-10 break-words flex items-center gap-2 text-wrap ${this.getUseMonospace() ? "font-mono" : ""}">
2361
+ ${contentTemplate}
2362
+ </div>
2363
+ `
2364
+ )}
2365
+ <slot @slotchange=${this._onSlotChange}></slot>
2366
+ </div>
2367
+ `;
2368
+ }
2369
+ return import_lit12.html`
2370
+ <div
2371
+ class="inline-flex items-center gap-1.5 cursor-pointer transition-all duration-200 rounded px-1 py-0.5 hover:bg-neutral-95 min-w-[320px] ${this.getContainerTextClass()} ${this.containerClassNames || ""}"
2372
+ @click=${this.handleClick}
2373
+ style="${this.maxWidth ? `max-width: ${this.maxWidth}px` : ""}"
2374
+ >
2375
+ <span class="inline-block overflow-hidden text-ellipsis whitespace-nowrap min-w-0 ${valueClass}">
2376
+ ${formattedValue}
2377
+ </span>
2378
+ ${this.showCopyButton ? import_lit12.html`
2379
+ <button
2380
+ class="inline-flex items-center justify-center bg-transparent border-0 cursor-pointer text-neutral-70 p-0.5 rounded transition-all duration-200 hover:text-primary-50 hover:bg-neutral-90 flex-shrink-0"
2381
+ @click=${(e) => this.handleCopy(e)}
2382
+ title="Copy value"
2383
+ aria-label="Copy value to clipboard"
2384
+ >
2385
+ <lukso-icon name="copy" size="small"></lukso-icon>
2386
+ </button>
2387
+ ` : ""}
2388
+ </div>
2389
+ `;
2390
+ }
2391
+ /** Whether to use monospace font for the value content */
2392
+ getUseMonospace() {
2393
+ const t = this.getEffectiveType();
2394
+ if (t === "address" || t === "bigint" || this.value?.toString().startsWith("0x"))
2395
+ return true;
2396
+ if (t === "string") {
2397
+ const s = String(this.value ?? "");
2398
+ return /^0x[0-9a-fA-F]+$/.test(s) || s.length > 32;
2399
+ }
2400
+ return false;
2401
+ }
2402
+ /** Map size to a typography class for the label */
2403
+ getLabelClass() {
2404
+ switch (this.size) {
2405
+ case "x-small":
2406
+ return "paragraph-inter-12-semi-bold";
2407
+ case "small":
2408
+ return "heading-inter-14-bold";
2409
+ case "medium":
2410
+ return "heading-inter-17-semi-bold";
2411
+ case "large":
2412
+ return "heading-inter-21-semi-bold";
2413
+ default:
2414
+ return "heading-inter-17-semi-bold";
2415
+ }
2416
+ }
2417
+ };
2418
+ __decorateClass([
2419
+ (0, import_decorators11.property)()
2420
+ ], ValueView.prototype, "value", 2);
2421
+ __decorateClass([
2422
+ (0, import_decorators11.property)({ attribute: "key-name" })
2423
+ ], ValueView.prototype, "keyName", 2);
2424
+ __decorateClass([
2425
+ (0, import_decorators11.property)({ type: String, attribute: "container-class-names" })
2426
+ ], ValueView.prototype, "containerClassNames", 2);
2427
+ __decorateClass([
2428
+ (0, import_decorators11.property)()
2429
+ ], ValueView.prototype, "type", 2);
2430
+ __decorateClass([
2431
+ (0, import_decorators11.property)({ attribute: "currency-symbol" })
2432
+ ], ValueView.prototype, "currencySymbol", 2);
2433
+ __decorateClass([
2434
+ (0, import_decorators11.property)({ type: Number })
2435
+ ], ValueView.prototype, "decimals", 2);
2436
+ __decorateClass([
2437
+ (0, import_decorators11.property)()
2438
+ ], ValueView.prototype, "size", 2);
2439
+ __decorateClass([
2440
+ (0, import_decorators11.property)({ type: Boolean, attribute: "show-copy-button" })
2441
+ ], ValueView.prototype, "showCopyButton", 2);
2442
+ __decorateClass([
2443
+ (0, import_decorators11.property)({ type: Boolean, attribute: "is-card-view" })
2444
+ ], ValueView.prototype, "isCardView", 2);
2445
+ __decorateClass([
2446
+ (0, import_decorators11.property)()
2447
+ ], ValueView.prototype, "label", 2);
2448
+ __decorateClass([
2449
+ (0, import_decorators11.property)({ type: Number, attribute: "max-width" })
2450
+ ], ValueView.prototype, "maxWidth", 2);
2451
+ __decorateClass([
2452
+ (0, import_decorators11.property)()
2453
+ ], ValueView.prototype, "address", 2);
2454
+ __decorateClass([
2455
+ (0, import_decorators11.state)()
2456
+ ], ValueView.prototype, "resolvedMetadata", 2);
2457
+ __decorateClass([
2458
+ (0, import_decorators11.state)()
2459
+ ], ValueView.prototype, "_hasSlotContent", 2);
2460
+ ValueView = __decorateClass([
2461
+ safeCustomElement("value-view")
2462
+ ], ValueView);
2463
+
2464
+ // src/shared/image-list.ts
2465
+ var import_task5 = require("@lit/task");
2466
+ var import_transaction_view_headless7 = require("@lukso/transaction-view-headless");
2467
+ var import_lit13 = require("lit");
2468
+ var import_decorators12 = require("lit/decorators.js");
2469
+ var import_repeat = require("lit/directives/repeat.js");
2470
+ var ImageList = class extends CoreLitElement {
2471
+ constructor() {
2472
+ super(...arguments);
2473
+ this.size = "small";
2474
+ this.isCardView = false;
2475
+ this.isLoading = false;
2476
+ // Composables
2477
+ this.addressResolver = (0, import_transaction_view_headless7.useAddressResolver)();
2478
+ // Task for resolving address data
2479
+ this.addressTask = new import_task5.Task(this, {
2480
+ task: async ([address], { signal }) => {
2481
+ if (!address) return null;
2482
+ this.isLoading = true;
2483
+ try {
2484
+ const resolved = await this.addressResolver.resolveAddress(address);
2485
+ return resolved;
2486
+ } catch (error) {
2487
+ console.warn("\u274C ImageList: Failed to resolve address:", error);
2488
+ return null;
2489
+ } finally {
2490
+ this.isLoading = false;
2491
+ }
2492
+ },
2493
+ args: () => [this.address]
2494
+ });
2495
+ }
2496
+ /**
2497
+ * Get the list of items to display from resolved data
2498
+ */
2499
+ getDisplayItems() {
2500
+ const resolved = this.addressTask.value;
2501
+ if (!resolved) return [];
2502
+ console.log("resolved images are", resolved);
2503
+ const items = resolved[this.imageHint];
2504
+ if (!Array.isArray(items)) return [];
2505
+ const hasIndex = items.length > 0 && items[0]?.index !== void 0;
2506
+ if (!hasIndex) {
2507
+ return items;
2508
+ }
2509
+ return items.filter((item) => {
2510
+ const index = item.index;
2511
+ if (this.minIndex !== void 0 && index < this.minIndex) return false;
2512
+ if (this.maxIndex !== void 0 && index > this.maxIndex) return false;
2513
+ return true;
2514
+ });
2515
+ }
2516
+ /**
2517
+ * Check if an item is an actual image based on fileType
2518
+ */
2519
+ isImageFile(item) {
2520
+ if (!item.fileType) return true;
2521
+ return item.fileType.startsWith("image/");
2522
+ }
2523
+ /**
2524
+ * Get file type icon for non-image files
2525
+ */
2526
+ getFileTypeIcon(item) {
2527
+ if (!item.fileType) return "\u{1F4C4}";
2528
+ if (item.fileType.startsWith("video/")) return "\u{1F3A5}";
2529
+ if (item.fileType.startsWith("audio/")) return "\u{1F3B5}";
2530
+ if (item.fileType.startsWith("application/pdf")) return "\u{1F4D5}";
2531
+ return "\u{1F4C4}";
2532
+ }
2533
+ /**
2534
+ * Render a single image item
2535
+ */
2536
+ renderImageItem(item, index) {
2537
+ const itemIndex = item.index !== void 0 ? item.index : index;
2538
+ const isImage = this.isImageFile(item);
2539
+ if (isImage) {
2540
+ const imageSrc = item.src || item.url;
2541
+ if (!imageSrc) {
2542
+ return import_lit13.html`
2543
+ <div class="image-item broken-image-item">
2544
+ <div class="broken-image-icon">🖼️❌</div>
2545
+ ${item.index !== void 0 ? import_lit13.html`<div class="broken-image-label">#${item.index}</div>` : ""}
2546
+ <div class="broken-image-text">No image</div>
2547
+ </div>
2548
+ `;
2549
+ }
2550
+ return import_lit13.html`
2551
+ <div class="">
2552
+ <img
2553
+ class="min-h-20 min-w-20 object-cover rounded-lg"
2554
+ src=${imageSrc}
2555
+ alt=${item.index !== void 0 ? `#${item.index}` : "Image"}
2556
+ @error=${(e) => {
2557
+ const target = e.target;
2558
+ target.style.display = "none";
2559
+ const parent = target.parentElement;
2560
+ if (parent) {
2561
+ parent.innerHTML = `
2562
+ <div class="broken-image-icon">\u{1F5BC}\uFE0F\u274C</div>
2563
+ <div class="broken-image-text">Failed to load</div>
2564
+ `;
2565
+ }
2566
+ }}
2567
+ />
2568
+ ${item.index !== void 0 ? import_lit13.html`<div class="image-label">#${item.index}</div>` : ""}
2569
+ </div>
2570
+ `;
2571
+ } else {
2572
+ return import_lit13.html`
2573
+ <div class="image-item file-item">
2574
+ <div class="file-icon">${this.getFileTypeIcon(item)}</div>
2575
+ ${item.index !== void 0 ? import_lit13.html`<div class="file-label">#${item.index}</div>` : ""}
2576
+ <div class="file-type">${item.fileType || "Unknown"}</div>
2577
+ </div>
2578
+ `;
2579
+ }
2580
+ }
2581
+ getImageMinSizePx() {
2582
+ switch (this.size) {
2583
+ case "x-small":
2584
+ return 80;
2585
+ case "small":
2586
+ return 120;
2587
+ case "medium":
2588
+ return 160;
2589
+ case "large":
2590
+ return 240;
2591
+ default:
2592
+ return 160;
2593
+ }
2594
+ }
2595
+ render() {
2596
+ if (this.isLoading) {
2597
+ return import_lit13.html`
2598
+ <div class="flex flex-col items-center justify-center py-10 px-5 text-neutral-60">
2599
+ <div class="text-[24px] mb-2 animate-spin">⏳</div>
2600
+ <div class="text-[14px]">Loading images...</div>
2601
+ </div>
2602
+ `;
2603
+ }
2604
+ const items = this.getDisplayItems();
2605
+ if (items.length === 0) {
2606
+ return import_lit13.html`
2607
+ <div class="flex flex-col items-center justify-center py-10 px-5 text-neutral-70">
2608
+ <div class="text-[14px]">No images found</div>
2609
+ </div>
2610
+ `;
2611
+ }
2612
+ const grid = import_lit13.html`
2613
+ <div class="grid grid-cols-[repeat(auto-fill,minmax(${this.getImageMinSizePx()}px,300px))] gap-3 p-2">
2614
+ ${(0, import_repeat.repeat)(
2615
+ items,
2616
+ (item, index) => item.index ?? index,
2617
+ (item, index) => this.renderImageItem(item, index)
2618
+ )}
2619
+ </div>
2620
+ `;
2621
+ return this.isCardView ? import_lit13.html`<div class="flex flex-row flex-wrap border border-neutral-90 rounded-xl p-3 bg-neutral-100">${grid}</div>` : grid;
2622
+ }
2623
+ };
2624
+ __decorateClass([
2625
+ (0, import_decorators12.property)()
2626
+ ], ImageList.prototype, "address", 2);
2627
+ __decorateClass([
2628
+ (0, import_decorators12.property)({ type: String, attribute: "image-hint" })
2629
+ ], ImageList.prototype, "imageHint", 2);
2630
+ __decorateClass([
2631
+ (0, import_decorators12.property)({ type: Number, attribute: "min-index" })
2632
+ ], ImageList.prototype, "minIndex", 2);
2633
+ __decorateClass([
2634
+ (0, import_decorators12.property)({ type: Number, attribute: "max-index" })
2635
+ ], ImageList.prototype, "maxIndex", 2);
2636
+ __decorateClass([
2637
+ (0, import_decorators12.property)()
2638
+ ], ImageList.prototype, "size", 2);
2639
+ __decorateClass([
2640
+ (0, import_decorators12.property)({ type: Boolean, attribute: "is-card-view" })
2641
+ ], ImageList.prototype, "isCardView", 2);
2642
+ __decorateClass([
2643
+ (0, import_decorators12.state)()
2644
+ ], ImageList.prototype, "isLoading", 2);
2645
+ ImageList = __decorateClass([
2646
+ safeCustomElement("image-list")
2647
+ ], ImageList);
2648
+
2649
+ // src/components/info-panel.ts
2650
+ var import_task6 = require("@lit/task");
2651
+ var import_transaction_view_headless8 = require("@lukso/transaction-view-headless");
2652
+ var import_lit14 = require("lit");
2653
+ var import_decorators13 = require("lit/decorators.js");
2654
+ var import_class_map = require("lit/directives/class-map.js");
2655
+ var import_repeat2 = require("lit/directives/repeat.js");
2656
+ var import_when2 = require("lit/directives/when.js");
2657
+ var InfoPanel = class extends import_lit14.LitElement {
2658
+ constructor() {
2659
+ super(...arguments);
2660
+ this.address = "";
2661
+ this.open = false;
2662
+ this.standard = "";
2663
+ this.type = "transfer";
2664
+ this._isAnimating = false;
2665
+ this._resolutionTask = new import_task6.Task(this, {
2666
+ task: async ([address]) => {
2667
+ if (!address) return null;
2668
+ const { resolveAddress } = (0, import_transaction_view_headless8.useAddressResolver)();
2669
+ const data = await resolveAddress(address);
2670
+ this._resolvedData = data;
2671
+ return data;
2672
+ },
2673
+ args: () => [this.address]
2674
+ });
2675
+ }
2676
+ _extractBaseAddress(addressOrComposite) {
2677
+ return addressOrComposite.split("-")[0];
2678
+ }
2679
+ _extractTokenId(addressOrComposite) {
2680
+ const parts = addressOrComposite.split("-");
2681
+ return parts.length > 1 ? parts[1] : void 0;
2682
+ }
2683
+ _handleClose() {
2684
+ this.dispatchEvent(new CustomEvent("close"));
2685
+ }
2686
+ _copyToClipboard(text) {
2687
+ if (navigator.clipboard) {
2688
+ navigator.clipboard.writeText(text);
2689
+ this.dispatchEvent(new CustomEvent("copied", { detail: { text } }));
2690
+ }
2691
+ }
2692
+ _renderHeader() {
2693
+ const name = this._resolvedData?.lsp4TokenName || this._resolvedData?.name || "Digital Asset";
2694
+ return import_lit14.html`
2695
+ <div class="header">
2696
+ ${(0, import_when2.when)(
2697
+ this.address,
2698
+ () => import_lit14.html`
2699
+ <icon-view
2700
+ address="${this.address}"
2701
+ size="large"
2702
+ class="header-icon"
2703
+ ></icon-view>
2704
+ `,
2705
+ () => import_lit14.html`
2706
+ <div class="loading-placeholder">🪙</div>
2707
+ `
2708
+ )}
2709
+ <div class="header-title">${name}</div>
2710
+ </div>
2711
+ `;
2712
+ }
2713
+ _renderContractAddress() {
2714
+ const contractAddress = this._extractBaseAddress(this.address);
2715
+ if (!contractAddress) return "";
2716
+ return import_lit14.html`
2717
+ <div class="section">
2718
+ <div class="section-title">
2719
+ 📄 Contract Address
2720
+ <button
2721
+ class="copy-button"
2722
+ @click=${() => this._copyToClipboard(contractAddress)}
2723
+ title="Copy to clipboard"
2724
+ >
2725
+ 📋
2726
+ </button>
2727
+ </div>
2728
+ <div class="section-content">
2729
+ <address-view
2730
+ .address=${contractAddress}
2731
+ format="truncated"
2732
+ ></address-view>
2733
+ </div>
2734
+ </div>
2735
+ `;
2736
+ }
2737
+ _renderTokenId() {
2738
+ const tokenId = this._extractTokenId(this.address);
2739
+ if (!tokenId) return "";
2740
+ const formattedTokenId = this._resolvedData?.formattedTokenId;
2741
+ const displayTokenId = formattedTokenId ? `#${formattedTokenId}` : tokenId || "";
2742
+ return import_lit14.html`
2743
+ <div class="section">
2744
+ <div class="section-title">
2745
+ 🏷️ Token ID
2746
+ <button
2747
+ class="copy-button"
2748
+ @click=${() => this._copyToClipboard(tokenId)}
2749
+ title="Copy to clipboard"
2750
+ >
2751
+ 📋
2752
+ </button>
2753
+ </div>
2754
+ <div class="section-content">${displayTokenId}</div>
2755
+ </div>
2756
+ `;
2757
+ }
2758
+ _renderDescription() {
2759
+ const description = this._resolvedData?.description;
2760
+ if (!description) return "";
2761
+ return import_lit14.html`
2762
+ <div class="section">
2763
+ <div class="section-title">📝 Description</div>
2764
+ <div class="section-content description">${description}</div>
2765
+ </div>
2766
+ `;
2767
+ }
2768
+ _renderLinks() {
2769
+ const links = this._resolvedData?.links || [];
2770
+ if (!links.length) return "";
2771
+ return import_lit14.html`
2772
+ <div class="section">
2773
+ <div class="section-title">🔗 Links</div>
2774
+ <ul class="links-list">
2775
+ ${(0, import_repeat2.repeat)(
2776
+ links,
2777
+ (link) => link.url,
2778
+ (link) => import_lit14.html`
2779
+ <li class="link-item">
2780
+ <a
2781
+ class="external-link"
2782
+ href="${link.url}"
2783
+ target="_blank"
2784
+ rel="noopener noreferrer"
2785
+ >
2786
+ ${link.title || link.url}
2787
+ <span>↗</span>
2788
+ </a>
2789
+ </li>
2790
+ `
2791
+ )}
2792
+ </ul>
2793
+ </div>
2794
+ `;
2795
+ }
2796
+ _renderImages() {
2797
+ const images = this._resolvedData?.images || [];
2798
+ if (!images.length) return "";
2799
+ return import_lit14.html`
2800
+ <div class="section">
2801
+ <div class="section-title">🖼️ Images</div>
2802
+ <image-list
2803
+ address=${this.address}
2804
+ image-hint="images"
2805
+ size="medium"
2806
+ ></image-list>
2807
+ </div>
2808
+ `;
2809
+ }
2810
+ _renderAssets() {
2811
+ const assets = this._resolvedData?.assets || [];
2812
+ if (!assets.length) return "";
2813
+ return import_lit14.html`
2814
+ <div class="section">
2815
+ <div class="section-title">📦 Assets</div>
2816
+ <image-list
2817
+ address=${this.address}
2818
+ image-hint="assets"
2819
+ size="medium"
2820
+ ></image-list>
2821
+ </div>
2822
+ `;
2823
+ }
2824
+ _handleBackdropClick(e) {
2825
+ if (e.target === e.currentTarget) {
2826
+ this._handleClose();
2827
+ }
2828
+ }
2829
+ render() {
2830
+ const panelClasses = {
2831
+ panel: true,
2832
+ open: this.open
2833
+ };
2834
+ return import_lit14.html`
2835
+ <div class=${(0, import_class_map.classMap)(panelClasses)} @click=${this._handleBackdropClick}>
2836
+ <div class="panel-content" @click=${(e) => e.stopPropagation()}>
2837
+ <button class="close-button" @click=${this._handleClose}>×</button>
2838
+
2839
+ ${this._renderHeader()}
2840
+ ${this._renderContractAddress()}
2841
+ ${this._renderTokenId()}
2842
+ ${this._renderDescription()}
2843
+ ${this._renderLinks()}
2844
+ ${this._renderImages()}
2845
+ ${this._renderAssets()}
2846
+ </div>
2847
+ </div>
2848
+ `;
2849
+ }
2850
+ };
2851
+ InfoPanel.styles = import_lit14.css`
2852
+ :host {
2853
+ display: block;
2854
+ position: relative;
2855
+ font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
2856
+ }
2857
+
2858
+ .panel {
2859
+ position: fixed;
2860
+ top: 0;
2861
+ left: 0;
2862
+ right: 0;
2863
+ bottom: 0;
2864
+ background: rgba(0, 0, 0, 0.5);
2865
+ z-index: 1000;
2866
+ opacity: 0;
2867
+ visibility: hidden;
2868
+ transition: all 0.3s ease;
2869
+ }
2870
+
2871
+ .panel.open {
2872
+ opacity: 1;
2873
+ visibility: visible;
2874
+ }
2875
+
2876
+ .panel-content {
2877
+ position: absolute;
2878
+ top: 0;
2879
+ right: 0;
2880
+ width: 100%;
2881
+ max-width: 400px;
2882
+ height: 100%;
2883
+ background: white;
2884
+ transform: translateX(100%);
2885
+ transition: transform 0.3s ease;
2886
+ overflow-y: auto;
2887
+ padding: 24px;
2888
+ box-sizing: border-box;
2889
+ }
2890
+
2891
+ .panel.open .panel-content {
2892
+ transform: translateX(0);
2893
+ }
2894
+
2895
+ .close-button {
2896
+ position: absolute;
2897
+ top: 20px;
2898
+ right: 20px;
2899
+ background: none;
2900
+ border: none;
2901
+ font-size: 24px;
2902
+ cursor: pointer;
2903
+ color: #6b7280;
2904
+ padding: 4px;
2905
+ border-radius: 4px;
2906
+ transition: background-color 0.2s;
2907
+ }
2908
+
2909
+ .close-button:hover {
2910
+ background-color: #f3f4f6;
2911
+ }
2912
+
2913
+ .header {
2914
+ display: flex;
2915
+ align-items: center;
2916
+ justify-content: center;
2917
+ margin-bottom: 24px;
2918
+ padding-top: 20px;
2919
+ }
2920
+
2921
+ .header-icon {
2922
+ margin-right: 12px;
2923
+ }
2924
+
2925
+ .header-title {
2926
+ font-size: 18px;
2927
+ font-weight: 600;
2928
+ color: #111827;
2929
+ text-align: center;
2930
+ }
2931
+
2932
+ .section {
2933
+ margin-bottom: 20px;
2934
+ padding: 16px;
2935
+ background: #f9fafb;
2936
+ border-radius: 12px;
2937
+ border: 1px solid #e5e7eb;
2938
+ }
2939
+
2940
+ .section-title {
2941
+ font-size: 14px;
2942
+ font-weight: 600;
2943
+ color: #374151;
2944
+ margin-bottom: 8px;
2945
+ display: flex;
2946
+ align-items: center;
2947
+ gap: 8px;
2948
+ }
2949
+
2950
+ .section-content {
2951
+ font-size: 14px;
2952
+ color: #6b7280;
2953
+ word-break: break-all;
2954
+ }
2955
+
2956
+ .copy-button {
2957
+ background: none;
2958
+ border: none;
2959
+ cursor: pointer;
2960
+ padding: 4px;
2961
+ border-radius: 4px;
2962
+ color: #6b7280;
2963
+ transition: background-color 0.2s;
2964
+ }
2965
+
2966
+ .copy-button:hover {
2967
+ background-color: #e5e7eb;
2968
+ }
2969
+
2970
+ .links-list {
2971
+ list-style: none;
2972
+ padding: 0;
2973
+ margin: 0;
2974
+ }
2975
+
2976
+ .link-item {
2977
+ margin-bottom: 8px;
2978
+ }
2979
+
2980
+ .link-item:last-child {
2981
+ margin-bottom: 0;
2982
+ }
2983
+
2984
+ .external-link {
2985
+ display: inline-flex;
2986
+ align-items: center;
2987
+ gap: 6px;
2988
+ color: #3b82f6;
2989
+ text-decoration: none;
2990
+ font-size: 14px;
2991
+ padding: 6px 12px;
2992
+ border-radius: 6px;
2993
+ transition: background-color 0.2s;
2994
+ }
2995
+
2996
+ .external-link:hover {
2997
+ background-color: #eff6ff;
2998
+ }
2999
+
3000
+ .description {
3001
+ line-height: 1.6;
3002
+ color: #374151;
3003
+ }
3004
+
3005
+ .loading-placeholder {
3006
+ width: 96px;
3007
+ height: 96px;
3008
+ background: #f3f4f6;
3009
+ border-radius: 16px;
3010
+ display: flex;
3011
+ align-items: center;
3012
+ justify-content: center;
3013
+ color: #9ca3af;
3014
+ font-size: 32px;
3015
+ }
3016
+
3017
+ @media (max-width: 640px) {
3018
+ .panel-content {
3019
+ max-width: 100%;
3020
+ }
3021
+ }
3022
+ `;
3023
+ __decorateClass([
3024
+ (0, import_decorators13.property)({ type: String })
3025
+ ], InfoPanel.prototype, "address", 2);
3026
+ __decorateClass([
3027
+ (0, import_decorators13.property)({ type: Boolean, attribute: "open" })
3028
+ ], InfoPanel.prototype, "open", 2);
3029
+ __decorateClass([
3030
+ (0, import_decorators13.property)({ type: String })
3031
+ ], InfoPanel.prototype, "standard", 2);
3032
+ __decorateClass([
3033
+ (0, import_decorators13.property)({ type: String })
3034
+ ], InfoPanel.prototype, "type", 2);
3035
+ __decorateClass([
3036
+ (0, import_decorators13.state)()
3037
+ ], InfoPanel.prototype, "_isAnimating", 2);
3038
+ __decorateClass([
3039
+ (0, import_decorators13.state)()
3040
+ ], InfoPanel.prototype, "_resolvedData", 2);
3041
+ InfoPanel = __decorateClass([
3042
+ safeCustomElement("info-panel")
3043
+ ], InfoPanel);
3044
+
3045
+ // src/components/asset-card.ts
3046
+ var import_lit15 = require("lit");
3047
+ var import_decorators14 = require("lit/decorators.js");
3048
+ var import_repeat3 = require("lit/directives/repeat.js");
3049
+ var import_when3 = require("lit/directives/when.js");
3050
+ var import_web_components = require("@lukso/web-components");
3051
+ var import_task7 = require("@lit/task");
3052
+ var import_transaction_view_headless9 = require("@lukso/transaction-view-headless");
3053
+ function formatUnits2(value, decimals = 18) {
3054
+ const divisor = 10n ** BigInt(decimals);
3055
+ const quotient = value / divisor;
3056
+ const remainder = value % divisor;
3057
+ if (remainder === 0n) {
3058
+ return quotient.toString();
3059
+ }
3060
+ const remainderStr = remainder.toString().padStart(decimals, "0");
3061
+ const trimmed = remainderStr.replace(/0+$/, "");
3062
+ return `${quotient}.${trimmed}`;
3063
+ }
3064
+ var AssetCard = class extends CoreLitElement {
3065
+ constructor() {
3066
+ super(...arguments);
3067
+ this.functionIcon = "code-outline";
3068
+ this.size = "medium";
3069
+ this.showInfoButton = true;
3070
+ this.showCreator = true;
3071
+ this.displayDetails = false;
3072
+ this._imageError = false;
3073
+ // Composables
3074
+ this.addressResolver = (0, import_transaction_view_headless9.useAddressResolver)();
3075
+ this._resolutionTask = new import_task7.Task(this, {
3076
+ task: async ([address]) => {
3077
+ if (!address) return null;
3078
+ const { resolveAddress } = this.addressResolver;
3079
+ const data = await resolveAddress(address);
3080
+ this._resolvedData = data;
3081
+ return data;
3082
+ },
3083
+ args: () => [this.address]
3084
+ });
3085
+ }
3086
+ _handleImageError() {
3087
+ this._imageError = true;
3088
+ }
3089
+ _handleInfoClick() {
3090
+ this.displayDetails = !this.displayDetails;
3091
+ }
3092
+ _extractBaseAddress(addressOrComposite) {
3093
+ return addressOrComposite.split("-")[0];
3094
+ }
3095
+ _extractTokenId(addressOrComposite) {
3096
+ const parts = addressOrComposite.split("-");
3097
+ return parts.length > 1 ? parts[1] : void 0;
3098
+ }
3099
+ _copyToClipboard(text) {
3100
+ if (navigator.clipboard) {
3101
+ navigator.clipboard.writeText(text);
3102
+ this.dispatchEvent(new CustomEvent("copied", { detail: { text } }));
3103
+ }
3104
+ }
3105
+ _renderAddressSection() {
3106
+ const data = this._resolutionTask.value;
3107
+ if (!data) return "";
3108
+ return import_lit15.html`
3109
+ <div class="flex items-center justify-between cursor-pointer">
3110
+ ${(0, import_when3.when)(
3111
+ data.lsp4TokenSymbol,
3112
+ () => import_lit15.html`
3113
+ <address-view
3114
+ address=${this._extractBaseAddress(data.address)}
3115
+ size="medium"
3116
+ max-width=${100}
3117
+ .showIdenticon=${false}
3118
+ ?is-card-view=${false}
3119
+ ?show-copy-button=${false}
3120
+ address-color="neutral-60"
3121
+ ></address-view>
3122
+ `
3123
+ )}
3124
+ ${(0, import_when3.when)(
3125
+ this.showInfoButton,
3126
+ () => import_lit15.html`
3127
+ <lukso-icon name="information" size="small" @click=${this._handleInfoClick}></lukso-icon>
3128
+ `
3129
+ )}
3130
+ </div>
3131
+ `;
3132
+ }
3133
+ _renderCreatorSection() {
3134
+ const owner = this._resolvedData?.owner_id;
3135
+ const creators = this._resolvedData?.lsp4Creators || [];
3136
+ const resolvedCreator = owner || creators[0]?.profile_id;
3137
+ if (!resolvedCreator) return "";
3138
+ return import_lit15.html`
3139
+ <div class="gap-2">
3140
+ <div class="text-neutral-60 text-[12px] font-normal">Created by</div>
3141
+ <div class="flex justify-center flex-col gap-1 text-[12px] font-bold font-mono">
3142
+ <icon-view
3143
+ address=${owner}
3144
+ size="small"
3145
+ name-position="beside"
3146
+ ></icon-view>
3147
+ </div>
3148
+ </div>
3149
+ `;
3150
+ }
3151
+ _renderContractAddress() {
3152
+ const data = this._resolutionTask.value;
3153
+ return import_lit15.html`
3154
+ <div class="section">
3155
+ ${(0, import_when3.when)(
3156
+ data.lsp4TokenSymbol,
3157
+ () => import_lit15.html`
3158
+ <address-view
3159
+ address=${data.address}
3160
+ size="medium"
3161
+ label=${data.lsp4TokenName}
3162
+ max-width=${100}
3163
+ .showIdenticon=${false}
3164
+ ?is-card-view=${true}
3165
+ ?show-copy-button=${true}
3166
+ address-color="neutral-60"
3167
+ ></address-view>
3168
+ `
3169
+ )}
3170
+ </div>
3171
+ `;
3172
+ }
3173
+ _renderAssetLongName() {
3174
+ const data = this._resolutionTask.value;
3175
+ return import_lit15.html`
3176
+ ${(0, import_when3.when)(
3177
+ data?.lsp4TokenName,
3178
+ () => import_lit15.html`
3179
+ <value-view
3180
+ ?is-card-view=${true}
3181
+ ?show-copy-button=${true}
3182
+ value=${data.lsp4TokenName}
3183
+ label="Token Name"
3184
+ ></value-view>
3185
+ `
3186
+ )}
3187
+ `;
3188
+ }
3189
+ _renderAssetSymbol() {
3190
+ const data = this._resolutionTask.value;
3191
+ return import_lit15.html`
3192
+ ${(0, import_when3.when)(
3193
+ data?.lsp4TokenSymbol,
3194
+ () => import_lit15.html`
3195
+ <value-view
3196
+ ?is-card-view=${true}
3197
+ ?show-copy-button=${true}
3198
+ value=${data.lsp4TokenSymbol}
3199
+ label="Symbol"
3200
+ ></value-view>
3201
+ `
3202
+ )}
3203
+ `;
3204
+ }
3205
+ get displayedTokenId() {
3206
+ const formattedTokenId = this._resolvedData?.formattedTokenId;
3207
+ const displayTokenId = formattedTokenId ? `${formattedTokenId}` : "";
3208
+ if (displayTokenId) return displayTokenId;
3209
+ return this.tokenId && !this._resolvedData?.isCollection ? `${parseInt(this.tokenId, 16)}` : void 0;
3210
+ }
3211
+ _renderTokenId() {
3212
+ const displayTokenId = this.displayedTokenId;
3213
+ if (!displayTokenId) return "";
3214
+ return import_lit15.html`
3215
+ <value-view
3216
+ ?is-card-view=${true}
3217
+ ?show-copy-button=${true}
3218
+ value=${displayTokenId}
3219
+ label="Token ID"
3220
+ ></value-view>
3221
+ `;
3222
+ }
3223
+ _renderDescription() {
3224
+ const description = this._resolvedData?.description;
3225
+ if (!description) return "";
3226
+ return import_lit15.html`
3227
+ <value-view
3228
+ ?is-card-view=${true}
3229
+ ?show-copy-button=${true}
3230
+ value=${description}
3231
+ label="Description"
3232
+ >
3233
+ </value-view>
3234
+ `;
3235
+ }
3236
+ _renderLinks() {
3237
+ const links = this._resolvedData?.links || [];
3238
+ if (!links.length) return "";
3239
+ return import_lit15.html`
3240
+ <div class="section">
3241
+ <div class="section-title">🔗 Links</div>
3242
+ <ul class="links-list">
3243
+ ${(0, import_repeat3.repeat)(
3244
+ links,
3245
+ (link) => link.url,
3246
+ (link) => import_lit15.html`
3247
+ <li class="link-item">
3248
+ <a
3249
+ class="external-link"
3250
+ href="${link.url}"
3251
+ target="_blank"
3252
+ rel="noopener noreferrer"
3253
+ >
3254
+ ${link.title || link.url}
3255
+ <span>↗</span>
3256
+ </a>
3257
+ </li>
3258
+ `
3259
+ )}
3260
+ </ul>
3261
+ </div>
3262
+ `;
3263
+ }
3264
+ _renderImages() {
3265
+ const images = this._resolvedData?.images || [];
3266
+ if (images.length === 0) return "";
3267
+ return import_lit15.html`
3268
+ <image-list
3269
+ address=${this.address}
3270
+ image-hint="images"
3271
+ size="medium"
3272
+ ?is-card-view=${true}
3273
+ ></image-list>
3274
+ `;
3275
+ }
3276
+ _renderAssets() {
3277
+ const assets = this._resolvedData?.assets || [];
3278
+ if (assets.length === 0) return "";
3279
+ return import_lit15.html`
3280
+ <div class="section">
3281
+ <div class="section-title">Assets</div>
3282
+ <image-list
3283
+ address=${this.address}
3284
+ image-hint="assets"
3285
+ size="medium"
3286
+ ></image-list>
3287
+ </div>
3288
+ `;
3289
+ }
3290
+ _renderStandards() {
3291
+ return import_lit15.html`
3292
+ <div class="flex justify-between items-center my-4">
3293
+ <function-name-view
3294
+ label=${this.functionName}
3295
+ size="small"
3296
+ icon=${this.functionIcon ? this.functionIcon : "code-outline"}
3297
+ ></function-name-view>
3298
+ <function-name-view label=${this._resolvedData?.standard} size="small"></function-name-view>
3299
+ </div>
3300
+ `;
3301
+ }
3302
+ _renderTokenDetails() {
3303
+ if (!this.displayDetails) return "";
3304
+ return import_lit15.html`
3305
+ <div class="p-4 mt-6 flex flex-col border border-neutral-90 rounded-xl gap-4">
3306
+ ${this._renderContractAddress()}
3307
+ ${this._renderAssetLongName()}
3308
+ ${this._renderAssetSymbol()}
3309
+ ${this._renderTokenId()}
3310
+ ${this._renderDescription()}
3311
+ ${this._renderLinks()}
3312
+ ${this._renderImages()}
3313
+ ${this._renderAssets()}
3314
+ </div>
3315
+ `;
3316
+ }
3317
+ renderFormattedTokenIdBadge() {
3318
+ if (!this.displayedTokenId) return "";
3319
+ return import_lit15.html`
3320
+ <span class="absolute top-3 left-3 z-10 text-[12px] text-neutral-20 font-mono font-bold bg-neutral-98 px-2 rounded-full">#${this.displayedTokenId}</span>
3321
+ `;
3322
+ }
3323
+ render() {
3324
+ return import_lit15.html`
3325
+ <div >
3326
+ ${this._renderStandards()}
3327
+ <div class="mt-6 flex-col">
3328
+ <div class="flex items-center justify-center gap-4">
3329
+ <div class="flex justify-end w-[48%]">
3330
+ <div class="border relative border-neutral-90 rounded-xl">
3331
+ ${this.renderFormattedTokenIdBadge()}
3332
+ <div class="p-2 relative">
3333
+ <icon-view
3334
+ address="${this.address}"
3335
+ size="2x-large"
3336
+ .showName=${false}
3337
+ ></icon-view>
3338
+ </div>
3339
+ <div style="height: 1px;" class="bg-neutral-90 w-full"></div>
3340
+ <div class="px-2">
3341
+ ${this._renderAddressSection()}
3342
+ </div>
3343
+ </div>
3344
+ </div>
3345
+
3346
+ <div class="flex flex-col gap-1 w-[51%]">
3347
+ <div class="text-[14px] font-bold text-neutral-20">
3348
+ ${this._resolvedData?.lsp4TokenName || "UNKNOWN"}
3349
+ </div>
3350
+ <div class="text-[17px] font-semibold text-neutral-20">
3351
+ ${(0, import_when3.when)(
3352
+ this.amount,
3353
+ () => import_lit15.html`
3354
+ <span class="">${formatUnits2(BigInt(this.amount), this._resolvedData?.decimals)}</span>
3355
+ <span class="ml-1 text-neutral-60 max-w-[60px] whitespace-nowrap overflow-hidden text-ellipsis text-[14px] font-semibold">${this._resolvedData?.lsp4TokenSymbol || ""}</span>
3356
+ `,
3357
+ () => import_lit15.html`${this._resolvedData?.lsp4TokenSymbol || ""}`
3358
+ )}
3359
+ </div>
3360
+
3361
+ ${(0, import_when3.when)(
3362
+ this.displayedTokenId,
3363
+ () => import_lit15.html`<div class="text-[14px] font-medium text-neutral-60"><span class="font-bold">#${this.displayedTokenId}</span></div>`
3364
+ )}
3365
+ <div class="mt-4">
3366
+ ${(0, import_when3.when)(this.showCreator, () => this._renderCreatorSection())}
3367
+ </div>
3368
+ </div>
3369
+ </div>
3370
+ <div class="border-neutral-90 pt-2">
3371
+ ${this._renderTokenDetails()}
3372
+ </div>
3373
+ </div>
3374
+ `;
3375
+ }
3376
+ };
3377
+ __decorateClass([
3378
+ (0, import_decorators14.property)()
3379
+ ], AssetCard.prototype, "address", 2);
3380
+ __decorateClass([
3381
+ (0, import_decorators14.property)({ type: String, attribute: "token-id" })
3382
+ ], AssetCard.prototype, "tokenId", 2);
3383
+ __decorateClass([
3384
+ (0, import_decorators14.property)({ type: String })
3385
+ ], AssetCard.prototype, "amount", 2);
3386
+ __decorateClass([
3387
+ (0, import_decorators14.property)({ type: String, attribute: "function-name" })
3388
+ ], AssetCard.prototype, "functionName", 2);
3389
+ __decorateClass([
3390
+ (0, import_decorators14.property)({ type: String, attribute: "standard" })
3391
+ ], AssetCard.prototype, "standard", 2);
3392
+ __decorateClass([
3393
+ (0, import_decorators14.property)({ type: String, attribute: "function-icon" })
3394
+ ], AssetCard.prototype, "functionIcon", 2);
3395
+ __decorateClass([
3396
+ (0, import_decorators14.property)({ type: String })
3397
+ ], AssetCard.prototype, "size", 2);
3398
+ __decorateClass([
3399
+ (0, import_decorators14.property)({ type: Boolean, attribute: "show-info-button" })
3400
+ ], AssetCard.prototype, "showInfoButton", 2);
3401
+ __decorateClass([
3402
+ (0, import_decorators14.property)({ type: Boolean, attribute: "show-creator" })
3403
+ ], AssetCard.prototype, "showCreator", 2);
3404
+ __decorateClass([
3405
+ (0, import_decorators14.state)()
3406
+ ], AssetCard.prototype, "displayDetails", 2);
3407
+ __decorateClass([
3408
+ (0, import_decorators14.state)()
3409
+ ], AssetCard.prototype, "_resolvedData", 2);
3410
+ __decorateClass([
3411
+ (0, import_decorators14.state)()
3412
+ ], AssetCard.prototype, "_imageError", 2);
3413
+ AssetCard = __decorateClass([
3414
+ safeCustomElement("asset-card")
3415
+ ], AssetCard);
3416
+
3417
+ // src/components/description-view.ts
3418
+ var import_lit16 = require("lit");
3419
+ var import_decorators15 = require("lit/decorators.js");
3420
+ var import_repeat4 = require("lit/directives/repeat.js");
3421
+ var import_when4 = require("lit/directives/when.js");
3422
+ var DescriptionView = class extends import_lit16.LitElement {
3423
+ constructor() {
3424
+ super(...arguments);
3425
+ this.data = {};
3426
+ this.variant = "default";
3427
+ }
3428
+ _copyToClipboard(text) {
3429
+ if (navigator.clipboard) {
3430
+ navigator.clipboard.writeText(text);
3431
+ this.dispatchEvent(
3432
+ new CustomEvent("copied", {
3433
+ detail: { text }
3434
+ })
3435
+ );
3436
+ }
3437
+ }
3438
+ _handleItemClick(item) {
3439
+ if (item.link) {
3440
+ window.open(item.link, "_blank", "noopener,noreferrer");
3441
+ }
3442
+ this.dispatchEvent(
3443
+ new CustomEvent("item-click", {
3444
+ detail: { item }
3445
+ })
3446
+ );
3447
+ }
3448
+ _renderHeader() {
3449
+ if (!this.data.title && !this.data.description && !this.data.type) return "";
3450
+ return import_lit16.html`
3451
+ <div class="header">
3452
+ ${(0, import_when4.when)(
3453
+ this.data.title,
3454
+ () => import_lit16.html`
3455
+ <h2 class="title">
3456
+ ${this.data.title}
3457
+ ${(0, import_when4.when)(
3458
+ this.data.type,
3459
+ () => import_lit16.html`
3460
+ <span class="type-badge ${this.data.type}">
3461
+ ${this.data.type}
3462
+ </span>
3463
+ `
3464
+ )}
3465
+ </h2>
3466
+ `
3467
+ )}
3468
+
3469
+ ${(0, import_when4.when)(
3470
+ this.data.description,
3471
+ () => import_lit16.html`
3472
+ <p class="description">${this.data.description}</p>
3473
+ `
3474
+ )}
3475
+ </div>
3476
+ `;
3477
+ }
3478
+ _renderItems() {
3479
+ const items = [];
3480
+ if (this.data.address) {
3481
+ const [contractAddress, tokenId] = this.data.address.split("-");
3482
+ items.push({
3483
+ label: "Contract Address",
3484
+ value: contractAddress,
3485
+ icon: "\u{1F4C4}",
3486
+ copyable: true
3487
+ });
3488
+ if (tokenId) {
3489
+ items.push({
3490
+ label: "Token ID",
3491
+ value: `#${tokenId}`,
3492
+ subtitle: tokenId,
3493
+ icon: "\u{1F3F7}\uFE0F",
3494
+ copyable: true
3495
+ });
3496
+ }
3497
+ }
3498
+ if (this.data.value) {
3499
+ items.push({
3500
+ label: "Amount",
3501
+ value: this.data.value.toString(),
3502
+ icon: "\u{1F4B0}",
3503
+ highlighted: true
3504
+ });
3505
+ }
3506
+ if (this.data.transactionInfo) {
3507
+ const txInfo = this.data.transactionInfo;
3508
+ if (txInfo.hash) {
3509
+ items.push({
3510
+ label: "Transaction Hash",
3511
+ value: txInfo.hash,
3512
+ icon: "\u{1F517}",
3513
+ copyable: true
3514
+ });
3515
+ }
3516
+ if (txInfo.blockNumber) {
3517
+ items.push({
3518
+ label: "Block Number",
3519
+ value: txInfo.blockNumber.toString(),
3520
+ icon: "\u{1F9F1}"
3521
+ });
3522
+ }
3523
+ if (txInfo.status) {
3524
+ items.push({
3525
+ label: "Status",
3526
+ value: txInfo.status.charAt(0).toUpperCase() + txInfo.status.slice(1),
3527
+ icon: txInfo.status === "success" ? "\u2705" : txInfo.status === "failed" ? "\u274C" : "\u23F3",
3528
+ highlighted: txInfo.status !== "success"
3529
+ });
3530
+ }
3531
+ }
3532
+ if (this.data.enhancedInfo) {
3533
+ const info = this.data.enhancedInfo;
3534
+ if (info.name) {
3535
+ items.push({
3536
+ label: "Asset Name",
3537
+ value: info.name,
3538
+ icon: "\u{1F3F7}\uFE0F"
3539
+ });
3540
+ }
3541
+ if (info.standard) {
3542
+ items.push({
3543
+ label: "Standard",
3544
+ value: info.standard,
3545
+ icon: "\u{1F4CB}"
3546
+ });
3547
+ }
3548
+ }
3549
+ if (this.data.customItems?.length) {
3550
+ items.push(...this.data.customItems);
3551
+ }
3552
+ if (!items.length) return "";
3553
+ return import_lit16.html`
3554
+ <div class="items-list">
3555
+ ${(0, import_repeat4.repeat)(
3556
+ items,
3557
+ (item) => `${item.label}-${item.value}`,
3558
+ (item) => import_lit16.html`
3559
+ <div
3560
+ class="description-item ${item.highlighted ? "highlighted" : ""} ${item.link ? "clickable" : ""}"
3561
+ @click=${item.link ? () => this._handleItemClick(item) : void 0}
3562
+ >
3563
+ <div class="item-label">
3564
+ ${(0, import_when4.when)(
3565
+ item.icon,
3566
+ () => import_lit16.html`<span class="item-icon">${item.icon}</span>`
3567
+ )}
3568
+ ${item.label}
3569
+ </div>
3570
+
3571
+ <div class="item-value-section">
3572
+ <div class="item-value">
3573
+ ${item.link ? import_lit16.html`<a class="external-link" href="${item.link}" target="_blank" rel="noopener noreferrer">${item.value}</a>` : item.value}
3574
+ </div>
3575
+ ${(0, import_when4.when)(
3576
+ item.subtitle,
3577
+ () => import_lit16.html`<div class="item-subtitle">${item.subtitle}</div>`
3578
+ )}
3579
+ </div>
3580
+
3581
+ <div class="item-actions">
3582
+ ${(0, import_when4.when)(
3583
+ item.copyable,
3584
+ () => import_lit16.html`
3585
+ <button
3586
+ class="copy-button"
3587
+ @click=${(e) => {
3588
+ e.stopPropagation();
3589
+ this._copyToClipboard(item.value);
3590
+ }}
3591
+ title="Copy to clipboard"
3592
+ >
3593
+ 📋
3594
+ </button>
3595
+ `
3596
+ )}
3597
+ </div>
3598
+ </div>
3599
+ `
3600
+ )}
3601
+ </div>
3602
+ `;
3603
+ }
3604
+ render() {
3605
+ if (this.data.loading) {
3606
+ return import_lit16.html`
3607
+ <div class="description-container">
3608
+ <div class="loading-state">
3609
+ <div class="loading-spinner">⏳</div>
3610
+ <div class="loading-text">Loading details...</div>
3611
+ </div>
3612
+ </div>
3613
+ `;
3614
+ }
3615
+ return import_lit16.html`
3616
+ <div class="${this.variant} description-view">
3617
+ <div class="description-container">
3618
+ ${this._renderHeader()}
3619
+ ${this._renderItems()}
3620
+ </div>
3621
+ </div>
3622
+ `;
3623
+ }
3624
+ };
3625
+ DescriptionView.styles = import_lit16.css`
3626
+ :host {
3627
+ display: block;
3628
+ font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
3629
+ }
3630
+
3631
+ .description-container {
3632
+ background: white;
3633
+ border-radius: 12px;
3634
+ padding: 16px;
3635
+ border: 1px solid #e5e7eb;
3636
+ }
3637
+
3638
+ .compact .description-container {
3639
+ padding: 12px;
3640
+ border-radius: 8px;
3641
+ }
3642
+
3643
+ .detailed .description-container {
3644
+ padding: 20px;
3645
+ border-radius: 16px;
3646
+ }
3647
+
3648
+ .header {
3649
+ margin-bottom: 16px;
3650
+ }
3651
+
3652
+ .compact .header {
3653
+ margin-bottom: 12px;
3654
+ }
3655
+
3656
+ .detailed .header {
3657
+ margin-bottom: 20px;
3658
+ }
3659
+
3660
+ .title {
3661
+ font-size: 16px;
3662
+ font-weight: 600;
3663
+ color: #111827;
3664
+ margin: 0 0 8px 0;
3665
+ display: flex;
3666
+ align-items: center;
3667
+ gap: 8px;
3668
+ }
3669
+
3670
+ .compact .title {
3671
+ font-size: 14px;
3672
+ margin-bottom: 6px;
3673
+ }
3674
+
3675
+ .detailed .title {
3676
+ font-size: 18px;
3677
+ margin-bottom: 12px;
3678
+ }
3679
+
3680
+ .type-badge {
3681
+ display: inline-flex;
3682
+ align-items: center;
3683
+ padding: 4px 8px;
3684
+ border-radius: 12px;
3685
+ font-size: 11px;
3686
+ font-weight: 600;
3687
+ text-transform: uppercase;
3688
+ letter-spacing: 0.5px;
3689
+ }
3690
+
3691
+ .type-badge.transfer {
3692
+ background: #dbeafe;
3693
+ color: #1d4ed8;
3694
+ }
3695
+
3696
+ .type-badge.mint {
3697
+ background: #d1fae5;
3698
+ color: #059669;
3699
+ }
3700
+
3701
+ .type-badge.burn {
3702
+ background: #fee2e2;
3703
+ color: #dc2626;
3704
+ }
3705
+
3706
+ .type-badge.approve {
3707
+ background: #fef3c7;
3708
+ color: #d97706;
3709
+ }
3710
+
3711
+ .type-badge.execute {
3712
+ background: #e0e7ff;
3713
+ color: #4338ca;
3714
+ }
3715
+
3716
+ .type-badge.deploy {
3717
+ background: #f3e8ff;
3718
+ color: #7c3aed;
3719
+ }
3720
+
3721
+ .description {
3722
+ font-size: 14px;
3723
+ line-height: 1.5;
3724
+ color: #6b7280;
3725
+ margin: 0;
3726
+ }
3727
+
3728
+ .compact .description {
3729
+ font-size: 13px;
3730
+ }
3731
+
3732
+ .detailed .description {
3733
+ font-size: 15px;
3734
+ line-height: 1.6;
3735
+ }
3736
+
3737
+ .items-list {
3738
+ display: flex;
3739
+ flex-direction: column;
3740
+ gap: 12px;
3741
+ margin-top: 16px;
3742
+ }
3743
+
3744
+ .compact .items-list {
3745
+ gap: 8px;
3746
+ margin-top: 12px;
3747
+ }
3748
+
3749
+ .detailed .items-list {
3750
+ gap: 16px;
3751
+ margin-top: 20px;
3752
+ }
3753
+
3754
+ .description-item {
3755
+ display: flex;
3756
+ justify-content: space-between;
3757
+ align-items: flex-start;
3758
+ padding: 12px;
3759
+ background: #f9fafb;
3760
+ border-radius: 8px;
3761
+ border: 1px solid #e5e7eb;
3762
+ transition: all 0.2s ease;
3763
+ }
3764
+
3765
+ .compact .description-item {
3766
+ padding: 8px;
3767
+ border-radius: 6px;
3768
+ }
3769
+
3770
+ .detailed .description-item {
3771
+ padding: 16px;
3772
+ border-radius: 12px;
3773
+ }
3774
+
3775
+ .description-item.highlighted {
3776
+ background: #eff6ff;
3777
+ border-color: #3b82f6;
3778
+ box-shadow: 0 0 0 1px rgba(59, 130, 246, 0.1);
3779
+ }
3780
+
3781
+ .description-item.clickable {
3782
+ cursor: pointer;
3783
+ }
3784
+
3785
+ .description-item.clickable:hover {
3786
+ background: #f3f4f6;
3787
+ border-color: #d1d5db;
3788
+ }
3789
+
3790
+ .description-item.highlighted.clickable:hover {
3791
+ background: #dbeafe;
3792
+ }
3793
+
3794
+ .item-label {
3795
+ display: flex;
3796
+ align-items: center;
3797
+ gap: 8px;
3798
+ font-size: 13px;
3799
+ font-weight: 500;
3800
+ color: #374151;
3801
+ flex-shrink: 0;
3802
+ min-width: 0;
3803
+ }
3804
+
3805
+ .compact .item-label {
3806
+ font-size: 12px;
3807
+ gap: 6px;
3808
+ }
3809
+
3810
+ .detailed .item-label {
3811
+ font-size: 14px;
3812
+ }
3813
+
3814
+ .item-icon {
3815
+ font-size: 14px;
3816
+ flex-shrink: 0;
3817
+ }
3818
+
3819
+ .item-value-section {
3820
+ display: flex;
3821
+ flex-direction: column;
3822
+ align-items: flex-end;
3823
+ gap: 4px;
3824
+ min-width: 0;
3825
+ flex: 1;
3826
+ margin-left: 12px;
3827
+ }
3828
+
3829
+ .item-value {
3830
+ font-size: 14px;
3831
+ font-weight: 500;
3832
+ color: #111827;
3833
+ word-break: break-all;
3834
+ text-align: right;
3835
+ }
3836
+
3837
+ .compact .item-value {
3838
+ font-size: 13px;
3839
+ }
3840
+
3841
+ .detailed .item-value {
3842
+ font-size: 15px;
3843
+ }
3844
+
3845
+ .item-subtitle {
3846
+ font-size: 12px;
3847
+ color: #6b7280;
3848
+ text-align: right;
3849
+ }
3850
+
3851
+ .compact .item-subtitle {
3852
+ font-size: 11px;
3853
+ }
3854
+
3855
+ .item-actions {
3856
+ display: flex;
3857
+ align-items: center;
3858
+ gap: 4px;
3859
+ margin-left: 8px;
3860
+ }
3861
+
3862
+ .copy-button {
3863
+ background: none;
3864
+ border: none;
3865
+ cursor: pointer;
3866
+ padding: 4px;
3867
+ border-radius: 4px;
3868
+ color: #6b7280;
3869
+ transition: all 0.2s ease;
3870
+ font-size: 14px;
3871
+ }
3872
+
3873
+ .copy-button:hover {
3874
+ background-color: #e5e7eb;
3875
+ color: #374151;
3876
+ }
3877
+
3878
+ .external-link {
3879
+ color: #3b82f6;
3880
+ text-decoration: none;
3881
+ font-size: 14px;
3882
+ }
3883
+
3884
+ .external-link:hover {
3885
+ text-decoration: underline;
3886
+ }
3887
+
3888
+ .loading-state {
3889
+ display: flex;
3890
+ flex-direction: column;
3891
+ align-items: center;
3892
+ justify-content: center;
3893
+ padding: 40px 20px;
3894
+ color: #6b7280;
3895
+ }
3896
+
3897
+ .loading-spinner {
3898
+ font-size: 24px;
3899
+ margin-bottom: 12px;
3900
+ }
3901
+
3902
+ .loading-text {
3903
+ font-size: 14px;
3904
+ }
3905
+ `;
3906
+ __decorateClass([
3907
+ (0, import_decorators15.property)({ type: Object })
3908
+ ], DescriptionView.prototype, "data", 2);
3909
+ __decorateClass([
3910
+ (0, import_decorators15.property)({ type: String })
3911
+ ], DescriptionView.prototype, "variant", 2);
3912
+ DescriptionView = __decorateClass([
3913
+ safeCustomElement("description-view")
3914
+ ], DescriptionView);
3915
+
3916
+ // src/components/universal-token-view.ts
3917
+ var import_lit17 = require("lit");
3918
+ var import_decorators16 = require("lit/decorators.js");
3919
+ var import_when5 = require("lit/directives/when.js");
3920
+ var UniversalTokenView = class extends import_lit17.LitElement {
3921
+ constructor() {
3922
+ super(...arguments);
3923
+ this.data = {};
3924
+ this._infoPanelOpen = false;
3925
+ }
3926
+ _handleInfoPanelToggle() {
3927
+ this._infoPanelOpen = !this._infoPanelOpen;
3928
+ }
3929
+ _handleInfoPanelClose() {
3930
+ this._infoPanelOpen = false;
3931
+ }
3932
+ _buildAssetCardData() {
3933
+ const [contractAddress, tokenId] = (this.data.address || "").split("-");
3934
+ return {
3935
+ name: this.data.enhancedInfo?.name,
3936
+ symbol: this.data.enhancedInfo?.symbol || this.data.enhancedInfo?.lsp4TokenSymbol,
3937
+ icon: this.data.enhancedInfo?.icon || this.data.enhancedInfo?.images?.[0]?.url,
3938
+ address: contractAddress,
3939
+ tokenId,
3940
+ formattedTokenId: tokenId ? `${parseInt(tokenId, 16)}` : void 0,
3941
+ amount: this.data.value?.toString(),
3942
+ decimals: this.data.enhancedInfo?.decimals,
3943
+ loadingImages: this.data.loading?.asset,
3944
+ creator: this.data.enhancedInfo?.creator
3945
+ };
3946
+ }
3947
+ _renderLoadingState() {
3948
+ return import_lit17.html`
3949
+ <div class="loading-state">
3950
+ <div class="loading-spinner">⏳</div>
3951
+ <div class="loading-text">Loading transaction details...</div>
3952
+ </div>
3953
+ `;
3954
+ }
3955
+ _renderErrorState(message) {
3956
+ return import_lit17.html`
3957
+ <div class="error-state">
3958
+ <div class="error-icon">❌</div>
3959
+ <div class="error-title">Error Loading Transaction</div>
3960
+ <div class="error-message">${message}</div>
3961
+ </div>
3962
+ `;
3963
+ }
3964
+ render() {
3965
+ const isLoading = this.data.loading?.transaction || this.data.loading?.metadata && !this.data.enhancedInfo || this.data.loading?.asset && !this.data.address;
3966
+ if (isLoading) {
3967
+ return this._renderLoadingState();
3968
+ }
3969
+ if (!this.data.address && !this.data.enhancedInfo && !this.data.transaction) {
3970
+ return this._renderErrorState("No transaction data provided");
3971
+ }
3972
+ return import_lit17.html`
3973
+ <div class="universal-view">
3974
+ <!-- Title wrapper with title and LSP tag - exact match -->
3975
+ <div class="title-wrapper">
3976
+ <div class="title-section">
3977
+ ${(0, import_when5.when)(
3978
+ this.data.icon,
3979
+ () => import_lit17.html`
3980
+ <svg class="title-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
3981
+ <path d="M7 16l-4-4 4-4M17 8l4 4-4 4" />
3982
+ </svg>
3983
+ `
3984
+ )}
3985
+ ${this.data.title || "Transaction"}
3986
+ </div>
3987
+ ${(0, import_when5.when)(
3988
+ this.data.standard,
3989
+ () => import_lit17.html`<div class="lsp-tag">${this.data.standard}</div>`
3990
+ )}
3991
+ </div>
3992
+
3993
+ <!-- AssetCard replaces DigitalAssetInfo - exact same functionality -->
3994
+ <asset-card
3995
+ .data=${this._buildAssetCardData()}
3996
+ size="medium"
3997
+ ?show-info-button=${true}
3998
+ @info-click=${this._handleInfoPanelToggle}
3999
+ ></asset-card>
4000
+
4001
+ <!-- InfoPanel replaces BackPanelAsset with class="mt-4" spacing -->
4002
+ <info-panel
4003
+ class="info-panel"
4004
+ address=${this.data.address || ""}
4005
+ ?open=${this._infoPanelOpen}
4006
+ standard=${this.data.standard || this.data.enhancedInfo?.standard || ""}
4007
+ type=${this.data.type || "transfer"}
4008
+ @close=${this._handleInfoPanelClose}
4009
+ ></info-panel>
4010
+ </div>
4011
+ `;
4012
+ }
4013
+ };
4014
+ UniversalTokenView.styles = import_lit17.css`
4015
+ :host {
4016
+ display: block;
4017
+ font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
4018
+ }
4019
+
4020
+ /* Match the original LSP7Transfer.vue structure exactly */
4021
+ .universal-view {
4022
+ padding: 16px; /* matches p-4 in Tailwind */
4023
+ }
4024
+
4025
+ /* Title wrapper - matches original layout */
4026
+ .title-wrapper {
4027
+ display: flex;
4028
+ justify-content: space-between;
4029
+ }
4030
+
4031
+ /* Title section with icon - replicates Title.vue */
4032
+ .title-section {
4033
+ display: flex;
4034
+ align-items: center;
4035
+ gap: 4px;
4036
+ font-size: 12px;
4037
+ font-weight: 500;
4038
+ color: var(--neutral-20, #374151);
4039
+ }
4040
+
4041
+ .title-icon {
4042
+ width: 16px;
4043
+ height: 16px;
4044
+ flex-shrink: 0;
4045
+ margin-right: 4px;
4046
+ }
4047
+
4048
+ /* LSP tag - matches original styling exactly */
4049
+ .lsp-tag {
4050
+ background: #eedde4;
4051
+ border-radius: 8px;
4052
+ height: 28px;
4053
+ padding: 8px;
4054
+ display: flex;
4055
+ align-items: center;
4056
+ justify-content: center;
4057
+ font-size: 12px;
4058
+ font-weight: 500;
4059
+ color: #374151;
4060
+ }
4061
+
4062
+ /* Info panel spacing - matches mt-4 */
4063
+ .info-panel {
4064
+ margin-top: 16px;
4065
+ }
4066
+
4067
+ .loading-state {
4068
+ display: flex;
4069
+ flex-direction: column;
4070
+ align-items: center;
4071
+ justify-content: center;
4072
+ padding: 60px 20px;
4073
+ color: #6b7280;
4074
+ }
4075
+
4076
+ .loading-spinner {
4077
+ font-size: 32px;
4078
+ margin-bottom: 16px;
4079
+ animation: spin 2s linear infinite;
4080
+ }
4081
+
4082
+ @keyframes spin {
4083
+ from { transform: rotate(0deg); }
4084
+ to { transform: rotate(360deg); }
4085
+ }
4086
+
4087
+ .loading-text {
4088
+ font-size: 16px;
4089
+ font-weight: 500;
4090
+ }
4091
+
4092
+ .error-state {
4093
+ display: flex;
4094
+ flex-direction: column;
4095
+ align-items: center;
4096
+ justify-content: center;
4097
+ padding: 60px 20px;
4098
+ color: #dc2626;
4099
+ background: #fef2f2;
4100
+ border: 1px solid #fecaca;
4101
+ border-radius: 12px;
4102
+ margin: 20px;
4103
+ }
4104
+
4105
+ .error-icon {
4106
+ font-size: 48px;
4107
+ margin-bottom: 16px;
4108
+ }
4109
+
4110
+ .error-title {
4111
+ font-size: 18px;
4112
+ font-weight: 600;
4113
+ margin-bottom: 8px;
4114
+ }
4115
+
4116
+ .error-message {
4117
+ font-size: 14px;
4118
+ text-align: center;
4119
+ line-height: 1.4;
4120
+ }
4121
+ `;
4122
+ __decorateClass([
4123
+ (0, import_decorators16.property)({ type: Object })
4124
+ ], UniversalTokenView.prototype, "data", 2);
4125
+ __decorateClass([
4126
+ (0, import_decorators16.state)()
4127
+ ], UniversalTokenView.prototype, "_infoPanelOpen", 2);
4128
+ UniversalTokenView = __decorateClass([
4129
+ safeCustomElement("universal-token-view")
4130
+ ], UniversalTokenView);
4131
+
4132
+ // src/components/contract-card.ts
4133
+ var import_task8 = require("@lit/task");
4134
+ var import_transaction_view_headless10 = require("@lukso/transaction-view-headless");
4135
+ var import_lit18 = require("lit");
4136
+ var import_decorators17 = require("lit/decorators.js");
4137
+ var ContractCard = class extends import_lit18.LitElement {
4138
+ constructor() {
4139
+ super(...arguments);
4140
+ this.variant = "basic";
4141
+ this.borderRadius = "medium";
4142
+ this.shadow = "large";
4143
+ this.isHoverable = false;
4144
+ this.hasOverlay = false;
4145
+ this.customClass = "";
4146
+ this.headerClass = "";
4147
+ this._resolutionTask = new import_task8.Task(this, {
4148
+ task: async ([address, resolved]) => {
4149
+ if (resolved) {
4150
+ this._resolvedData = resolved;
4151
+ return resolved;
4152
+ }
4153
+ const { resolveAddress } = (0, import_transaction_view_headless10.useAddressResolver)();
4154
+ const baseAddress = this._extractBaseAddress(address);
4155
+ const data = await resolveAddress(baseAddress);
4156
+ this._resolvedData = data;
4157
+ return data;
4158
+ },
4159
+ args: () => [this.address, this.resolved]
4160
+ });
4161
+ this._profileImageTask = new import_task8.Task(this, {
4162
+ task: async ([resolved]) => {
4163
+ const { loadProfileImage } = (0, import_transaction_view_headless10.useImageLoader)();
4164
+ const data = resolved || this._resolvedData;
4165
+ if (!data) return null;
4166
+ const image = await loadProfileImage(data, {
4167
+ width: 256,
4168
+ height: 256,
4169
+ dpr: window.devicePixelRatio || 1
4170
+ });
4171
+ if (image?.src) {
4172
+ this._profileImageUrl = image.src;
4173
+ }
4174
+ return image;
4175
+ },
4176
+ args: () => [this._resolvedData]
4177
+ });
4178
+ this._backgroundImageTask = new import_task8.Task(this, {
4179
+ task: async ([resolved]) => {
4180
+ const { loadBackgroundImage } = (0, import_transaction_view_headless10.useImageLoader)();
4181
+ const data = resolved || this._resolvedData;
4182
+ if (!data) return null;
4183
+ const image = await loadBackgroundImage(data, {
4184
+ width: 800,
4185
+ height: 200,
4186
+ dpr: window.devicePixelRatio || 1
4187
+ });
4188
+ if (image?.src) {
4189
+ this._backgroundImageUrl = image.src;
4190
+ }
4191
+ return image;
4192
+ },
4193
+ args: () => [this._resolvedData]
4194
+ });
4195
+ }
4196
+ _extractBaseAddress(addressOrComposite) {
4197
+ return addressOrComposite.split("-")[0];
4198
+ }
4199
+ _handleClick() {
4200
+ this.dispatchEvent(
4201
+ new CustomEvent("address-click", {
4202
+ detail: {
4203
+ address: this.address,
4204
+ resolved: this._resolvedData
4205
+ },
4206
+ bubbles: true,
4207
+ composed: true
4208
+ })
4209
+ );
4210
+ }
4211
+ render() {
4212
+ const baseAddress = this._extractBaseAddress(this.address);
4213
+ const isEoa = !this._resolvedData?.__gqltype;
4214
+ return import_lit18.html`
4215
+ <lukso-card
4216
+ variant="${this.variant}"
4217
+ border-radius="${this.borderRadius}"
4218
+ shadow="${this.shadow}"
4219
+ ?is-hoverable="${this.isHoverable}"
4220
+ ?has-overlay="${this.hasOverlay}"
4221
+ ?is-eoa="${isEoa}"
4222
+ custom-class="${this.customClass}"
4223
+ header-class="${this.headerClass}"
4224
+ profile-url="${this._profileImageUrl || ""}"
4225
+ background-url="${this._backgroundImageUrl || ""}"
4226
+ profile-address="${baseAddress}"
4227
+ .width="${this.width}"
4228
+ .height="${this.height}"
4229
+ @click="${this._handleClick}"
4230
+ >
4231
+ <!-- Pass through all slots -->
4232
+ <slot name="header" slot="header"></slot>
4233
+ <slot name="content" slot="content"></slot>
4234
+ <slot name="bottom" slot="bottom"></slot>
4235
+ </lukso-card>
4236
+ `;
4237
+ }
4238
+ };
4239
+ ContractCard.styles = import_lit18.css`
4240
+ :host {
4241
+ display: block;
4242
+ }
4243
+ `;
4244
+ __decorateClass([
4245
+ (0, import_decorators17.property)()
4246
+ ], ContractCard.prototype, "address", 2);
4247
+ __decorateClass([
4248
+ (0, import_decorators17.property)({ type: Object })
4249
+ ], ContractCard.prototype, "resolved", 2);
4250
+ __decorateClass([
4251
+ (0, import_decorators17.property)()
4252
+ ], ContractCard.prototype, "variant", 2);
4253
+ __decorateClass([
4254
+ (0, import_decorators17.property)({ attribute: "border-radius" })
4255
+ ], ContractCard.prototype, "borderRadius", 2);
4256
+ __decorateClass([
4257
+ (0, import_decorators17.property)()
4258
+ ], ContractCard.prototype, "shadow", 2);
4259
+ __decorateClass([
4260
+ (0, import_decorators17.property)({ type: Number })
4261
+ ], ContractCard.prototype, "width", 2);
4262
+ __decorateClass([
4263
+ (0, import_decorators17.property)({ type: Number })
4264
+ ], ContractCard.prototype, "height", 2);
4265
+ __decorateClass([
4266
+ (0, import_decorators17.property)({ type: Boolean, attribute: "is-hoverable" })
4267
+ ], ContractCard.prototype, "isHoverable", 2);
4268
+ __decorateClass([
4269
+ (0, import_decorators17.property)({ type: Boolean, attribute: "has-overlay" })
4270
+ ], ContractCard.prototype, "hasOverlay", 2);
4271
+ __decorateClass([
4272
+ (0, import_decorators17.property)({ attribute: "custom-class" })
4273
+ ], ContractCard.prototype, "customClass", 2);
4274
+ __decorateClass([
4275
+ (0, import_decorators17.property)({ attribute: "header-class" })
4276
+ ], ContractCard.prototype, "headerClass", 2);
4277
+ __decorateClass([
4278
+ (0, import_decorators17.state)()
4279
+ ], ContractCard.prototype, "_resolvedData", 2);
4280
+ __decorateClass([
4281
+ (0, import_decorators17.state)()
4282
+ ], ContractCard.prototype, "_profileImageUrl", 2);
4283
+ __decorateClass([
4284
+ (0, import_decorators17.state)()
4285
+ ], ContractCard.prototype, "_backgroundImageUrl", 2);
4286
+ ContractCard = __decorateClass([
4287
+ safeCustomElement("contract-card")
4288
+ ], ContractCard);
4289
+
4290
+ // src/components/permissions-block.ts
4291
+ var import_lit19 = require("lit");
4292
+ var import_decorators18 = require("lit/decorators.js");
4293
+ var PermissionsBlock = class extends CoreLitElement {
4294
+ constructor() {
4295
+ super(...arguments);
4296
+ this.icon = "";
4297
+ this.actionIcon = "";
4298
+ this.color = "var(--neutral-60)";
4299
+ this.title = "";
4300
+ this.description = "";
4301
+ this.control = "";
4302
+ this.permissions = [];
4303
+ }
4304
+ render() {
4305
+ return import_lit19.html`
4306
+ <div
4307
+ class="mb-6 p-4 bg-[var(--neutral-100)] border border-[var(--neutral-90)] rounded-lg"
4308
+ >
4309
+ <div class="flex items-center mb-2">
4310
+ ${this.icon ? import_lit19.html`<lukso-icon
4311
+ name=${this.icon}
4312
+ size="x-small"
4313
+ color=${this.color}
4314
+ ></lukso-icon>` : import_lit19.nothing}
4315
+ <div class="ml-2 heading-inter-14-bold">${this.title}</div>
4316
+ </div>
4317
+
4318
+ ${this.description ? import_lit19.html`<div class="text-[var(--neutral-40)] paragraph-inter-12-regular">
4319
+ ${this.description}
4320
+ </div>` : import_lit19.nothing}
4321
+
4322
+ <div class="h-px w-full bg-[var(--neutral-90)] mt-4"></div>
4323
+
4324
+ <slot></slot>
4325
+
4326
+ ${(this.permissions || []).map((p) => this.renderPermission(p))}
4327
+ </div>
4328
+ `;
4329
+ }
4330
+ renderPermission(p) {
4331
+ const nameBase = (p.icon || p.permissionName || "").toLowerCase();
4332
+ const activeIcon = `${nameBase}-activated`;
4333
+ const inactiveIcon = `${nameBase}-inactive`;
4334
+ return import_lit19.html`
4335
+ <div class="mt-4 grid grid-cols-[40px,1fr,20px] gap-x-2 items-start">
4336
+ <div class="relative w-10 h-10">
4337
+ <svg-icon
4338
+ class="active absolute bottom-0 opacity-0 z-[99] transition-opacity duration-200 ${p.isActive ? "opacity-100" : ""}"
4339
+ name=${activeIcon}
4340
+ width="40"
4341
+ height="40"
4342
+ color=${this.color}
4343
+ ></svg-icon>
4344
+ <svg-icon
4345
+ class="inactive absolute bottom-0 ${p.isActive ? "opacity-0" : "opacity-100"}"
4346
+ name=${inactiveIcon}
4347
+ width="40"
4348
+ height="40"
4349
+ color=${this.color}
4350
+ ></svg-icon>
4351
+ </div>
4352
+
4353
+ <div>
4354
+ <span class="paragraph-inter-12-semi-bold ">${p.type}</span>
4355
+ <div class="paragraph-inter-12-regular">${p.info}</div>
4356
+ </div>
4357
+
4358
+ ${p.isActive ? import_lit19.html`<lukso-icon
4359
+ name="complete-filled"
4360
+ width="20"
4361
+ height="20"
4362
+ secondary-color="neutral-100"
4363
+ color="green-54"
4364
+ stroke-width="1.5"
4365
+ ></lukso-icon>` : import_lit19.html`<lukso-icon
4366
+ name="cross-outline"
4367
+ width="20"
4368
+ height="20"
4369
+ color="red-65"
4370
+ stroke-width="1.5"
4371
+ ></lukso-icon>`}
4372
+ </div>
4373
+ `;
4374
+ }
4375
+ };
4376
+ __decorateClass([
4377
+ (0, import_decorators18.property)({ type: String })
4378
+ ], PermissionsBlock.prototype, "icon", 2);
4379
+ __decorateClass([
4380
+ (0, import_decorators18.property)({ type: String, attribute: "action-icon" })
4381
+ ], PermissionsBlock.prototype, "actionIcon", 2);
4382
+ __decorateClass([
4383
+ (0, import_decorators18.property)({ type: String })
4384
+ ], PermissionsBlock.prototype, "color", 2);
4385
+ __decorateClass([
4386
+ (0, import_decorators18.property)({ type: String })
4387
+ ], PermissionsBlock.prototype, "title", 2);
4388
+ __decorateClass([
4389
+ (0, import_decorators18.property)({ type: String })
4390
+ ], PermissionsBlock.prototype, "description", 2);
4391
+ __decorateClass([
4392
+ (0, import_decorators18.property)({ type: String })
4393
+ ], PermissionsBlock.prototype, "control", 2);
4394
+ __decorateClass([
4395
+ (0, import_decorators18.property)({ type: Array })
4396
+ ], PermissionsBlock.prototype, "permissions", 2);
4397
+ PermissionsBlock = __decorateClass([
4398
+ safeCustomElement("permissions-block")
4399
+ ], PermissionsBlock);
4400
+
4401
+ // src/registry/index.ts
4402
+ var import_transaction_view_headless12 = require("@lukso/transaction-view-headless");
4403
+
4404
+ // src/registry/lit-view-loader.ts
4405
+ var import_transaction_view_headless11 = require("@lukso/transaction-view-headless");
4406
+ var LitViewLoader = class {
4407
+ constructor() {
4408
+ this.loadedComponents = /* @__PURE__ */ new Map();
4409
+ }
4410
+ /**
4411
+ * Load a component from a view match
4412
+ */
4413
+ async loadFromMatch(match) {
4414
+ if (!match.frameworkConfig) {
4415
+ throw new import_transaction_view_headless11.ViewLoadingError(
4416
+ `No framework config for view "${match.view.id}"`,
4417
+ { type: "custom-element", tagName: "" },
4418
+ {}
4419
+ );
4420
+ }
4421
+ return this.loadComponent(match.frameworkConfig);
4422
+ }
4423
+ /**
4424
+ * Load a component based on framework config
4425
+ */
4426
+ async loadComponent(config) {
4427
+ const { loader, component } = config;
4428
+ if (this.loadedComponents.has(component)) {
4429
+ return this.loadedComponents.get(component);
4430
+ }
4431
+ try {
4432
+ let loadedComponent;
4433
+ switch (loader.type) {
4434
+ case "custom-element":
4435
+ loadedComponent = await this.loadCustomElement(loader.tagName);
4436
+ break;
4437
+ case "dynamic-import":
4438
+ loadedComponent = await this.loadDynamicImport(loader.path);
4439
+ break;
4440
+ case "static-import":
4441
+ loadedComponent = await this.loadStaticImport(loader.path);
4442
+ break;
4443
+ case "custom":
4444
+ loadedComponent = await loader.loader(config);
4445
+ break;
4446
+ default:
4447
+ throw new import_transaction_view_headless11.ViewLoadingError(
4448
+ `Unsupported loader type: ${loader.type}`,
4449
+ loader,
4450
+ config
4451
+ );
4452
+ }
4453
+ this.loadedComponents.set(component, loadedComponent);
4454
+ return loadedComponent;
4455
+ } catch (error) {
4456
+ throw new import_transaction_view_headless11.ViewLoadingError(
4457
+ `Failed to load component "${component}"`,
4458
+ loader,
4459
+ config,
4460
+ error instanceof Error ? error : new Error(String(error))
4461
+ );
4462
+ }
4463
+ }
4464
+ /**
4465
+ * Load a custom element (Web Component)
4466
+ */
4467
+ async loadCustomElement(tagName) {
4468
+ if (customElements.get(tagName)) {
4469
+ return customElements.get(tagName);
4470
+ }
4471
+ return new Promise((resolve, reject) => {
4472
+ const timeout = setTimeout(() => {
4473
+ reject(
4474
+ new Error(`Custom element "${tagName}" not found after 5s timeout`)
4475
+ );
4476
+ }, 5e3);
4477
+ customElements.whenDefined(tagName).then(() => {
4478
+ clearTimeout(timeout);
4479
+ resolve(customElements.get(tagName));
4480
+ }).catch(reject);
4481
+ });
4482
+ }
4483
+ /**
4484
+ * Load via dynamic import
4485
+ */
4486
+ async loadDynamicImport(path) {
4487
+ if (typeof path === "function") {
4488
+ const module3 = await path();
4489
+ return module3.default || module3;
4490
+ }
4491
+ const module2 = await import(
4492
+ /* @vite-ignore */
4493
+ path
4494
+ );
4495
+ return module2.default || module2;
4496
+ }
4497
+ /**
4498
+ * Load via static import (not really possible at runtime, but for completeness)
4499
+ */
4500
+ async loadStaticImport(path) {
4501
+ return this.loadDynamicImport(path);
4502
+ }
4503
+ /**
4504
+ * Create a component instance with data
4505
+ */
4506
+ createInstance(componentClass, data) {
4507
+ const element = new componentClass();
4508
+ Object.keys(data).forEach((key) => {
4509
+ if (key in element) {
4510
+ element[key] = data[key];
4511
+ } else {
4512
+ element.setAttribute(
4513
+ key,
4514
+ typeof data[key] === "object" ? JSON.stringify(data[key]) : String(data[key])
4515
+ );
4516
+ }
4517
+ });
4518
+ return element;
4519
+ }
4520
+ /**
4521
+ * Clear component cache
4522
+ */
4523
+ clearCache() {
4524
+ this.loadedComponents.clear();
4525
+ }
4526
+ };
4527
+ var globalLitLoader = null;
4528
+ function getGlobalLitLoader() {
4529
+ if (!globalLitLoader) {
4530
+ globalLitLoader = new LitViewLoader();
4531
+ }
4532
+ return globalLitLoader;
4533
+ }
4534
+ function setGlobalLitLoader(loader) {
4535
+ globalLitLoader = loader;
4536
+ }
4537
+ function resetGlobalLitLoader() {
4538
+ globalLitLoader = null;
4539
+ }
4540
+ // Annotate the CommonJS export names for ESM import in node:
4541
+ 0 && (module.exports = {
4542
+ AddressDisplay,
4543
+ AddressView,
4544
+ CustomOption,
4545
+ CustomSelect,
4546
+ DefaultViewRegistry,
4547
+ FunctionNameView,
4548
+ GasProviderView,
4549
+ IconView,
4550
+ ImageLoaderController,
4551
+ LitViewLoader,
4552
+ MultiSignalController,
4553
+ NotificationView,
4554
+ ProgressView,
4555
+ ScrollToBottomButton,
4556
+ SignalController,
4557
+ TransactionSignalController,
4558
+ TransactionViewController,
4559
+ UrlView,
4560
+ ValueView,
4561
+ getGlobalLitLoader,
4562
+ getGlobalRegistry,
4563
+ resetGlobalLitLoader,
4564
+ resetGlobalRegistry,
4565
+ setGlobalLitLoader,
4566
+ setGlobalRegistry,
4567
+ useImageLoader,
4568
+ useSignal,
4569
+ useSignals,
4570
+ useTransactionSignal,
4571
+ useTransactionView
4572
+ });
4573
+ //# sourceMappingURL=index.cjs.map