@lumiapassport/ui-kit 1.2.0 → 1.3.1
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.
- package/README.md +26 -4
- package/dist/iframe/main.js +1282 -2
- package/dist/iframe/main.js.map +1 -1
- package/dist/index.cjs +913 -703
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +974 -764
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -2365,6 +2365,7 @@ var init_iframe_manager = __esm({
|
|
|
2365
2365
|
this.iframeUrl = config.iframeUrl;
|
|
2366
2366
|
this.projectId = config.projectId;
|
|
2367
2367
|
this.debug = config.debug || false;
|
|
2368
|
+
this.onWalletReadyCallback = config.onWalletReady;
|
|
2368
2369
|
this.readyPromise = new Promise((resolve) => {
|
|
2369
2370
|
this.readyResolve = resolve;
|
|
2370
2371
|
});
|
|
@@ -2395,6 +2396,7 @@ var init_iframe_manager = __esm({
|
|
|
2395
2396
|
this.iframe.style.zIndex = "999999";
|
|
2396
2397
|
this.iframe.style.background = "rgba(0, 0, 0, 0.5)";
|
|
2397
2398
|
this.iframe.setAttribute("sandbox", "allow-scripts allow-same-origin");
|
|
2399
|
+
this.iframe.setAttribute("allow", "publickey-credentials-get *; publickey-credentials-create *");
|
|
2398
2400
|
this.messageListener = this.handleMessage.bind(this);
|
|
2399
2401
|
window.addEventListener("message", this.messageListener);
|
|
2400
2402
|
document.body.appendChild(this.iframe);
|
|
@@ -2427,6 +2429,7 @@ var init_iframe_manager = __esm({
|
|
|
2427
2429
|
}
|
|
2428
2430
|
const validIframeTypes = [
|
|
2429
2431
|
"LUMIA_PASSPORT_IFRAME_READY",
|
|
2432
|
+
"LUMIA_PASSPORT_WALLET_READY",
|
|
2430
2433
|
"LUMIA_PASSPORT_SHOW_IFRAME",
|
|
2431
2434
|
"LUMIA_PASSPORT_HIDE_IFRAME",
|
|
2432
2435
|
"LUMIA_PASSPORT_SDK_AUTH_SUCCESS",
|
|
@@ -2447,7 +2450,7 @@ var init_iframe_manager = __esm({
|
|
|
2447
2450
|
}
|
|
2448
2451
|
const iframeOrigin = new URL(this.iframeUrl).origin;
|
|
2449
2452
|
if (event.origin !== iframeOrigin) {
|
|
2450
|
-
this.log("[IframeManager] \u26A0\uFE0F Ignored message from invalid origin:", event.origin,
|
|
2453
|
+
this.log("[IframeManager] \u26A0\uFE0F Ignored message from invalid origin:", { received: event.origin, expected: iframeOrigin });
|
|
2451
2454
|
return;
|
|
2452
2455
|
}
|
|
2453
2456
|
if (message.type === "LUMIA_PASSPORT_IFRAME_READY") {
|
|
@@ -2456,6 +2459,13 @@ var init_iframe_manager = __esm({
|
|
|
2456
2459
|
this.readyResolve();
|
|
2457
2460
|
return;
|
|
2458
2461
|
}
|
|
2462
|
+
if (message.type === "LUMIA_PASSPORT_WALLET_READY") {
|
|
2463
|
+
this.log("[IframeManager] \u{1F4E8} Received LUMIA_PASSPORT_WALLET_READY", message.data);
|
|
2464
|
+
if (this.onWalletReadyCallback) {
|
|
2465
|
+
this.onWalletReadyCallback(message.data);
|
|
2466
|
+
}
|
|
2467
|
+
return;
|
|
2468
|
+
}
|
|
2459
2469
|
if (message.type === "LUMIA_PASSPORT_SHOW_IFRAME") {
|
|
2460
2470
|
this.log("[IframeManager] \u{1F4E8} Received LUMIA_PASSPORT_SHOW_IFRAME");
|
|
2461
2471
|
this.showIframe();
|
|
@@ -2751,6 +2761,92 @@ var init_iframe_manager = __esm({
|
|
|
2751
2761
|
}
|
|
2752
2762
|
return false;
|
|
2753
2763
|
}
|
|
2764
|
+
/**
|
|
2765
|
+
* Create backup of keyshare
|
|
2766
|
+
*/
|
|
2767
|
+
async createBackup(userId, backupRequest, accessToken) {
|
|
2768
|
+
this.log("[IframeManager] Creating backup...");
|
|
2769
|
+
const response = await this.sendMessage("CREATE_BACKUP", {
|
|
2770
|
+
userId,
|
|
2771
|
+
backupRequest,
|
|
2772
|
+
accessToken
|
|
2773
|
+
// Pass access token for TSS API authentication
|
|
2774
|
+
});
|
|
2775
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_CREATED") {
|
|
2776
|
+
return response.result;
|
|
2777
|
+
}
|
|
2778
|
+
throw new Error("Unexpected response type");
|
|
2779
|
+
}
|
|
2780
|
+
/**
|
|
2781
|
+
* Restore keyshare from server backup
|
|
2782
|
+
*/
|
|
2783
|
+
async restoreFromServer(userId, password, accessToken) {
|
|
2784
|
+
this.log("[IframeManager] Restoring backup from server...");
|
|
2785
|
+
const response = await this.sendMessage("RESTORE_BACKUP", {
|
|
2786
|
+
userId,
|
|
2787
|
+
password,
|
|
2788
|
+
accessToken
|
|
2789
|
+
// Pass access token for TSS API authentication
|
|
2790
|
+
});
|
|
2791
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_RESTORED") {
|
|
2792
|
+
return response.result;
|
|
2793
|
+
}
|
|
2794
|
+
throw new Error("Unexpected response type");
|
|
2795
|
+
}
|
|
2796
|
+
/**
|
|
2797
|
+
* Encrypt backup data without uploading (for cloud/local backups)
|
|
2798
|
+
* Returns encrypted data that parent can upload/download
|
|
2799
|
+
*/
|
|
2800
|
+
async encryptBackupData(userId, password) {
|
|
2801
|
+
this.log("[IframeManager] Encrypting backup data...");
|
|
2802
|
+
const response = await this.sendMessage("ENCRYPT_BACKUP_DATA", {
|
|
2803
|
+
userId,
|
|
2804
|
+
password
|
|
2805
|
+
});
|
|
2806
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_ENCRYPTED") {
|
|
2807
|
+
return response.encryptedData;
|
|
2808
|
+
}
|
|
2809
|
+
throw new Error("Unexpected response type");
|
|
2810
|
+
}
|
|
2811
|
+
/**
|
|
2812
|
+
* Restore keyshare from local file backup
|
|
2813
|
+
*/
|
|
2814
|
+
async restoreFromLocalFile(userId, fileContent, password) {
|
|
2815
|
+
this.log("[IframeManager] Restoring backup from local file...");
|
|
2816
|
+
const response = await this.sendMessage("RESTORE_FROM_FILE", {
|
|
2817
|
+
userId,
|
|
2818
|
+
fileContent,
|
|
2819
|
+
password
|
|
2820
|
+
});
|
|
2821
|
+
if (response.type === "LUMIA_PASSPORT_FILE_RESTORED") {
|
|
2822
|
+
return response.result;
|
|
2823
|
+
}
|
|
2824
|
+
throw new Error("Unexpected response type");
|
|
2825
|
+
}
|
|
2826
|
+
/**
|
|
2827
|
+
* Get backup status for user
|
|
2828
|
+
*/
|
|
2829
|
+
async getBackupStatus(userId) {
|
|
2830
|
+
this.log("[IframeManager] Getting backup status...");
|
|
2831
|
+
const response = await this.sendMessage("GET_BACKUP_STATUS", {
|
|
2832
|
+
userId
|
|
2833
|
+
});
|
|
2834
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_STATUS") {
|
|
2835
|
+
return response.status;
|
|
2836
|
+
}
|
|
2837
|
+
throw new Error("Unexpected response type");
|
|
2838
|
+
}
|
|
2839
|
+
/**
|
|
2840
|
+
* Get available cloud providers
|
|
2841
|
+
*/
|
|
2842
|
+
async getCloudProviders() {
|
|
2843
|
+
this.log("[IframeManager] Getting cloud providers...");
|
|
2844
|
+
const response = await this.sendMessage("GET_CLOUD_PROVIDERS", {});
|
|
2845
|
+
if (response.type === "LUMIA_PASSPORT_CLOUD_PROVIDERS") {
|
|
2846
|
+
return response.providers;
|
|
2847
|
+
}
|
|
2848
|
+
throw new Error("Unexpected response type");
|
|
2849
|
+
}
|
|
2754
2850
|
/**
|
|
2755
2851
|
* Cleanup and destroy iframe
|
|
2756
2852
|
*/
|
|
@@ -2827,7 +2923,7 @@ __export(index_exports, {
|
|
|
2827
2923
|
module.exports = __toCommonJS(index_exports);
|
|
2828
2924
|
|
|
2829
2925
|
// src/styles/built.css
|
|
2830
|
-
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{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))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{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))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{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))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{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))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{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)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;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))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2926
|
+
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{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))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{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))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{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))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{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))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{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)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;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))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2831
2927
|
|
|
2832
2928
|
// src/context/LumiaPassportContext.tsx
|
|
2833
2929
|
var import_react = require("react");
|
|
@@ -3000,7 +3096,8 @@ var LumiaPassportProvider = ({
|
|
|
3000
3096
|
const iframeManager = getIframeManager({
|
|
3001
3097
|
iframeUrl,
|
|
3002
3098
|
projectId: projectId2,
|
|
3003
|
-
debug: config.features?.mpcSecurity ?? true
|
|
3099
|
+
debug: config.features?.mpcSecurity ?? true,
|
|
3100
|
+
onWalletReady: callbacks?.onWalletReady
|
|
3004
3101
|
});
|
|
3005
3102
|
iframeManager.initialize().then(() => {
|
|
3006
3103
|
console.log("[LumiaPassport] \u2705 Secure iframe wallet initialized successfully");
|
|
@@ -3623,6 +3720,7 @@ Input.displayName = "Input";
|
|
|
3623
3720
|
|
|
3624
3721
|
// src/internal/components/KeyshareRestore.tsx
|
|
3625
3722
|
init_vaultClient();
|
|
3723
|
+
init_iframe_manager();
|
|
3626
3724
|
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
3627
3725
|
function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
3628
3726
|
const { config } = useLumiaPassportConfig();
|
|
@@ -3636,6 +3734,14 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3636
3734
|
const [restorePassword, setRestorePassword] = React10.useState("");
|
|
3637
3735
|
const [hasServerBackup, setHasServerBackup] = React10.useState(null);
|
|
3638
3736
|
const [checkingBackup, setCheckingBackup] = React10.useState(true);
|
|
3737
|
+
const iframeManager = React10.useMemo(() => {
|
|
3738
|
+
try {
|
|
3739
|
+
return getIframeManager();
|
|
3740
|
+
} catch (e) {
|
|
3741
|
+
console.error("[KeyshareRestore] Failed to get iframe manager:", e);
|
|
3742
|
+
return null;
|
|
3743
|
+
}
|
|
3744
|
+
}, []);
|
|
3639
3745
|
React10.useEffect(() => {
|
|
3640
3746
|
const checkBackupAvailability = async () => {
|
|
3641
3747
|
try {
|
|
@@ -3658,20 +3764,31 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3658
3764
|
}, [userId]);
|
|
3659
3765
|
const handleRestoreFromServer = async () => {
|
|
3660
3766
|
console.log("[KeyshareRestore] Starting server restore for userId:", userId);
|
|
3767
|
+
if (!iframeManager) {
|
|
3768
|
+
setError("Iframe manager not initialized");
|
|
3769
|
+
return;
|
|
3770
|
+
}
|
|
3661
3771
|
setLoading((prev) => ({ ...prev, server: true }));
|
|
3662
3772
|
setError(null);
|
|
3663
3773
|
setSuccess(null);
|
|
3664
3774
|
try {
|
|
3665
|
-
const passwordToUse = useCustomPassword ? restorePassword :
|
|
3666
|
-
console.log("[KeyshareRestore] Calling restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3667
|
-
await
|
|
3668
|
-
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3775
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3776
|
+
console.log("[KeyshareRestore] Calling iframeManager.restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3777
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
3778
|
+
const accessToken = jwt?.accessToken;
|
|
3779
|
+
const result = await iframeManager.restoreFromServer(userId, passwordToUse, accessToken);
|
|
3780
|
+
if (result.success) {
|
|
3781
|
+
console.log("[KeyshareRestore] Server restore successful");
|
|
3782
|
+
setSuccess("Successfully restored keyshare from server backup");
|
|
3783
|
+
setTimeout(() => {
|
|
3784
|
+
onRestoreSuccess?.();
|
|
3785
|
+
}, 100);
|
|
3786
|
+
} else {
|
|
3787
|
+
console.error("[KeyshareRestore] Server restore failed:", result.error);
|
|
3788
|
+
setError(result.error || "Server restore failed");
|
|
3789
|
+
}
|
|
3673
3790
|
} catch (err) {
|
|
3674
|
-
console.error("[KeyshareRestore] Server restore
|
|
3791
|
+
console.error("[KeyshareRestore] Server restore exception:", err);
|
|
3675
3792
|
const errorMsg = err instanceof Error ? err.message : "Server restore failed";
|
|
3676
3793
|
setError(errorMsg);
|
|
3677
3794
|
} finally {
|
|
@@ -3688,18 +3805,27 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3688
3805
|
setError("Please enter the backup password");
|
|
3689
3806
|
return;
|
|
3690
3807
|
}
|
|
3808
|
+
if (!iframeManager) {
|
|
3809
|
+
setError("Iframe manager not initialized");
|
|
3810
|
+
return;
|
|
3811
|
+
}
|
|
3691
3812
|
setLoading((prev) => ({ ...prev, file: true }));
|
|
3692
3813
|
setError(null);
|
|
3693
3814
|
setSuccess(null);
|
|
3694
3815
|
try {
|
|
3695
|
-
const
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3816
|
+
const fileContent = await restoreFile.text();
|
|
3817
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3818
|
+
const result = await iframeManager.restoreFromLocalFile(userId, fileContent, passwordToUse);
|
|
3819
|
+
if (result.success) {
|
|
3820
|
+
setSuccess("Successfully restored keyshare from backup file");
|
|
3821
|
+
setRestoreFile(null);
|
|
3822
|
+
setRestorePassword("");
|
|
3823
|
+
setTimeout(() => {
|
|
3824
|
+
onRestoreSuccess?.();
|
|
3825
|
+
}, 100);
|
|
3826
|
+
} else {
|
|
3827
|
+
setError(result.error || "File restore failed");
|
|
3828
|
+
}
|
|
3703
3829
|
} catch (err) {
|
|
3704
3830
|
const errorMsg = err instanceof Error ? err.message : "Restore failed";
|
|
3705
3831
|
setError(errorMsg);
|
|
@@ -6716,11 +6842,312 @@ var SecurityModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6716
6842
|
] });
|
|
6717
6843
|
};
|
|
6718
6844
|
|
|
6845
|
+
// src/internal/components/KeyshareBackup.tsx
|
|
6846
|
+
var React19 = __toESM(require("react"), 1);
|
|
6847
|
+
var import_lucide_react9 = require("lucide-react");
|
|
6848
|
+
init_iframe_manager();
|
|
6849
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
6850
|
+
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
6851
|
+
const [backupStatus, setBackupStatus] = React19.useState({
|
|
6852
|
+
server: {},
|
|
6853
|
+
cloud: {},
|
|
6854
|
+
local: {}
|
|
6855
|
+
});
|
|
6856
|
+
const [loading, setLoading] = React19.useState({
|
|
6857
|
+
server: false,
|
|
6858
|
+
cloud: false,
|
|
6859
|
+
local: false
|
|
6860
|
+
});
|
|
6861
|
+
const [error, setError] = React19.useState(null);
|
|
6862
|
+
const [success, setSuccess] = React19.useState(null);
|
|
6863
|
+
const [showPassword, setShowPassword] = React19.useState(false);
|
|
6864
|
+
const [useCustomPassword, setUseCustomPassword] = React19.useState(false);
|
|
6865
|
+
const [customPassword, setCustomPassword] = React19.useState("");
|
|
6866
|
+
const [cloudProviders, setCloudProviders] = React19.useState([]);
|
|
6867
|
+
const [selectedCloudProvider, setSelectedCloudProvider] = React19.useState(null);
|
|
6868
|
+
const [hasKeyshareData, setHasKeyshareData] = React19.useState(true);
|
|
6869
|
+
const iframeManager = React19.useMemo(() => {
|
|
6870
|
+
try {
|
|
6871
|
+
return getIframeManager();
|
|
6872
|
+
} catch (e) {
|
|
6873
|
+
console.error("[KeyshareBackup] Failed to get iframe manager:", e);
|
|
6874
|
+
return null;
|
|
6875
|
+
}
|
|
6876
|
+
}, []);
|
|
6877
|
+
React19.useEffect(() => {
|
|
6878
|
+
const loadCloudProviders = async () => {
|
|
6879
|
+
try {
|
|
6880
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6881
|
+
const availableProviders = getAvailableCloudProviders3();
|
|
6882
|
+
const providers = availableProviders.map((p) => ({
|
|
6883
|
+
id: p.id,
|
|
6884
|
+
name: p.name,
|
|
6885
|
+
available: p.isAvailable()
|
|
6886
|
+
}));
|
|
6887
|
+
setCloudProviders(providers);
|
|
6888
|
+
if (providers.length > 0 && !selectedCloudProvider) {
|
|
6889
|
+
setSelectedCloudProvider(providers[0].id);
|
|
6890
|
+
}
|
|
6891
|
+
} catch (error2) {
|
|
6892
|
+
console.error("[KeyshareBackup] Failed to load cloud providers:", error2);
|
|
6893
|
+
}
|
|
6894
|
+
};
|
|
6895
|
+
loadCloudProviders();
|
|
6896
|
+
}, [selectedCloudProvider]);
|
|
6897
|
+
const refreshStatus = React19.useCallback(async () => {
|
|
6898
|
+
if (!iframeManager) return;
|
|
6899
|
+
try {
|
|
6900
|
+
const status = await iframeManager.getBackupStatus(userId);
|
|
6901
|
+
setBackupStatus(status);
|
|
6902
|
+
} catch (error2) {
|
|
6903
|
+
console.error("[KeyshareBackup] Failed to get backup status:", error2);
|
|
6904
|
+
}
|
|
6905
|
+
}, [iframeManager, userId]);
|
|
6906
|
+
React19.useEffect(() => {
|
|
6907
|
+
refreshStatus();
|
|
6908
|
+
}, [refreshStatus]);
|
|
6909
|
+
const handleBackup = async (method) => {
|
|
6910
|
+
if (!iframeManager) {
|
|
6911
|
+
setError("Iframe manager not initialized");
|
|
6912
|
+
return;
|
|
6913
|
+
}
|
|
6914
|
+
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
6915
|
+
setError(null);
|
|
6916
|
+
setSuccess(null);
|
|
6917
|
+
try {
|
|
6918
|
+
const password = useCustomPassword ? customPassword : void 0;
|
|
6919
|
+
if (method === "server") {
|
|
6920
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
6921
|
+
const accessToken = jwt?.accessToken;
|
|
6922
|
+
const result = await iframeManager.createBackup(userId, {
|
|
6923
|
+
method,
|
|
6924
|
+
password
|
|
6925
|
+
}, accessToken);
|
|
6926
|
+
if (result.success) {
|
|
6927
|
+
setSuccess("Successfully created server backup");
|
|
6928
|
+
await refreshStatus();
|
|
6929
|
+
onBackupSuccess?.();
|
|
6930
|
+
} else {
|
|
6931
|
+
throw new Error(result.error || "Server backup failed");
|
|
6932
|
+
}
|
|
6933
|
+
} else if (method === "cloud") {
|
|
6934
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6935
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6936
|
+
const providers = getAvailableCloudProviders3();
|
|
6937
|
+
const provider = selectedCloudProvider ? providers.find((p) => p.id === selectedCloudProvider) : providers[0];
|
|
6938
|
+
if (!provider) {
|
|
6939
|
+
throw new Error("No cloud provider available");
|
|
6940
|
+
}
|
|
6941
|
+
if (!provider.isAuthenticated()) {
|
|
6942
|
+
const authenticated = await provider.authenticate();
|
|
6943
|
+
if (!authenticated) {
|
|
6944
|
+
throw new Error(`Failed to authenticate with ${provider.name}`);
|
|
6945
|
+
}
|
|
6946
|
+
}
|
|
6947
|
+
const timestamp = Date.now();
|
|
6948
|
+
const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;
|
|
6949
|
+
const fileContent = JSON.stringify(encryptedData, null, 2);
|
|
6950
|
+
await provider.upload(fileName, fileContent, true);
|
|
6951
|
+
setSuccess(`Successfully created cloud backup on ${provider.name}`);
|
|
6952
|
+
await refreshStatus();
|
|
6953
|
+
onBackupSuccess?.();
|
|
6954
|
+
} else if (method === "local") {
|
|
6955
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6956
|
+
const blob = new Blob([JSON.stringify(encryptedData, null, 2)], {
|
|
6957
|
+
type: "application/json"
|
|
6958
|
+
});
|
|
6959
|
+
const url = URL.createObjectURL(blob);
|
|
6960
|
+
const a = document.createElement("a");
|
|
6961
|
+
a.href = url;
|
|
6962
|
+
a.download = `lumia-passport-backup-${userId}-${Date.now()}.json`;
|
|
6963
|
+
document.body.appendChild(a);
|
|
6964
|
+
a.click();
|
|
6965
|
+
document.body.removeChild(a);
|
|
6966
|
+
URL.revokeObjectURL(url);
|
|
6967
|
+
setSuccess("Backup file downloaded successfully");
|
|
6968
|
+
await refreshStatus();
|
|
6969
|
+
onBackupSuccess?.();
|
|
6970
|
+
}
|
|
6971
|
+
if (typeof window !== "undefined") {
|
|
6972
|
+
window.dispatchEvent(
|
|
6973
|
+
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
6974
|
+
detail: { method, success: true }
|
|
6975
|
+
})
|
|
6976
|
+
);
|
|
6977
|
+
}
|
|
6978
|
+
} catch (err) {
|
|
6979
|
+
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
6980
|
+
setError(errorMsg);
|
|
6981
|
+
await refreshStatus();
|
|
6982
|
+
} finally {
|
|
6983
|
+
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
6984
|
+
}
|
|
6985
|
+
};
|
|
6986
|
+
const formatLastBackup = (timestamp) => {
|
|
6987
|
+
if (!timestamp) return "Never";
|
|
6988
|
+
const date = new Date(timestamp);
|
|
6989
|
+
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
6990
|
+
};
|
|
6991
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(Card, { className: "border-green-200 bg-green-50", children: [
|
|
6992
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardHeader, { className: "pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
6993
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
6994
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Shield, { className: "h-6 w-6 text-green-600" }),
|
|
6995
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
6996
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
6997
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
6998
|
+
] })
|
|
6999
|
+
] }),
|
|
7000
|
+
onClose && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.X, { className: "h-4 w-4" }) })
|
|
7001
|
+
] }) }),
|
|
7002
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
7003
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
7004
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.AlertCircle, { className: "h-4 w-4 flex-shrink-0" }),
|
|
7005
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: error })
|
|
7006
|
+
] }),
|
|
7007
|
+
success && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
7008
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.CheckCircle2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
7009
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: success })
|
|
7010
|
+
] }),
|
|
7011
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-3", children: [
|
|
7012
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
7013
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7014
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7015
|
+
"input",
|
|
7016
|
+
{
|
|
7017
|
+
type: "checkbox",
|
|
7018
|
+
id: "use-backup-password",
|
|
7019
|
+
checked: useCustomPassword,
|
|
7020
|
+
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
7021
|
+
className: "rounded"
|
|
7022
|
+
}
|
|
7023
|
+
),
|
|
7024
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
7025
|
+
] }),
|
|
7026
|
+
!useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7027
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Key, { className: "h-4 w-4" }),
|
|
7028
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
7029
|
+
] }) }),
|
|
7030
|
+
useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "relative", children: [
|
|
7031
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7032
|
+
Input,
|
|
7033
|
+
{
|
|
7034
|
+
type: showPassword ? "text" : "password",
|
|
7035
|
+
placeholder: "Enter backup encryption password",
|
|
7036
|
+
value: customPassword,
|
|
7037
|
+
onChange: (e) => setCustomPassword(e.target.value),
|
|
7038
|
+
className: "pr-10"
|
|
7039
|
+
}
|
|
7040
|
+
),
|
|
7041
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7042
|
+
"button",
|
|
7043
|
+
{
|
|
7044
|
+
type: "button",
|
|
7045
|
+
onClick: () => setShowPassword(!showPassword),
|
|
7046
|
+
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
7047
|
+
children: showPassword ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Eye, { className: "h-4 w-4" })
|
|
7048
|
+
}
|
|
7049
|
+
)
|
|
7050
|
+
] })
|
|
7051
|
+
] }),
|
|
7052
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-4", children: [
|
|
7053
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
7054
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
7055
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7056
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Server, { className: "h-5 w-5 text-blue-600" }),
|
|
7057
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7058
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
7059
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
7060
|
+
] })
|
|
7061
|
+
] }) }),
|
|
7062
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7063
|
+
Button,
|
|
7064
|
+
{
|
|
7065
|
+
onClick: () => handleBackup("server"),
|
|
7066
|
+
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7067
|
+
className: "px-4 py-2",
|
|
7068
|
+
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7069
|
+
}
|
|
7070
|
+
),
|
|
7071
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7072
|
+
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
7073
|
+
formatLastBackup(backupStatus.server.lastBackup)
|
|
7074
|
+
] })
|
|
7075
|
+
] }),
|
|
7076
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
7077
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7078
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Cloud, { className: "h-5 w-5 text-sky-600" }),
|
|
7079
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7080
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
7081
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
7082
|
+
] })
|
|
7083
|
+
] }),
|
|
7084
|
+
cloudProviders.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7085
|
+
"select",
|
|
7086
|
+
{
|
|
7087
|
+
value: selectedCloudProvider || "",
|
|
7088
|
+
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
7089
|
+
className: "text-sm border rounded px-2 py-1 w-full",
|
|
7090
|
+
children: cloudProviders.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("option", { value: provider.id, disabled: !provider.available, children: [
|
|
7091
|
+
provider.name,
|
|
7092
|
+
" ",
|
|
7093
|
+
provider.available ? "" : "(Not Available)"
|
|
7094
|
+
] }, provider.id))
|
|
7095
|
+
}
|
|
7096
|
+
) }),
|
|
7097
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7098
|
+
Button,
|
|
7099
|
+
{
|
|
7100
|
+
onClick: () => handleBackup("cloud"),
|
|
7101
|
+
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
7102
|
+
className: "px-4 py-2",
|
|
7103
|
+
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7104
|
+
}
|
|
7105
|
+
),
|
|
7106
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
7107
|
+
] }),
|
|
7108
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
7109
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7110
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Download, { className: "h-5 w-5 text-purple-600" }),
|
|
7111
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7112
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
7113
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
7114
|
+
] })
|
|
7115
|
+
] }),
|
|
7116
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7117
|
+
Button,
|
|
7118
|
+
{
|
|
7119
|
+
onClick: () => handleBackup("local"),
|
|
7120
|
+
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7121
|
+
className: "w-full",
|
|
7122
|
+
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
7123
|
+
}
|
|
7124
|
+
),
|
|
7125
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7126
|
+
"Download encrypted backup file to your device \u2022 Last: ",
|
|
7127
|
+
formatLastBackup(backupStatus.local.lastBackup)
|
|
7128
|
+
] })
|
|
7129
|
+
] })
|
|
7130
|
+
] }),
|
|
7131
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
7132
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Lock, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
7133
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7134
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium", children: "Security Notice" }),
|
|
7135
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "mt-1", children: [
|
|
7136
|
+
useCustomPassword ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
7137
|
+
" ",
|
|
7138
|
+
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
7139
|
+
] })
|
|
7140
|
+
] })
|
|
7141
|
+
] })
|
|
7142
|
+
] })
|
|
7143
|
+
] });
|
|
7144
|
+
}
|
|
7145
|
+
|
|
6719
7146
|
// src/internal/components/TransactionsModal.tsx
|
|
6720
7147
|
var import_react13 = __toESM(require("react"), 1);
|
|
6721
|
-
var
|
|
7148
|
+
var import_lucide_react10 = require("lucide-react");
|
|
6722
7149
|
init_base();
|
|
6723
|
-
var
|
|
7150
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
6724
7151
|
var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
6725
7152
|
const { address } = useLumiaSession();
|
|
6726
7153
|
const [transactions, setTransactions] = import_react13.default.useState([]);
|
|
@@ -6770,98 +7197,98 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6770
7197
|
}
|
|
6771
7198
|
};
|
|
6772
7199
|
const getStatusIcon = (status) => {
|
|
6773
|
-
return status === "ok" ? /* @__PURE__ */ (0,
|
|
7200
|
+
return status === "ok" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.CheckCircle2, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.XCircle, { className: "w-4 h-4 text-red-500" });
|
|
6774
7201
|
};
|
|
6775
7202
|
const getTransactionIcon = (from, to) => {
|
|
6776
7203
|
const isIncoming = to.toLowerCase() === address?.toLowerCase();
|
|
6777
|
-
return isIncoming ? /* @__PURE__ */ (0,
|
|
7204
|
+
return isIncoming ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowDownRight, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowUpRight, { className: "w-4 h-4 text-blue-500" });
|
|
6778
7205
|
};
|
|
6779
7206
|
const openInExplorer = (txHash) => {
|
|
6780
7207
|
const explorerUrl = getExplorerUrl();
|
|
6781
7208
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
6782
7209
|
};
|
|
6783
|
-
return /* @__PURE__ */ (0,
|
|
6784
|
-
/* @__PURE__ */ (0,
|
|
6785
|
-
/* @__PURE__ */ (0,
|
|
6786
|
-
/* @__PURE__ */ (0,
|
|
6787
|
-
onBack && /* @__PURE__ */ (0,
|
|
7210
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7211
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DialogTitle, { children: "Transaction History" }) }),
|
|
7212
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DialogDescription, { className: "sr-only", children: "View your transaction history" }),
|
|
7213
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7214
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6788
7215
|
"button",
|
|
6789
7216
|
{
|
|
6790
7217
|
onClick: onBack,
|
|
6791
7218
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6792
7219
|
title: "Back",
|
|
6793
|
-
children: /* @__PURE__ */ (0,
|
|
7220
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowLeft, { className: "h-4 w-4" })
|
|
6794
7221
|
}
|
|
6795
7222
|
),
|
|
6796
|
-
/* @__PURE__ */ (0,
|
|
6797
|
-
/* @__PURE__ */ (0,
|
|
6798
|
-
/* @__PURE__ */ (0,
|
|
6799
|
-
/* @__PURE__ */ (0,
|
|
7223
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7224
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Activity, { className: "h-5 w-5" }),
|
|
7225
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: "Transaction History" }),
|
|
7226
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6800
7227
|
"button",
|
|
6801
7228
|
{
|
|
6802
7229
|
onClick: loadTransactions,
|
|
6803
7230
|
disabled: loading,
|
|
6804
7231
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6805
7232
|
title: "Refresh transactions",
|
|
6806
|
-
children: /* @__PURE__ */ (0,
|
|
7233
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.RefreshCw, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` })
|
|
6807
7234
|
}
|
|
6808
7235
|
)
|
|
6809
7236
|
] })
|
|
6810
7237
|
] }) }),
|
|
6811
|
-
/* @__PURE__ */ (0,
|
|
6812
|
-
/* @__PURE__ */ (0,
|
|
6813
|
-
/* @__PURE__ */ (0,
|
|
6814
|
-
] }) : transactions.length === 0 ? /* @__PURE__ */ (0,
|
|
6815
|
-
/* @__PURE__ */ (0,
|
|
6816
|
-
/* @__PURE__ */ (0,
|
|
7238
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: loading ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `${theme.mutedText}`, children: "Loading transactions..." }) }) : error ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${isDark ? "text-red-400" : "text-red-500"}`, children: [
|
|
7239
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.XCircle, { className: "w-12 h-12 mb-2" }),
|
|
7240
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-center text-sm", children: error })
|
|
7241
|
+
] }) : transactions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7242
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Activity, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7243
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("p", { className: "text-center", children: [
|
|
6817
7244
|
"No transactions found",
|
|
6818
|
-
/* @__PURE__ */ (0,
|
|
6819
|
-
/* @__PURE__ */ (0,
|
|
7245
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("br", {}),
|
|
7246
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "text-xs mt-2", children: "Smart account transactions will appear here" })
|
|
6820
7247
|
] })
|
|
6821
|
-
] }) : /* @__PURE__ */ (0,
|
|
7248
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "space-y-3", children: transactions.map((tx) => {
|
|
6822
7249
|
const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();
|
|
6823
7250
|
const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;
|
|
6824
|
-
return /* @__PURE__ */ (0,
|
|
7251
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
|
|
6825
7252
|
"div",
|
|
6826
7253
|
{
|
|
6827
7254
|
className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors cursor-pointer`,
|
|
6828
7255
|
onClick: () => openInExplorer(tx.hash),
|
|
6829
7256
|
children: [
|
|
6830
|
-
/* @__PURE__ */ (0,
|
|
6831
|
-
/* @__PURE__ */ (0,
|
|
7257
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7258
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
6832
7259
|
getTransactionIcon(tx.from.hash, tx.to.hash),
|
|
6833
|
-
/* @__PURE__ */ (0,
|
|
7260
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `font-medium ${theme.titleText}`, children: isIncoming ? "Received" : "Sent" }),
|
|
6834
7261
|
getStatusIcon(tx.status)
|
|
6835
7262
|
] }),
|
|
6836
|
-
/* @__PURE__ */ (0,
|
|
7263
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `text-xs ${theme.mutedText}`, children: formatTime(tx.timestamp) })
|
|
6837
7264
|
] }),
|
|
6838
|
-
/* @__PURE__ */ (0,
|
|
6839
|
-
/* @__PURE__ */ (0,
|
|
6840
|
-
/* @__PURE__ */ (0,
|
|
6841
|
-
/* @__PURE__ */ (0,
|
|
7265
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1 text-sm", children: [
|
|
7266
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7267
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: isIncoming ? "From:" : "To:" }),
|
|
7268
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6842
7269
|
formatAddress(displayAddress),
|
|
6843
|
-
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ (0,
|
|
7270
|
+
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} ml-1`, children: "(Contract)" })
|
|
6844
7271
|
] })
|
|
6845
7272
|
] }),
|
|
6846
|
-
/* @__PURE__ */ (0,
|
|
6847
|
-
/* @__PURE__ */ (0,
|
|
6848
|
-
/* @__PURE__ */ (0,
|
|
7273
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7274
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Value:" }),
|
|
7275
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
6849
7276
|
formatValue(tx.value),
|
|
6850
7277
|
" LUMIA"
|
|
6851
7278
|
] })
|
|
6852
7279
|
] }),
|
|
6853
|
-
/* @__PURE__ */ (0,
|
|
6854
|
-
/* @__PURE__ */ (0,
|
|
6855
|
-
/* @__PURE__ */ (0,
|
|
7280
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7281
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Block:" }),
|
|
7282
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6856
7283
|
"#",
|
|
6857
7284
|
tx.block_number
|
|
6858
7285
|
] })
|
|
6859
7286
|
] }),
|
|
6860
|
-
tx.method && /* @__PURE__ */ (0,
|
|
6861
|
-
/* @__PURE__ */ (0,
|
|
6862
|
-
/* @__PURE__ */ (0,
|
|
7287
|
+
tx.method && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7288
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Method:" }),
|
|
7289
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${isDark ? "text-blue-400" : "text-blue-600"} text-xs`, children: tx.method })
|
|
6863
7290
|
] }),
|
|
6864
|
-
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ (0,
|
|
7291
|
+
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6865
7292
|
"span",
|
|
6866
7293
|
{
|
|
6867
7294
|
className: `text-xs ${isDark ? "bg-blue-900/30 text-blue-300" : "bg-blue-100 text-blue-800"} px-2 py-0.5 rounded-full`,
|
|
@@ -6875,7 +7302,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6875
7302
|
tx.hash
|
|
6876
7303
|
);
|
|
6877
7304
|
}) }) }),
|
|
6878
|
-
transactions.length > 0 && /* @__PURE__ */ (0,
|
|
7305
|
+
transactions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
6879
7306
|
"Total: ",
|
|
6880
7307
|
transactions.length,
|
|
6881
7308
|
" transaction",
|
|
@@ -7049,9 +7476,9 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
7049
7476
|
}
|
|
7050
7477
|
|
|
7051
7478
|
// src/internal/components/ViewAssetsModal.tsx
|
|
7052
|
-
var
|
|
7479
|
+
var import_lucide_react11 = require("lucide-react");
|
|
7053
7480
|
init_base();
|
|
7054
|
-
var
|
|
7481
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
7055
7482
|
var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
7056
7483
|
const { address } = useLumiaSession();
|
|
7057
7484
|
const { assets, refreshBalances, isLoading } = useAssets(address);
|
|
@@ -7070,107 +7497,107 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7070
7497
|
const openInExplorer = (address2) => {
|
|
7071
7498
|
window.open(`${LUMIA_EXPLORER_URL}/address/${address2}`, "_blank");
|
|
7072
7499
|
};
|
|
7073
|
-
return /* @__PURE__ */ (0,
|
|
7074
|
-
/* @__PURE__ */ (0,
|
|
7075
|
-
/* @__PURE__ */ (0,
|
|
7076
|
-
/* @__PURE__ */ (0,
|
|
7077
|
-
onBack && /* @__PURE__ */ (0,
|
|
7500
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7501
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DialogTitle, { children: "View Assets" }) }),
|
|
7502
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DialogDescription, { className: "sr-only", children: "View your token balances and assets" }),
|
|
7503
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7504
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7078
7505
|
"button",
|
|
7079
7506
|
{
|
|
7080
7507
|
onClick: onBack,
|
|
7081
7508
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7082
7509
|
title: "Back",
|
|
7083
|
-
children: /* @__PURE__ */ (0,
|
|
7510
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ArrowLeft, { className: "h-4 w-4" })
|
|
7084
7511
|
}
|
|
7085
7512
|
),
|
|
7086
|
-
/* @__PURE__ */ (0,
|
|
7087
|
-
/* @__PURE__ */ (0,
|
|
7088
|
-
/* @__PURE__ */ (0,
|
|
7089
|
-
/* @__PURE__ */ (0,
|
|
7513
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7514
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Gem, { className: "h-5 w-5" }),
|
|
7515
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { children: "Your Assets" }),
|
|
7516
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7090
7517
|
"button",
|
|
7091
7518
|
{
|
|
7092
7519
|
onClick: refreshBalances,
|
|
7093
7520
|
disabled: isLoading,
|
|
7094
7521
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
7095
7522
|
title: "Refresh balances",
|
|
7096
|
-
children: /* @__PURE__ */ (0,
|
|
7523
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.RefreshCw, { className: `h-4 w-4 ${isLoading ? "animate-spin" : ""}` })
|
|
7097
7524
|
}
|
|
7098
7525
|
)
|
|
7099
7526
|
] })
|
|
7100
7527
|
] }) }),
|
|
7101
|
-
/* @__PURE__ */ (0,
|
|
7102
|
-
/* @__PURE__ */ (0,
|
|
7103
|
-
/* @__PURE__ */ (0,
|
|
7104
|
-
] }) : /* @__PURE__ */ (0,
|
|
7105
|
-
/* @__PURE__ */ (0,
|
|
7106
|
-
/* @__PURE__ */ (0,
|
|
7107
|
-
/* @__PURE__ */ (0,
|
|
7108
|
-
/* @__PURE__ */ (0,
|
|
7109
|
-
/* @__PURE__ */ (0,
|
|
7110
|
-
/* @__PURE__ */ (0,
|
|
7528
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `${theme.mutedText}`, children: "Loading assets..." }) }) : assets.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7529
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Gem, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7530
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { children: "No assets found" })
|
|
7531
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "space-y-3", children: assets.map((asset, index) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors`, children: [
|
|
7532
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7533
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7534
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "w-10 h-10 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-white font-bold text-sm", children: asset.symbol.charAt(0) }) }),
|
|
7535
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { children: [
|
|
7536
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `font-medium ${theme.titleText}`, children: asset.name }),
|
|
7537
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
7111
7538
|
] })
|
|
7112
7539
|
] }),
|
|
7113
|
-
/* @__PURE__ */ (0,
|
|
7114
|
-
/* @__PURE__ */ (0,
|
|
7115
|
-
/* @__PURE__ */ (0,
|
|
7540
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "text-right", children: [
|
|
7541
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `font-mono ${theme.titleText}`, children: asset.formattedBalance }),
|
|
7542
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
7116
7543
|
] })
|
|
7117
7544
|
] }),
|
|
7118
|
-
asset.address && /* @__PURE__ */ (0,
|
|
7119
|
-
/* @__PURE__ */ (0,
|
|
7120
|
-
/* @__PURE__ */ (0,
|
|
7121
|
-
/* @__PURE__ */ (0,
|
|
7122
|
-
/* @__PURE__ */ (0,
|
|
7123
|
-
/* @__PURE__ */ (0,
|
|
7545
|
+
asset.address && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `space-y-2 mt-3 pt-3 border-t ${theme.divider}`, children: [
|
|
7546
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7547
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Contract Address:" }),
|
|
7548
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7549
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` }),
|
|
7550
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7124
7551
|
"button",
|
|
7125
7552
|
{
|
|
7126
7553
|
onClick: () => handleCopy(asset.address, "address"),
|
|
7127
7554
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7128
7555
|
title: "Copy address",
|
|
7129
|
-
children: copied === "address" ? /* @__PURE__ */ (0,
|
|
7556
|
+
children: copied === "address" ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Copy, { className: "w-3 h-3" })
|
|
7130
7557
|
}
|
|
7131
7558
|
),
|
|
7132
|
-
/* @__PURE__ */ (0,
|
|
7559
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7133
7560
|
"button",
|
|
7134
7561
|
{
|
|
7135
7562
|
onClick: () => openInExplorer(asset.address),
|
|
7136
7563
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7137
7564
|
title: "View in explorer",
|
|
7138
|
-
children: /* @__PURE__ */ (0,
|
|
7565
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ExternalLink, { className: "w-3 h-3" })
|
|
7139
7566
|
}
|
|
7140
7567
|
)
|
|
7141
7568
|
] })
|
|
7142
7569
|
] }),
|
|
7143
|
-
asset.decimals && /* @__PURE__ */ (0,
|
|
7144
|
-
/* @__PURE__ */ (0,
|
|
7145
|
-
/* @__PURE__ */ (0,
|
|
7570
|
+
asset.decimals && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7571
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Decimals:" }),
|
|
7572
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.titleText}`, children: asset.decimals })
|
|
7146
7573
|
] })
|
|
7147
7574
|
] }),
|
|
7148
|
-
asset.type === "native" && address && /* @__PURE__ */ (0,
|
|
7149
|
-
/* @__PURE__ */ (0,
|
|
7150
|
-
/* @__PURE__ */ (0,
|
|
7151
|
-
/* @__PURE__ */ (0,
|
|
7152
|
-
/* @__PURE__ */ (0,
|
|
7575
|
+
asset.type === "native" && address && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "mt-3 pt-3 border-t border-gray-200", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7576
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Your Address:" }),
|
|
7577
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7578
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${address.slice(0, 6)}...${address.slice(-4)}` }),
|
|
7579
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7153
7580
|
"button",
|
|
7154
7581
|
{
|
|
7155
7582
|
onClick: () => handleCopy(address, "wallet"),
|
|
7156
7583
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7157
7584
|
title: "Copy wallet address",
|
|
7158
|
-
children: copied === "wallet" ? /* @__PURE__ */ (0,
|
|
7585
|
+
children: copied === "wallet" ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Copy, { className: "w-3 h-3" })
|
|
7159
7586
|
}
|
|
7160
7587
|
),
|
|
7161
|
-
/* @__PURE__ */ (0,
|
|
7588
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7162
7589
|
"button",
|
|
7163
7590
|
{
|
|
7164
7591
|
onClick: () => openInExplorer(address),
|
|
7165
7592
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7166
7593
|
title: "View in explorer",
|
|
7167
|
-
children: /* @__PURE__ */ (0,
|
|
7594
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ExternalLink, { className: "w-3 h-3" })
|
|
7168
7595
|
}
|
|
7169
7596
|
)
|
|
7170
7597
|
] })
|
|
7171
7598
|
] }) })
|
|
7172
7599
|
] }, `${asset.type}-${asset.address || "native"}-${index}`)) }) }),
|
|
7173
|
-
assets.length > 0 && /* @__PURE__ */ (0,
|
|
7600
|
+
assets.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
7174
7601
|
"Total: ",
|
|
7175
7602
|
assets.length,
|
|
7176
7603
|
" asset",
|
|
@@ -7181,7 +7608,7 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7181
7608
|
|
|
7182
7609
|
// src/internal/components/SendModal.tsx
|
|
7183
7610
|
var import_react17 = require("react");
|
|
7184
|
-
var
|
|
7611
|
+
var import_lucide_react14 = require("lucide-react");
|
|
7185
7612
|
|
|
7186
7613
|
// src/hooks/useSendTransaction.ts
|
|
7187
7614
|
var import_react16 = require("react");
|
|
@@ -7247,8 +7674,8 @@ var import_viem6 = require("viem");
|
|
|
7247
7674
|
var import_wagmi7 = require("wagmi");
|
|
7248
7675
|
|
|
7249
7676
|
// src/internal/components/UserOpStatus.tsx
|
|
7250
|
-
var
|
|
7251
|
-
var
|
|
7677
|
+
var React24 = __toESM(require("react"), 1);
|
|
7678
|
+
var import_lucide_react13 = require("lucide-react");
|
|
7252
7679
|
|
|
7253
7680
|
// src/internal/components/ui/badge.tsx
|
|
7254
7681
|
var import_class_variance_authority2 = require("class-variance-authority");
|
|
@@ -7261,7 +7688,7 @@ function cn2(...inputs) {
|
|
|
7261
7688
|
}
|
|
7262
7689
|
|
|
7263
7690
|
// src/internal/components/ui/badge.tsx
|
|
7264
|
-
var
|
|
7691
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
7265
7692
|
var badgeVariants = (0, import_class_variance_authority2.cva)(
|
|
7266
7693
|
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
7267
7694
|
{
|
|
@@ -7281,13 +7708,13 @@ var badgeVariants = (0, import_class_variance_authority2.cva)(
|
|
|
7281
7708
|
}
|
|
7282
7709
|
);
|
|
7283
7710
|
function Badge({ className, variant, ...props }) {
|
|
7284
|
-
return /* @__PURE__ */ (0,
|
|
7711
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
7285
7712
|
}
|
|
7286
7713
|
|
|
7287
7714
|
// src/internal/components/Address.tsx
|
|
7288
|
-
var
|
|
7289
|
-
var
|
|
7290
|
-
var
|
|
7715
|
+
var React23 = __toESM(require("react"), 1);
|
|
7716
|
+
var import_lucide_react12 = require("lucide-react");
|
|
7717
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
7291
7718
|
function toExplorerAddressUrl(address, chain) {
|
|
7292
7719
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
7293
7720
|
if (!base2) return null;
|
|
@@ -7308,12 +7735,12 @@ var Address = ({
|
|
|
7308
7735
|
}) => {
|
|
7309
7736
|
const addr = address || "";
|
|
7310
7737
|
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
7311
|
-
const [copied, setCopied] =
|
|
7312
|
-
if (!addr) return /* @__PURE__ */ (0,
|
|
7313
|
-
return /* @__PURE__ */ (0,
|
|
7314
|
-
label && /* @__PURE__ */ (0,
|
|
7315
|
-
/* @__PURE__ */ (0,
|
|
7316
|
-
showCopy && /* @__PURE__ */ (0,
|
|
7738
|
+
const [copied, setCopied] = React23.useState(false);
|
|
7739
|
+
if (!addr) return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
7740
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: cn2("flex items-center gap-2", className), style: { listStyle: "none" }, children: [
|
|
7741
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "text-sm font-medium", children: label }),
|
|
7742
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("code", { className: "text-xs bg-background px-2 py-1 rounded select-all", children: truncate ? short(addr) : addr }),
|
|
7743
|
+
showCopy && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
7317
7744
|
Button,
|
|
7318
7745
|
{
|
|
7319
7746
|
variant: "ghost",
|
|
@@ -7327,10 +7754,10 @@ var Address = ({
|
|
|
7327
7754
|
} catch {
|
|
7328
7755
|
}
|
|
7329
7756
|
},
|
|
7330
|
-
children: /* @__PURE__ */ (0,
|
|
7757
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react12.Copy, { className: "h-4 w-4" })
|
|
7331
7758
|
}
|
|
7332
7759
|
),
|
|
7333
|
-
showExplorer && explorer && /* @__PURE__ */ (0,
|
|
7760
|
+
showExplorer && explorer && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
7334
7761
|
"a",
|
|
7335
7762
|
{
|
|
7336
7763
|
href: explorer,
|
|
@@ -7338,7 +7765,7 @@ var Address = ({
|
|
|
7338
7765
|
rel: "noreferrer noopener",
|
|
7339
7766
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
7340
7767
|
title: "Open in explorer",
|
|
7341
|
-
children: /* @__PURE__ */ (0,
|
|
7768
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react12.ExternalLink, { className: "h-4 w-4" })
|
|
7342
7769
|
}
|
|
7343
7770
|
)
|
|
7344
7771
|
] });
|
|
@@ -7346,7 +7773,7 @@ var Address = ({
|
|
|
7346
7773
|
|
|
7347
7774
|
// src/internal/components/UserOpStatus.tsx
|
|
7348
7775
|
init_base();
|
|
7349
|
-
var
|
|
7776
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
7350
7777
|
var UserOpStatus = ({
|
|
7351
7778
|
userOpHash,
|
|
7352
7779
|
chain,
|
|
@@ -7357,20 +7784,20 @@ var UserOpStatus = ({
|
|
|
7357
7784
|
externalState
|
|
7358
7785
|
}) => {
|
|
7359
7786
|
const useExternalState = !!externalState;
|
|
7360
|
-
const [internalReceipt, setInternalReceipt] =
|
|
7361
|
-
const [internalMempool, setInternalMempool] =
|
|
7362
|
-
const [internalError, setInternalError] =
|
|
7363
|
-
const [attempt, setAttempt] =
|
|
7364
|
-
const [internalRefreshing, setInternalRefreshing] =
|
|
7365
|
-
const [timedOut, setTimedOut] =
|
|
7366
|
-
const [rejected, setRejected] =
|
|
7367
|
-
const intervalRef =
|
|
7368
|
-
const startTimeRef =
|
|
7787
|
+
const [internalReceipt, setInternalReceipt] = React24.useState(null);
|
|
7788
|
+
const [internalMempool, setInternalMempool] = React24.useState(null);
|
|
7789
|
+
const [internalError, setInternalError] = React24.useState(null);
|
|
7790
|
+
const [attempt, setAttempt] = React24.useState(0);
|
|
7791
|
+
const [internalRefreshing, setInternalRefreshing] = React24.useState(false);
|
|
7792
|
+
const [timedOut, setTimedOut] = React24.useState(false);
|
|
7793
|
+
const [rejected, setRejected] = React24.useState(false);
|
|
7794
|
+
const intervalRef = React24.useRef(null);
|
|
7795
|
+
const startTimeRef = React24.useRef(Date.now());
|
|
7369
7796
|
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
7370
7797
|
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
7371
7798
|
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
7372
7799
|
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
7373
|
-
const rpc =
|
|
7800
|
+
const rpc = React24.useCallback(async (method, params) => {
|
|
7374
7801
|
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
7375
7802
|
const res = await fetch(getBundlerUrl(), {
|
|
7376
7803
|
method: "POST",
|
|
@@ -7381,14 +7808,14 @@ var UserOpStatus = ({
|
|
|
7381
7808
|
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
7382
7809
|
return json.result;
|
|
7383
7810
|
}, []);
|
|
7384
|
-
const extractMempoolInfo =
|
|
7811
|
+
const extractMempoolInfo = React24.useCallback((m) => {
|
|
7385
7812
|
if (!m) return null;
|
|
7386
7813
|
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
7387
7814
|
const sender = m.sender || m?.userOperation?.sender || null;
|
|
7388
7815
|
if (!entryPoint && !sender) return null;
|
|
7389
7816
|
return { entryPoint, sender };
|
|
7390
7817
|
}, []);
|
|
7391
|
-
const tick =
|
|
7818
|
+
const tick = React24.useCallback(async () => {
|
|
7392
7819
|
if (useExternalState) return;
|
|
7393
7820
|
const elapsed = Date.now() - startTimeRef.current;
|
|
7394
7821
|
if (elapsed > maxPollTimeMs) {
|
|
@@ -7432,7 +7859,7 @@ var UserOpStatus = ({
|
|
|
7432
7859
|
setAttempt((x) => x + 1);
|
|
7433
7860
|
}
|
|
7434
7861
|
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
7435
|
-
|
|
7862
|
+
React24.useEffect(() => {
|
|
7436
7863
|
if (useExternalState) return;
|
|
7437
7864
|
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
7438
7865
|
startTimeRef.current = Date.now();
|
|
@@ -7444,7 +7871,7 @@ var UserOpStatus = ({
|
|
|
7444
7871
|
setAttempt(0);
|
|
7445
7872
|
setInternalRefreshing(false);
|
|
7446
7873
|
}, [userOpHash, useExternalState]);
|
|
7447
|
-
|
|
7874
|
+
React24.useEffect(() => {
|
|
7448
7875
|
if (useExternalState) {
|
|
7449
7876
|
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
7450
7877
|
return;
|
|
@@ -7479,54 +7906,54 @@ var UserOpStatus = ({
|
|
|
7479
7906
|
const stateBadge = () => {
|
|
7480
7907
|
if (receipt) {
|
|
7481
7908
|
const ok = !!receipt.success;
|
|
7482
|
-
return /* @__PURE__ */ (0,
|
|
7483
|
-
ok ? /* @__PURE__ */ (0,
|
|
7909
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
7910
|
+
ok ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.CheckCircle2, { className: "h-3 w-3" }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7484
7911
|
ok ? "Included" : "Failed"
|
|
7485
7912
|
] });
|
|
7486
7913
|
}
|
|
7487
7914
|
if (rejected) {
|
|
7488
|
-
return /* @__PURE__ */ (0,
|
|
7489
|
-
/* @__PURE__ */ (0,
|
|
7915
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
7916
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7490
7917
|
" Rejected by bundler"
|
|
7491
7918
|
] });
|
|
7492
7919
|
}
|
|
7493
7920
|
if (timedOut) {
|
|
7494
|
-
return /* @__PURE__ */ (0,
|
|
7495
|
-
/* @__PURE__ */ (0,
|
|
7921
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "warning", className: "gap-1", children: [
|
|
7922
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7496
7923
|
" Timeout - may be rejected"
|
|
7497
7924
|
] });
|
|
7498
7925
|
}
|
|
7499
7926
|
if (mempool) {
|
|
7500
|
-
return /* @__PURE__ */ (0,
|
|
7501
|
-
/* @__PURE__ */ (0,
|
|
7927
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "outline", className: "gap-1", children: [
|
|
7928
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Clock, { className: "h-3 w-3" }),
|
|
7502
7929
|
" Pending in bundler"
|
|
7503
7930
|
] });
|
|
7504
7931
|
}
|
|
7505
|
-
return /* @__PURE__ */ (0,
|
|
7506
|
-
/* @__PURE__ */ (0,
|
|
7932
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
7933
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Clock, { className: "h-3 w-3" }),
|
|
7507
7934
|
" Waiting"
|
|
7508
7935
|
] });
|
|
7509
7936
|
};
|
|
7510
|
-
return /* @__PURE__ */ (0,
|
|
7937
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
7511
7938
|
"div",
|
|
7512
7939
|
{
|
|
7513
7940
|
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
7514
7941
|
style: { textAlign: "left", listStyle: "none" },
|
|
7515
7942
|
children: [
|
|
7516
|
-
/* @__PURE__ */ (0,
|
|
7517
|
-
/* @__PURE__ */ (0,
|
|
7943
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [
|
|
7944
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7518
7945
|
stateBadge(),
|
|
7519
|
-
/* @__PURE__ */ (0,
|
|
7946
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
7520
7947
|
] }),
|
|
7521
|
-
/* @__PURE__ */ (0,
|
|
7522
|
-
/* @__PURE__ */ (0,
|
|
7523
|
-
/* @__PURE__ */ (0,
|
|
7948
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Button, { variant: "ghost", size: "sm", onClick: () => tick(), disabled: refreshing, className: "h-8", children: [
|
|
7949
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.RefreshCw, { className: cn2("h-3.5 w-3.5 mr-1", refreshing && "animate-spin") }),
|
|
7950
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-xs", children: "Refresh" })
|
|
7524
7951
|
] })
|
|
7525
7952
|
] }),
|
|
7526
|
-
/* @__PURE__ */ (0,
|
|
7527
|
-
/* @__PURE__ */ (0,
|
|
7528
|
-
/* @__PURE__ */ (0,
|
|
7529
|
-
/* @__PURE__ */ (0,
|
|
7953
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
7954
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "UO Hash" }),
|
|
7955
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("code", { className: "text-xs font-mono flex-1 select-all", children: userOpHash }),
|
|
7956
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7530
7957
|
Button,
|
|
7531
7958
|
{
|
|
7532
7959
|
variant: "ghost",
|
|
@@ -7538,14 +7965,14 @@ var UserOpStatus = ({
|
|
|
7538
7965
|
} catch {
|
|
7539
7966
|
}
|
|
7540
7967
|
},
|
|
7541
|
-
children: /* @__PURE__ */ (0,
|
|
7968
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Copy, { className: "h-3.5 w-3.5" })
|
|
7542
7969
|
}
|
|
7543
7970
|
)
|
|
7544
7971
|
] }),
|
|
7545
|
-
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ (0,
|
|
7546
|
-
/* @__PURE__ */ (0,
|
|
7547
|
-
/* @__PURE__ */ (0,
|
|
7548
|
-
/* @__PURE__ */ (0,
|
|
7972
|
+
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
7973
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "Tx Hash" }),
|
|
7974
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("code", { className: "text-xs font-mono flex-1 select-all", children: receipt.receipt.transactionHash }),
|
|
7975
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7549
7976
|
Button,
|
|
7550
7977
|
{
|
|
7551
7978
|
variant: "ghost",
|
|
@@ -7557,10 +7984,10 @@ var UserOpStatus = ({
|
|
|
7557
7984
|
} catch {
|
|
7558
7985
|
}
|
|
7559
7986
|
},
|
|
7560
|
-
children: /* @__PURE__ */ (0,
|
|
7987
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Copy, { className: "h-3.5 w-3.5" })
|
|
7561
7988
|
}
|
|
7562
7989
|
),
|
|
7563
|
-
chain?.blockExplorers?.default?.url && /* @__PURE__ */ (0,
|
|
7990
|
+
chain?.blockExplorers?.default?.url && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7564
7991
|
"a",
|
|
7565
7992
|
{
|
|
7566
7993
|
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
@@ -7568,11 +7995,11 @@ var UserOpStatus = ({
|
|
|
7568
7995
|
rel: "noreferrer noopener",
|
|
7569
7996
|
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
7570
7997
|
title: "Open in explorer",
|
|
7571
|
-
children: /* @__PURE__ */ (0,
|
|
7998
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.ExternalLink, { className: "h-3.5 w-3.5" })
|
|
7572
7999
|
}
|
|
7573
8000
|
)
|
|
7574
8001
|
] }),
|
|
7575
|
-
receipt && /* @__PURE__ */ (0,
|
|
8002
|
+
receipt && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
7576
8003
|
"Block ",
|
|
7577
8004
|
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
7578
8005
|
" \u2022 Gas Used",
|
|
@@ -7581,32 +8008,32 @@ var UserOpStatus = ({
|
|
|
7581
8008
|
" \u2022 Success ",
|
|
7582
8009
|
String(!!receipt.success)
|
|
7583
8010
|
] }),
|
|
7584
|
-
/* @__PURE__ */ (0,
|
|
8011
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { className: "ml-2", children: [
|
|
7585
8012
|
"\u2022 Polling for ",
|
|
7586
8013
|
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
7587
8014
|
"s"
|
|
7588
8015
|
] }) }),
|
|
7589
|
-
mempool && /* @__PURE__ */ (0,
|
|
7590
|
-
/* @__PURE__ */ (0,
|
|
8016
|
+
mempool && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
8017
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { children: [
|
|
7591
8018
|
"Seen by bundler at ",
|
|
7592
|
-
/* @__PURE__ */ (0,
|
|
8019
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
7593
8020
|
] }),
|
|
7594
|
-
/* @__PURE__ */ (0,
|
|
8021
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { children: [
|
|
7595
8022
|
"sender ",
|
|
7596
|
-
/* @__PURE__ */ (0,
|
|
8023
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Address, { address: mempool.sender, chain, truncate: false })
|
|
7597
8024
|
] })
|
|
7598
8025
|
] }),
|
|
7599
|
-
error && /* @__PURE__ */ (0,
|
|
7600
|
-
/* @__PURE__ */ (0,
|
|
8026
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8027
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7601
8028
|
" ",
|
|
7602
8029
|
error
|
|
7603
8030
|
] }),
|
|
7604
|
-
rejected && /* @__PURE__ */ (0,
|
|
7605
|
-
/* @__PURE__ */ (0,
|
|
8031
|
+
rejected && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8032
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7606
8033
|
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
7607
8034
|
] }),
|
|
7608
|
-
timedOut && /* @__PURE__ */ (0,
|
|
7609
|
-
/* @__PURE__ */ (0,
|
|
8035
|
+
timedOut && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8036
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7610
8037
|
"Stopped polling after ",
|
|
7611
8038
|
Math.round(maxPollTimeMs / 1e3),
|
|
7612
8039
|
"s. UserOperation may have been rejected by the bundler."
|
|
@@ -7618,7 +8045,7 @@ var UserOpStatus = ({
|
|
|
7618
8045
|
|
|
7619
8046
|
// src/internal/components/SendModal.tsx
|
|
7620
8047
|
init_base();
|
|
7621
|
-
var
|
|
8048
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
7622
8049
|
var SendModal = ({
|
|
7623
8050
|
open,
|
|
7624
8051
|
onOpenChange,
|
|
@@ -7701,7 +8128,7 @@ var SendModal = ({
|
|
|
7701
8128
|
const maxAmount = Math.max(0, balance - 1e-3);
|
|
7702
8129
|
setAmount(maxAmount.toFixed(6));
|
|
7703
8130
|
};
|
|
7704
|
-
return /* @__PURE__ */ (0,
|
|
8131
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
7705
8132
|
DialogContent,
|
|
7706
8133
|
{
|
|
7707
8134
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7713,28 +8140,28 @@ var SendModal = ({
|
|
|
7713
8140
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7714
8141
|
},
|
|
7715
8142
|
children: [
|
|
7716
|
-
/* @__PURE__ */ (0,
|
|
7717
|
-
/* @__PURE__ */ (0,
|
|
7718
|
-
/* @__PURE__ */ (0,
|
|
7719
|
-
onBack && txStep === "input" && /* @__PURE__ */ (0,
|
|
8143
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogTitle, { children: "Send Transaction" }) }),
|
|
8144
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogDescription, { className: "sr-only", children: "Send LUMIA tokens to another address" }),
|
|
8145
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8146
|
+
onBack && txStep === "input" && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7720
8147
|
"button",
|
|
7721
8148
|
{
|
|
7722
8149
|
onClick: onBack,
|
|
7723
8150
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7724
8151
|
title: "Back",
|
|
7725
|
-
children: /* @__PURE__ */ (0,
|
|
8152
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.ArrowLeft, { className: "h-4 w-4" })
|
|
7726
8153
|
}
|
|
7727
8154
|
),
|
|
7728
|
-
/* @__PURE__ */ (0,
|
|
7729
|
-
/* @__PURE__ */ (0,
|
|
7730
|
-
/* @__PURE__ */ (0,
|
|
8155
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8156
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Send, { className: "h-5 w-5" }),
|
|
8157
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { children: "Send LUMIA" })
|
|
7731
8158
|
] })
|
|
7732
8159
|
] }) }),
|
|
7733
|
-
/* @__PURE__ */ (0,
|
|
7734
|
-
txStep === "input" && /* @__PURE__ */ (0,
|
|
7735
|
-
/* @__PURE__ */ (0,
|
|
7736
|
-
/* @__PURE__ */ (0,
|
|
7737
|
-
/* @__PURE__ */ (0,
|
|
8160
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "p-5", children: [
|
|
8161
|
+
txStep === "input" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8162
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8163
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Recipient Address" }),
|
|
8164
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7738
8165
|
"input",
|
|
7739
8166
|
{
|
|
7740
8167
|
type: "text",
|
|
@@ -7745,17 +8172,17 @@ var SendModal = ({
|
|
|
7745
8172
|
}
|
|
7746
8173
|
)
|
|
7747
8174
|
] }),
|
|
7748
|
-
/* @__PURE__ */ (0,
|
|
7749
|
-
/* @__PURE__ */ (0,
|
|
7750
|
-
/* @__PURE__ */ (0,
|
|
7751
|
-
/* @__PURE__ */ (0,
|
|
8175
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8176
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between items-center mb-2", children: [
|
|
8177
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { className: `text-sm font-medium ${theme.bodyText}`, children: "Amount" }),
|
|
8178
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
7752
8179
|
"Balance: ",
|
|
7753
8180
|
balance.toFixed(4),
|
|
7754
8181
|
" LUMIA"
|
|
7755
8182
|
] })
|
|
7756
8183
|
] }),
|
|
7757
|
-
/* @__PURE__ */ (0,
|
|
7758
|
-
/* @__PURE__ */ (0,
|
|
8184
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "relative", children: [
|
|
8185
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7759
8186
|
"input",
|
|
7760
8187
|
{
|
|
7761
8188
|
type: "number",
|
|
@@ -7766,7 +8193,7 @@ var SendModal = ({
|
|
|
7766
8193
|
className: `w-full px-3 py-2 pr-16 border ${isDark ? "bg-gray-800 border-gray-600 text-white placeholder:text-gray-400" : "bg-white border-gray-300 text-gray-900 placeholder:text-gray-400"} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`
|
|
7767
8194
|
}
|
|
7768
8195
|
),
|
|
7769
|
-
/* @__PURE__ */ (0,
|
|
8196
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7770
8197
|
"button",
|
|
7771
8198
|
{
|
|
7772
8199
|
onClick: handleMaxAmount,
|
|
@@ -7776,11 +8203,11 @@ var SendModal = ({
|
|
|
7776
8203
|
)
|
|
7777
8204
|
] })
|
|
7778
8205
|
] }),
|
|
7779
|
-
(validationError || error) && /* @__PURE__ */ (0,
|
|
7780
|
-
/* @__PURE__ */ (0,
|
|
7781
|
-
/* @__PURE__ */ (0,
|
|
8206
|
+
(validationError || error) && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `flex items-center gap-2 p-3 ${isDark ? "bg-red-900/30 text-red-400" : "bg-red-50 text-red-700"} rounded-lg`, children: [
|
|
8207
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.AlertCircle, { className: "h-4 w-4" }),
|
|
8208
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "text-sm", children: validationError || error })
|
|
7782
8209
|
] }),
|
|
7783
|
-
/* @__PURE__ */ (0,
|
|
8210
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7784
8211
|
Button,
|
|
7785
8212
|
{
|
|
7786
8213
|
onClick: handleSend,
|
|
@@ -7791,29 +8218,29 @@ var SendModal = ({
|
|
|
7791
8218
|
}
|
|
7792
8219
|
)
|
|
7793
8220
|
] }),
|
|
7794
|
-
txStep === "confirm" && /* @__PURE__ */ (0,
|
|
7795
|
-
/* @__PURE__ */ (0,
|
|
7796
|
-
/* @__PURE__ */ (0,
|
|
7797
|
-
/* @__PURE__ */ (0,
|
|
7798
|
-
/* @__PURE__ */ (0,
|
|
7799
|
-
/* @__PURE__ */ (0,
|
|
7800
|
-
/* @__PURE__ */ (0,
|
|
8221
|
+
txStep === "confirm" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8222
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8223
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("h3", { className: `font-medium ${theme.titleText} mb-3`, children: "Transaction Details" }),
|
|
8224
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-2 text-sm", children: [
|
|
8225
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8226
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "To:" }),
|
|
8227
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `font-mono ${theme.titleText}`, children: `${recipient.slice(0, 6)}...${recipient.slice(-4)}` })
|
|
7801
8228
|
] }),
|
|
7802
|
-
/* @__PURE__ */ (0,
|
|
7803
|
-
/* @__PURE__ */ (0,
|
|
7804
|
-
/* @__PURE__ */ (0,
|
|
8229
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8230
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "Amount:" }),
|
|
8231
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
7805
8232
|
amount,
|
|
7806
8233
|
" LUMIA"
|
|
7807
8234
|
] })
|
|
7808
8235
|
] }),
|
|
7809
|
-
/* @__PURE__ */ (0,
|
|
7810
|
-
/* @__PURE__ */ (0,
|
|
7811
|
-
/* @__PURE__ */ (0,
|
|
8236
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8237
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "Network:" }),
|
|
8238
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.titleText}`, children: "Lumia Beam" })
|
|
7812
8239
|
] })
|
|
7813
8240
|
] })
|
|
7814
8241
|
] }),
|
|
7815
|
-
/* @__PURE__ */ (0,
|
|
7816
|
-
/* @__PURE__ */ (0,
|
|
8242
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex gap-2", children: [
|
|
8243
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7817
8244
|
Button,
|
|
7818
8245
|
{
|
|
7819
8246
|
onClick: () => setTxStep("input"),
|
|
@@ -7823,7 +8250,7 @@ var SendModal = ({
|
|
|
7823
8250
|
children: "Back"
|
|
7824
8251
|
}
|
|
7825
8252
|
),
|
|
7826
|
-
/* @__PURE__ */ (0,
|
|
8253
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
7827
8254
|
Button,
|
|
7828
8255
|
{
|
|
7829
8256
|
onClick: handleConfirm,
|
|
@@ -7831,28 +8258,28 @@ var SendModal = ({
|
|
|
7831
8258
|
className: "flex-1",
|
|
7832
8259
|
size: "lg",
|
|
7833
8260
|
children: [
|
|
7834
|
-
isLoading && /* @__PURE__ */ (0,
|
|
8261
|
+
isLoading && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
7835
8262
|
"Confirm"
|
|
7836
8263
|
]
|
|
7837
8264
|
}
|
|
7838
8265
|
)
|
|
7839
8266
|
] })
|
|
7840
8267
|
] }),
|
|
7841
|
-
txStep === "pending" && /* @__PURE__ */ (0,
|
|
7842
|
-
/* @__PURE__ */ (0,
|
|
7843
|
-
/* @__PURE__ */ (0,
|
|
7844
|
-
/* @__PURE__ */ (0,
|
|
7845
|
-
/* @__PURE__ */ (0,
|
|
8268
|
+
txStep === "pending" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "py-8 text-center space-y-4", children: [
|
|
8269
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Loader2, { className: `h-12 w-12 animate-spin ${isDark ? "text-blue-400" : "text-blue-600"} mx-auto` }),
|
|
8270
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8271
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Pending" }),
|
|
8272
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Please wait while we process your transaction" })
|
|
7846
8273
|
] })
|
|
7847
8274
|
] }),
|
|
7848
|
-
txStep === "success" && userOpHash && /* @__PURE__ */ (0,
|
|
7849
|
-
/* @__PURE__ */ (0,
|
|
7850
|
-
/* @__PURE__ */ (0,
|
|
7851
|
-
/* @__PURE__ */ (0,
|
|
7852
|
-
/* @__PURE__ */ (0,
|
|
8275
|
+
txStep === "success" && userOpHash && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8276
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "text-center py-4", children: [
|
|
8277
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.CheckCircle2, { className: `h-12 w-12 ${isDark ? "text-green-400" : "text-green-500"} mx-auto mb-3` }),
|
|
8278
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Sent!" }),
|
|
8279
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Your transaction is being processed" })
|
|
7853
8280
|
] }),
|
|
7854
|
-
/* @__PURE__ */ (0,
|
|
7855
|
-
/* @__PURE__ */ (0,
|
|
8281
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(UserOpStatus, { userOpHash, chain: lumiaBeam }) }),
|
|
8282
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7856
8283
|
Button,
|
|
7857
8284
|
{
|
|
7858
8285
|
onClick: handleClose,
|
|
@@ -7870,9 +8297,9 @@ var SendModal = ({
|
|
|
7870
8297
|
|
|
7871
8298
|
// src/internal/components/ReceiveModal.tsx
|
|
7872
8299
|
var import_react18 = require("react");
|
|
7873
|
-
var
|
|
8300
|
+
var import_lucide_react15 = require("lucide-react");
|
|
7874
8301
|
var import_qrcode = __toESM(require("qrcode"), 1);
|
|
7875
|
-
var
|
|
8302
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
7876
8303
|
var ReceiveModal = ({
|
|
7877
8304
|
open,
|
|
7878
8305
|
onOpenChange,
|
|
@@ -7913,7 +8340,7 @@ var ReceiveModal = ({
|
|
|
7913
8340
|
if (!addr) return "";
|
|
7914
8341
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7915
8342
|
};
|
|
7916
|
-
return /* @__PURE__ */ (0,
|
|
8343
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
7917
8344
|
DialogContent,
|
|
7918
8345
|
{
|
|
7919
8346
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7925,51 +8352,51 @@ var ReceiveModal = ({
|
|
|
7925
8352
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7926
8353
|
},
|
|
7927
8354
|
children: [
|
|
7928
|
-
/* @__PURE__ */ (0,
|
|
7929
|
-
/* @__PURE__ */ (0,
|
|
7930
|
-
/* @__PURE__ */ (0,
|
|
7931
|
-
onBack && /* @__PURE__ */ (0,
|
|
8355
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DialogTitle, { children: "Receive LUMIA" }) }),
|
|
8356
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DialogDescription, { className: "sr-only", children: "Your wallet address and QR code for receiving LUMIA" }),
|
|
8357
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8358
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
7932
8359
|
"button",
|
|
7933
8360
|
{
|
|
7934
8361
|
onClick: onBack,
|
|
7935
8362
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7936
8363
|
title: "Back",
|
|
7937
|
-
children: /* @__PURE__ */ (0,
|
|
8364
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.ArrowLeft, { className: "h-4 w-4" })
|
|
7938
8365
|
}
|
|
7939
8366
|
),
|
|
7940
|
-
/* @__PURE__ */ (0,
|
|
7941
|
-
/* @__PURE__ */ (0,
|
|
7942
|
-
/* @__PURE__ */ (0,
|
|
8367
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8368
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.QrCode, { className: "h-5 w-5" }),
|
|
8369
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Receive LUMIA" })
|
|
7943
8370
|
] })
|
|
7944
8371
|
] }) }),
|
|
7945
|
-
/* @__PURE__ */ (0,
|
|
7946
|
-
qrCodeUrl && /* @__PURE__ */ (0,
|
|
7947
|
-
/* @__PURE__ */ (0,
|
|
7948
|
-
/* @__PURE__ */ (0,
|
|
7949
|
-
/* @__PURE__ */ (0,
|
|
8372
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "p-5 space-y-4", children: [
|
|
8373
|
+
qrCodeUrl && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `${isDark ? "bg-white" : "bg-white"} p-4 rounded-xl border ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("img", { src: qrCodeUrl, alt: "Wallet QR Code", className: "w-48 h-48" }) }) }),
|
|
8374
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `${isDark ? "bg-blue-900/30 border-blue-600" : "bg-blue-50 border-blue-200"} rounded-lg p-3`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `flex items-center gap-2 ${isDark ? "text-blue-300" : "text-blue-700"} text-sm`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex-1", children: [
|
|
8375
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "font-medium", children: "Network: Lumia Beam" }),
|
|
8376
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} mt-0.5`, children: "Ensure sender is on the same network" })
|
|
7950
8377
|
] }) }) }),
|
|
7951
|
-
/* @__PURE__ */ (0,
|
|
7952
|
-
/* @__PURE__ */ (0,
|
|
7953
|
-
/* @__PURE__ */ (0,
|
|
7954
|
-
/* @__PURE__ */ (0,
|
|
8378
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8379
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Your Wallet Address" }),
|
|
8380
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `flex-1 font-mono text-sm ${isDark ? "text-white bg-gray-700 border-gray-600" : "text-gray-900 bg-white border-gray-300"} rounded-lg px-3 py-2 break-all`, children: address }) }),
|
|
8381
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
7955
8382
|
Button,
|
|
7956
8383
|
{
|
|
7957
8384
|
onClick: handleCopy,
|
|
7958
8385
|
className: "w-full mt-3",
|
|
7959
8386
|
size: "lg",
|
|
7960
|
-
children: copied ? /* @__PURE__ */ (0,
|
|
7961
|
-
/* @__PURE__ */ (0,
|
|
7962
|
-
/* @__PURE__ */ (0,
|
|
7963
|
-
] }) : /* @__PURE__ */ (0,
|
|
7964
|
-
/* @__PURE__ */ (0,
|
|
7965
|
-
/* @__PURE__ */ (0,
|
|
8387
|
+
children: copied ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
|
|
8388
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.CheckCircle2, { className: "h-4 w-4" }),
|
|
8389
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Copied!" })
|
|
8390
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
|
|
8391
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.Copy, { className: "h-4 w-4" }),
|
|
8392
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Copy Address" })
|
|
7966
8393
|
] })
|
|
7967
8394
|
}
|
|
7968
8395
|
)
|
|
7969
8396
|
] }),
|
|
7970
|
-
/* @__PURE__ */ (0,
|
|
7971
|
-
/* @__PURE__ */ (0,
|
|
7972
|
-
/* @__PURE__ */ (0,
|
|
8397
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
8398
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { children: "Share this address to receive LUMIA tokens." }),
|
|
8399
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "mt-1", children: "Only send LUMIA tokens to this address on Lumia Beam network." })
|
|
7973
8400
|
] })
|
|
7974
8401
|
] })
|
|
7975
8402
|
]
|
|
@@ -7978,12 +8405,12 @@ var ReceiveModal = ({
|
|
|
7978
8405
|
};
|
|
7979
8406
|
|
|
7980
8407
|
// src/internal/components/BuyModal.tsx
|
|
7981
|
-
var
|
|
7982
|
-
var
|
|
8408
|
+
var import_lucide_react16 = require("lucide-react");
|
|
8409
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
7983
8410
|
var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
7984
8411
|
const { config } = useLumiaPassportConfig();
|
|
7985
8412
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7986
|
-
return /* @__PURE__ */ (0,
|
|
8413
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
|
|
7987
8414
|
DialogContent,
|
|
7988
8415
|
{
|
|
7989
8416
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7995,26 +8422,26 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7995
8422
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7996
8423
|
},
|
|
7997
8424
|
children: [
|
|
7998
|
-
/* @__PURE__ */ (0,
|
|
7999
|
-
/* @__PURE__ */ (0,
|
|
8000
|
-
/* @__PURE__ */ (0,
|
|
8001
|
-
onBack && /* @__PURE__ */ (0,
|
|
8425
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DialogTitle, { children: "Buy Crypto" }) }),
|
|
8426
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DialogDescription, { className: "sr-only", children: "On-ramp placeholder" }),
|
|
8427
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8428
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
8002
8429
|
"button",
|
|
8003
8430
|
{
|
|
8004
8431
|
onClick: onBack,
|
|
8005
8432
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8006
8433
|
title: "Back",
|
|
8007
|
-
children: /* @__PURE__ */ (0,
|
|
8434
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_lucide_react16.ArrowLeft, { className: "h-4 w-4" })
|
|
8008
8435
|
}
|
|
8009
8436
|
),
|
|
8010
|
-
/* @__PURE__ */ (0,
|
|
8011
|
-
/* @__PURE__ */ (0,
|
|
8012
|
-
/* @__PURE__ */ (0,
|
|
8437
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8438
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_lucide_react16.CreditCard, { className: "h-5 w-5" }),
|
|
8439
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: "Buy" })
|
|
8013
8440
|
] })
|
|
8014
8441
|
] }) }),
|
|
8015
|
-
/* @__PURE__ */ (0,
|
|
8016
|
-
/* @__PURE__ */ (0,
|
|
8017
|
-
/* @__PURE__ */ (0,
|
|
8442
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "p-5", children: [
|
|
8443
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "On-ramp coming soon\u2026" }) }),
|
|
8444
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "pt-4", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
8018
8445
|
] })
|
|
8019
8446
|
]
|
|
8020
8447
|
}
|
|
@@ -8022,14 +8449,14 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8022
8449
|
};
|
|
8023
8450
|
|
|
8024
8451
|
// src/internal/components/KycModal.tsx
|
|
8025
|
-
var
|
|
8026
|
-
var
|
|
8452
|
+
var import_lucide_react17 = require("lucide-react");
|
|
8453
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
8027
8454
|
var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
8028
8455
|
const { config } = useLumiaPassportConfig();
|
|
8029
8456
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
8030
8457
|
const provider = config.kyc?.provider;
|
|
8031
8458
|
const options = config.kyc?.options || {};
|
|
8032
|
-
return /* @__PURE__ */ (0,
|
|
8459
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
|
|
8033
8460
|
DialogContent,
|
|
8034
8461
|
{
|
|
8035
8462
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8041,32 +8468,32 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8041
8468
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8042
8469
|
},
|
|
8043
8470
|
children: [
|
|
8044
|
-
/* @__PURE__ */ (0,
|
|
8045
|
-
/* @__PURE__ */ (0,
|
|
8046
|
-
/* @__PURE__ */ (0,
|
|
8047
|
-
onBack && /* @__PURE__ */ (0,
|
|
8471
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(DialogTitle, { children: "KYC" }) }),
|
|
8472
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(DialogDescription, { className: "sr-only", children: "KYC placeholder" }),
|
|
8473
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8474
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
|
|
8048
8475
|
"button",
|
|
8049
8476
|
{
|
|
8050
8477
|
onClick: onBack,
|
|
8051
8478
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8052
8479
|
title: "Back",
|
|
8053
|
-
children: /* @__PURE__ */ (0,
|
|
8480
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react17.ArrowLeft, { className: "h-4 w-4" })
|
|
8054
8481
|
}
|
|
8055
8482
|
),
|
|
8056
|
-
/* @__PURE__ */ (0,
|
|
8057
|
-
/* @__PURE__ */ (0,
|
|
8058
|
-
/* @__PURE__ */ (0,
|
|
8483
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8484
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react17.ShieldCheck, { className: "h-5 w-5" }),
|
|
8485
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: "KYC" })
|
|
8059
8486
|
] })
|
|
8060
8487
|
] }) }),
|
|
8061
|
-
/* @__PURE__ */ (0,
|
|
8062
|
-
provider ? /* @__PURE__ */ (0,
|
|
8063
|
-
/* @__PURE__ */ (0,
|
|
8488
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "p-5", children: [
|
|
8489
|
+
provider ? /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `rounded-xl p-4 ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: [
|
|
8490
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `text-sm ${theme.titleText} mb-2`, children: [
|
|
8064
8491
|
"KYC provider: ",
|
|
8065
|
-
/* @__PURE__ */ (0,
|
|
8492
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "font-medium", children: provider })
|
|
8066
8493
|
] }),
|
|
8067
|
-
Object.keys(options).length > 0 ? /* @__PURE__ */ (0,
|
|
8068
|
-
] }) : /* @__PURE__ */ (0,
|
|
8069
|
-
/* @__PURE__ */ (0,
|
|
8494
|
+
Object.keys(options).length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-xs ${theme.mutedText} break-words whitespace-pre-wrap`, children: JSON.stringify(options, null, 2) }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "No provider options configured." })
|
|
8495
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "KYC verification coming soon\u2026" }) }),
|
|
8496
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pt-4", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
8070
8497
|
] })
|
|
8071
8498
|
]
|
|
8072
8499
|
}
|
|
@@ -8075,20 +8502,20 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8075
8502
|
|
|
8076
8503
|
// src/components/ConnectWalletButton.tsx
|
|
8077
8504
|
init_auth();
|
|
8078
|
-
var
|
|
8505
|
+
var import_lucide_react18 = require("lucide-react");
|
|
8079
8506
|
init_base();
|
|
8080
8507
|
|
|
8081
8508
|
// src/modules/linkedProfiles.ts
|
|
8082
|
-
var
|
|
8509
|
+
var React27 = __toESM(require("react"), 1);
|
|
8083
8510
|
init_common();
|
|
8084
8511
|
init_types();
|
|
8085
8512
|
init_auth();
|
|
8086
8513
|
function useLumiaPassportLinkedProfiles() {
|
|
8087
|
-
const [profiles, setProfiles] =
|
|
8088
|
-
const [avatar, setAvatar] =
|
|
8089
|
-
const [isLoading, setIsLoading] =
|
|
8090
|
-
const [error, setError] =
|
|
8091
|
-
const load =
|
|
8514
|
+
const [profiles, setProfiles] = React27.useState([]);
|
|
8515
|
+
const [avatar, setAvatar] = React27.useState(null);
|
|
8516
|
+
const [isLoading, setIsLoading] = React27.useState(false);
|
|
8517
|
+
const [error, setError] = React27.useState(null);
|
|
8518
|
+
const load = React27.useCallback(async () => {
|
|
8092
8519
|
setIsLoading(true);
|
|
8093
8520
|
setError(null);
|
|
8094
8521
|
try {
|
|
@@ -8114,14 +8541,14 @@ function useLumiaPassportLinkedProfiles() {
|
|
|
8114
8541
|
setIsLoading(false);
|
|
8115
8542
|
}
|
|
8116
8543
|
}, []);
|
|
8117
|
-
|
|
8544
|
+
React27.useEffect(() => {
|
|
8118
8545
|
load();
|
|
8119
8546
|
}, [load]);
|
|
8120
8547
|
return { profiles, avatar, isLoading, error, refresh: load };
|
|
8121
8548
|
}
|
|
8122
8549
|
|
|
8123
8550
|
// src/components/ConnectWalletButton.tsx
|
|
8124
|
-
var
|
|
8551
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
8125
8552
|
var ConnectWalletButton = ({
|
|
8126
8553
|
className,
|
|
8127
8554
|
label = "Connect Wallet",
|
|
@@ -8173,6 +8600,7 @@ var ConnectWalletButton = ({
|
|
|
8173
8600
|
const [copied, setCopied] = import_react19.default.useState(false);
|
|
8174
8601
|
const [isManageWalletOpen, setIsManageWalletOpen] = import_react19.default.useState(false);
|
|
8175
8602
|
const [isSecurityOpen, setIsSecurityOpen] = import_react19.default.useState(false);
|
|
8603
|
+
const [isBackupOpen, setIsBackupOpen] = import_react19.default.useState(false);
|
|
8176
8604
|
const [isTransactionsOpen, setIsTransactionsOpen] = import_react19.default.useState(false);
|
|
8177
8605
|
const [isViewAssetsOpen, setIsViewAssetsOpen] = import_react19.default.useState(false);
|
|
8178
8606
|
const [isSendOpen, setIsSendOpen] = import_react19.default.useState(false);
|
|
@@ -8423,8 +8851,8 @@ var ConnectWalletButton = ({
|
|
|
8423
8851
|
refetchBalance();
|
|
8424
8852
|
}
|
|
8425
8853
|
}, [address]);
|
|
8426
|
-
return /* @__PURE__ */ (0,
|
|
8427
|
-
/* @__PURE__ */ (0,
|
|
8854
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: [className, "lumia-scope"].filter(Boolean).join(" "), children: [
|
|
8855
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "inline-flex items-center gap-2", children: !address ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8428
8856
|
"button",
|
|
8429
8857
|
{
|
|
8430
8858
|
onClick: () => {
|
|
@@ -8461,56 +8889,56 @@ var ConnectWalletButton = ({
|
|
|
8461
8889
|
},
|
|
8462
8890
|
children: label || "Connect"
|
|
8463
8891
|
}
|
|
8464
|
-
) }) : /* @__PURE__ */ (0,
|
|
8892
|
+
) }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8465
8893
|
"div",
|
|
8466
8894
|
{
|
|
8467
8895
|
className: `relative rounded-2xl p-4 shadow-lg cursor-pointer transition-all duration-200 hover:scale-105 hover:shadow-xl max-w-sm min-w-[280px] ${isDark ? "bg-gray-900/40 backdrop-blur border border-gray-700" : "bg-white backdrop-blur border border-gray-200"}`,
|
|
8468
8896
|
onClick: () => setIsWalletMenuOpen(true),
|
|
8469
|
-
children: /* @__PURE__ */ (0,
|
|
8470
|
-
/* @__PURE__ */ (0,
|
|
8897
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-3", children: [
|
|
8898
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 overflow-hidden bg-gradient-to-br from-purple-500 to-blue-600", children: avatar ? (
|
|
8471
8899
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8472
|
-
/* @__PURE__ */ (0,
|
|
8473
|
-
) : /* @__PURE__ */ (0,
|
|
8474
|
-
/* @__PURE__ */ (0,
|
|
8475
|
-
/* @__PURE__ */ (0,
|
|
8476
|
-
/* @__PURE__ */ (0,
|
|
8900
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8901
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white font-bold text-sm", children: "LP" }) }),
|
|
8902
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "text-left flex-1 min-w-0", children: [
|
|
8903
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `font-semibold text-base truncate ${theme.titleText}`, children: mode === "compact" && displayName ? displayName : formatAddress(address) }),
|
|
8904
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
8477
8905
|
formatBalance(),
|
|
8478
8906
|
" LUMIA"
|
|
8479
8907
|
] })
|
|
8480
8908
|
] }),
|
|
8481
|
-
/* @__PURE__ */ (0,
|
|
8482
|
-
/* @__PURE__ */ (0,
|
|
8483
|
-
/* @__PURE__ */ (0,
|
|
8484
|
-
|
|
8909
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
8910
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8911
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8912
|
+
import_lucide_react18.Cloud,
|
|
8485
8913
|
{
|
|
8486
8914
|
className: `w-3 h-3 ${indicators.server ? "text-green-500" : "text-orange-400"}`
|
|
8487
8915
|
}
|
|
8488
8916
|
),
|
|
8489
|
-
/* @__PURE__ */ (0,
|
|
8917
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8490
8918
|
"Server Keyshare: ",
|
|
8491
8919
|
indicators.server ? "Available" : "Missing"
|
|
8492
8920
|
] })
|
|
8493
8921
|
] }),
|
|
8494
|
-
/* @__PURE__ */ (0,
|
|
8495
|
-
/* @__PURE__ */ (0,
|
|
8496
|
-
|
|
8922
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8923
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8924
|
+
import_lucide_react18.Laptop,
|
|
8497
8925
|
{
|
|
8498
8926
|
className: `w-3 h-3 ${indicators.local ? "text-green-500" : "text-orange-400"}`
|
|
8499
8927
|
}
|
|
8500
8928
|
),
|
|
8501
|
-
/* @__PURE__ */ (0,
|
|
8929
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8502
8930
|
"Local Keyshare: ",
|
|
8503
8931
|
indicators.local ? "Available" : "Missing"
|
|
8504
8932
|
] })
|
|
8505
8933
|
] }),
|
|
8506
|
-
/* @__PURE__ */ (0,
|
|
8507
|
-
/* @__PURE__ */ (0,
|
|
8508
|
-
|
|
8934
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8935
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8936
|
+
import_lucide_react18.Shield,
|
|
8509
8937
|
{
|
|
8510
8938
|
className: `w-3 h-3 ${indicators.backup ? "text-green-500" : "text-orange-400"}`
|
|
8511
8939
|
}
|
|
8512
8940
|
),
|
|
8513
|
-
/* @__PURE__ */ (0,
|
|
8941
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8514
8942
|
"Vault Backup: ",
|
|
8515
8943
|
indicators.backup ? "Available" : "Not Found"
|
|
8516
8944
|
] })
|
|
@@ -8519,59 +8947,59 @@ var ConnectWalletButton = ({
|
|
|
8519
8947
|
] })
|
|
8520
8948
|
}
|
|
8521
8949
|
) }),
|
|
8522
|
-
isWalletMenuOpen && address && /* @__PURE__ */ (0,
|
|
8523
|
-
/* @__PURE__ */ (0,
|
|
8524
|
-
/* @__PURE__ */ (0,
|
|
8525
|
-
/* @__PURE__ */ (0,
|
|
8526
|
-
/* @__PURE__ */ (0,
|
|
8950
|
+
isWalletMenuOpen && address && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "fixed inset-0 z-[60]", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Dialog, { open: isWalletMenuOpen, onOpenChange: setIsWalletMenuOpen, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
8951
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogTitle, { children: "Wallet Menu" }) }),
|
|
8952
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogDescription, { className: "sr-only", children: "Smart Account wallet actions and status" }),
|
|
8953
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `p-4 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-4", children: [
|
|
8954
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center relative overflow-hidden", children: avatar ? (
|
|
8527
8955
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8528
|
-
/* @__PURE__ */ (0,
|
|
8529
|
-
) : /* @__PURE__ */ (0,
|
|
8530
|
-
/* @__PURE__ */ (0,
|
|
8531
|
-
/* @__PURE__ */ (0,
|
|
8532
|
-
/* @__PURE__ */ (0,
|
|
8533
|
-
/* @__PURE__ */ (0,
|
|
8534
|
-
/* @__PURE__ */ (0,
|
|
8956
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8957
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white font-bold text-lg", children: "L" }) }),
|
|
8958
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
8959
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `font-medium text-lg ${theme.titleText}`, children: displayName || "Smart Account" }),
|
|
8960
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
8961
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: formatAddress(address) }),
|
|
8962
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("button", { onClick: async () => {
|
|
8535
8963
|
try {
|
|
8536
8964
|
await navigator.clipboard.writeText(address);
|
|
8537
8965
|
setCopied(true);
|
|
8538
8966
|
setTimeout(() => setCopied(false), 1500);
|
|
8539
8967
|
} catch {
|
|
8540
8968
|
}
|
|
8541
|
-
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ (0,
|
|
8969
|
+
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-green-500 text-sm", children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Copy, { className: "w-4 h-4" }) })
|
|
8542
8970
|
] })
|
|
8543
8971
|
] })
|
|
8544
8972
|
] }) }) }),
|
|
8545
|
-
/* @__PURE__ */ (0,
|
|
8546
|
-
/* @__PURE__ */ (0,
|
|
8547
|
-
/* @__PURE__ */ (0,
|
|
8973
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "p-4", children: [
|
|
8974
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "grid grid-cols-3 gap-2 mb-4", children: [
|
|
8975
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8548
8976
|
setIsWalletMenuOpen(false);
|
|
8549
8977
|
setIsSendOpen(true);
|
|
8550
8978
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-blue-400" : "bg-blue-50 hover:bg-blue-100 text-blue-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8551
|
-
/* @__PURE__ */ (0,
|
|
8552
|
-
/* @__PURE__ */ (0,
|
|
8979
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUp, { className: "w-5 h-5" }),
|
|
8980
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Send" })
|
|
8553
8981
|
] }),
|
|
8554
|
-
/* @__PURE__ */ (0,
|
|
8982
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8555
8983
|
setIsWalletMenuOpen(false);
|
|
8556
8984
|
setIsReceiveOpen(true);
|
|
8557
8985
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-green-400" : "bg-green-50 hover:bg-green-100 text-green-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8558
|
-
/* @__PURE__ */ (0,
|
|
8559
|
-
/* @__PURE__ */ (0,
|
|
8986
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowDown, { className: "w-5 h-5" }),
|
|
8987
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Receive" })
|
|
8560
8988
|
] }),
|
|
8561
|
-
/* @__PURE__ */ (0,
|
|
8989
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8562
8990
|
setIsWalletMenuOpen(false);
|
|
8563
8991
|
setIsBuyOpen(true);
|
|
8564
8992
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-purple-400" : "bg-purple-50 hover:bg-purple-100 text-purple-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8565
|
-
/* @__PURE__ */ (0,
|
|
8566
|
-
/* @__PURE__ */ (0,
|
|
8993
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Plus, { className: "w-5 h-5" }),
|
|
8994
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Buy" })
|
|
8567
8995
|
] })
|
|
8568
8996
|
] }),
|
|
8569
|
-
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ (0,
|
|
8570
|
-
/* @__PURE__ */ (0,
|
|
8571
|
-
/* @__PURE__ */ (0,
|
|
8572
|
-
/* @__PURE__ */ (0,
|
|
8573
|
-
/* @__PURE__ */ (0,
|
|
8574
|
-
/* @__PURE__ */ (0,
|
|
8997
|
+
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-orange-900/20 border border-orange-900/40" : "bg-orange-50 border border-orange-200"}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-start space-x-3", children: [
|
|
8998
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.AlertTriangle, { className: `w-5 h-5 ${isDark ? "text-orange-400" : "text-orange-500"} mt-0.5 flex-shrink-0` }),
|
|
8999
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
9000
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm font-medium ${isDark ? "text-orange-300" : "text-orange-700"}`, children: "Backup Not Created" }),
|
|
9001
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-xs mt-1 ${isDark ? "text-orange-400/80" : "text-orange-600"}`, children: "Secure your wallet with an encrypted vault backup to protect against device loss." }),
|
|
9002
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
8575
9003
|
"button",
|
|
8576
9004
|
{
|
|
8577
9005
|
onClick: () => {
|
|
@@ -8580,19 +9008,19 @@ var ConnectWalletButton = ({
|
|
|
8580
9008
|
},
|
|
8581
9009
|
className: `mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${isDark ? "bg-orange-900/40 hover:bg-orange-900/60 text-orange-300" : "bg-orange-100 hover:bg-orange-200 text-orange-700"}`,
|
|
8582
9010
|
children: [
|
|
8583
|
-
/* @__PURE__ */ (0,
|
|
9011
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: "w-3 h-3 inline mr-1" }),
|
|
8584
9012
|
"Create Backup"
|
|
8585
9013
|
]
|
|
8586
9014
|
}
|
|
8587
9015
|
)
|
|
8588
9016
|
] })
|
|
8589
9017
|
] }) }),
|
|
8590
|
-
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ (0,
|
|
8591
|
-
/* @__PURE__ */ (0,
|
|
8592
|
-
/* @__PURE__ */ (0,
|
|
8593
|
-
/* @__PURE__ */ (0,
|
|
8594
|
-
/* @__PURE__ */ (0,
|
|
8595
|
-
/* @__PURE__ */ (0,
|
|
9018
|
+
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-blue-900/20 border border-blue-900/40" : "bg-blue-50 border border-blue-200"}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-start space-x-3", children: [
|
|
9019
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.AlertTriangle, { className: `w-5 h-5 ${isDark ? "text-blue-400" : "text-blue-500"} mt-0.5 flex-shrink-0` }),
|
|
9020
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
9021
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm font-medium ${isDark ? "text-blue-300" : "text-blue-700"}`, children: "Email Not Connected" }),
|
|
9022
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-xs mt-1 ${isDark ? "text-blue-400/80" : "text-blue-600"}`, children: "Connect your email for easier account recovery and additional security." }),
|
|
9023
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
8596
9024
|
"button",
|
|
8597
9025
|
{
|
|
8598
9026
|
onClick: () => {
|
|
@@ -8601,80 +9029,87 @@ var ConnectWalletButton = ({
|
|
|
8601
9029
|
},
|
|
8602
9030
|
className: `mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${isDark ? "bg-blue-900/40 hover:bg-blue-900/60 text-blue-300" : "bg-blue-100 hover:bg-blue-200 text-blue-700"}`,
|
|
8603
9031
|
children: [
|
|
8604
|
-
/* @__PURE__ */ (0,
|
|
9032
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: "w-3 h-3 inline mr-1" }),
|
|
8605
9033
|
"Connect Email"
|
|
8606
9034
|
]
|
|
8607
9035
|
}
|
|
8608
9036
|
)
|
|
8609
9037
|
] })
|
|
8610
9038
|
] }) }),
|
|
8611
|
-
/* @__PURE__ */ (0,
|
|
9039
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8612
9040
|
"button",
|
|
8613
9041
|
{
|
|
8614
9042
|
onClick: () => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank"),
|
|
8615
9043
|
className: `w-full ${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-3 mb-3 transition-colors cursor-pointer text-left`,
|
|
8616
|
-
children: /* @__PURE__ */ (0,
|
|
8617
|
-
/* @__PURE__ */ (0,
|
|
8618
|
-
/* @__PURE__ */ (0,
|
|
8619
|
-
/* @__PURE__ */ (0,
|
|
8620
|
-
/* @__PURE__ */ (0,
|
|
8621
|
-
/* @__PURE__ */ (0,
|
|
9044
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9045
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-3", children: [
|
|
9046
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden", children: lumiaBeam.logoDataUri ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: lumiaBeam.logoDataUri, alt: "Chain logo", className: "w-full h-full object-cover" }) : lumiaBeam.logo === "lumia" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(LumiaLogo, { size: 32 }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white text-xs font-bold", children: (lumiaBeam.name || "L").charAt(0) }) }),
|
|
9047
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
|
|
9048
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `${theme.titleText} font-medium`, children: lumiaBeam.name }),
|
|
9049
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: theme.mutedText + " text-sm", children: [
|
|
8622
9050
|
formatBalance(),
|
|
8623
9051
|
" LUMIA"
|
|
8624
9052
|
] })
|
|
8625
9053
|
] })
|
|
8626
9054
|
] }),
|
|
8627
|
-
/* @__PURE__ */ (0,
|
|
9055
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: theme.iconColor, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUpRight, { className: "w-4 h-4" }) })
|
|
8628
9056
|
] })
|
|
8629
9057
|
}
|
|
8630
9058
|
),
|
|
8631
|
-
/* @__PURE__ */ (0,
|
|
8632
|
-
config.features?.kycNeeded && /* @__PURE__ */ (0,
|
|
9059
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "space-y-1", children: [
|
|
9060
|
+
config.features?.kycNeeded && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8633
9061
|
setIsWalletMenuOpen(false);
|
|
8634
9062
|
setIsKycOpen(true);
|
|
8635
9063
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8636
|
-
/* @__PURE__ */ (0,
|
|
8637
|
-
/* @__PURE__ */ (0,
|
|
9064
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9065
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "KYC" })
|
|
8638
9066
|
] }),
|
|
8639
|
-
/* @__PURE__ */ (0,
|
|
9067
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8640
9068
|
setIsWalletMenuOpen(false);
|
|
8641
9069
|
setIsTransactionsOpen(true);
|
|
8642
9070
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8643
|
-
/* @__PURE__ */ (0,
|
|
8644
|
-
/* @__PURE__ */ (0,
|
|
9071
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Activity, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9072
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Transactions" })
|
|
8645
9073
|
] }),
|
|
8646
|
-
/* @__PURE__ */ (0,
|
|
9074
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8647
9075
|
setIsWalletMenuOpen(false);
|
|
8648
9076
|
setIsViewAssetsOpen(true);
|
|
8649
9077
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8650
|
-
/* @__PURE__ */ (0,
|
|
8651
|
-
/* @__PURE__ */ (0,
|
|
9078
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Gem, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9079
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "View Assets" })
|
|
8652
9080
|
] }),
|
|
8653
|
-
/* @__PURE__ */ (0,
|
|
9081
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8654
9082
|
setIsWalletMenuOpen(false);
|
|
8655
9083
|
setIsManageWalletOpen(true);
|
|
8656
9084
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8657
|
-
/* @__PURE__ */ (0,
|
|
8658
|
-
/* @__PURE__ */ (0,
|
|
9085
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.CreditCard, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9086
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Manage Wallet" })
|
|
8659
9087
|
] }),
|
|
8660
|
-
/* @__PURE__ */ (0,
|
|
9088
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8661
9089
|
setIsWalletMenuOpen(false);
|
|
8662
9090
|
setIsSecurityOpen(true);
|
|
8663
9091
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8664
|
-
/* @__PURE__ */ (0,
|
|
8665
|
-
/* @__PURE__ */ (0,
|
|
9092
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Lock, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9093
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Security" })
|
|
8666
9094
|
] }),
|
|
8667
|
-
/* @__PURE__ */ (0,
|
|
9095
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
9096
|
+
setIsWalletMenuOpen(false);
|
|
9097
|
+
setIsBackupOpen(true);
|
|
9098
|
+
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9099
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Shield, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9100
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Keyshare Backup" })
|
|
9101
|
+
] }),
|
|
9102
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: async () => {
|
|
8668
9103
|
await handleDisconnect();
|
|
8669
9104
|
setIsWalletMenuOpen(false);
|
|
8670
9105
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-red-900/20" : "hover:bg-red-50"} transition-colors flex items-center space-x-3`, children: [
|
|
8671
|
-
/* @__PURE__ */ (0,
|
|
8672
|
-
/* @__PURE__ */ (0,
|
|
9106
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUpRight, { className: "w-5 h-5 text-red-600" }),
|
|
9107
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-red-600", children: "Disconnect Wallet" })
|
|
8673
9108
|
] })
|
|
8674
9109
|
] })
|
|
8675
9110
|
] })
|
|
8676
9111
|
] }) }) }),
|
|
8677
|
-
/* @__PURE__ */ (0,
|
|
9112
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8678
9113
|
ManageWallet,
|
|
8679
9114
|
{
|
|
8680
9115
|
open: isManageWalletOpen,
|
|
@@ -8685,7 +9120,7 @@ var ConnectWalletButton = ({
|
|
|
8685
9120
|
}
|
|
8686
9121
|
}
|
|
8687
9122
|
),
|
|
8688
|
-
/* @__PURE__ */ (0,
|
|
9123
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8689
9124
|
SecurityModal,
|
|
8690
9125
|
{
|
|
8691
9126
|
open: isSecurityOpen,
|
|
@@ -8696,7 +9131,23 @@ var ConnectWalletButton = ({
|
|
|
8696
9131
|
}
|
|
8697
9132
|
}
|
|
8698
9133
|
),
|
|
8699
|
-
/* @__PURE__ */ (0,
|
|
9134
|
+
isBackupOpen && session?.mpcUserId && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Dialog, { open: isBackupOpen, onOpenChange: setIsBackupOpen, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
9135
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(VisuallyHidden, { children: [
|
|
9136
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogTitle, { children: "Keyshare Backup" }),
|
|
9137
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogDescription, { children: "Create and manage encrypted backups of your keyshare" })
|
|
9138
|
+
] }),
|
|
9139
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
9140
|
+
KeyshareBackup,
|
|
9141
|
+
{
|
|
9142
|
+
userId: session.mpcUserId,
|
|
9143
|
+
onClose: () => setIsBackupOpen(false),
|
|
9144
|
+
onBackupSuccess: () => {
|
|
9145
|
+
console.log("[ConnectWalletButton] Backup created successfully");
|
|
9146
|
+
}
|
|
9147
|
+
}
|
|
9148
|
+
)
|
|
9149
|
+
] }) }),
|
|
9150
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8700
9151
|
TransactionsModal,
|
|
8701
9152
|
{
|
|
8702
9153
|
open: isTransactionsOpen,
|
|
@@ -8707,7 +9158,7 @@ var ConnectWalletButton = ({
|
|
|
8707
9158
|
}
|
|
8708
9159
|
}
|
|
8709
9160
|
),
|
|
8710
|
-
/* @__PURE__ */ (0,
|
|
9161
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8711
9162
|
ViewAssetsModal,
|
|
8712
9163
|
{
|
|
8713
9164
|
open: isViewAssetsOpen,
|
|
@@ -8718,7 +9169,7 @@ var ConnectWalletButton = ({
|
|
|
8718
9169
|
}
|
|
8719
9170
|
}
|
|
8720
9171
|
),
|
|
8721
|
-
/* @__PURE__ */ (0,
|
|
9172
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8722
9173
|
SendModal,
|
|
8723
9174
|
{
|
|
8724
9175
|
open: isSendOpen,
|
|
@@ -8729,7 +9180,7 @@ var ConnectWalletButton = ({
|
|
|
8729
9180
|
}
|
|
8730
9181
|
}
|
|
8731
9182
|
),
|
|
8732
|
-
/* @__PURE__ */ (0,
|
|
9183
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8733
9184
|
ReceiveModal,
|
|
8734
9185
|
{
|
|
8735
9186
|
open: isReceiveOpen,
|
|
@@ -8740,7 +9191,7 @@ var ConnectWalletButton = ({
|
|
|
8740
9191
|
}
|
|
8741
9192
|
}
|
|
8742
9193
|
),
|
|
8743
|
-
/* @__PURE__ */ (0,
|
|
9194
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8744
9195
|
BuyModal,
|
|
8745
9196
|
{
|
|
8746
9197
|
open: isBuyOpen,
|
|
@@ -8751,7 +9202,7 @@ var ConnectWalletButton = ({
|
|
|
8751
9202
|
}
|
|
8752
9203
|
}
|
|
8753
9204
|
),
|
|
8754
|
-
/* @__PURE__ */ (0,
|
|
9205
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8755
9206
|
KycModal,
|
|
8756
9207
|
{
|
|
8757
9208
|
open: isKycOpen,
|
|
@@ -8762,7 +9213,7 @@ var ConnectWalletButton = ({
|
|
|
8762
9213
|
}
|
|
8763
9214
|
}
|
|
8764
9215
|
),
|
|
8765
|
-
/* @__PURE__ */ (0,
|
|
9216
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8766
9217
|
AuthModal,
|
|
8767
9218
|
{
|
|
8768
9219
|
open: isAuthModalOpen,
|
|
@@ -8807,7 +9258,7 @@ var ConnectWalletButton = ({
|
|
|
8807
9258
|
}
|
|
8808
9259
|
}
|
|
8809
9260
|
),
|
|
8810
|
-
/* @__PURE__ */ (0,
|
|
9261
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8811
9262
|
TssManagerWithRef,
|
|
8812
9263
|
{
|
|
8813
9264
|
ref: tssManagerRef,
|
|
@@ -8825,7 +9276,7 @@ var ConnectWalletButton = ({
|
|
|
8825
9276
|
};
|
|
8826
9277
|
|
|
8827
9278
|
// src/components/ThemeToggle.tsx
|
|
8828
|
-
var
|
|
9279
|
+
var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
8829
9280
|
var ThemeToggle = () => {
|
|
8830
9281
|
const { config, updateConfig } = useLumiaPassportConfig();
|
|
8831
9282
|
const currentTheme = config.ui.theme;
|
|
@@ -8870,7 +9321,7 @@ var ThemeToggle = () => {
|
|
|
8870
9321
|
return "auto";
|
|
8871
9322
|
}
|
|
8872
9323
|
};
|
|
8873
|
-
return /* @__PURE__ */ (0,
|
|
9324
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "lumia-scope", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
|
|
8874
9325
|
"button",
|
|
8875
9326
|
{
|
|
8876
9327
|
onClick: cycleTheme,
|
|
@@ -8886,19 +9337,19 @@ var ThemeToggle = () => {
|
|
|
8886
9337
|
};
|
|
8887
9338
|
|
|
8888
9339
|
// src/components/LumiaLogo.tsx
|
|
8889
|
-
var
|
|
9340
|
+
var import_jsx_runtime35 = require("react/jsx-runtime");
|
|
8890
9341
|
var LumiaLogo2 = ({ size = 80, className = "" }) => {
|
|
8891
|
-
return /* @__PURE__ */ (0,
|
|
9342
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
8892
9343
|
"div",
|
|
8893
9344
|
{
|
|
8894
9345
|
className: `flex items-center justify-center ${className}`,
|
|
8895
9346
|
style: { width: size, height: size },
|
|
8896
|
-
children: /* @__PURE__ */ (0,
|
|
8897
|
-
/* @__PURE__ */ (0,
|
|
8898
|
-
/* @__PURE__ */ (0,
|
|
8899
|
-
/* @__PURE__ */ (0,
|
|
8900
|
-
/* @__PURE__ */ (0,
|
|
8901
|
-
/* @__PURE__ */ (0,
|
|
9347
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("svg", { viewBox: "0 0 512 512", width: size, height: size, children: [
|
|
9348
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("circle", { cx: "256", cy: "256", r: "256", fill: "#060117", strokeWidth: "0" }),
|
|
9349
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9350
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9351
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9352
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z", fill: "#fefdff", strokeWidth: "0" })
|
|
8902
9353
|
] })
|
|
8903
9354
|
}
|
|
8904
9355
|
);
|
|
@@ -8961,9 +9412,9 @@ function useTheme2(configTheme) {
|
|
|
8961
9412
|
}
|
|
8962
9413
|
|
|
8963
9414
|
// src/internal/components/Hash.tsx
|
|
8964
|
-
var
|
|
8965
|
-
var
|
|
8966
|
-
var
|
|
9415
|
+
var React29 = __toESM(require("react"), 1);
|
|
9416
|
+
var import_lucide_react19 = require("lucide-react");
|
|
9417
|
+
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
8967
9418
|
function toExplorerUrl(kind, value, chain) {
|
|
8968
9419
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
8969
9420
|
if (!base2) return null;
|
|
@@ -8986,12 +9437,12 @@ var Hash = ({
|
|
|
8986
9437
|
}) => {
|
|
8987
9438
|
const value = hash || "";
|
|
8988
9439
|
const explorer = toExplorerUrl(kind, value, chain || void 0);
|
|
8989
|
-
const [copied, setCopied] =
|
|
8990
|
-
if (!value) return /* @__PURE__ */ (0,
|
|
8991
|
-
return /* @__PURE__ */ (0,
|
|
8992
|
-
label && /* @__PURE__ */ (0,
|
|
8993
|
-
/* @__PURE__ */ (0,
|
|
8994
|
-
showCopy && /* @__PURE__ */ (0,
|
|
9440
|
+
const [copied, setCopied] = React29.useState(false);
|
|
9441
|
+
if (!value) return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
9442
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cn2("flex items-center gap-2", className), children: [
|
|
9443
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "text-sm font-medium", children: label }),
|
|
9444
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("code", { className: "text-xs bg-background px-2 py-1 rounded break-all", children: truncate ? short2(value) : value }),
|
|
9445
|
+
showCopy && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8995
9446
|
Button,
|
|
8996
9447
|
{
|
|
8997
9448
|
variant: "ghost",
|
|
@@ -9005,10 +9456,10 @@ var Hash = ({
|
|
|
9005
9456
|
} catch {
|
|
9006
9457
|
}
|
|
9007
9458
|
},
|
|
9008
|
-
children: /* @__PURE__ */ (0,
|
|
9459
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react19.Copy, { className: "h-4 w-4" })
|
|
9009
9460
|
}
|
|
9010
9461
|
),
|
|
9011
|
-
showExplorer && explorer && /* @__PURE__ */ (0,
|
|
9462
|
+
showExplorer && explorer && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
9012
9463
|
"a",
|
|
9013
9464
|
{
|
|
9014
9465
|
href: explorer,
|
|
@@ -9016,7 +9467,7 @@ var Hash = ({
|
|
|
9016
9467
|
rel: "noreferrer noopener",
|
|
9017
9468
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
9018
9469
|
title: "Open in explorer",
|
|
9019
|
-
children: /* @__PURE__ */ (0,
|
|
9470
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react19.ExternalLink, { className: "h-4 w-4" })
|
|
9020
9471
|
}
|
|
9021
9472
|
)
|
|
9022
9473
|
] });
|
|
@@ -9025,7 +9476,7 @@ var Hash = ({
|
|
|
9025
9476
|
// src/internal/components/TransactionsList.tsx
|
|
9026
9477
|
var import_react21 = require("react");
|
|
9027
9478
|
init_base();
|
|
9028
|
-
var
|
|
9479
|
+
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
9029
9480
|
var TransactionsList = ({
|
|
9030
9481
|
address,
|
|
9031
9482
|
itemsCount = 10
|
|
@@ -9079,15 +9530,15 @@ var TransactionsList = ({
|
|
|
9079
9530
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
9080
9531
|
};
|
|
9081
9532
|
if (loading) {
|
|
9082
|
-
return /* @__PURE__ */ (0,
|
|
9083
|
-
/* @__PURE__ */ (0,
|
|
9084
|
-
/* @__PURE__ */ (0,
|
|
9533
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 text-center", children: [
|
|
9534
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full" }),
|
|
9535
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "mt-2 text-sm text-gray-600", children: "Loading transactions..." })
|
|
9085
9536
|
] });
|
|
9086
9537
|
}
|
|
9087
9538
|
if (error) {
|
|
9088
|
-
return /* @__PURE__ */ (0,
|
|
9089
|
-
/* @__PURE__ */ (0,
|
|
9090
|
-
/* @__PURE__ */ (0,
|
|
9539
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 text-center", children: [
|
|
9540
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "text-red-600 text-sm", children: error }),
|
|
9541
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9091
9542
|
"button",
|
|
9092
9543
|
{
|
|
9093
9544
|
onClick: () => window.location.reload(),
|
|
@@ -9098,54 +9549,54 @@ var TransactionsList = ({
|
|
|
9098
9549
|
] });
|
|
9099
9550
|
}
|
|
9100
9551
|
if (transactions.length === 0) {
|
|
9101
|
-
return /* @__PURE__ */ (0,
|
|
9552
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "p-4 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "text-gray-600 text-sm", children: "No transactions found" }) });
|
|
9102
9553
|
}
|
|
9103
|
-
return /* @__PURE__ */ (0,
|
|
9554
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "max-h-96 overflow-y-auto", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "space-y-2 p-2", children: transactions.map((tx) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
|
|
9104
9555
|
"div",
|
|
9105
9556
|
{
|
|
9106
9557
|
className: "border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors",
|
|
9107
9558
|
onClick: () => openTransaction(tx.hash),
|
|
9108
9559
|
children: [
|
|
9109
|
-
/* @__PURE__ */ (0,
|
|
9110
|
-
/* @__PURE__ */ (0,
|
|
9111
|
-
/* @__PURE__ */ (0,
|
|
9112
|
-
/* @__PURE__ */ (0,
|
|
9113
|
-
/* @__PURE__ */ (0,
|
|
9560
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex justify-between items-start mb-2", children: [
|
|
9561
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex-1", children: [
|
|
9562
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center space-x-2 mb-1", children: [
|
|
9563
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs font-mono bg-gray-100 px-2 py-1 rounded", children: formatAddress(tx.hash) }),
|
|
9564
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: `text-xs px-2 py-1 rounded ${tx.status === "ok" ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800"}`, children: tx.status === "ok" ? "Success" : "Failed" })
|
|
9114
9565
|
] }),
|
|
9115
|
-
/* @__PURE__ */ (0,
|
|
9116
|
-
/* @__PURE__ */ (0,
|
|
9117
|
-
/* @__PURE__ */ (0,
|
|
9118
|
-
/* @__PURE__ */ (0,
|
|
9566
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-sm space-y-1", children: [
|
|
9567
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9568
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "From:" }),
|
|
9569
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-mono ml-1", children: [
|
|
9119
9570
|
formatAddress(tx.from.hash),
|
|
9120
|
-
tx.from.is_contract && /* @__PURE__ */ (0,
|
|
9571
|
+
tx.from.is_contract && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9121
9572
|
] })
|
|
9122
9573
|
] }),
|
|
9123
|
-
/* @__PURE__ */ (0,
|
|
9124
|
-
/* @__PURE__ */ (0,
|
|
9125
|
-
/* @__PURE__ */ (0,
|
|
9574
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9575
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "To:" }),
|
|
9576
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-mono ml-1", children: [
|
|
9126
9577
|
formatAddress(tx.to.hash),
|
|
9127
|
-
tx.to.is_contract && /* @__PURE__ */ (0,
|
|
9578
|
+
tx.to.is_contract && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9128
9579
|
] })
|
|
9129
9580
|
] }),
|
|
9130
|
-
/* @__PURE__ */ (0,
|
|
9131
|
-
/* @__PURE__ */ (0,
|
|
9132
|
-
/* @__PURE__ */ (0,
|
|
9581
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9582
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "Value:" }),
|
|
9583
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-semibold ml-1", children: [
|
|
9133
9584
|
formatValue(tx.value),
|
|
9134
9585
|
" LUMIA"
|
|
9135
9586
|
] })
|
|
9136
9587
|
] })
|
|
9137
9588
|
] })
|
|
9138
9589
|
] }),
|
|
9139
|
-
/* @__PURE__ */ (0,
|
|
9140
|
-
/* @__PURE__ */ (0,
|
|
9141
|
-
/* @__PURE__ */ (0,
|
|
9590
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-right text-xs text-gray-500", children: [
|
|
9591
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { children: formatDate2(tx.timestamp) }),
|
|
9592
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "mt-1", children: [
|
|
9142
9593
|
"Gas: ",
|
|
9143
9594
|
parseInt(tx.gas_used).toLocaleString()
|
|
9144
9595
|
] }),
|
|
9145
|
-
tx.method && /* @__PURE__ */ (0,
|
|
9596
|
+
tx.method && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "mt-1 text-blue-600", children: tx.method })
|
|
9146
9597
|
] })
|
|
9147
9598
|
] }),
|
|
9148
|
-
tx.transaction_types.length > 0 && /* @__PURE__ */ (0,
|
|
9599
|
+
tx.transaction_types.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9149
9600
|
"span",
|
|
9150
9601
|
{
|
|
9151
9602
|
className: "text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full",
|
|
@@ -9159,247 +9610,6 @@ var TransactionsList = ({
|
|
|
9159
9610
|
)) }) });
|
|
9160
9611
|
};
|
|
9161
9612
|
|
|
9162
|
-
// src/internal/components/KeyshareBackup.tsx
|
|
9163
|
-
var React30 = __toESM(require("react"), 1);
|
|
9164
|
-
var import_lucide_react19 = require("lucide-react");
|
|
9165
|
-
init_vaultClient();
|
|
9166
|
-
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
9167
|
-
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
9168
|
-
const [backupStatus, setBackupStatus] = React30.useState(() => getBackupStatus(userId));
|
|
9169
|
-
const [loading, setLoading] = React30.useState({
|
|
9170
|
-
server: false,
|
|
9171
|
-
cloud: false,
|
|
9172
|
-
local: false
|
|
9173
|
-
});
|
|
9174
|
-
const [error, setError] = React30.useState(null);
|
|
9175
|
-
const [success, setSuccess] = React30.useState(null);
|
|
9176
|
-
const [showPassword, setShowPassword] = React30.useState(false);
|
|
9177
|
-
const [useCustomPassword, setUseCustomPassword] = React30.useState(false);
|
|
9178
|
-
const [customPassword, setCustomPassword] = React30.useState("");
|
|
9179
|
-
const [cloudProviders, setCloudProviders] = React30.useState([]);
|
|
9180
|
-
const [selectedCloudProvider, setSelectedCloudProvider] = React30.useState(null);
|
|
9181
|
-
const hasKeyshareData = React30.useMemo(() => {
|
|
9182
|
-
return !!getCurrentKeyshareBackupData(userId);
|
|
9183
|
-
}, [userId]);
|
|
9184
|
-
React30.useEffect(() => {
|
|
9185
|
-
getAvailableCloudProviders2().then((providers) => {
|
|
9186
|
-
setCloudProviders(providers);
|
|
9187
|
-
if (providers.length > 0 && !selectedCloudProvider) {
|
|
9188
|
-
setSelectedCloudProvider(providers[0].id);
|
|
9189
|
-
}
|
|
9190
|
-
});
|
|
9191
|
-
}, [selectedCloudProvider]);
|
|
9192
|
-
const refreshStatus = React30.useCallback(() => {
|
|
9193
|
-
setBackupStatus(getBackupStatus(userId));
|
|
9194
|
-
}, [userId]);
|
|
9195
|
-
React30.useEffect(() => {
|
|
9196
|
-
refreshStatus();
|
|
9197
|
-
}, [refreshStatus]);
|
|
9198
|
-
const handleBackup = async (method) => {
|
|
9199
|
-
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
9200
|
-
setError(null);
|
|
9201
|
-
setSuccess(null);
|
|
9202
|
-
try {
|
|
9203
|
-
const password = useCustomPassword ? customPassword : void 0;
|
|
9204
|
-
switch (method) {
|
|
9205
|
-
case "server":
|
|
9206
|
-
await backupToServer(userId, password);
|
|
9207
|
-
setSuccess("Successfully created server backup");
|
|
9208
|
-
break;
|
|
9209
|
-
case "cloud": {
|
|
9210
|
-
await backupToCloud(userId, password, selectedCloudProvider || void 0);
|
|
9211
|
-
setSuccess(`Successfully created cloud backup`);
|
|
9212
|
-
const updatedProviders = await getAvailableCloudProviders2();
|
|
9213
|
-
setCloudProviders(updatedProviders);
|
|
9214
|
-
break;
|
|
9215
|
-
}
|
|
9216
|
-
case "local":
|
|
9217
|
-
await backupToLocalFile(userId, password);
|
|
9218
|
-
setSuccess("Backup file downloaded successfully");
|
|
9219
|
-
break;
|
|
9220
|
-
}
|
|
9221
|
-
refreshStatus();
|
|
9222
|
-
setTimeout(() => {
|
|
9223
|
-
if (typeof window !== "undefined") {
|
|
9224
|
-
window.dispatchEvent(
|
|
9225
|
-
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
9226
|
-
detail: { method, success: true }
|
|
9227
|
-
})
|
|
9228
|
-
);
|
|
9229
|
-
}
|
|
9230
|
-
onBackupSuccess?.();
|
|
9231
|
-
}, 100);
|
|
9232
|
-
} catch (err) {
|
|
9233
|
-
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
9234
|
-
setError(errorMsg);
|
|
9235
|
-
updateBackupStatus(userId, method, { error: errorMsg });
|
|
9236
|
-
refreshStatus();
|
|
9237
|
-
} finally {
|
|
9238
|
-
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
9239
|
-
}
|
|
9240
|
-
};
|
|
9241
|
-
const formatLastBackup = (timestamp) => {
|
|
9242
|
-
if (!timestamp) return "Never";
|
|
9243
|
-
const date = new Date(timestamp);
|
|
9244
|
-
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
9245
|
-
};
|
|
9246
|
-
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(Card, { className: "border-green-200 bg-green-50", children: [
|
|
9247
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardHeader, { className: "pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9248
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
9249
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Shield, { className: "h-6 w-6 text-green-600" }),
|
|
9250
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9251
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
9252
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
9253
|
-
] })
|
|
9254
|
-
] }),
|
|
9255
|
-
onClose && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.X, { className: "h-4 w-4" }) })
|
|
9256
|
-
] }) }),
|
|
9257
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
9258
|
-
error && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
9259
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.AlertCircle, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9260
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: error })
|
|
9261
|
-
] }),
|
|
9262
|
-
success && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
9263
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.CheckCircle2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9264
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: success })
|
|
9265
|
-
] }),
|
|
9266
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "space-y-3", children: [
|
|
9267
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
9268
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9269
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9270
|
-
"input",
|
|
9271
|
-
{
|
|
9272
|
-
type: "checkbox",
|
|
9273
|
-
id: "use-backup-password",
|
|
9274
|
-
checked: useCustomPassword,
|
|
9275
|
-
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
9276
|
-
className: "rounded"
|
|
9277
|
-
}
|
|
9278
|
-
),
|
|
9279
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
9280
|
-
] }),
|
|
9281
|
-
!useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9282
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Key, { className: "h-4 w-4" }),
|
|
9283
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
9284
|
-
] }) }),
|
|
9285
|
-
useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "relative", children: [
|
|
9286
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9287
|
-
Input,
|
|
9288
|
-
{
|
|
9289
|
-
type: showPassword ? "text" : "password",
|
|
9290
|
-
placeholder: "Enter backup encryption password",
|
|
9291
|
-
value: customPassword,
|
|
9292
|
-
onChange: (e) => setCustomPassword(e.target.value),
|
|
9293
|
-
className: "pr-10"
|
|
9294
|
-
}
|
|
9295
|
-
),
|
|
9296
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9297
|
-
"button",
|
|
9298
|
-
{
|
|
9299
|
-
type: "button",
|
|
9300
|
-
onClick: () => setShowPassword(!showPassword),
|
|
9301
|
-
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
9302
|
-
children: showPassword ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Eye, { className: "h-4 w-4" })
|
|
9303
|
-
}
|
|
9304
|
-
)
|
|
9305
|
-
] })
|
|
9306
|
-
] }),
|
|
9307
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "space-y-4", children: [
|
|
9308
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
9309
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
9310
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
9311
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Server, { className: "h-5 w-5 text-blue-600" }),
|
|
9312
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9313
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
9314
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
9315
|
-
] })
|
|
9316
|
-
] }) }),
|
|
9317
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9318
|
-
Button,
|
|
9319
|
-
{
|
|
9320
|
-
onClick: () => handleBackup("server"),
|
|
9321
|
-
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9322
|
-
className: "px-4 py-2",
|
|
9323
|
-
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9324
|
-
}
|
|
9325
|
-
),
|
|
9326
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9327
|
-
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
9328
|
-
formatLastBackup(backupStatus.server.lastBackup)
|
|
9329
|
-
] })
|
|
9330
|
-
] }),
|
|
9331
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
9332
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9333
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Cloud, { className: "h-5 w-5 text-sky-600" }),
|
|
9334
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9335
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
9336
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
9337
|
-
] })
|
|
9338
|
-
] }),
|
|
9339
|
-
cloudProviders.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9340
|
-
"select",
|
|
9341
|
-
{
|
|
9342
|
-
value: selectedCloudProvider || "",
|
|
9343
|
-
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
9344
|
-
className: "text-sm border rounded px-2 py-1 w-full",
|
|
9345
|
-
children: cloudProviders.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("option", { value: provider.id, children: [
|
|
9346
|
-
provider.icon,
|
|
9347
|
-
" ",
|
|
9348
|
-
provider.name,
|
|
9349
|
-
" ",
|
|
9350
|
-
provider.isAuthenticated ? "\u2713" : ""
|
|
9351
|
-
] }, provider.id))
|
|
9352
|
-
}
|
|
9353
|
-
) }),
|
|
9354
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9355
|
-
Button,
|
|
9356
|
-
{
|
|
9357
|
-
onClick: () => handleBackup("cloud"),
|
|
9358
|
-
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
9359
|
-
className: "px-4 py-2",
|
|
9360
|
-
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9361
|
-
}
|
|
9362
|
-
),
|
|
9363
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
9364
|
-
] }),
|
|
9365
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
9366
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9367
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Download, { className: "h-5 w-5 text-purple-600" }),
|
|
9368
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9369
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
9370
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
9371
|
-
] })
|
|
9372
|
-
] }),
|
|
9373
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9374
|
-
Button,
|
|
9375
|
-
{
|
|
9376
|
-
onClick: () => handleBackup("local"),
|
|
9377
|
-
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9378
|
-
className: "w-full",
|
|
9379
|
-
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
9380
|
-
}
|
|
9381
|
-
),
|
|
9382
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9383
|
-
"Download encrypted backup file to your device \u2022 Last: ",
|
|
9384
|
-
formatLastBackup(backupStatus.local.lastBackup)
|
|
9385
|
-
] })
|
|
9386
|
-
] })
|
|
9387
|
-
] }),
|
|
9388
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
9389
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Lock, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
9390
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9391
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium", children: "Security Notice" }),
|
|
9392
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "mt-1", children: [
|
|
9393
|
-
useCustomPassword ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
9394
|
-
" ",
|
|
9395
|
-
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
9396
|
-
] })
|
|
9397
|
-
] })
|
|
9398
|
-
] })
|
|
9399
|
-
] })
|
|
9400
|
-
] });
|
|
9401
|
-
}
|
|
9402
|
-
|
|
9403
9613
|
// src/hooks/useUserOpStatus.ts
|
|
9404
9614
|
var React31 = __toESM(require("react"), 1);
|
|
9405
9615
|
init_base();
|