@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.js
CHANGED
|
@@ -2366,6 +2366,7 @@ var init_iframe_manager = __esm({
|
|
|
2366
2366
|
this.iframeUrl = config.iframeUrl;
|
|
2367
2367
|
this.projectId = config.projectId;
|
|
2368
2368
|
this.debug = config.debug || false;
|
|
2369
|
+
this.onWalletReadyCallback = config.onWalletReady;
|
|
2369
2370
|
this.readyPromise = new Promise((resolve) => {
|
|
2370
2371
|
this.readyResolve = resolve;
|
|
2371
2372
|
});
|
|
@@ -2396,6 +2397,7 @@ var init_iframe_manager = __esm({
|
|
|
2396
2397
|
this.iframe.style.zIndex = "999999";
|
|
2397
2398
|
this.iframe.style.background = "rgba(0, 0, 0, 0.5)";
|
|
2398
2399
|
this.iframe.setAttribute("sandbox", "allow-scripts allow-same-origin");
|
|
2400
|
+
this.iframe.setAttribute("allow", "publickey-credentials-get *; publickey-credentials-create *");
|
|
2399
2401
|
this.messageListener = this.handleMessage.bind(this);
|
|
2400
2402
|
window.addEventListener("message", this.messageListener);
|
|
2401
2403
|
document.body.appendChild(this.iframe);
|
|
@@ -2428,6 +2430,7 @@ var init_iframe_manager = __esm({
|
|
|
2428
2430
|
}
|
|
2429
2431
|
const validIframeTypes = [
|
|
2430
2432
|
"LUMIA_PASSPORT_IFRAME_READY",
|
|
2433
|
+
"LUMIA_PASSPORT_WALLET_READY",
|
|
2431
2434
|
"LUMIA_PASSPORT_SHOW_IFRAME",
|
|
2432
2435
|
"LUMIA_PASSPORT_HIDE_IFRAME",
|
|
2433
2436
|
"LUMIA_PASSPORT_SDK_AUTH_SUCCESS",
|
|
@@ -2448,7 +2451,7 @@ var init_iframe_manager = __esm({
|
|
|
2448
2451
|
}
|
|
2449
2452
|
const iframeOrigin = new URL(this.iframeUrl).origin;
|
|
2450
2453
|
if (event.origin !== iframeOrigin) {
|
|
2451
|
-
this.log("[IframeManager] \u26A0\uFE0F Ignored message from invalid origin:", event.origin,
|
|
2454
|
+
this.log("[IframeManager] \u26A0\uFE0F Ignored message from invalid origin:", { received: event.origin, expected: iframeOrigin });
|
|
2452
2455
|
return;
|
|
2453
2456
|
}
|
|
2454
2457
|
if (message.type === "LUMIA_PASSPORT_IFRAME_READY") {
|
|
@@ -2457,6 +2460,13 @@ var init_iframe_manager = __esm({
|
|
|
2457
2460
|
this.readyResolve();
|
|
2458
2461
|
return;
|
|
2459
2462
|
}
|
|
2463
|
+
if (message.type === "LUMIA_PASSPORT_WALLET_READY") {
|
|
2464
|
+
this.log("[IframeManager] \u{1F4E8} Received LUMIA_PASSPORT_WALLET_READY", message.data);
|
|
2465
|
+
if (this.onWalletReadyCallback) {
|
|
2466
|
+
this.onWalletReadyCallback(message.data);
|
|
2467
|
+
}
|
|
2468
|
+
return;
|
|
2469
|
+
}
|
|
2460
2470
|
if (message.type === "LUMIA_PASSPORT_SHOW_IFRAME") {
|
|
2461
2471
|
this.log("[IframeManager] \u{1F4E8} Received LUMIA_PASSPORT_SHOW_IFRAME");
|
|
2462
2472
|
this.showIframe();
|
|
@@ -2752,6 +2762,92 @@ var init_iframe_manager = __esm({
|
|
|
2752
2762
|
}
|
|
2753
2763
|
return false;
|
|
2754
2764
|
}
|
|
2765
|
+
/**
|
|
2766
|
+
* Create backup of keyshare
|
|
2767
|
+
*/
|
|
2768
|
+
async createBackup(userId, backupRequest, accessToken) {
|
|
2769
|
+
this.log("[IframeManager] Creating backup...");
|
|
2770
|
+
const response = await this.sendMessage("CREATE_BACKUP", {
|
|
2771
|
+
userId,
|
|
2772
|
+
backupRequest,
|
|
2773
|
+
accessToken
|
|
2774
|
+
// Pass access token for TSS API authentication
|
|
2775
|
+
});
|
|
2776
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_CREATED") {
|
|
2777
|
+
return response.result;
|
|
2778
|
+
}
|
|
2779
|
+
throw new Error("Unexpected response type");
|
|
2780
|
+
}
|
|
2781
|
+
/**
|
|
2782
|
+
* Restore keyshare from server backup
|
|
2783
|
+
*/
|
|
2784
|
+
async restoreFromServer(userId, password, accessToken) {
|
|
2785
|
+
this.log("[IframeManager] Restoring backup from server...");
|
|
2786
|
+
const response = await this.sendMessage("RESTORE_BACKUP", {
|
|
2787
|
+
userId,
|
|
2788
|
+
password,
|
|
2789
|
+
accessToken
|
|
2790
|
+
// Pass access token for TSS API authentication
|
|
2791
|
+
});
|
|
2792
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_RESTORED") {
|
|
2793
|
+
return response.result;
|
|
2794
|
+
}
|
|
2795
|
+
throw new Error("Unexpected response type");
|
|
2796
|
+
}
|
|
2797
|
+
/**
|
|
2798
|
+
* Encrypt backup data without uploading (for cloud/local backups)
|
|
2799
|
+
* Returns encrypted data that parent can upload/download
|
|
2800
|
+
*/
|
|
2801
|
+
async encryptBackupData(userId, password) {
|
|
2802
|
+
this.log("[IframeManager] Encrypting backup data...");
|
|
2803
|
+
const response = await this.sendMessage("ENCRYPT_BACKUP_DATA", {
|
|
2804
|
+
userId,
|
|
2805
|
+
password
|
|
2806
|
+
});
|
|
2807
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_ENCRYPTED") {
|
|
2808
|
+
return response.encryptedData;
|
|
2809
|
+
}
|
|
2810
|
+
throw new Error("Unexpected response type");
|
|
2811
|
+
}
|
|
2812
|
+
/**
|
|
2813
|
+
* Restore keyshare from local file backup
|
|
2814
|
+
*/
|
|
2815
|
+
async restoreFromLocalFile(userId, fileContent, password) {
|
|
2816
|
+
this.log("[IframeManager] Restoring backup from local file...");
|
|
2817
|
+
const response = await this.sendMessage("RESTORE_FROM_FILE", {
|
|
2818
|
+
userId,
|
|
2819
|
+
fileContent,
|
|
2820
|
+
password
|
|
2821
|
+
});
|
|
2822
|
+
if (response.type === "LUMIA_PASSPORT_FILE_RESTORED") {
|
|
2823
|
+
return response.result;
|
|
2824
|
+
}
|
|
2825
|
+
throw new Error("Unexpected response type");
|
|
2826
|
+
}
|
|
2827
|
+
/**
|
|
2828
|
+
* Get backup status for user
|
|
2829
|
+
*/
|
|
2830
|
+
async getBackupStatus(userId) {
|
|
2831
|
+
this.log("[IframeManager] Getting backup status...");
|
|
2832
|
+
const response = await this.sendMessage("GET_BACKUP_STATUS", {
|
|
2833
|
+
userId
|
|
2834
|
+
});
|
|
2835
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_STATUS") {
|
|
2836
|
+
return response.status;
|
|
2837
|
+
}
|
|
2838
|
+
throw new Error("Unexpected response type");
|
|
2839
|
+
}
|
|
2840
|
+
/**
|
|
2841
|
+
* Get available cloud providers
|
|
2842
|
+
*/
|
|
2843
|
+
async getCloudProviders() {
|
|
2844
|
+
this.log("[IframeManager] Getting cloud providers...");
|
|
2845
|
+
const response = await this.sendMessage("GET_CLOUD_PROVIDERS", {});
|
|
2846
|
+
if (response.type === "LUMIA_PASSPORT_CLOUD_PROVIDERS") {
|
|
2847
|
+
return response.providers;
|
|
2848
|
+
}
|
|
2849
|
+
throw new Error("Unexpected response type");
|
|
2850
|
+
}
|
|
2755
2851
|
/**
|
|
2756
2852
|
* Cleanup and destroy iframe
|
|
2757
2853
|
*/
|
|
@@ -2791,7 +2887,7 @@ var init_iframe_manager = __esm({
|
|
|
2791
2887
|
});
|
|
2792
2888
|
|
|
2793
2889
|
// src/styles/built.css
|
|
2794
|
-
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}';
|
|
2890
|
+
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}';
|
|
2795
2891
|
|
|
2796
2892
|
// src/context/LumiaPassportContext.tsx
|
|
2797
2893
|
init_lumiaPassport();
|
|
@@ -2964,7 +3060,8 @@ var LumiaPassportProvider = ({
|
|
|
2964
3060
|
const iframeManager = getIframeManager({
|
|
2965
3061
|
iframeUrl,
|
|
2966
3062
|
projectId: projectId2,
|
|
2967
|
-
debug: config.features?.mpcSecurity ?? true
|
|
3063
|
+
debug: config.features?.mpcSecurity ?? true,
|
|
3064
|
+
onWalletReady: callbacks?.onWalletReady
|
|
2968
3065
|
});
|
|
2969
3066
|
iframeManager.initialize().then(() => {
|
|
2970
3067
|
console.log("[LumiaPassport] \u2705 Secure iframe wallet initialized successfully");
|
|
@@ -3260,7 +3357,7 @@ var LumiaRainbowKitProvider = ({ children }) => {
|
|
|
3260
3357
|
};
|
|
3261
3358
|
|
|
3262
3359
|
// src/components/ConnectWalletButton.tsx
|
|
3263
|
-
import
|
|
3360
|
+
import React28 from "react";
|
|
3264
3361
|
import { useBalance as useBalance3 } from "wagmi";
|
|
3265
3362
|
|
|
3266
3363
|
// src/internal/components/ui/dialog.tsx
|
|
@@ -3596,6 +3693,7 @@ Input.displayName = "Input";
|
|
|
3596
3693
|
|
|
3597
3694
|
// src/internal/components/KeyshareRestore.tsx
|
|
3598
3695
|
init_vaultClient();
|
|
3696
|
+
init_iframe_manager();
|
|
3599
3697
|
import { Fragment as Fragment2, jsx as jsx16, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
3600
3698
|
function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
3601
3699
|
const { config } = useLumiaPassportConfig();
|
|
@@ -3609,6 +3707,14 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3609
3707
|
const [restorePassword, setRestorePassword] = React10.useState("");
|
|
3610
3708
|
const [hasServerBackup, setHasServerBackup] = React10.useState(null);
|
|
3611
3709
|
const [checkingBackup, setCheckingBackup] = React10.useState(true);
|
|
3710
|
+
const iframeManager = React10.useMemo(() => {
|
|
3711
|
+
try {
|
|
3712
|
+
return getIframeManager();
|
|
3713
|
+
} catch (e) {
|
|
3714
|
+
console.error("[KeyshareRestore] Failed to get iframe manager:", e);
|
|
3715
|
+
return null;
|
|
3716
|
+
}
|
|
3717
|
+
}, []);
|
|
3612
3718
|
React10.useEffect(() => {
|
|
3613
3719
|
const checkBackupAvailability = async () => {
|
|
3614
3720
|
try {
|
|
@@ -3631,20 +3737,31 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3631
3737
|
}, [userId]);
|
|
3632
3738
|
const handleRestoreFromServer = async () => {
|
|
3633
3739
|
console.log("[KeyshareRestore] Starting server restore for userId:", userId);
|
|
3740
|
+
if (!iframeManager) {
|
|
3741
|
+
setError("Iframe manager not initialized");
|
|
3742
|
+
return;
|
|
3743
|
+
}
|
|
3634
3744
|
setLoading((prev) => ({ ...prev, server: true }));
|
|
3635
3745
|
setError(null);
|
|
3636
3746
|
setSuccess(null);
|
|
3637
3747
|
try {
|
|
3638
|
-
const passwordToUse = useCustomPassword ? restorePassword :
|
|
3639
|
-
console.log("[KeyshareRestore] Calling restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3640
|
-
await
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3748
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3749
|
+
console.log("[KeyshareRestore] Calling iframeManager.restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3750
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
3751
|
+
const accessToken = jwt?.accessToken;
|
|
3752
|
+
const result = await iframeManager.restoreFromServer(userId, passwordToUse, accessToken);
|
|
3753
|
+
if (result.success) {
|
|
3754
|
+
console.log("[KeyshareRestore] Server restore successful");
|
|
3755
|
+
setSuccess("Successfully restored keyshare from server backup");
|
|
3756
|
+
setTimeout(() => {
|
|
3757
|
+
onRestoreSuccess?.();
|
|
3758
|
+
}, 100);
|
|
3759
|
+
} else {
|
|
3760
|
+
console.error("[KeyshareRestore] Server restore failed:", result.error);
|
|
3761
|
+
setError(result.error || "Server restore failed");
|
|
3762
|
+
}
|
|
3646
3763
|
} catch (err) {
|
|
3647
|
-
console.error("[KeyshareRestore] Server restore
|
|
3764
|
+
console.error("[KeyshareRestore] Server restore exception:", err);
|
|
3648
3765
|
const errorMsg = err instanceof Error ? err.message : "Server restore failed";
|
|
3649
3766
|
setError(errorMsg);
|
|
3650
3767
|
} finally {
|
|
@@ -3661,18 +3778,27 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3661
3778
|
setError("Please enter the backup password");
|
|
3662
3779
|
return;
|
|
3663
3780
|
}
|
|
3781
|
+
if (!iframeManager) {
|
|
3782
|
+
setError("Iframe manager not initialized");
|
|
3783
|
+
return;
|
|
3784
|
+
}
|
|
3664
3785
|
setLoading((prev) => ({ ...prev, file: true }));
|
|
3665
3786
|
setError(null);
|
|
3666
3787
|
setSuccess(null);
|
|
3667
3788
|
try {
|
|
3668
|
-
const
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3789
|
+
const fileContent = await restoreFile.text();
|
|
3790
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3791
|
+
const result = await iframeManager.restoreFromLocalFile(userId, fileContent, passwordToUse);
|
|
3792
|
+
if (result.success) {
|
|
3793
|
+
setSuccess("Successfully restored keyshare from backup file");
|
|
3794
|
+
setRestoreFile(null);
|
|
3795
|
+
setRestorePassword("");
|
|
3796
|
+
setTimeout(() => {
|
|
3797
|
+
onRestoreSuccess?.();
|
|
3798
|
+
}, 100);
|
|
3799
|
+
} else {
|
|
3800
|
+
setError(result.error || "File restore failed");
|
|
3801
|
+
}
|
|
3676
3802
|
} catch (err) {
|
|
3677
3803
|
const errorMsg = err instanceof Error ? err.message : "Restore failed";
|
|
3678
3804
|
setError(errorMsg);
|
|
@@ -3910,7 +4036,7 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3910
4036
|
}
|
|
3911
4037
|
|
|
3912
4038
|
// src/internal/components/VerificationCodeInput.tsx
|
|
3913
|
-
import { useEffect as useEffect4, useMemo as
|
|
4039
|
+
import { useEffect as useEffect4, useMemo as useMemo3, useRef, useState as useState4 } from "react";
|
|
3914
4040
|
import { jsx as jsx17, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
3915
4041
|
var VerificationCodeInput = ({ onVerifyCode, onResendCode, isLoading, expiresIn, error }) => {
|
|
3916
4042
|
const { config } = useLumiaPassportConfig();
|
|
@@ -3926,7 +4052,7 @@ var VerificationCodeInput = ({ onVerifyCode, onResendCode, isLoading, expiresIn,
|
|
|
3926
4052
|
const [digits, setDigits] = useState4(["", "", "", "", "", ""]);
|
|
3927
4053
|
const inputsRef = useRef([]);
|
|
3928
4054
|
const lastSubmittedRef = useRef(null);
|
|
3929
|
-
const code =
|
|
4055
|
+
const code = useMemo3(() => digits.join(""), [digits]);
|
|
3930
4056
|
useEffect4(() => {
|
|
3931
4057
|
if (code.length === 6 && digits.every((d) => d !== "") && !isLoading) {
|
|
3932
4058
|
if (lastSubmittedRef.current !== code) {
|
|
@@ -6693,19 +6819,320 @@ var SecurityModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6693
6819
|
] });
|
|
6694
6820
|
};
|
|
6695
6821
|
|
|
6822
|
+
// src/internal/components/KeyshareBackup.tsx
|
|
6823
|
+
import * as React19 from "react";
|
|
6824
|
+
import { Shield as Shield4, Server as Server4, CheckCircle2 as CheckCircle24, AlertCircle as AlertCircle3, Key as Key5, X as X3, Eye as Eye3, EyeOff as EyeOff3, Download as Download2, Cloud as Cloud3, Lock as Lock2 } from "lucide-react";
|
|
6825
|
+
init_iframe_manager();
|
|
6826
|
+
import { Fragment as Fragment6, jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
6827
|
+
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
6828
|
+
const [backupStatus, setBackupStatus] = React19.useState({
|
|
6829
|
+
server: {},
|
|
6830
|
+
cloud: {},
|
|
6831
|
+
local: {}
|
|
6832
|
+
});
|
|
6833
|
+
const [loading, setLoading] = React19.useState({
|
|
6834
|
+
server: false,
|
|
6835
|
+
cloud: false,
|
|
6836
|
+
local: false
|
|
6837
|
+
});
|
|
6838
|
+
const [error, setError] = React19.useState(null);
|
|
6839
|
+
const [success, setSuccess] = React19.useState(null);
|
|
6840
|
+
const [showPassword, setShowPassword] = React19.useState(false);
|
|
6841
|
+
const [useCustomPassword, setUseCustomPassword] = React19.useState(false);
|
|
6842
|
+
const [customPassword, setCustomPassword] = React19.useState("");
|
|
6843
|
+
const [cloudProviders, setCloudProviders] = React19.useState([]);
|
|
6844
|
+
const [selectedCloudProvider, setSelectedCloudProvider] = React19.useState(null);
|
|
6845
|
+
const [hasKeyshareData, setHasKeyshareData] = React19.useState(true);
|
|
6846
|
+
const iframeManager = React19.useMemo(() => {
|
|
6847
|
+
try {
|
|
6848
|
+
return getIframeManager();
|
|
6849
|
+
} catch (e) {
|
|
6850
|
+
console.error("[KeyshareBackup] Failed to get iframe manager:", e);
|
|
6851
|
+
return null;
|
|
6852
|
+
}
|
|
6853
|
+
}, []);
|
|
6854
|
+
React19.useEffect(() => {
|
|
6855
|
+
const loadCloudProviders = async () => {
|
|
6856
|
+
try {
|
|
6857
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6858
|
+
const availableProviders = getAvailableCloudProviders3();
|
|
6859
|
+
const providers = availableProviders.map((p) => ({
|
|
6860
|
+
id: p.id,
|
|
6861
|
+
name: p.name,
|
|
6862
|
+
available: p.isAvailable()
|
|
6863
|
+
}));
|
|
6864
|
+
setCloudProviders(providers);
|
|
6865
|
+
if (providers.length > 0 && !selectedCloudProvider) {
|
|
6866
|
+
setSelectedCloudProvider(providers[0].id);
|
|
6867
|
+
}
|
|
6868
|
+
} catch (error2) {
|
|
6869
|
+
console.error("[KeyshareBackup] Failed to load cloud providers:", error2);
|
|
6870
|
+
}
|
|
6871
|
+
};
|
|
6872
|
+
loadCloudProviders();
|
|
6873
|
+
}, [selectedCloudProvider]);
|
|
6874
|
+
const refreshStatus = React19.useCallback(async () => {
|
|
6875
|
+
if (!iframeManager) return;
|
|
6876
|
+
try {
|
|
6877
|
+
const status = await iframeManager.getBackupStatus(userId);
|
|
6878
|
+
setBackupStatus(status);
|
|
6879
|
+
} catch (error2) {
|
|
6880
|
+
console.error("[KeyshareBackup] Failed to get backup status:", error2);
|
|
6881
|
+
}
|
|
6882
|
+
}, [iframeManager, userId]);
|
|
6883
|
+
React19.useEffect(() => {
|
|
6884
|
+
refreshStatus();
|
|
6885
|
+
}, [refreshStatus]);
|
|
6886
|
+
const handleBackup = async (method) => {
|
|
6887
|
+
if (!iframeManager) {
|
|
6888
|
+
setError("Iframe manager not initialized");
|
|
6889
|
+
return;
|
|
6890
|
+
}
|
|
6891
|
+
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
6892
|
+
setError(null);
|
|
6893
|
+
setSuccess(null);
|
|
6894
|
+
try {
|
|
6895
|
+
const password = useCustomPassword ? customPassword : void 0;
|
|
6896
|
+
if (method === "server") {
|
|
6897
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
6898
|
+
const accessToken = jwt?.accessToken;
|
|
6899
|
+
const result = await iframeManager.createBackup(userId, {
|
|
6900
|
+
method,
|
|
6901
|
+
password
|
|
6902
|
+
}, accessToken);
|
|
6903
|
+
if (result.success) {
|
|
6904
|
+
setSuccess("Successfully created server backup");
|
|
6905
|
+
await refreshStatus();
|
|
6906
|
+
onBackupSuccess?.();
|
|
6907
|
+
} else {
|
|
6908
|
+
throw new Error(result.error || "Server backup failed");
|
|
6909
|
+
}
|
|
6910
|
+
} else if (method === "cloud") {
|
|
6911
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6912
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6913
|
+
const providers = getAvailableCloudProviders3();
|
|
6914
|
+
const provider = selectedCloudProvider ? providers.find((p) => p.id === selectedCloudProvider) : providers[0];
|
|
6915
|
+
if (!provider) {
|
|
6916
|
+
throw new Error("No cloud provider available");
|
|
6917
|
+
}
|
|
6918
|
+
if (!provider.isAuthenticated()) {
|
|
6919
|
+
const authenticated = await provider.authenticate();
|
|
6920
|
+
if (!authenticated) {
|
|
6921
|
+
throw new Error(`Failed to authenticate with ${provider.name}`);
|
|
6922
|
+
}
|
|
6923
|
+
}
|
|
6924
|
+
const timestamp = Date.now();
|
|
6925
|
+
const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;
|
|
6926
|
+
const fileContent = JSON.stringify(encryptedData, null, 2);
|
|
6927
|
+
await provider.upload(fileName, fileContent, true);
|
|
6928
|
+
setSuccess(`Successfully created cloud backup on ${provider.name}`);
|
|
6929
|
+
await refreshStatus();
|
|
6930
|
+
onBackupSuccess?.();
|
|
6931
|
+
} else if (method === "local") {
|
|
6932
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6933
|
+
const blob = new Blob([JSON.stringify(encryptedData, null, 2)], {
|
|
6934
|
+
type: "application/json"
|
|
6935
|
+
});
|
|
6936
|
+
const url = URL.createObjectURL(blob);
|
|
6937
|
+
const a = document.createElement("a");
|
|
6938
|
+
a.href = url;
|
|
6939
|
+
a.download = `lumia-passport-backup-${userId}-${Date.now()}.json`;
|
|
6940
|
+
document.body.appendChild(a);
|
|
6941
|
+
a.click();
|
|
6942
|
+
document.body.removeChild(a);
|
|
6943
|
+
URL.revokeObjectURL(url);
|
|
6944
|
+
setSuccess("Backup file downloaded successfully");
|
|
6945
|
+
await refreshStatus();
|
|
6946
|
+
onBackupSuccess?.();
|
|
6947
|
+
}
|
|
6948
|
+
if (typeof window !== "undefined") {
|
|
6949
|
+
window.dispatchEvent(
|
|
6950
|
+
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
6951
|
+
detail: { method, success: true }
|
|
6952
|
+
})
|
|
6953
|
+
);
|
|
6954
|
+
}
|
|
6955
|
+
} catch (err) {
|
|
6956
|
+
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
6957
|
+
setError(errorMsg);
|
|
6958
|
+
await refreshStatus();
|
|
6959
|
+
} finally {
|
|
6960
|
+
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
6961
|
+
}
|
|
6962
|
+
};
|
|
6963
|
+
const formatLastBackup = (timestamp) => {
|
|
6964
|
+
if (!timestamp) return "Never";
|
|
6965
|
+
const date = new Date(timestamp);
|
|
6966
|
+
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
6967
|
+
};
|
|
6968
|
+
return /* @__PURE__ */ jsxs15(Card, { className: "border-green-200 bg-green-50", children: [
|
|
6969
|
+
/* @__PURE__ */ jsx23(CardHeader, { className: "pb-4", children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between", children: [
|
|
6970
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
|
|
6971
|
+
/* @__PURE__ */ jsx23(Shield4, { className: "h-6 w-6 text-green-600" }),
|
|
6972
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
6973
|
+
/* @__PURE__ */ jsx23(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
6974
|
+
/* @__PURE__ */ jsx23(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
6975
|
+
] })
|
|
6976
|
+
] }),
|
|
6977
|
+
onClose && /* @__PURE__ */ jsx23("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ jsx23(X3, { className: "h-4 w-4" }) })
|
|
6978
|
+
] }) }),
|
|
6979
|
+
/* @__PURE__ */ jsxs15(CardContent, { className: "space-y-6", children: [
|
|
6980
|
+
error && /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
6981
|
+
/* @__PURE__ */ jsx23(AlertCircle3, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6982
|
+
/* @__PURE__ */ jsx23("span", { children: error })
|
|
6983
|
+
] }),
|
|
6984
|
+
success && /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
6985
|
+
/* @__PURE__ */ jsx23(CheckCircle24, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6986
|
+
/* @__PURE__ */ jsx23("span", { children: success })
|
|
6987
|
+
] }),
|
|
6988
|
+
/* @__PURE__ */ jsxs15("div", { className: "space-y-3", children: [
|
|
6989
|
+
/* @__PURE__ */ jsx23("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
6990
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
|
|
6991
|
+
/* @__PURE__ */ jsx23(
|
|
6992
|
+
"input",
|
|
6993
|
+
{
|
|
6994
|
+
type: "checkbox",
|
|
6995
|
+
id: "use-backup-password",
|
|
6996
|
+
checked: useCustomPassword,
|
|
6997
|
+
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
6998
|
+
className: "rounded"
|
|
6999
|
+
}
|
|
7000
|
+
),
|
|
7001
|
+
/* @__PURE__ */ jsx23("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
7002
|
+
] }),
|
|
7003
|
+
!useCustomPassword && /* @__PURE__ */ jsx23("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
|
|
7004
|
+
/* @__PURE__ */ jsx23(Key5, { className: "h-4 w-4" }),
|
|
7005
|
+
/* @__PURE__ */ jsx23("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
7006
|
+
] }) }),
|
|
7007
|
+
useCustomPassword && /* @__PURE__ */ jsxs15("div", { className: "relative", children: [
|
|
7008
|
+
/* @__PURE__ */ jsx23(
|
|
7009
|
+
Input,
|
|
7010
|
+
{
|
|
7011
|
+
type: showPassword ? "text" : "password",
|
|
7012
|
+
placeholder: "Enter backup encryption password",
|
|
7013
|
+
value: customPassword,
|
|
7014
|
+
onChange: (e) => setCustomPassword(e.target.value),
|
|
7015
|
+
className: "pr-10"
|
|
7016
|
+
}
|
|
7017
|
+
),
|
|
7018
|
+
/* @__PURE__ */ jsx23(
|
|
7019
|
+
"button",
|
|
7020
|
+
{
|
|
7021
|
+
type: "button",
|
|
7022
|
+
onClick: () => setShowPassword(!showPassword),
|
|
7023
|
+
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
7024
|
+
children: showPassword ? /* @__PURE__ */ jsx23(EyeOff3, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx23(Eye3, { className: "h-4 w-4" })
|
|
7025
|
+
}
|
|
7026
|
+
)
|
|
7027
|
+
] })
|
|
7028
|
+
] }),
|
|
7029
|
+
/* @__PURE__ */ jsxs15("div", { className: "space-y-4", children: [
|
|
7030
|
+
/* @__PURE__ */ jsx23("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
7031
|
+
/* @__PURE__ */ jsxs15("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
7032
|
+
/* @__PURE__ */ jsx23("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
|
|
7033
|
+
/* @__PURE__ */ jsx23(Server4, { className: "h-5 w-5 text-blue-600" }),
|
|
7034
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7035
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
7036
|
+
/* @__PURE__ */ jsx23("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
7037
|
+
] })
|
|
7038
|
+
] }) }),
|
|
7039
|
+
/* @__PURE__ */ jsx23(
|
|
7040
|
+
Button,
|
|
7041
|
+
{
|
|
7042
|
+
onClick: () => handleBackup("server"),
|
|
7043
|
+
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7044
|
+
className: "px-4 py-2",
|
|
7045
|
+
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7046
|
+
}
|
|
7047
|
+
),
|
|
7048
|
+
/* @__PURE__ */ jsxs15("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7049
|
+
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
7050
|
+
formatLastBackup(backupStatus.server.lastBackup)
|
|
7051
|
+
] })
|
|
7052
|
+
] }),
|
|
7053
|
+
/* @__PURE__ */ jsxs15("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
7054
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7055
|
+
/* @__PURE__ */ jsx23(Cloud3, { className: "h-5 w-5 text-sky-600" }),
|
|
7056
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7057
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
7058
|
+
/* @__PURE__ */ jsx23("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
7059
|
+
] })
|
|
7060
|
+
] }),
|
|
7061
|
+
cloudProviders.length > 1 && /* @__PURE__ */ jsx23("div", { className: "mb-3", children: /* @__PURE__ */ jsx23(
|
|
7062
|
+
"select",
|
|
7063
|
+
{
|
|
7064
|
+
value: selectedCloudProvider || "",
|
|
7065
|
+
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
7066
|
+
className: "text-sm border rounded px-2 py-1 w-full",
|
|
7067
|
+
children: cloudProviders.map((provider) => /* @__PURE__ */ jsxs15("option", { value: provider.id, disabled: !provider.available, children: [
|
|
7068
|
+
provider.name,
|
|
7069
|
+
" ",
|
|
7070
|
+
provider.available ? "" : "(Not Available)"
|
|
7071
|
+
] }, provider.id))
|
|
7072
|
+
}
|
|
7073
|
+
) }),
|
|
7074
|
+
/* @__PURE__ */ jsx23(
|
|
7075
|
+
Button,
|
|
7076
|
+
{
|
|
7077
|
+
onClick: () => handleBackup("cloud"),
|
|
7078
|
+
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
7079
|
+
className: "px-4 py-2",
|
|
7080
|
+
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7081
|
+
}
|
|
7082
|
+
),
|
|
7083
|
+
/* @__PURE__ */ jsx23("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)}` })
|
|
7084
|
+
] }),
|
|
7085
|
+
/* @__PURE__ */ jsxs15("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
7086
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7087
|
+
/* @__PURE__ */ jsx23(Download2, { className: "h-5 w-5 text-purple-600" }),
|
|
7088
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7089
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
7090
|
+
/* @__PURE__ */ jsx23("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
7091
|
+
] })
|
|
7092
|
+
] }),
|
|
7093
|
+
/* @__PURE__ */ jsx23(
|
|
7094
|
+
Button,
|
|
7095
|
+
{
|
|
7096
|
+
onClick: () => handleBackup("local"),
|
|
7097
|
+
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7098
|
+
className: "w-full",
|
|
7099
|
+
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
7100
|
+
}
|
|
7101
|
+
),
|
|
7102
|
+
/* @__PURE__ */ jsxs15("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7103
|
+
"Download encrypted backup file to your device \u2022 Last: ",
|
|
7104
|
+
formatLastBackup(backupStatus.local.lastBackup)
|
|
7105
|
+
] })
|
|
7106
|
+
] })
|
|
7107
|
+
] }),
|
|
7108
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
7109
|
+
/* @__PURE__ */ jsx23(Lock2, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
7110
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7111
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium", children: "Security Notice" }),
|
|
7112
|
+
/* @__PURE__ */ jsxs15("div", { className: "mt-1", children: [
|
|
7113
|
+
useCustomPassword ? /* @__PURE__ */ jsx23(Fragment6, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ jsx23(Fragment6, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
7114
|
+
" ",
|
|
7115
|
+
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
7116
|
+
] })
|
|
7117
|
+
] })
|
|
7118
|
+
] })
|
|
7119
|
+
] })
|
|
7120
|
+
] });
|
|
7121
|
+
}
|
|
7122
|
+
|
|
6696
7123
|
// src/internal/components/TransactionsModal.tsx
|
|
6697
|
-
import
|
|
7124
|
+
import React20 from "react";
|
|
6698
7125
|
init_base();
|
|
6699
|
-
import { Activity, ArrowUpRight, ArrowDownRight, CheckCircle2 as
|
|
6700
|
-
import { jsx as
|
|
7126
|
+
import { Activity, ArrowUpRight, ArrowDownRight, CheckCircle2 as CheckCircle25, XCircle, ArrowLeft as ArrowLeft5, RefreshCw as RefreshCw3 } from "lucide-react";
|
|
7127
|
+
import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
6701
7128
|
var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
6702
7129
|
const { address } = useLumiaSession();
|
|
6703
|
-
const [transactions, setTransactions] =
|
|
6704
|
-
const [loading, setLoading] =
|
|
6705
|
-
const [error, setError] =
|
|
7130
|
+
const [transactions, setTransactions] = React20.useState([]);
|
|
7131
|
+
const [loading, setLoading] = React20.useState(false);
|
|
7132
|
+
const [error, setError] = React20.useState(null);
|
|
6706
7133
|
const { config } = useLumiaPassportConfig();
|
|
6707
7134
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
6708
|
-
const loadTransactions =
|
|
7135
|
+
const loadTransactions = React20.useCallback(async () => {
|
|
6709
7136
|
if (!address) return;
|
|
6710
7137
|
setLoading(true);
|
|
6711
7138
|
setError(null);
|
|
@@ -6726,7 +7153,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6726
7153
|
setLoading(false);
|
|
6727
7154
|
}
|
|
6728
7155
|
}, [address]);
|
|
6729
|
-
|
|
7156
|
+
React20.useEffect(() => {
|
|
6730
7157
|
if (open && address && !loading && transactions.length === 0) {
|
|
6731
7158
|
loadTransactions();
|
|
6732
7159
|
}
|
|
@@ -6747,98 +7174,98 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6747
7174
|
}
|
|
6748
7175
|
};
|
|
6749
7176
|
const getStatusIcon = (status) => {
|
|
6750
|
-
return status === "ok" ? /* @__PURE__ */
|
|
7177
|
+
return status === "ok" ? /* @__PURE__ */ jsx24(CheckCircle25, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx24(XCircle, { className: "w-4 h-4 text-red-500" });
|
|
6751
7178
|
};
|
|
6752
7179
|
const getTransactionIcon = (from, to) => {
|
|
6753
7180
|
const isIncoming = to.toLowerCase() === address?.toLowerCase();
|
|
6754
|
-
return isIncoming ? /* @__PURE__ */
|
|
7181
|
+
return isIncoming ? /* @__PURE__ */ jsx24(ArrowDownRight, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx24(ArrowUpRight, { className: "w-4 h-4 text-blue-500" });
|
|
6755
7182
|
};
|
|
6756
7183
|
const openInExplorer = (txHash) => {
|
|
6757
7184
|
const explorerUrl = getExplorerUrl();
|
|
6758
7185
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
6759
7186
|
};
|
|
6760
|
-
return /* @__PURE__ */
|
|
6761
|
-
/* @__PURE__ */
|
|
6762
|
-
/* @__PURE__ */
|
|
6763
|
-
/* @__PURE__ */
|
|
6764
|
-
onBack && /* @__PURE__ */
|
|
7187
|
+
return /* @__PURE__ */ jsx24(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs16(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: [
|
|
7188
|
+
/* @__PURE__ */ jsx24(VisuallyHidden, { children: /* @__PURE__ */ jsx24(DialogTitle, { children: "Transaction History" }) }),
|
|
7189
|
+
/* @__PURE__ */ jsx24(DialogDescription, { className: "sr-only", children: "View your transaction history" }),
|
|
7190
|
+
/* @__PURE__ */ jsx24("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
|
|
7191
|
+
onBack && /* @__PURE__ */ jsx24(
|
|
6765
7192
|
"button",
|
|
6766
7193
|
{
|
|
6767
7194
|
onClick: onBack,
|
|
6768
7195
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6769
7196
|
title: "Back",
|
|
6770
|
-
children: /* @__PURE__ */
|
|
7197
|
+
children: /* @__PURE__ */ jsx24(ArrowLeft5, { className: "h-4 w-4" })
|
|
6771
7198
|
}
|
|
6772
7199
|
),
|
|
6773
|
-
/* @__PURE__ */
|
|
6774
|
-
/* @__PURE__ */
|
|
6775
|
-
/* @__PURE__ */
|
|
6776
|
-
/* @__PURE__ */
|
|
7200
|
+
/* @__PURE__ */ jsxs16("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7201
|
+
/* @__PURE__ */ jsx24(Activity, { className: "h-5 w-5" }),
|
|
7202
|
+
/* @__PURE__ */ jsx24("span", { children: "Transaction History" }),
|
|
7203
|
+
/* @__PURE__ */ jsx24(
|
|
6777
7204
|
"button",
|
|
6778
7205
|
{
|
|
6779
7206
|
onClick: loadTransactions,
|
|
6780
7207
|
disabled: loading,
|
|
6781
7208
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6782
7209
|
title: "Refresh transactions",
|
|
6783
|
-
children: /* @__PURE__ */
|
|
7210
|
+
children: /* @__PURE__ */ jsx24(RefreshCw3, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` })
|
|
6784
7211
|
}
|
|
6785
7212
|
)
|
|
6786
7213
|
] })
|
|
6787
7214
|
] }) }),
|
|
6788
|
-
/* @__PURE__ */
|
|
6789
|
-
/* @__PURE__ */
|
|
6790
|
-
/* @__PURE__ */
|
|
6791
|
-
] }) : transactions.length === 0 ? /* @__PURE__ */
|
|
6792
|
-
/* @__PURE__ */
|
|
6793
|
-
/* @__PURE__ */
|
|
7215
|
+
/* @__PURE__ */ jsx24("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: loading ? /* @__PURE__ */ jsx24("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsx24("div", { className: `${theme.mutedText}`, children: "Loading transactions..." }) }) : error ? /* @__PURE__ */ jsxs16("div", { className: `flex flex-col items-center justify-center py-8 ${isDark ? "text-red-400" : "text-red-500"}`, children: [
|
|
7216
|
+
/* @__PURE__ */ jsx24(XCircle, { className: "w-12 h-12 mb-2" }),
|
|
7217
|
+
/* @__PURE__ */ jsx24("p", { className: "text-center text-sm", children: error })
|
|
7218
|
+
] }) : transactions.length === 0 ? /* @__PURE__ */ jsxs16("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7219
|
+
/* @__PURE__ */ jsx24(Activity, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7220
|
+
/* @__PURE__ */ jsxs16("p", { className: "text-center", children: [
|
|
6794
7221
|
"No transactions found",
|
|
6795
|
-
/* @__PURE__ */
|
|
6796
|
-
/* @__PURE__ */
|
|
7222
|
+
/* @__PURE__ */ jsx24("br", {}),
|
|
7223
|
+
/* @__PURE__ */ jsx24("span", { className: "text-xs mt-2", children: "Smart account transactions will appear here" })
|
|
6797
7224
|
] })
|
|
6798
|
-
] }) : /* @__PURE__ */
|
|
7225
|
+
] }) : /* @__PURE__ */ jsx24("div", { className: "space-y-3", children: transactions.map((tx) => {
|
|
6799
7226
|
const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();
|
|
6800
7227
|
const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;
|
|
6801
|
-
return /* @__PURE__ */
|
|
7228
|
+
return /* @__PURE__ */ jsxs16(
|
|
6802
7229
|
"div",
|
|
6803
7230
|
{
|
|
6804
7231
|
className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors cursor-pointer`,
|
|
6805
7232
|
onClick: () => openInExplorer(tx.hash),
|
|
6806
7233
|
children: [
|
|
6807
|
-
/* @__PURE__ */
|
|
6808
|
-
/* @__PURE__ */
|
|
7234
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7235
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
|
|
6809
7236
|
getTransactionIcon(tx.from.hash, tx.to.hash),
|
|
6810
|
-
/* @__PURE__ */
|
|
7237
|
+
/* @__PURE__ */ jsx24("span", { className: `font-medium ${theme.titleText}`, children: isIncoming ? "Received" : "Sent" }),
|
|
6811
7238
|
getStatusIcon(tx.status)
|
|
6812
7239
|
] }),
|
|
6813
|
-
/* @__PURE__ */
|
|
7240
|
+
/* @__PURE__ */ jsx24("div", { className: `text-xs ${theme.mutedText}`, children: formatTime(tx.timestamp) })
|
|
6814
7241
|
] }),
|
|
6815
|
-
/* @__PURE__ */
|
|
6816
|
-
/* @__PURE__ */
|
|
6817
|
-
/* @__PURE__ */
|
|
6818
|
-
/* @__PURE__ */
|
|
7242
|
+
/* @__PURE__ */ jsxs16("div", { className: "space-y-1 text-sm", children: [
|
|
7243
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7244
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: isIncoming ? "From:" : "To:" }),
|
|
7245
|
+
/* @__PURE__ */ jsxs16("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6819
7246
|
formatAddress(displayAddress),
|
|
6820
|
-
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */
|
|
7247
|
+
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ jsx24("span", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} ml-1`, children: "(Contract)" })
|
|
6821
7248
|
] })
|
|
6822
7249
|
] }),
|
|
6823
|
-
/* @__PURE__ */
|
|
6824
|
-
/* @__PURE__ */
|
|
6825
|
-
/* @__PURE__ */
|
|
7250
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7251
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: "Value:" }),
|
|
7252
|
+
/* @__PURE__ */ jsxs16("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
6826
7253
|
formatValue(tx.value),
|
|
6827
7254
|
" LUMIA"
|
|
6828
7255
|
] })
|
|
6829
7256
|
] }),
|
|
6830
|
-
/* @__PURE__ */
|
|
6831
|
-
/* @__PURE__ */
|
|
6832
|
-
/* @__PURE__ */
|
|
7257
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7258
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: "Block:" }),
|
|
7259
|
+
/* @__PURE__ */ jsxs16("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6833
7260
|
"#",
|
|
6834
7261
|
tx.block_number
|
|
6835
7262
|
] })
|
|
6836
7263
|
] }),
|
|
6837
|
-
tx.method && /* @__PURE__ */
|
|
6838
|
-
/* @__PURE__ */
|
|
6839
|
-
/* @__PURE__ */
|
|
7264
|
+
tx.method && /* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7265
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: "Method:" }),
|
|
7266
|
+
/* @__PURE__ */ jsx24("span", { className: `${isDark ? "text-blue-400" : "text-blue-600"} text-xs`, children: tx.method })
|
|
6840
7267
|
] }),
|
|
6841
|
-
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */
|
|
7268
|
+
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ jsx24("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ jsx24(
|
|
6842
7269
|
"span",
|
|
6843
7270
|
{
|
|
6844
7271
|
className: `text-xs ${isDark ? "bg-blue-900/30 text-blue-300" : "bg-blue-100 text-blue-800"} px-2 py-0.5 rounded-full`,
|
|
@@ -6852,7 +7279,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6852
7279
|
tx.hash
|
|
6853
7280
|
);
|
|
6854
7281
|
}) }) }),
|
|
6855
|
-
transactions.length > 0 && /* @__PURE__ */
|
|
7282
|
+
transactions.length > 0 && /* @__PURE__ */ jsx24("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ jsxs16("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
6856
7283
|
"Total: ",
|
|
6857
7284
|
transactions.length,
|
|
6858
7285
|
" transaction",
|
|
@@ -6862,11 +7289,11 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6862
7289
|
};
|
|
6863
7290
|
|
|
6864
7291
|
// src/internal/components/ViewAssetsModal.tsx
|
|
6865
|
-
import
|
|
7292
|
+
import React22 from "react";
|
|
6866
7293
|
|
|
6867
7294
|
// src/modules/assets.ts
|
|
6868
7295
|
init_base();
|
|
6869
|
-
import
|
|
7296
|
+
import React21 from "react";
|
|
6870
7297
|
import { useBalance, useReadContract, useReadContracts } from "wagmi";
|
|
6871
7298
|
import { formatUnits, erc20Abi } from "viem";
|
|
6872
7299
|
var COMMON_TOKENS = [
|
|
@@ -7012,7 +7439,7 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
7012
7439
|
}
|
|
7013
7440
|
});
|
|
7014
7441
|
const { tokenInfo } = useTokenInfo(tokenAddress);
|
|
7015
|
-
const formattedBalance =
|
|
7442
|
+
const formattedBalance = React21.useMemo(() => {
|
|
7016
7443
|
if (!balance || !tokenInfo) return "0";
|
|
7017
7444
|
return formatUnits(balance, tokenInfo.decimals);
|
|
7018
7445
|
}, [balance, tokenInfo]);
|
|
@@ -7028,11 +7455,11 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
7028
7455
|
// src/internal/components/ViewAssetsModal.tsx
|
|
7029
7456
|
init_base();
|
|
7030
7457
|
import { Gem, RefreshCw as RefreshCw4, Copy, ExternalLink as ExternalLink2, ArrowLeft as ArrowLeft6 } from "lucide-react";
|
|
7031
|
-
import { jsx as
|
|
7458
|
+
import { jsx as jsx25, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
7032
7459
|
var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
7033
7460
|
const { address } = useLumiaSession();
|
|
7034
7461
|
const { assets, refreshBalances, isLoading } = useAssets(address);
|
|
7035
|
-
const [copied, setCopied] =
|
|
7462
|
+
const [copied, setCopied] = React22.useState(null);
|
|
7036
7463
|
const { config } = useLumiaPassportConfig();
|
|
7037
7464
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7038
7465
|
const handleCopy = async (text, type) => {
|
|
@@ -7047,107 +7474,107 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7047
7474
|
const openInExplorer = (address2) => {
|
|
7048
7475
|
window.open(`${LUMIA_EXPLORER_URL}/address/${address2}`, "_blank");
|
|
7049
7476
|
};
|
|
7050
|
-
return /* @__PURE__ */
|
|
7051
|
-
/* @__PURE__ */
|
|
7052
|
-
/* @__PURE__ */
|
|
7053
|
-
/* @__PURE__ */
|
|
7054
|
-
onBack && /* @__PURE__ */
|
|
7477
|
+
return /* @__PURE__ */ jsx25(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs17(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: [
|
|
7478
|
+
/* @__PURE__ */ jsx25(VisuallyHidden, { children: /* @__PURE__ */ jsx25(DialogTitle, { children: "View Assets" }) }),
|
|
7479
|
+
/* @__PURE__ */ jsx25(DialogDescription, { className: "sr-only", children: "View your token balances and assets" }),
|
|
7480
|
+
/* @__PURE__ */ jsx25("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
|
|
7481
|
+
onBack && /* @__PURE__ */ jsx25(
|
|
7055
7482
|
"button",
|
|
7056
7483
|
{
|
|
7057
7484
|
onClick: onBack,
|
|
7058
7485
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7059
7486
|
title: "Back",
|
|
7060
|
-
children: /* @__PURE__ */
|
|
7487
|
+
children: /* @__PURE__ */ jsx25(ArrowLeft6, { className: "h-4 w-4" })
|
|
7061
7488
|
}
|
|
7062
7489
|
),
|
|
7063
|
-
/* @__PURE__ */
|
|
7064
|
-
/* @__PURE__ */
|
|
7065
|
-
/* @__PURE__ */
|
|
7066
|
-
/* @__PURE__ */
|
|
7490
|
+
/* @__PURE__ */ jsxs17("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7491
|
+
/* @__PURE__ */ jsx25(Gem, { className: "h-5 w-5" }),
|
|
7492
|
+
/* @__PURE__ */ jsx25("span", { children: "Your Assets" }),
|
|
7493
|
+
/* @__PURE__ */ jsx25(
|
|
7067
7494
|
"button",
|
|
7068
7495
|
{
|
|
7069
7496
|
onClick: refreshBalances,
|
|
7070
7497
|
disabled: isLoading,
|
|
7071
7498
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
7072
7499
|
title: "Refresh balances",
|
|
7073
|
-
children: /* @__PURE__ */
|
|
7500
|
+
children: /* @__PURE__ */ jsx25(RefreshCw4, { className: `h-4 w-4 ${isLoading ? "animate-spin" : ""}` })
|
|
7074
7501
|
}
|
|
7075
7502
|
)
|
|
7076
7503
|
] })
|
|
7077
7504
|
] }) }),
|
|
7078
|
-
/* @__PURE__ */
|
|
7079
|
-
/* @__PURE__ */
|
|
7080
|
-
/* @__PURE__ */
|
|
7081
|
-
] }) : /* @__PURE__ */
|
|
7082
|
-
/* @__PURE__ */
|
|
7083
|
-
/* @__PURE__ */
|
|
7084
|
-
/* @__PURE__ */
|
|
7085
|
-
/* @__PURE__ */
|
|
7086
|
-
/* @__PURE__ */
|
|
7087
|
-
/* @__PURE__ */
|
|
7505
|
+
/* @__PURE__ */ jsx25("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: isLoading ? /* @__PURE__ */ jsx25("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsx25("div", { className: `${theme.mutedText}`, children: "Loading assets..." }) }) : assets.length === 0 ? /* @__PURE__ */ jsxs17("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7506
|
+
/* @__PURE__ */ jsx25(Gem, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7507
|
+
/* @__PURE__ */ jsx25("p", { children: "No assets found" })
|
|
7508
|
+
] }) : /* @__PURE__ */ jsx25("div", { className: "space-y-3", children: assets.map((asset, index) => /* @__PURE__ */ jsxs17("div", { className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors`, children: [
|
|
7509
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7510
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3", children: [
|
|
7511
|
+
/* @__PURE__ */ jsx25("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__ */ jsx25("span", { className: "text-white font-bold text-sm", children: asset.symbol.charAt(0) }) }),
|
|
7512
|
+
/* @__PURE__ */ jsxs17("div", { children: [
|
|
7513
|
+
/* @__PURE__ */ jsx25("div", { className: `font-medium ${theme.titleText}`, children: asset.name }),
|
|
7514
|
+
/* @__PURE__ */ jsx25("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
7088
7515
|
] })
|
|
7089
7516
|
] }),
|
|
7090
|
-
/* @__PURE__ */
|
|
7091
|
-
/* @__PURE__ */
|
|
7092
|
-
/* @__PURE__ */
|
|
7517
|
+
/* @__PURE__ */ jsxs17("div", { className: "text-right", children: [
|
|
7518
|
+
/* @__PURE__ */ jsx25("div", { className: `font-mono ${theme.titleText}`, children: asset.formattedBalance }),
|
|
7519
|
+
/* @__PURE__ */ jsx25("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
7093
7520
|
] })
|
|
7094
7521
|
] }),
|
|
7095
|
-
asset.address && /* @__PURE__ */
|
|
7096
|
-
/* @__PURE__ */
|
|
7097
|
-
/* @__PURE__ */
|
|
7098
|
-
/* @__PURE__ */
|
|
7099
|
-
/* @__PURE__ */
|
|
7100
|
-
/* @__PURE__ */
|
|
7522
|
+
asset.address && /* @__PURE__ */ jsxs17("div", { className: `space-y-2 mt-3 pt-3 border-t ${theme.divider}`, children: [
|
|
7523
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7524
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Contract Address:" }),
|
|
7525
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
|
|
7526
|
+
/* @__PURE__ */ jsx25("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` }),
|
|
7527
|
+
/* @__PURE__ */ jsx25(
|
|
7101
7528
|
"button",
|
|
7102
7529
|
{
|
|
7103
7530
|
onClick: () => handleCopy(asset.address, "address"),
|
|
7104
7531
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7105
7532
|
title: "Copy address",
|
|
7106
|
-
children: copied === "address" ? /* @__PURE__ */
|
|
7533
|
+
children: copied === "address" ? /* @__PURE__ */ jsx25("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ jsx25(Copy, { className: "w-3 h-3" })
|
|
7107
7534
|
}
|
|
7108
7535
|
),
|
|
7109
|
-
/* @__PURE__ */
|
|
7536
|
+
/* @__PURE__ */ jsx25(
|
|
7110
7537
|
"button",
|
|
7111
7538
|
{
|
|
7112
7539
|
onClick: () => openInExplorer(asset.address),
|
|
7113
7540
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7114
7541
|
title: "View in explorer",
|
|
7115
|
-
children: /* @__PURE__ */
|
|
7542
|
+
children: /* @__PURE__ */ jsx25(ExternalLink2, { className: "w-3 h-3" })
|
|
7116
7543
|
}
|
|
7117
7544
|
)
|
|
7118
7545
|
] })
|
|
7119
7546
|
] }),
|
|
7120
|
-
asset.decimals && /* @__PURE__ */
|
|
7121
|
-
/* @__PURE__ */
|
|
7122
|
-
/* @__PURE__ */
|
|
7547
|
+
asset.decimals && /* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7548
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Decimals:" }),
|
|
7549
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.titleText}`, children: asset.decimals })
|
|
7123
7550
|
] })
|
|
7124
7551
|
] }),
|
|
7125
|
-
asset.type === "native" && address && /* @__PURE__ */
|
|
7126
|
-
/* @__PURE__ */
|
|
7127
|
-
/* @__PURE__ */
|
|
7128
|
-
/* @__PURE__ */
|
|
7129
|
-
/* @__PURE__ */
|
|
7552
|
+
asset.type === "native" && address && /* @__PURE__ */ jsx25("div", { className: "mt-3 pt-3 border-t border-gray-200", children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7553
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Your Address:" }),
|
|
7554
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
|
|
7555
|
+
/* @__PURE__ */ jsx25("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${address.slice(0, 6)}...${address.slice(-4)}` }),
|
|
7556
|
+
/* @__PURE__ */ jsx25(
|
|
7130
7557
|
"button",
|
|
7131
7558
|
{
|
|
7132
7559
|
onClick: () => handleCopy(address, "wallet"),
|
|
7133
7560
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7134
7561
|
title: "Copy wallet address",
|
|
7135
|
-
children: copied === "wallet" ? /* @__PURE__ */
|
|
7562
|
+
children: copied === "wallet" ? /* @__PURE__ */ jsx25("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ jsx25(Copy, { className: "w-3 h-3" })
|
|
7136
7563
|
}
|
|
7137
7564
|
),
|
|
7138
|
-
/* @__PURE__ */
|
|
7565
|
+
/* @__PURE__ */ jsx25(
|
|
7139
7566
|
"button",
|
|
7140
7567
|
{
|
|
7141
7568
|
onClick: () => openInExplorer(address),
|
|
7142
7569
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7143
7570
|
title: "View in explorer",
|
|
7144
|
-
children: /* @__PURE__ */
|
|
7571
|
+
children: /* @__PURE__ */ jsx25(ExternalLink2, { className: "w-3 h-3" })
|
|
7145
7572
|
}
|
|
7146
7573
|
)
|
|
7147
7574
|
] })
|
|
7148
7575
|
] }) })
|
|
7149
7576
|
] }, `${asset.type}-${asset.address || "native"}-${index}`)) }) }),
|
|
7150
|
-
assets.length > 0 && /* @__PURE__ */
|
|
7577
|
+
assets.length > 0 && /* @__PURE__ */ jsx25("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ jsxs17("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
7151
7578
|
"Total: ",
|
|
7152
7579
|
assets.length,
|
|
7153
7580
|
" asset",
|
|
@@ -7157,18 +7584,18 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7157
7584
|
};
|
|
7158
7585
|
|
|
7159
7586
|
// src/internal/components/SendModal.tsx
|
|
7160
|
-
import { useState as
|
|
7161
|
-
import { Send, ArrowLeft as ArrowLeft7, Loader2, CheckCircle2 as
|
|
7587
|
+
import { useState as useState13, useEffect as useEffect10 } from "react";
|
|
7588
|
+
import { Send, ArrowLeft as ArrowLeft7, Loader2, CheckCircle2 as CheckCircle27, AlertCircle as AlertCircle5 } from "lucide-react";
|
|
7162
7589
|
|
|
7163
7590
|
// src/hooks/useSendTransaction.ts
|
|
7164
|
-
import { useState as
|
|
7591
|
+
import { useState as useState10, useCallback as useCallback4 } from "react";
|
|
7165
7592
|
import { parseEther as parseEther2, isAddress } from "viem";
|
|
7166
7593
|
function useSendTransaction() {
|
|
7167
7594
|
const { session, address } = useLumiaSession();
|
|
7168
|
-
const [isLoading, setIsLoading] =
|
|
7169
|
-
const [error, setError] =
|
|
7170
|
-
const [userOpHash, setUserOpHash] =
|
|
7171
|
-
const sendTransaction =
|
|
7595
|
+
const [isLoading, setIsLoading] = useState10(false);
|
|
7596
|
+
const [error, setError] = useState10(null);
|
|
7597
|
+
const [userOpHash, setUserOpHash] = useState10(null);
|
|
7598
|
+
const sendTransaction = useCallback4(async (params) => {
|
|
7172
7599
|
if (!session || !address) {
|
|
7173
7600
|
setError("No active session");
|
|
7174
7601
|
return null;
|
|
@@ -7205,7 +7632,7 @@ function useSendTransaction() {
|
|
|
7205
7632
|
setIsLoading(false);
|
|
7206
7633
|
}
|
|
7207
7634
|
}, [session, address]);
|
|
7208
|
-
const reset =
|
|
7635
|
+
const reset = useCallback4(() => {
|
|
7209
7636
|
setError(null);
|
|
7210
7637
|
setUserOpHash(null);
|
|
7211
7638
|
setIsLoading(false);
|
|
@@ -7224,8 +7651,8 @@ import { isAddress as isAddress2 } from "viem";
|
|
|
7224
7651
|
import { useBalance as useBalance2 } from "wagmi";
|
|
7225
7652
|
|
|
7226
7653
|
// src/internal/components/UserOpStatus.tsx
|
|
7227
|
-
import * as
|
|
7228
|
-
import { AlertCircle as
|
|
7654
|
+
import * as React24 from "react";
|
|
7655
|
+
import { AlertCircle as AlertCircle4, CheckCircle2 as CheckCircle26, Clock as Clock3, Copy as Copy3, ExternalLink as ExternalLink4, RefreshCw as RefreshCw5 } from "lucide-react";
|
|
7229
7656
|
|
|
7230
7657
|
// src/internal/components/ui/badge.tsx
|
|
7231
7658
|
import { cva as cva2 } from "class-variance-authority";
|
|
@@ -7238,7 +7665,7 @@ function cn2(...inputs) {
|
|
|
7238
7665
|
}
|
|
7239
7666
|
|
|
7240
7667
|
// src/internal/components/ui/badge.tsx
|
|
7241
|
-
import { jsx as
|
|
7668
|
+
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
7242
7669
|
var badgeVariants = cva2(
|
|
7243
7670
|
"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",
|
|
7244
7671
|
{
|
|
@@ -7258,13 +7685,13 @@ var badgeVariants = cva2(
|
|
|
7258
7685
|
}
|
|
7259
7686
|
);
|
|
7260
7687
|
function Badge({ className, variant, ...props }) {
|
|
7261
|
-
return /* @__PURE__ */
|
|
7688
|
+
return /* @__PURE__ */ jsx26("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
7262
7689
|
}
|
|
7263
7690
|
|
|
7264
7691
|
// src/internal/components/Address.tsx
|
|
7265
|
-
import * as
|
|
7692
|
+
import * as React23 from "react";
|
|
7266
7693
|
import { Copy as Copy2, ExternalLink as ExternalLink3 } from "lucide-react";
|
|
7267
|
-
import { jsx as
|
|
7694
|
+
import { jsx as jsx27, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
7268
7695
|
function toExplorerAddressUrl(address, chain) {
|
|
7269
7696
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
7270
7697
|
if (!base2) return null;
|
|
@@ -7285,12 +7712,12 @@ var Address = ({
|
|
|
7285
7712
|
}) => {
|
|
7286
7713
|
const addr = address || "";
|
|
7287
7714
|
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
7288
|
-
const [copied, setCopied] =
|
|
7289
|
-
if (!addr) return /* @__PURE__ */
|
|
7290
|
-
return /* @__PURE__ */
|
|
7291
|
-
label && /* @__PURE__ */
|
|
7292
|
-
/* @__PURE__ */
|
|
7293
|
-
showCopy && /* @__PURE__ */
|
|
7715
|
+
const [copied, setCopied] = React23.useState(false);
|
|
7716
|
+
if (!addr) return /* @__PURE__ */ jsx27("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
7717
|
+
return /* @__PURE__ */ jsxs18("div", { className: cn2("flex items-center gap-2", className), style: { listStyle: "none" }, children: [
|
|
7718
|
+
label && /* @__PURE__ */ jsx27("span", { className: "text-sm font-medium", children: label }),
|
|
7719
|
+
/* @__PURE__ */ jsx27("code", { className: "text-xs bg-background px-2 py-1 rounded select-all", children: truncate ? short(addr) : addr }),
|
|
7720
|
+
showCopy && /* @__PURE__ */ jsx27(
|
|
7294
7721
|
Button,
|
|
7295
7722
|
{
|
|
7296
7723
|
variant: "ghost",
|
|
@@ -7304,10 +7731,10 @@ var Address = ({
|
|
|
7304
7731
|
} catch {
|
|
7305
7732
|
}
|
|
7306
7733
|
},
|
|
7307
|
-
children: /* @__PURE__ */
|
|
7734
|
+
children: /* @__PURE__ */ jsx27(Copy2, { className: "h-4 w-4" })
|
|
7308
7735
|
}
|
|
7309
7736
|
),
|
|
7310
|
-
showExplorer && explorer && /* @__PURE__ */
|
|
7737
|
+
showExplorer && explorer && /* @__PURE__ */ jsx27(
|
|
7311
7738
|
"a",
|
|
7312
7739
|
{
|
|
7313
7740
|
href: explorer,
|
|
@@ -7315,7 +7742,7 @@ var Address = ({
|
|
|
7315
7742
|
rel: "noreferrer noopener",
|
|
7316
7743
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
7317
7744
|
title: "Open in explorer",
|
|
7318
|
-
children: /* @__PURE__ */
|
|
7745
|
+
children: /* @__PURE__ */ jsx27(ExternalLink3, { className: "h-4 w-4" })
|
|
7319
7746
|
}
|
|
7320
7747
|
)
|
|
7321
7748
|
] });
|
|
@@ -7323,7 +7750,7 @@ var Address = ({
|
|
|
7323
7750
|
|
|
7324
7751
|
// src/internal/components/UserOpStatus.tsx
|
|
7325
7752
|
init_base();
|
|
7326
|
-
import { jsx as
|
|
7753
|
+
import { jsx as jsx28, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
7327
7754
|
var UserOpStatus = ({
|
|
7328
7755
|
userOpHash,
|
|
7329
7756
|
chain,
|
|
@@ -7334,20 +7761,20 @@ var UserOpStatus = ({
|
|
|
7334
7761
|
externalState
|
|
7335
7762
|
}) => {
|
|
7336
7763
|
const useExternalState = !!externalState;
|
|
7337
|
-
const [internalReceipt, setInternalReceipt] =
|
|
7338
|
-
const [internalMempool, setInternalMempool] =
|
|
7339
|
-
const [internalError, setInternalError] =
|
|
7340
|
-
const [attempt, setAttempt] =
|
|
7341
|
-
const [internalRefreshing, setInternalRefreshing] =
|
|
7342
|
-
const [timedOut, setTimedOut] =
|
|
7343
|
-
const [rejected, setRejected] =
|
|
7344
|
-
const intervalRef =
|
|
7345
|
-
const startTimeRef =
|
|
7764
|
+
const [internalReceipt, setInternalReceipt] = React24.useState(null);
|
|
7765
|
+
const [internalMempool, setInternalMempool] = React24.useState(null);
|
|
7766
|
+
const [internalError, setInternalError] = React24.useState(null);
|
|
7767
|
+
const [attempt, setAttempt] = React24.useState(0);
|
|
7768
|
+
const [internalRefreshing, setInternalRefreshing] = React24.useState(false);
|
|
7769
|
+
const [timedOut, setTimedOut] = React24.useState(false);
|
|
7770
|
+
const [rejected, setRejected] = React24.useState(false);
|
|
7771
|
+
const intervalRef = React24.useRef(null);
|
|
7772
|
+
const startTimeRef = React24.useRef(Date.now());
|
|
7346
7773
|
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
7347
7774
|
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
7348
7775
|
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
7349
7776
|
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
7350
|
-
const rpc =
|
|
7777
|
+
const rpc = React24.useCallback(async (method, params) => {
|
|
7351
7778
|
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
7352
7779
|
const res = await fetch(getBundlerUrl(), {
|
|
7353
7780
|
method: "POST",
|
|
@@ -7358,14 +7785,14 @@ var UserOpStatus = ({
|
|
|
7358
7785
|
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
7359
7786
|
return json.result;
|
|
7360
7787
|
}, []);
|
|
7361
|
-
const extractMempoolInfo =
|
|
7788
|
+
const extractMempoolInfo = React24.useCallback((m) => {
|
|
7362
7789
|
if (!m) return null;
|
|
7363
7790
|
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
7364
7791
|
const sender = m.sender || m?.userOperation?.sender || null;
|
|
7365
7792
|
if (!entryPoint && !sender) return null;
|
|
7366
7793
|
return { entryPoint, sender };
|
|
7367
7794
|
}, []);
|
|
7368
|
-
const tick =
|
|
7795
|
+
const tick = React24.useCallback(async () => {
|
|
7369
7796
|
if (useExternalState) return;
|
|
7370
7797
|
const elapsed = Date.now() - startTimeRef.current;
|
|
7371
7798
|
if (elapsed > maxPollTimeMs) {
|
|
@@ -7409,7 +7836,7 @@ var UserOpStatus = ({
|
|
|
7409
7836
|
setAttempt((x) => x + 1);
|
|
7410
7837
|
}
|
|
7411
7838
|
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
7412
|
-
|
|
7839
|
+
React24.useEffect(() => {
|
|
7413
7840
|
if (useExternalState) return;
|
|
7414
7841
|
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
7415
7842
|
startTimeRef.current = Date.now();
|
|
@@ -7421,7 +7848,7 @@ var UserOpStatus = ({
|
|
|
7421
7848
|
setAttempt(0);
|
|
7422
7849
|
setInternalRefreshing(false);
|
|
7423
7850
|
}, [userOpHash, useExternalState]);
|
|
7424
|
-
|
|
7851
|
+
React24.useEffect(() => {
|
|
7425
7852
|
if (useExternalState) {
|
|
7426
7853
|
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
7427
7854
|
return;
|
|
@@ -7456,54 +7883,54 @@ var UserOpStatus = ({
|
|
|
7456
7883
|
const stateBadge = () => {
|
|
7457
7884
|
if (receipt) {
|
|
7458
7885
|
const ok = !!receipt.success;
|
|
7459
|
-
return /* @__PURE__ */
|
|
7460
|
-
ok ? /* @__PURE__ */
|
|
7886
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
7887
|
+
ok ? /* @__PURE__ */ jsx28(CheckCircle26, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7461
7888
|
ok ? "Included" : "Failed"
|
|
7462
7889
|
] });
|
|
7463
7890
|
}
|
|
7464
7891
|
if (rejected) {
|
|
7465
|
-
return /* @__PURE__ */
|
|
7466
|
-
/* @__PURE__ */
|
|
7892
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
7893
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7467
7894
|
" Rejected by bundler"
|
|
7468
7895
|
] });
|
|
7469
7896
|
}
|
|
7470
7897
|
if (timedOut) {
|
|
7471
|
-
return /* @__PURE__ */
|
|
7472
|
-
/* @__PURE__ */
|
|
7898
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "warning", className: "gap-1", children: [
|
|
7899
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7473
7900
|
" Timeout - may be rejected"
|
|
7474
7901
|
] });
|
|
7475
7902
|
}
|
|
7476
7903
|
if (mempool) {
|
|
7477
|
-
return /* @__PURE__ */
|
|
7478
|
-
/* @__PURE__ */
|
|
7904
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "outline", className: "gap-1", children: [
|
|
7905
|
+
/* @__PURE__ */ jsx28(Clock3, { className: "h-3 w-3" }),
|
|
7479
7906
|
" Pending in bundler"
|
|
7480
7907
|
] });
|
|
7481
7908
|
}
|
|
7482
|
-
return /* @__PURE__ */
|
|
7483
|
-
/* @__PURE__ */
|
|
7909
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
7910
|
+
/* @__PURE__ */ jsx28(Clock3, { className: "h-3 w-3" }),
|
|
7484
7911
|
" Waiting"
|
|
7485
7912
|
] });
|
|
7486
7913
|
};
|
|
7487
|
-
return /* @__PURE__ */
|
|
7914
|
+
return /* @__PURE__ */ jsxs19(
|
|
7488
7915
|
"div",
|
|
7489
7916
|
{
|
|
7490
7917
|
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
7491
7918
|
style: { textAlign: "left", listStyle: "none" },
|
|
7492
7919
|
children: [
|
|
7493
|
-
/* @__PURE__ */
|
|
7494
|
-
/* @__PURE__ */
|
|
7920
|
+
/* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between mb-3", children: [
|
|
7921
|
+
/* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2", children: [
|
|
7495
7922
|
stateBadge(),
|
|
7496
|
-
/* @__PURE__ */
|
|
7923
|
+
/* @__PURE__ */ jsx28("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
7497
7924
|
] }),
|
|
7498
|
-
/* @__PURE__ */
|
|
7499
|
-
/* @__PURE__ */
|
|
7500
|
-
/* @__PURE__ */
|
|
7925
|
+
/* @__PURE__ */ jsxs19(Button, { variant: "ghost", size: "sm", onClick: () => tick(), disabled: refreshing, className: "h-8", children: [
|
|
7926
|
+
/* @__PURE__ */ jsx28(RefreshCw5, { className: cn2("h-3.5 w-3.5 mr-1", refreshing && "animate-spin") }),
|
|
7927
|
+
/* @__PURE__ */ jsx28("span", { className: "text-xs", children: "Refresh" })
|
|
7501
7928
|
] })
|
|
7502
7929
|
] }),
|
|
7503
|
-
/* @__PURE__ */
|
|
7504
|
-
/* @__PURE__ */
|
|
7505
|
-
/* @__PURE__ */
|
|
7506
|
-
/* @__PURE__ */
|
|
7930
|
+
/* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
7931
|
+
/* @__PURE__ */ jsx28("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "UO Hash" }),
|
|
7932
|
+
/* @__PURE__ */ jsx28("code", { className: "text-xs font-mono flex-1 select-all", children: userOpHash }),
|
|
7933
|
+
/* @__PURE__ */ jsx28(
|
|
7507
7934
|
Button,
|
|
7508
7935
|
{
|
|
7509
7936
|
variant: "ghost",
|
|
@@ -7515,14 +7942,14 @@ var UserOpStatus = ({
|
|
|
7515
7942
|
} catch {
|
|
7516
7943
|
}
|
|
7517
7944
|
},
|
|
7518
|
-
children: /* @__PURE__ */
|
|
7945
|
+
children: /* @__PURE__ */ jsx28(Copy3, { className: "h-3.5 w-3.5" })
|
|
7519
7946
|
}
|
|
7520
7947
|
)
|
|
7521
7948
|
] }),
|
|
7522
|
-
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */
|
|
7523
|
-
/* @__PURE__ */
|
|
7524
|
-
/* @__PURE__ */
|
|
7525
|
-
/* @__PURE__ */
|
|
7949
|
+
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
7950
|
+
/* @__PURE__ */ jsx28("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "Tx Hash" }),
|
|
7951
|
+
/* @__PURE__ */ jsx28("code", { className: "text-xs font-mono flex-1 select-all", children: receipt.receipt.transactionHash }),
|
|
7952
|
+
/* @__PURE__ */ jsx28(
|
|
7526
7953
|
Button,
|
|
7527
7954
|
{
|
|
7528
7955
|
variant: "ghost",
|
|
@@ -7534,10 +7961,10 @@ var UserOpStatus = ({
|
|
|
7534
7961
|
} catch {
|
|
7535
7962
|
}
|
|
7536
7963
|
},
|
|
7537
|
-
children: /* @__PURE__ */
|
|
7964
|
+
children: /* @__PURE__ */ jsx28(Copy3, { className: "h-3.5 w-3.5" })
|
|
7538
7965
|
}
|
|
7539
7966
|
),
|
|
7540
|
-
chain?.blockExplorers?.default?.url && /* @__PURE__ */
|
|
7967
|
+
chain?.blockExplorers?.default?.url && /* @__PURE__ */ jsx28(
|
|
7541
7968
|
"a",
|
|
7542
7969
|
{
|
|
7543
7970
|
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
@@ -7545,11 +7972,11 @@ var UserOpStatus = ({
|
|
|
7545
7972
|
rel: "noreferrer noopener",
|
|
7546
7973
|
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
7547
7974
|
title: "Open in explorer",
|
|
7548
|
-
children: /* @__PURE__ */
|
|
7975
|
+
children: /* @__PURE__ */ jsx28(ExternalLink4, { className: "h-3.5 w-3.5" })
|
|
7549
7976
|
}
|
|
7550
7977
|
)
|
|
7551
7978
|
] }),
|
|
7552
|
-
receipt && /* @__PURE__ */
|
|
7979
|
+
receipt && /* @__PURE__ */ jsxs19("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
7553
7980
|
"Block ",
|
|
7554
7981
|
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
7555
7982
|
" \u2022 Gas Used",
|
|
@@ -7558,32 +7985,32 @@ var UserOpStatus = ({
|
|
|
7558
7985
|
" \u2022 Success ",
|
|
7559
7986
|
String(!!receipt.success)
|
|
7560
7987
|
] }),
|
|
7561
|
-
/* @__PURE__ */
|
|
7988
|
+
/* @__PURE__ */ jsx28("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ jsxs19("span", { className: "ml-2", children: [
|
|
7562
7989
|
"\u2022 Polling for ",
|
|
7563
7990
|
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
7564
7991
|
"s"
|
|
7565
7992
|
] }) }),
|
|
7566
|
-
mempool && /* @__PURE__ */
|
|
7567
|
-
/* @__PURE__ */
|
|
7993
|
+
mempool && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
7994
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
7568
7995
|
"Seen by bundler at ",
|
|
7569
|
-
/* @__PURE__ */
|
|
7996
|
+
/* @__PURE__ */ jsx28(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
7570
7997
|
] }),
|
|
7571
|
-
/* @__PURE__ */
|
|
7998
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
7572
7999
|
"sender ",
|
|
7573
|
-
/* @__PURE__ */
|
|
8000
|
+
/* @__PURE__ */ jsx28(Address, { address: mempool.sender, chain, truncate: false })
|
|
7574
8001
|
] })
|
|
7575
8002
|
] }),
|
|
7576
|
-
error && /* @__PURE__ */
|
|
7577
|
-
/* @__PURE__ */
|
|
8003
|
+
error && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8004
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-4 w-4" }),
|
|
7578
8005
|
" ",
|
|
7579
8006
|
error
|
|
7580
8007
|
] }),
|
|
7581
|
-
rejected && /* @__PURE__ */
|
|
7582
|
-
/* @__PURE__ */
|
|
8008
|
+
rejected && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8009
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-4 w-4" }),
|
|
7583
8010
|
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
7584
8011
|
] }),
|
|
7585
|
-
timedOut && /* @__PURE__ */
|
|
7586
|
-
/* @__PURE__ */
|
|
8012
|
+
timedOut && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8013
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-4 w-4" }),
|
|
7587
8014
|
"Stopped polling after ",
|
|
7588
8015
|
Math.round(maxPollTimeMs / 1e3),
|
|
7589
8016
|
"s. UserOperation may have been rejected by the bundler."
|
|
@@ -7595,7 +8022,7 @@ var UserOpStatus = ({
|
|
|
7595
8022
|
|
|
7596
8023
|
// src/internal/components/SendModal.tsx
|
|
7597
8024
|
init_base();
|
|
7598
|
-
import { jsx as
|
|
8025
|
+
import { jsx as jsx29, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
7599
8026
|
var SendModal = ({
|
|
7600
8027
|
open,
|
|
7601
8028
|
onOpenChange,
|
|
@@ -7612,13 +8039,13 @@ var SendModal = ({
|
|
|
7612
8039
|
address,
|
|
7613
8040
|
chainId: lumiaBeam.id
|
|
7614
8041
|
});
|
|
7615
|
-
const [recipient, setRecipient] =
|
|
7616
|
-
const [amount, setAmount] =
|
|
7617
|
-
const [txStep, setTxStep] =
|
|
7618
|
-
const [validationError, setValidationError] =
|
|
8042
|
+
const [recipient, setRecipient] = useState13(initialRecipient);
|
|
8043
|
+
const [amount, setAmount] = useState13(initialAmount);
|
|
8044
|
+
const [txStep, setTxStep] = useState13("input");
|
|
8045
|
+
const [validationError, setValidationError] = useState13(null);
|
|
7619
8046
|
const nativeAsset = assets.find((a) => a.type === "native");
|
|
7620
8047
|
const balance = nativeAsset ? parseFloat(nativeAsset.formattedBalance) : 0;
|
|
7621
|
-
|
|
8048
|
+
useEffect10(() => {
|
|
7622
8049
|
if (open) {
|
|
7623
8050
|
setTxStep("input");
|
|
7624
8051
|
setValidationError(null);
|
|
@@ -7678,7 +8105,7 @@ var SendModal = ({
|
|
|
7678
8105
|
const maxAmount = Math.max(0, balance - 1e-3);
|
|
7679
8106
|
setAmount(maxAmount.toFixed(6));
|
|
7680
8107
|
};
|
|
7681
|
-
return /* @__PURE__ */
|
|
8108
|
+
return /* @__PURE__ */ jsx29(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs20(
|
|
7682
8109
|
DialogContent,
|
|
7683
8110
|
{
|
|
7684
8111
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7690,28 +8117,28 @@ var SendModal = ({
|
|
|
7690
8117
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7691
8118
|
},
|
|
7692
8119
|
children: [
|
|
7693
|
-
/* @__PURE__ */
|
|
7694
|
-
/* @__PURE__ */
|
|
7695
|
-
/* @__PURE__ */
|
|
7696
|
-
onBack && txStep === "input" && /* @__PURE__ */
|
|
8120
|
+
/* @__PURE__ */ jsx29(VisuallyHidden, { children: /* @__PURE__ */ jsx29(DialogTitle, { children: "Send Transaction" }) }),
|
|
8121
|
+
/* @__PURE__ */ jsx29(DialogDescription, { className: "sr-only", children: "Send LUMIA tokens to another address" }),
|
|
8122
|
+
/* @__PURE__ */ jsx29("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
|
|
8123
|
+
onBack && txStep === "input" && /* @__PURE__ */ jsx29(
|
|
7697
8124
|
"button",
|
|
7698
8125
|
{
|
|
7699
8126
|
onClick: onBack,
|
|
7700
8127
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7701
8128
|
title: "Back",
|
|
7702
|
-
children: /* @__PURE__ */
|
|
8129
|
+
children: /* @__PURE__ */ jsx29(ArrowLeft7, { className: "h-4 w-4" })
|
|
7703
8130
|
}
|
|
7704
8131
|
),
|
|
7705
|
-
/* @__PURE__ */
|
|
7706
|
-
/* @__PURE__ */
|
|
7707
|
-
/* @__PURE__ */
|
|
8132
|
+
/* @__PURE__ */ jsxs20("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8133
|
+
/* @__PURE__ */ jsx29(Send, { className: "h-5 w-5" }),
|
|
8134
|
+
/* @__PURE__ */ jsx29("span", { children: "Send LUMIA" })
|
|
7708
8135
|
] })
|
|
7709
8136
|
] }) }),
|
|
7710
|
-
/* @__PURE__ */
|
|
7711
|
-
txStep === "input" && /* @__PURE__ */
|
|
7712
|
-
/* @__PURE__ */
|
|
7713
|
-
/* @__PURE__ */
|
|
7714
|
-
/* @__PURE__ */
|
|
8137
|
+
/* @__PURE__ */ jsxs20("div", { className: "p-5", children: [
|
|
8138
|
+
txStep === "input" && /* @__PURE__ */ jsxs20("div", { className: "space-y-4", children: [
|
|
8139
|
+
/* @__PURE__ */ jsxs20("div", { children: [
|
|
8140
|
+
/* @__PURE__ */ jsx29("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Recipient Address" }),
|
|
8141
|
+
/* @__PURE__ */ jsx29(
|
|
7715
8142
|
"input",
|
|
7716
8143
|
{
|
|
7717
8144
|
type: "text",
|
|
@@ -7722,17 +8149,17 @@ var SendModal = ({
|
|
|
7722
8149
|
}
|
|
7723
8150
|
)
|
|
7724
8151
|
] }),
|
|
7725
|
-
/* @__PURE__ */
|
|
7726
|
-
/* @__PURE__ */
|
|
7727
|
-
/* @__PURE__ */
|
|
7728
|
-
/* @__PURE__ */
|
|
8152
|
+
/* @__PURE__ */ jsxs20("div", { children: [
|
|
8153
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between items-center mb-2", children: [
|
|
8154
|
+
/* @__PURE__ */ jsx29("label", { className: `text-sm font-medium ${theme.bodyText}`, children: "Amount" }),
|
|
8155
|
+
/* @__PURE__ */ jsxs20("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
7729
8156
|
"Balance: ",
|
|
7730
8157
|
balance.toFixed(4),
|
|
7731
8158
|
" LUMIA"
|
|
7732
8159
|
] })
|
|
7733
8160
|
] }),
|
|
7734
|
-
/* @__PURE__ */
|
|
7735
|
-
/* @__PURE__ */
|
|
8161
|
+
/* @__PURE__ */ jsxs20("div", { className: "relative", children: [
|
|
8162
|
+
/* @__PURE__ */ jsx29(
|
|
7736
8163
|
"input",
|
|
7737
8164
|
{
|
|
7738
8165
|
type: "number",
|
|
@@ -7743,7 +8170,7 @@ var SendModal = ({
|
|
|
7743
8170
|
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`
|
|
7744
8171
|
}
|
|
7745
8172
|
),
|
|
7746
|
-
/* @__PURE__ */
|
|
8173
|
+
/* @__PURE__ */ jsx29(
|
|
7747
8174
|
"button",
|
|
7748
8175
|
{
|
|
7749
8176
|
onClick: handleMaxAmount,
|
|
@@ -7753,11 +8180,11 @@ var SendModal = ({
|
|
|
7753
8180
|
)
|
|
7754
8181
|
] })
|
|
7755
8182
|
] }),
|
|
7756
|
-
(validationError || error) && /* @__PURE__ */
|
|
7757
|
-
/* @__PURE__ */
|
|
7758
|
-
/* @__PURE__ */
|
|
8183
|
+
(validationError || error) && /* @__PURE__ */ jsxs20("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: [
|
|
8184
|
+
/* @__PURE__ */ jsx29(AlertCircle5, { className: "h-4 w-4" }),
|
|
8185
|
+
/* @__PURE__ */ jsx29("span", { className: "text-sm", children: validationError || error })
|
|
7759
8186
|
] }),
|
|
7760
|
-
/* @__PURE__ */
|
|
8187
|
+
/* @__PURE__ */ jsx29(
|
|
7761
8188
|
Button,
|
|
7762
8189
|
{
|
|
7763
8190
|
onClick: handleSend,
|
|
@@ -7768,29 +8195,29 @@ var SendModal = ({
|
|
|
7768
8195
|
}
|
|
7769
8196
|
)
|
|
7770
8197
|
] }),
|
|
7771
|
-
txStep === "confirm" && /* @__PURE__ */
|
|
7772
|
-
/* @__PURE__ */
|
|
7773
|
-
/* @__PURE__ */
|
|
7774
|
-
/* @__PURE__ */
|
|
7775
|
-
/* @__PURE__ */
|
|
7776
|
-
/* @__PURE__ */
|
|
7777
|
-
/* @__PURE__ */
|
|
8198
|
+
txStep === "confirm" && /* @__PURE__ */ jsxs20("div", { className: "space-y-4", children: [
|
|
8199
|
+
/* @__PURE__ */ jsxs20("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8200
|
+
/* @__PURE__ */ jsx29("h3", { className: `font-medium ${theme.titleText} mb-3`, children: "Transaction Details" }),
|
|
8201
|
+
/* @__PURE__ */ jsxs20("div", { className: "space-y-2 text-sm", children: [
|
|
8202
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between", children: [
|
|
8203
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.bodyText}`, children: "To:" }),
|
|
8204
|
+
/* @__PURE__ */ jsx29("span", { className: `font-mono ${theme.titleText}`, children: `${recipient.slice(0, 6)}...${recipient.slice(-4)}` })
|
|
7778
8205
|
] }),
|
|
7779
|
-
/* @__PURE__ */
|
|
7780
|
-
/* @__PURE__ */
|
|
7781
|
-
/* @__PURE__ */
|
|
8206
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between", children: [
|
|
8207
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.bodyText}`, children: "Amount:" }),
|
|
8208
|
+
/* @__PURE__ */ jsxs20("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
7782
8209
|
amount,
|
|
7783
8210
|
" LUMIA"
|
|
7784
8211
|
] })
|
|
7785
8212
|
] }),
|
|
7786
|
-
/* @__PURE__ */
|
|
7787
|
-
/* @__PURE__ */
|
|
7788
|
-
/* @__PURE__ */
|
|
8213
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between", children: [
|
|
8214
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.bodyText}`, children: "Network:" }),
|
|
8215
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.titleText}`, children: "Lumia Beam" })
|
|
7789
8216
|
] })
|
|
7790
8217
|
] })
|
|
7791
8218
|
] }),
|
|
7792
|
-
/* @__PURE__ */
|
|
7793
|
-
/* @__PURE__ */
|
|
8219
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex gap-2", children: [
|
|
8220
|
+
/* @__PURE__ */ jsx29(
|
|
7794
8221
|
Button,
|
|
7795
8222
|
{
|
|
7796
8223
|
onClick: () => setTxStep("input"),
|
|
@@ -7800,7 +8227,7 @@ var SendModal = ({
|
|
|
7800
8227
|
children: "Back"
|
|
7801
8228
|
}
|
|
7802
8229
|
),
|
|
7803
|
-
/* @__PURE__ */
|
|
8230
|
+
/* @__PURE__ */ jsxs20(
|
|
7804
8231
|
Button,
|
|
7805
8232
|
{
|
|
7806
8233
|
onClick: handleConfirm,
|
|
@@ -7808,28 +8235,28 @@ var SendModal = ({
|
|
|
7808
8235
|
className: "flex-1",
|
|
7809
8236
|
size: "lg",
|
|
7810
8237
|
children: [
|
|
7811
|
-
isLoading && /* @__PURE__ */
|
|
8238
|
+
isLoading && /* @__PURE__ */ jsx29(Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
7812
8239
|
"Confirm"
|
|
7813
8240
|
]
|
|
7814
8241
|
}
|
|
7815
8242
|
)
|
|
7816
8243
|
] })
|
|
7817
8244
|
] }),
|
|
7818
|
-
txStep === "pending" && /* @__PURE__ */
|
|
7819
|
-
/* @__PURE__ */
|
|
7820
|
-
/* @__PURE__ */
|
|
7821
|
-
/* @__PURE__ */
|
|
7822
|
-
/* @__PURE__ */
|
|
8245
|
+
txStep === "pending" && /* @__PURE__ */ jsxs20("div", { className: "py-8 text-center space-y-4", children: [
|
|
8246
|
+
/* @__PURE__ */ jsx29(Loader2, { className: `h-12 w-12 animate-spin ${isDark ? "text-blue-400" : "text-blue-600"} mx-auto` }),
|
|
8247
|
+
/* @__PURE__ */ jsxs20("div", { children: [
|
|
8248
|
+
/* @__PURE__ */ jsx29("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Pending" }),
|
|
8249
|
+
/* @__PURE__ */ jsx29("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Please wait while we process your transaction" })
|
|
7823
8250
|
] })
|
|
7824
8251
|
] }),
|
|
7825
|
-
txStep === "success" && userOpHash && /* @__PURE__ */
|
|
7826
|
-
/* @__PURE__ */
|
|
7827
|
-
/* @__PURE__ */
|
|
7828
|
-
/* @__PURE__ */
|
|
7829
|
-
/* @__PURE__ */
|
|
8252
|
+
txStep === "success" && userOpHash && /* @__PURE__ */ jsxs20("div", { className: "space-y-4", children: [
|
|
8253
|
+
/* @__PURE__ */ jsxs20("div", { className: "text-center py-4", children: [
|
|
8254
|
+
/* @__PURE__ */ jsx29(CheckCircle27, { className: `h-12 w-12 ${isDark ? "text-green-400" : "text-green-500"} mx-auto mb-3` }),
|
|
8255
|
+
/* @__PURE__ */ jsx29("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Sent!" }),
|
|
8256
|
+
/* @__PURE__ */ jsx29("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Your transaction is being processed" })
|
|
7830
8257
|
] }),
|
|
7831
|
-
/* @__PURE__ */
|
|
7832
|
-
/* @__PURE__ */
|
|
8258
|
+
/* @__PURE__ */ jsx29("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: /* @__PURE__ */ jsx29(UserOpStatus, { userOpHash, chain: lumiaBeam }) }),
|
|
8259
|
+
/* @__PURE__ */ jsx29(
|
|
7833
8260
|
Button,
|
|
7834
8261
|
{
|
|
7835
8262
|
onClick: handleClose,
|
|
@@ -7846,21 +8273,21 @@ var SendModal = ({
|
|
|
7846
8273
|
};
|
|
7847
8274
|
|
|
7848
8275
|
// src/internal/components/ReceiveModal.tsx
|
|
7849
|
-
import { useState as
|
|
7850
|
-
import { QrCode, Copy as Copy4, ArrowLeft as ArrowLeft8, CheckCircle2 as
|
|
8276
|
+
import { useState as useState14, useEffect as useEffect11 } from "react";
|
|
8277
|
+
import { QrCode, Copy as Copy4, ArrowLeft as ArrowLeft8, CheckCircle2 as CheckCircle28 } from "lucide-react";
|
|
7851
8278
|
import QRCode from "qrcode";
|
|
7852
|
-
import { Fragment as
|
|
8279
|
+
import { Fragment as Fragment7, jsx as jsx30, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
7853
8280
|
var ReceiveModal = ({
|
|
7854
8281
|
open,
|
|
7855
8282
|
onOpenChange,
|
|
7856
8283
|
onBack
|
|
7857
8284
|
}) => {
|
|
7858
8285
|
const { address } = useLumiaSession();
|
|
7859
|
-
const [qrCodeUrl, setQrCodeUrl] =
|
|
8286
|
+
const [qrCodeUrl, setQrCodeUrl] = useState14("");
|
|
7860
8287
|
const { config } = useLumiaPassportConfig();
|
|
7861
8288
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7862
|
-
const [copied, setCopied] =
|
|
7863
|
-
|
|
8289
|
+
const [copied, setCopied] = useState14(false);
|
|
8290
|
+
useEffect11(() => {
|
|
7864
8291
|
if (open && address) {
|
|
7865
8292
|
QRCode.toDataURL(address, {
|
|
7866
8293
|
width: 200,
|
|
@@ -7890,7 +8317,7 @@ var ReceiveModal = ({
|
|
|
7890
8317
|
if (!addr) return "";
|
|
7891
8318
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7892
8319
|
};
|
|
7893
|
-
return /* @__PURE__ */
|
|
8320
|
+
return /* @__PURE__ */ jsx30(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs21(
|
|
7894
8321
|
DialogContent,
|
|
7895
8322
|
{
|
|
7896
8323
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7902,51 +8329,51 @@ var ReceiveModal = ({
|
|
|
7902
8329
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7903
8330
|
},
|
|
7904
8331
|
children: [
|
|
7905
|
-
/* @__PURE__ */
|
|
7906
|
-
/* @__PURE__ */
|
|
7907
|
-
/* @__PURE__ */
|
|
7908
|
-
onBack && /* @__PURE__ */
|
|
8332
|
+
/* @__PURE__ */ jsx30(VisuallyHidden, { children: /* @__PURE__ */ jsx30(DialogTitle, { children: "Receive LUMIA" }) }),
|
|
8333
|
+
/* @__PURE__ */ jsx30(DialogDescription, { className: "sr-only", children: "Your wallet address and QR code for receiving LUMIA" }),
|
|
8334
|
+
/* @__PURE__ */ jsx30("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-2", children: [
|
|
8335
|
+
onBack && /* @__PURE__ */ jsx30(
|
|
7909
8336
|
"button",
|
|
7910
8337
|
{
|
|
7911
8338
|
onClick: onBack,
|
|
7912
8339
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7913
8340
|
title: "Back",
|
|
7914
|
-
children: /* @__PURE__ */
|
|
8341
|
+
children: /* @__PURE__ */ jsx30(ArrowLeft8, { className: "h-4 w-4" })
|
|
7915
8342
|
}
|
|
7916
8343
|
),
|
|
7917
|
-
/* @__PURE__ */
|
|
7918
|
-
/* @__PURE__ */
|
|
7919
|
-
/* @__PURE__ */
|
|
8344
|
+
/* @__PURE__ */ jsxs21("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8345
|
+
/* @__PURE__ */ jsx30(QrCode, { className: "h-5 w-5" }),
|
|
8346
|
+
/* @__PURE__ */ jsx30("span", { children: "Receive LUMIA" })
|
|
7920
8347
|
] })
|
|
7921
8348
|
] }) }),
|
|
7922
|
-
/* @__PURE__ */
|
|
7923
|
-
qrCodeUrl && /* @__PURE__ */
|
|
7924
|
-
/* @__PURE__ */
|
|
7925
|
-
/* @__PURE__ */
|
|
7926
|
-
/* @__PURE__ */
|
|
8349
|
+
/* @__PURE__ */ jsxs21("div", { className: "p-5 space-y-4", children: [
|
|
8350
|
+
qrCodeUrl && /* @__PURE__ */ jsx30("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx30("div", { className: `${isDark ? "bg-white" : "bg-white"} p-4 rounded-xl border ${theme.divider}`, children: /* @__PURE__ */ jsx30("img", { src: qrCodeUrl, alt: "Wallet QR Code", className: "w-48 h-48" }) }) }),
|
|
8351
|
+
/* @__PURE__ */ jsx30("div", { className: `${isDark ? "bg-blue-900/30 border-blue-600" : "bg-blue-50 border-blue-200"} rounded-lg p-3`, children: /* @__PURE__ */ jsx30("div", { className: `flex items-center gap-2 ${isDark ? "text-blue-300" : "text-blue-700"} text-sm`, children: /* @__PURE__ */ jsxs21("div", { className: "flex-1", children: [
|
|
8352
|
+
/* @__PURE__ */ jsx30("p", { className: "font-medium", children: "Network: Lumia Beam" }),
|
|
8353
|
+
/* @__PURE__ */ jsx30("p", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} mt-0.5`, children: "Ensure sender is on the same network" })
|
|
7927
8354
|
] }) }) }),
|
|
7928
|
-
/* @__PURE__ */
|
|
7929
|
-
/* @__PURE__ */
|
|
7930
|
-
/* @__PURE__ */
|
|
7931
|
-
/* @__PURE__ */
|
|
8355
|
+
/* @__PURE__ */ jsxs21("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8356
|
+
/* @__PURE__ */ jsx30("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Your Wallet Address" }),
|
|
8357
|
+
/* @__PURE__ */ jsx30("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx30("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 }) }),
|
|
8358
|
+
/* @__PURE__ */ jsx30(
|
|
7932
8359
|
Button,
|
|
7933
8360
|
{
|
|
7934
8361
|
onClick: handleCopy,
|
|
7935
8362
|
className: "w-full mt-3",
|
|
7936
8363
|
size: "lg",
|
|
7937
|
-
children: copied ? /* @__PURE__ */
|
|
7938
|
-
/* @__PURE__ */
|
|
7939
|
-
/* @__PURE__ */
|
|
7940
|
-
] }) : /* @__PURE__ */
|
|
7941
|
-
/* @__PURE__ */
|
|
7942
|
-
/* @__PURE__ */
|
|
8364
|
+
children: copied ? /* @__PURE__ */ jsxs21(Fragment7, { children: [
|
|
8365
|
+
/* @__PURE__ */ jsx30(CheckCircle28, { className: "h-4 w-4" }),
|
|
8366
|
+
/* @__PURE__ */ jsx30("span", { children: "Copied!" })
|
|
8367
|
+
] }) : /* @__PURE__ */ jsxs21(Fragment7, { children: [
|
|
8368
|
+
/* @__PURE__ */ jsx30(Copy4, { className: "h-4 w-4" }),
|
|
8369
|
+
/* @__PURE__ */ jsx30("span", { children: "Copy Address" })
|
|
7943
8370
|
] })
|
|
7944
8371
|
}
|
|
7945
8372
|
)
|
|
7946
8373
|
] }),
|
|
7947
|
-
/* @__PURE__ */
|
|
7948
|
-
/* @__PURE__ */
|
|
7949
|
-
/* @__PURE__ */
|
|
8374
|
+
/* @__PURE__ */ jsxs21("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
8375
|
+
/* @__PURE__ */ jsx30("p", { children: "Share this address to receive LUMIA tokens." }),
|
|
8376
|
+
/* @__PURE__ */ jsx30("p", { className: "mt-1", children: "Only send LUMIA tokens to this address on Lumia Beam network." })
|
|
7950
8377
|
] })
|
|
7951
8378
|
] })
|
|
7952
8379
|
]
|
|
@@ -7956,11 +8383,11 @@ var ReceiveModal = ({
|
|
|
7956
8383
|
|
|
7957
8384
|
// src/internal/components/BuyModal.tsx
|
|
7958
8385
|
import { CreditCard, ArrowLeft as ArrowLeft9 } from "lucide-react";
|
|
7959
|
-
import { jsx as
|
|
8386
|
+
import { jsx as jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
7960
8387
|
var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
7961
8388
|
const { config } = useLumiaPassportConfig();
|
|
7962
8389
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7963
|
-
return /* @__PURE__ */
|
|
8390
|
+
return /* @__PURE__ */ jsx31(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs22(
|
|
7964
8391
|
DialogContent,
|
|
7965
8392
|
{
|
|
7966
8393
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7972,26 +8399,26 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7972
8399
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7973
8400
|
},
|
|
7974
8401
|
children: [
|
|
7975
|
-
/* @__PURE__ */
|
|
7976
|
-
/* @__PURE__ */
|
|
7977
|
-
/* @__PURE__ */
|
|
7978
|
-
onBack && /* @__PURE__ */
|
|
8402
|
+
/* @__PURE__ */ jsx31(VisuallyHidden, { children: /* @__PURE__ */ jsx31(DialogTitle, { children: "Buy Crypto" }) }),
|
|
8403
|
+
/* @__PURE__ */ jsx31(DialogDescription, { className: "sr-only", children: "On-ramp placeholder" }),
|
|
8404
|
+
/* @__PURE__ */ jsx31("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2", children: [
|
|
8405
|
+
onBack && /* @__PURE__ */ jsx31(
|
|
7979
8406
|
"button",
|
|
7980
8407
|
{
|
|
7981
8408
|
onClick: onBack,
|
|
7982
8409
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7983
8410
|
title: "Back",
|
|
7984
|
-
children: /* @__PURE__ */
|
|
8411
|
+
children: /* @__PURE__ */ jsx31(ArrowLeft9, { className: "h-4 w-4" })
|
|
7985
8412
|
}
|
|
7986
8413
|
),
|
|
7987
|
-
/* @__PURE__ */
|
|
7988
|
-
/* @__PURE__ */
|
|
7989
|
-
/* @__PURE__ */
|
|
8414
|
+
/* @__PURE__ */ jsxs22("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8415
|
+
/* @__PURE__ */ jsx31(CreditCard, { className: "h-5 w-5" }),
|
|
8416
|
+
/* @__PURE__ */ jsx31("span", { children: "Buy" })
|
|
7990
8417
|
] })
|
|
7991
8418
|
] }) }),
|
|
7992
|
-
/* @__PURE__ */
|
|
7993
|
-
/* @__PURE__ */
|
|
7994
|
-
/* @__PURE__ */
|
|
8419
|
+
/* @__PURE__ */ jsxs22("div", { className: "p-5", children: [
|
|
8420
|
+
/* @__PURE__ */ jsx31("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ jsx31("div", { className: `text-sm ${theme.mutedText}`, children: "On-ramp coming soon\u2026" }) }),
|
|
8421
|
+
/* @__PURE__ */ jsx31("div", { className: "pt-4", children: /* @__PURE__ */ jsx31(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
7995
8422
|
] })
|
|
7996
8423
|
]
|
|
7997
8424
|
}
|
|
@@ -8000,13 +8427,13 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8000
8427
|
|
|
8001
8428
|
// src/internal/components/KycModal.tsx
|
|
8002
8429
|
import { ShieldCheck, ArrowLeft as ArrowLeft10 } from "lucide-react";
|
|
8003
|
-
import { jsx as
|
|
8430
|
+
import { jsx as jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
8004
8431
|
var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
8005
8432
|
const { config } = useLumiaPassportConfig();
|
|
8006
8433
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
8007
8434
|
const provider = config.kyc?.provider;
|
|
8008
8435
|
const options = config.kyc?.options || {};
|
|
8009
|
-
return /* @__PURE__ */
|
|
8436
|
+
return /* @__PURE__ */ jsx32(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs23(
|
|
8010
8437
|
DialogContent,
|
|
8011
8438
|
{
|
|
8012
8439
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8018,32 +8445,32 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8018
8445
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8019
8446
|
},
|
|
8020
8447
|
children: [
|
|
8021
|
-
/* @__PURE__ */
|
|
8022
|
-
/* @__PURE__ */
|
|
8023
|
-
/* @__PURE__ */
|
|
8024
|
-
onBack && /* @__PURE__ */
|
|
8448
|
+
/* @__PURE__ */ jsx32(VisuallyHidden, { children: /* @__PURE__ */ jsx32(DialogTitle, { children: "KYC" }) }),
|
|
8449
|
+
/* @__PURE__ */ jsx32(DialogDescription, { className: "sr-only", children: "KYC placeholder" }),
|
|
8450
|
+
/* @__PURE__ */ jsx32("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2", children: [
|
|
8451
|
+
onBack && /* @__PURE__ */ jsx32(
|
|
8025
8452
|
"button",
|
|
8026
8453
|
{
|
|
8027
8454
|
onClick: onBack,
|
|
8028
8455
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8029
8456
|
title: "Back",
|
|
8030
|
-
children: /* @__PURE__ */
|
|
8457
|
+
children: /* @__PURE__ */ jsx32(ArrowLeft10, { className: "h-4 w-4" })
|
|
8031
8458
|
}
|
|
8032
8459
|
),
|
|
8033
|
-
/* @__PURE__ */
|
|
8034
|
-
/* @__PURE__ */
|
|
8035
|
-
/* @__PURE__ */
|
|
8460
|
+
/* @__PURE__ */ jsxs23("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8461
|
+
/* @__PURE__ */ jsx32(ShieldCheck, { className: "h-5 w-5" }),
|
|
8462
|
+
/* @__PURE__ */ jsx32("span", { children: "KYC" })
|
|
8036
8463
|
] })
|
|
8037
8464
|
] }) }),
|
|
8038
|
-
/* @__PURE__ */
|
|
8039
|
-
provider ? /* @__PURE__ */
|
|
8040
|
-
/* @__PURE__ */
|
|
8465
|
+
/* @__PURE__ */ jsxs23("div", { className: "p-5", children: [
|
|
8466
|
+
provider ? /* @__PURE__ */ jsxs23("div", { className: `rounded-xl p-4 ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: [
|
|
8467
|
+
/* @__PURE__ */ jsxs23("div", { className: `text-sm ${theme.titleText} mb-2`, children: [
|
|
8041
8468
|
"KYC provider: ",
|
|
8042
|
-
/* @__PURE__ */
|
|
8469
|
+
/* @__PURE__ */ jsx32("span", { className: "font-medium", children: provider })
|
|
8043
8470
|
] }),
|
|
8044
|
-
Object.keys(options).length > 0 ? /* @__PURE__ */
|
|
8045
|
-
] }) : /* @__PURE__ */
|
|
8046
|
-
/* @__PURE__ */
|
|
8471
|
+
Object.keys(options).length > 0 ? /* @__PURE__ */ jsx32("div", { className: `text-xs ${theme.mutedText} break-words whitespace-pre-wrap`, children: JSON.stringify(options, null, 2) }) : /* @__PURE__ */ jsx32("div", { className: `text-sm ${theme.mutedText}`, children: "No provider options configured." })
|
|
8472
|
+
] }) : /* @__PURE__ */ jsx32("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ jsx32("div", { className: `text-sm ${theme.mutedText}`, children: "KYC verification coming soon\u2026" }) }),
|
|
8473
|
+
/* @__PURE__ */ jsx32("div", { className: "pt-4", children: /* @__PURE__ */ jsx32(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
8047
8474
|
] })
|
|
8048
8475
|
]
|
|
8049
8476
|
}
|
|
@@ -8052,20 +8479,20 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8052
8479
|
|
|
8053
8480
|
// src/components/ConnectWalletButton.tsx
|
|
8054
8481
|
init_auth();
|
|
8055
|
-
import { Cloud as
|
|
8482
|
+
import { Cloud as Cloud4, Laptop as Laptop2, Shield as Shield5, Copy as Copy5, ArrowUp, ArrowDown, Plus as Plus2, Activity as Activity2, Gem as Gem2, CreditCard as CreditCard2, Lock as Lock3, ArrowUpRight as ArrowUpRight2, AlertTriangle as AlertTriangle4, ShieldCheck as ShieldCheck2 } from "lucide-react";
|
|
8056
8483
|
init_base();
|
|
8057
8484
|
|
|
8058
8485
|
// src/modules/linkedProfiles.ts
|
|
8059
8486
|
init_common();
|
|
8060
8487
|
init_types();
|
|
8061
8488
|
init_auth();
|
|
8062
|
-
import * as
|
|
8489
|
+
import * as React27 from "react";
|
|
8063
8490
|
function useLumiaPassportLinkedProfiles() {
|
|
8064
|
-
const [profiles, setProfiles] =
|
|
8065
|
-
const [avatar, setAvatar] =
|
|
8066
|
-
const [isLoading, setIsLoading] =
|
|
8067
|
-
const [error, setError] =
|
|
8068
|
-
const load =
|
|
8491
|
+
const [profiles, setProfiles] = React27.useState([]);
|
|
8492
|
+
const [avatar, setAvatar] = React27.useState(null);
|
|
8493
|
+
const [isLoading, setIsLoading] = React27.useState(false);
|
|
8494
|
+
const [error, setError] = React27.useState(null);
|
|
8495
|
+
const load = React27.useCallback(async () => {
|
|
8069
8496
|
setIsLoading(true);
|
|
8070
8497
|
setError(null);
|
|
8071
8498
|
try {
|
|
@@ -8091,14 +8518,14 @@ function useLumiaPassportLinkedProfiles() {
|
|
|
8091
8518
|
setIsLoading(false);
|
|
8092
8519
|
}
|
|
8093
8520
|
}, []);
|
|
8094
|
-
|
|
8521
|
+
React27.useEffect(() => {
|
|
8095
8522
|
load();
|
|
8096
8523
|
}, [load]);
|
|
8097
8524
|
return { profiles, avatar, isLoading, error, refresh: load };
|
|
8098
8525
|
}
|
|
8099
8526
|
|
|
8100
8527
|
// src/components/ConnectWalletButton.tsx
|
|
8101
|
-
import { jsx as
|
|
8528
|
+
import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
8102
8529
|
var ConnectWalletButton = ({
|
|
8103
8530
|
className,
|
|
8104
8531
|
label = "Connect Wallet",
|
|
@@ -8110,7 +8537,7 @@ var ConnectWalletButton = ({
|
|
|
8110
8537
|
}) => {
|
|
8111
8538
|
console.log("[ConnectWalletButton] Component rendering");
|
|
8112
8539
|
const { config, callbacks: contextCallbacks } = useLumiaPassportConfig();
|
|
8113
|
-
const callbacks =
|
|
8540
|
+
const callbacks = React28.useMemo(() => ({
|
|
8114
8541
|
onLumiaPassportConnecting: buttonCallbacks?.onLumiaPassportConnecting ?? contextCallbacks?.onLumiaPassportConnecting,
|
|
8115
8542
|
onLumiaPassportConnect: buttonCallbacks?.onLumiaPassportConnect ?? contextCallbacks?.onLumiaPassportConnect,
|
|
8116
8543
|
onLumiaPassportAccount: buttonCallbacks?.onLumiaPassportAccount ?? contextCallbacks?.onLumiaPassportAccount,
|
|
@@ -8128,14 +8555,14 @@ var ConnectWalletButton = ({
|
|
|
8128
8555
|
isAuthenticated: jwtTokenManager2.isAuthenticated?.(),
|
|
8129
8556
|
hasTokens: !!jwtTokenManager2.getTokens()
|
|
8130
8557
|
});
|
|
8131
|
-
|
|
8558
|
+
React28.useEffect(() => {
|
|
8132
8559
|
if (!profilesLoading && profiles.length > 0) {
|
|
8133
8560
|
console.log("[ConnectWalletButton] Profiles loaded:", profiles.map((p) => ({ provider: p.provider, externalId: p.externalId })));
|
|
8134
8561
|
const hasEmail = profiles.some((p) => p.provider?.toLowerCase() === "email");
|
|
8135
8562
|
console.log("[ConnectWalletButton] Has email provider:", hasEmail);
|
|
8136
8563
|
}
|
|
8137
8564
|
}, [profiles, profilesLoading]);
|
|
8138
|
-
|
|
8565
|
+
React28.useEffect(() => {
|
|
8139
8566
|
console.log("[ConnectWalletButton] Theme state:", {
|
|
8140
8567
|
configTheme: config.ui.theme,
|
|
8141
8568
|
resolvedTheme,
|
|
@@ -8143,20 +8570,21 @@ var ConnectWalletButton = ({
|
|
|
8143
8570
|
bodyClasses: document.body.className
|
|
8144
8571
|
});
|
|
8145
8572
|
}, [config.ui.theme, resolvedTheme, isDark]);
|
|
8146
|
-
const [isAuthModalOpen, setIsAuthModalOpen] =
|
|
8147
|
-
const [recoveryUserId, setRecoveryUserId] =
|
|
8148
|
-
const tssManagerRef =
|
|
8149
|
-
const [isWalletMenuOpen, setIsWalletMenuOpen] =
|
|
8150
|
-
const [copied, setCopied] =
|
|
8151
|
-
const [isManageWalletOpen, setIsManageWalletOpen] =
|
|
8152
|
-
const [isSecurityOpen, setIsSecurityOpen] =
|
|
8153
|
-
const [
|
|
8154
|
-
const [
|
|
8155
|
-
const [
|
|
8156
|
-
const [
|
|
8157
|
-
const [
|
|
8158
|
-
const [
|
|
8159
|
-
|
|
8573
|
+
const [isAuthModalOpen, setIsAuthModalOpen] = React28.useState(false);
|
|
8574
|
+
const [recoveryUserId, setRecoveryUserId] = React28.useState(null);
|
|
8575
|
+
const tssManagerRef = React28.useRef(null);
|
|
8576
|
+
const [isWalletMenuOpen, setIsWalletMenuOpen] = React28.useState(false);
|
|
8577
|
+
const [copied, setCopied] = React28.useState(false);
|
|
8578
|
+
const [isManageWalletOpen, setIsManageWalletOpen] = React28.useState(false);
|
|
8579
|
+
const [isSecurityOpen, setIsSecurityOpen] = React28.useState(false);
|
|
8580
|
+
const [isBackupOpen, setIsBackupOpen] = React28.useState(false);
|
|
8581
|
+
const [isTransactionsOpen, setIsTransactionsOpen] = React28.useState(false);
|
|
8582
|
+
const [isViewAssetsOpen, setIsViewAssetsOpen] = React28.useState(false);
|
|
8583
|
+
const [isSendOpen, setIsSendOpen] = React28.useState(false);
|
|
8584
|
+
const [isReceiveOpen, setIsReceiveOpen] = React28.useState(false);
|
|
8585
|
+
const [isBuyOpen, setIsBuyOpen] = React28.useState(false);
|
|
8586
|
+
const [isKycOpen, setIsKycOpen] = React28.useState(false);
|
|
8587
|
+
React28.useEffect(() => {
|
|
8160
8588
|
try {
|
|
8161
8589
|
const shouldAutoOpen = authOpen ?? config?.ui?.authOpen;
|
|
8162
8590
|
if (!address && !session && shouldAutoOpen) {
|
|
@@ -8183,25 +8611,25 @@ var ConnectWalletButton = ({
|
|
|
8183
8611
|
refetchOnWindowFocus: true
|
|
8184
8612
|
}
|
|
8185
8613
|
});
|
|
8186
|
-
const formatAddress =
|
|
8614
|
+
const formatAddress = React28.useCallback((addr) => {
|
|
8187
8615
|
if (!addr) return "";
|
|
8188
8616
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
8189
8617
|
}, []);
|
|
8190
|
-
const avatar =
|
|
8191
|
-
const displayName =
|
|
8192
|
-
const formatBalance =
|
|
8618
|
+
const avatar = React28.useMemo(() => jwtTokenManager2.getAvatar(), [isAuthModalOpen, status]);
|
|
8619
|
+
const displayName = React28.useMemo(() => jwtTokenManager2.getDisplayName(), [isAuthModalOpen, status]);
|
|
8620
|
+
const formatBalance = React28.useCallback(() => {
|
|
8193
8621
|
if (!balance || balanceLoading) return "0.0000";
|
|
8194
8622
|
return parseFloat(balance.formatted).toFixed(4);
|
|
8195
8623
|
}, [balance, balanceLoading]);
|
|
8196
|
-
const [hasServerVault, setHasServerVault] =
|
|
8197
|
-
const indicators =
|
|
8624
|
+
const [hasServerVault, setHasServerVault] = React28.useState(false);
|
|
8625
|
+
const indicators = React28.useMemo(() => {
|
|
8198
8626
|
const userId = jwtTokenManager2.getUserId();
|
|
8199
8627
|
if (!userId) return { server: false, local: false, backup: false };
|
|
8200
8628
|
const server = jwtTokenManager2.getHasKeyshare() ?? false;
|
|
8201
8629
|
const local = !!address;
|
|
8202
8630
|
return { server, local, backup: hasServerVault };
|
|
8203
8631
|
}, [session, address, hasServerVault]);
|
|
8204
|
-
const handleAuthModalSuccess =
|
|
8632
|
+
const handleAuthModalSuccess = React28.useCallback(async () => {
|
|
8205
8633
|
await new Promise((r) => setTimeout(r, 100));
|
|
8206
8634
|
const userId = jwtTokenManager2.getUserId();
|
|
8207
8635
|
const isAuthenticated = jwtTokenManager2.isAuthenticated();
|
|
@@ -8253,7 +8681,7 @@ var ConnectWalletButton = ({
|
|
|
8253
8681
|
}
|
|
8254
8682
|
}
|
|
8255
8683
|
}, [onConnected, setAddress, setError, setSession, setStatus]);
|
|
8256
|
-
const handleDisconnect =
|
|
8684
|
+
const handleDisconnect = React28.useCallback(async () => {
|
|
8257
8685
|
const prevAddress = address;
|
|
8258
8686
|
let userId = null;
|
|
8259
8687
|
try {
|
|
@@ -8273,7 +8701,7 @@ var ConnectWalletButton = ({
|
|
|
8273
8701
|
} catch {
|
|
8274
8702
|
}
|
|
8275
8703
|
}, [setAddress, setError, setSession, setStatus]);
|
|
8276
|
-
|
|
8704
|
+
React28.useEffect(() => {
|
|
8277
8705
|
if (address) {
|
|
8278
8706
|
(async () => {
|
|
8279
8707
|
try {
|
|
@@ -8290,7 +8718,7 @@ var ConnectWalletButton = ({
|
|
|
8290
8718
|
setHasServerVault(false);
|
|
8291
8719
|
}
|
|
8292
8720
|
}, [address]);
|
|
8293
|
-
|
|
8721
|
+
React28.useEffect(() => {
|
|
8294
8722
|
console.log("[UI-KIT][AutoConnect] useEffect mounted");
|
|
8295
8723
|
let cancelled = false;
|
|
8296
8724
|
const tryAutoConnect = async (attempt) => {
|
|
@@ -8395,13 +8823,13 @@ var ConnectWalletButton = ({
|
|
|
8395
8823
|
cancelled = true;
|
|
8396
8824
|
};
|
|
8397
8825
|
}, []);
|
|
8398
|
-
|
|
8826
|
+
React28.useEffect(() => {
|
|
8399
8827
|
if (address && refetchBalance) {
|
|
8400
8828
|
refetchBalance();
|
|
8401
8829
|
}
|
|
8402
8830
|
}, [address]);
|
|
8403
|
-
return /* @__PURE__ */
|
|
8404
|
-
/* @__PURE__ */
|
|
8831
|
+
return /* @__PURE__ */ jsxs24("div", { className: [className, "lumia-scope"].filter(Boolean).join(" "), children: [
|
|
8832
|
+
/* @__PURE__ */ jsx33("div", { className: "inline-flex items-center gap-2", children: !address ? /* @__PURE__ */ jsx33("div", { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx33(
|
|
8405
8833
|
"button",
|
|
8406
8834
|
{
|
|
8407
8835
|
onClick: () => {
|
|
@@ -8438,56 +8866,56 @@ var ConnectWalletButton = ({
|
|
|
8438
8866
|
},
|
|
8439
8867
|
children: label || "Connect"
|
|
8440
8868
|
}
|
|
8441
|
-
) }) : /* @__PURE__ */
|
|
8869
|
+
) }) : /* @__PURE__ */ jsx33(
|
|
8442
8870
|
"div",
|
|
8443
8871
|
{
|
|
8444
8872
|
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"}`,
|
|
8445
8873
|
onClick: () => setIsWalletMenuOpen(true),
|
|
8446
|
-
children: /* @__PURE__ */
|
|
8447
|
-
/* @__PURE__ */
|
|
8874
|
+
children: /* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-3", children: [
|
|
8875
|
+
/* @__PURE__ */ jsx33("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 ? (
|
|
8448
8876
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8449
|
-
/* @__PURE__ */
|
|
8450
|
-
) : /* @__PURE__ */
|
|
8451
|
-
/* @__PURE__ */
|
|
8452
|
-
/* @__PURE__ */
|
|
8453
|
-
/* @__PURE__ */
|
|
8877
|
+
/* @__PURE__ */ jsx33("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8878
|
+
) : /* @__PURE__ */ jsx33("span", { className: "text-white font-bold text-sm", children: "LP" }) }),
|
|
8879
|
+
/* @__PURE__ */ jsxs24("div", { className: "text-left flex-1 min-w-0", children: [
|
|
8880
|
+
/* @__PURE__ */ jsx33("div", { className: `font-semibold text-base truncate ${theme.titleText}`, children: mode === "compact" && displayName ? displayName : formatAddress(address) }),
|
|
8881
|
+
/* @__PURE__ */ jsxs24("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
8454
8882
|
formatBalance(),
|
|
8455
8883
|
" LUMIA"
|
|
8456
8884
|
] })
|
|
8457
8885
|
] }),
|
|
8458
|
-
/* @__PURE__ */
|
|
8459
|
-
/* @__PURE__ */
|
|
8460
|
-
/* @__PURE__ */
|
|
8461
|
-
|
|
8886
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-1", children: [
|
|
8887
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8888
|
+
/* @__PURE__ */ jsx33(
|
|
8889
|
+
Cloud4,
|
|
8462
8890
|
{
|
|
8463
8891
|
className: `w-3 h-3 ${indicators.server ? "text-green-500" : "text-orange-400"}`
|
|
8464
8892
|
}
|
|
8465
8893
|
),
|
|
8466
|
-
/* @__PURE__ */
|
|
8894
|
+
/* @__PURE__ */ jsxs24("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: [
|
|
8467
8895
|
"Server Keyshare: ",
|
|
8468
8896
|
indicators.server ? "Available" : "Missing"
|
|
8469
8897
|
] })
|
|
8470
8898
|
] }),
|
|
8471
|
-
/* @__PURE__ */
|
|
8472
|
-
/* @__PURE__ */
|
|
8899
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8900
|
+
/* @__PURE__ */ jsx33(
|
|
8473
8901
|
Laptop2,
|
|
8474
8902
|
{
|
|
8475
8903
|
className: `w-3 h-3 ${indicators.local ? "text-green-500" : "text-orange-400"}`
|
|
8476
8904
|
}
|
|
8477
8905
|
),
|
|
8478
|
-
/* @__PURE__ */
|
|
8906
|
+
/* @__PURE__ */ jsxs24("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: [
|
|
8479
8907
|
"Local Keyshare: ",
|
|
8480
8908
|
indicators.local ? "Available" : "Missing"
|
|
8481
8909
|
] })
|
|
8482
8910
|
] }),
|
|
8483
|
-
/* @__PURE__ */
|
|
8484
|
-
/* @__PURE__ */
|
|
8485
|
-
|
|
8911
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8912
|
+
/* @__PURE__ */ jsx33(
|
|
8913
|
+
Shield5,
|
|
8486
8914
|
{
|
|
8487
8915
|
className: `w-3 h-3 ${indicators.backup ? "text-green-500" : "text-orange-400"}`
|
|
8488
8916
|
}
|
|
8489
8917
|
),
|
|
8490
|
-
/* @__PURE__ */
|
|
8918
|
+
/* @__PURE__ */ jsxs24("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: [
|
|
8491
8919
|
"Vault Backup: ",
|
|
8492
8920
|
indicators.backup ? "Available" : "Not Found"
|
|
8493
8921
|
] })
|
|
@@ -8496,59 +8924,59 @@ var ConnectWalletButton = ({
|
|
|
8496
8924
|
] })
|
|
8497
8925
|
}
|
|
8498
8926
|
) }),
|
|
8499
|
-
isWalletMenuOpen && address && /* @__PURE__ */
|
|
8500
|
-
/* @__PURE__ */
|
|
8501
|
-
/* @__PURE__ */
|
|
8502
|
-
/* @__PURE__ */
|
|
8503
|
-
/* @__PURE__ */
|
|
8927
|
+
isWalletMenuOpen && address && /* @__PURE__ */ jsx33("div", { className: "fixed inset-0 z-[60]", children: /* @__PURE__ */ jsx33(Dialog, { open: isWalletMenuOpen, onOpenChange: setIsWalletMenuOpen, children: /* @__PURE__ */ jsxs24(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: [
|
|
8928
|
+
/* @__PURE__ */ jsx33(VisuallyHidden, { children: /* @__PURE__ */ jsx33(DialogTitle, { children: "Wallet Menu" }) }),
|
|
8929
|
+
/* @__PURE__ */ jsx33(DialogDescription, { className: "sr-only", children: "Smart Account wallet actions and status" }),
|
|
8930
|
+
/* @__PURE__ */ jsx33("div", { className: `p-4 border-b ${theme.divider}`, children: /* @__PURE__ */ jsx33("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-4", children: [
|
|
8931
|
+
/* @__PURE__ */ jsx33("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 ? (
|
|
8504
8932
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8505
|
-
/* @__PURE__ */
|
|
8506
|
-
) : /* @__PURE__ */
|
|
8507
|
-
/* @__PURE__ */
|
|
8508
|
-
/* @__PURE__ */
|
|
8509
|
-
/* @__PURE__ */
|
|
8510
|
-
/* @__PURE__ */
|
|
8511
|
-
/* @__PURE__ */
|
|
8933
|
+
/* @__PURE__ */ jsx33("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8934
|
+
) : /* @__PURE__ */ jsx33("span", { className: "text-white font-bold text-lg", children: "L" }) }),
|
|
8935
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex-1 min-w-0", children: [
|
|
8936
|
+
/* @__PURE__ */ jsx33("div", { className: `font-medium text-lg ${theme.titleText}`, children: displayName || "Smart Account" }),
|
|
8937
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-2", children: [
|
|
8938
|
+
/* @__PURE__ */ jsx33("div", { className: `text-sm ${theme.mutedText}`, children: formatAddress(address) }),
|
|
8939
|
+
/* @__PURE__ */ jsx33("button", { onClick: async () => {
|
|
8512
8940
|
try {
|
|
8513
8941
|
await navigator.clipboard.writeText(address);
|
|
8514
8942
|
setCopied(true);
|
|
8515
8943
|
setTimeout(() => setCopied(false), 1500);
|
|
8516
8944
|
} catch {
|
|
8517
8945
|
}
|
|
8518
|
-
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */
|
|
8946
|
+
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ jsx33("span", { className: "text-green-500 text-sm", children: "\u2713" }) : /* @__PURE__ */ jsx33(Copy5, { className: "w-4 h-4" }) })
|
|
8519
8947
|
] })
|
|
8520
8948
|
] })
|
|
8521
8949
|
] }) }) }),
|
|
8522
|
-
/* @__PURE__ */
|
|
8523
|
-
/* @__PURE__ */
|
|
8524
|
-
/* @__PURE__ */
|
|
8950
|
+
/* @__PURE__ */ jsxs24("div", { className: "p-4", children: [
|
|
8951
|
+
/* @__PURE__ */ jsxs24("div", { className: "grid grid-cols-3 gap-2 mb-4", children: [
|
|
8952
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8525
8953
|
setIsWalletMenuOpen(false);
|
|
8526
8954
|
setIsSendOpen(true);
|
|
8527
8955
|
}, 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: [
|
|
8528
|
-
/* @__PURE__ */
|
|
8529
|
-
/* @__PURE__ */
|
|
8956
|
+
/* @__PURE__ */ jsx33(ArrowUp, { className: "w-5 h-5" }),
|
|
8957
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Send" })
|
|
8530
8958
|
] }),
|
|
8531
|
-
/* @__PURE__ */
|
|
8959
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8532
8960
|
setIsWalletMenuOpen(false);
|
|
8533
8961
|
setIsReceiveOpen(true);
|
|
8534
8962
|
}, 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: [
|
|
8535
|
-
/* @__PURE__ */
|
|
8536
|
-
/* @__PURE__ */
|
|
8963
|
+
/* @__PURE__ */ jsx33(ArrowDown, { className: "w-5 h-5" }),
|
|
8964
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Receive" })
|
|
8537
8965
|
] }),
|
|
8538
|
-
/* @__PURE__ */
|
|
8966
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8539
8967
|
setIsWalletMenuOpen(false);
|
|
8540
8968
|
setIsBuyOpen(true);
|
|
8541
8969
|
}, 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: [
|
|
8542
|
-
/* @__PURE__ */
|
|
8543
|
-
/* @__PURE__ */
|
|
8970
|
+
/* @__PURE__ */ jsx33(Plus2, { className: "w-5 h-5" }),
|
|
8971
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Buy" })
|
|
8544
8972
|
] })
|
|
8545
8973
|
] }),
|
|
8546
|
-
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */
|
|
8547
|
-
/* @__PURE__ */
|
|
8548
|
-
/* @__PURE__ */
|
|
8549
|
-
/* @__PURE__ */
|
|
8550
|
-
/* @__PURE__ */
|
|
8551
|
-
/* @__PURE__ */
|
|
8974
|
+
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ jsx33("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__ */ jsxs24("div", { className: "flex items-start space-x-3", children: [
|
|
8975
|
+
/* @__PURE__ */ jsx33(AlertTriangle4, { className: `w-5 h-5 ${isDark ? "text-orange-400" : "text-orange-500"} mt-0.5 flex-shrink-0` }),
|
|
8976
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex-1 min-w-0", children: [
|
|
8977
|
+
/* @__PURE__ */ jsx33("div", { className: `text-sm font-medium ${isDark ? "text-orange-300" : "text-orange-700"}`, children: "Backup Not Created" }),
|
|
8978
|
+
/* @__PURE__ */ jsx33("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." }),
|
|
8979
|
+
/* @__PURE__ */ jsxs24(
|
|
8552
8980
|
"button",
|
|
8553
8981
|
{
|
|
8554
8982
|
onClick: () => {
|
|
@@ -8557,19 +8985,19 @@ var ConnectWalletButton = ({
|
|
|
8557
8985
|
},
|
|
8558
8986
|
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"}`,
|
|
8559
8987
|
children: [
|
|
8560
|
-
/* @__PURE__ */
|
|
8988
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: "w-3 h-3 inline mr-1" }),
|
|
8561
8989
|
"Create Backup"
|
|
8562
8990
|
]
|
|
8563
8991
|
}
|
|
8564
8992
|
)
|
|
8565
8993
|
] })
|
|
8566
8994
|
] }) }),
|
|
8567
|
-
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */
|
|
8568
|
-
/* @__PURE__ */
|
|
8569
|
-
/* @__PURE__ */
|
|
8570
|
-
/* @__PURE__ */
|
|
8571
|
-
/* @__PURE__ */
|
|
8572
|
-
/* @__PURE__ */
|
|
8995
|
+
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ jsx33("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__ */ jsxs24("div", { className: "flex items-start space-x-3", children: [
|
|
8996
|
+
/* @__PURE__ */ jsx33(AlertTriangle4, { className: `w-5 h-5 ${isDark ? "text-blue-400" : "text-blue-500"} mt-0.5 flex-shrink-0` }),
|
|
8997
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex-1 min-w-0", children: [
|
|
8998
|
+
/* @__PURE__ */ jsx33("div", { className: `text-sm font-medium ${isDark ? "text-blue-300" : "text-blue-700"}`, children: "Email Not Connected" }),
|
|
8999
|
+
/* @__PURE__ */ jsx33("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." }),
|
|
9000
|
+
/* @__PURE__ */ jsxs24(
|
|
8573
9001
|
"button",
|
|
8574
9002
|
{
|
|
8575
9003
|
onClick: () => {
|
|
@@ -8578,80 +9006,87 @@ var ConnectWalletButton = ({
|
|
|
8578
9006
|
},
|
|
8579
9007
|
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"}`,
|
|
8580
9008
|
children: [
|
|
8581
|
-
/* @__PURE__ */
|
|
9009
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: "w-3 h-3 inline mr-1" }),
|
|
8582
9010
|
"Connect Email"
|
|
8583
9011
|
]
|
|
8584
9012
|
}
|
|
8585
9013
|
)
|
|
8586
9014
|
] })
|
|
8587
9015
|
] }) }),
|
|
8588
|
-
/* @__PURE__ */
|
|
9016
|
+
/* @__PURE__ */ jsx33(
|
|
8589
9017
|
"button",
|
|
8590
9018
|
{
|
|
8591
9019
|
onClick: () => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank"),
|
|
8592
9020
|
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`,
|
|
8593
|
-
children: /* @__PURE__ */
|
|
8594
|
-
/* @__PURE__ */
|
|
8595
|
-
/* @__PURE__ */
|
|
8596
|
-
/* @__PURE__ */
|
|
8597
|
-
/* @__PURE__ */
|
|
8598
|
-
/* @__PURE__ */
|
|
9021
|
+
children: /* @__PURE__ */ jsxs24("div", { className: "flex items-center justify-between", children: [
|
|
9022
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-3", children: [
|
|
9023
|
+
/* @__PURE__ */ jsx33("div", { className: "w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden", children: lumiaBeam.logoDataUri ? /* @__PURE__ */ jsx33("img", { src: lumiaBeam.logoDataUri, alt: "Chain logo", className: "w-full h-full object-cover" }) : lumiaBeam.logo === "lumia" ? /* @__PURE__ */ jsx33(LumiaLogo, { size: 32 }) : /* @__PURE__ */ jsx33("span", { className: "text-white text-xs font-bold", children: (lumiaBeam.name || "L").charAt(0) }) }),
|
|
9024
|
+
/* @__PURE__ */ jsxs24("div", { children: [
|
|
9025
|
+
/* @__PURE__ */ jsx33("div", { className: `${theme.titleText} font-medium`, children: lumiaBeam.name }),
|
|
9026
|
+
/* @__PURE__ */ jsxs24("div", { className: theme.mutedText + " text-sm", children: [
|
|
8599
9027
|
formatBalance(),
|
|
8600
9028
|
" LUMIA"
|
|
8601
9029
|
] })
|
|
8602
9030
|
] })
|
|
8603
9031
|
] }),
|
|
8604
|
-
/* @__PURE__ */
|
|
9032
|
+
/* @__PURE__ */ jsx33("div", { className: theme.iconColor, children: /* @__PURE__ */ jsx33(ArrowUpRight2, { className: "w-4 h-4" }) })
|
|
8605
9033
|
] })
|
|
8606
9034
|
}
|
|
8607
9035
|
),
|
|
8608
|
-
/* @__PURE__ */
|
|
8609
|
-
config.features?.kycNeeded && /* @__PURE__ */
|
|
9036
|
+
/* @__PURE__ */ jsxs24("div", { className: "space-y-1", children: [
|
|
9037
|
+
config.features?.kycNeeded && /* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8610
9038
|
setIsWalletMenuOpen(false);
|
|
8611
9039
|
setIsKycOpen(true);
|
|
8612
9040
|
}, 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: [
|
|
8613
|
-
/* @__PURE__ */
|
|
8614
|
-
/* @__PURE__ */
|
|
9041
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9042
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "KYC" })
|
|
8615
9043
|
] }),
|
|
8616
|
-
/* @__PURE__ */
|
|
9044
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8617
9045
|
setIsWalletMenuOpen(false);
|
|
8618
9046
|
setIsTransactionsOpen(true);
|
|
8619
9047
|
}, 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: [
|
|
8620
|
-
/* @__PURE__ */
|
|
8621
|
-
/* @__PURE__ */
|
|
9048
|
+
/* @__PURE__ */ jsx33(Activity2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9049
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Transactions" })
|
|
8622
9050
|
] }),
|
|
8623
|
-
/* @__PURE__ */
|
|
9051
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8624
9052
|
setIsWalletMenuOpen(false);
|
|
8625
9053
|
setIsViewAssetsOpen(true);
|
|
8626
9054
|
}, 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: [
|
|
8627
|
-
/* @__PURE__ */
|
|
8628
|
-
/* @__PURE__ */
|
|
9055
|
+
/* @__PURE__ */ jsx33(Gem2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9056
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "View Assets" })
|
|
8629
9057
|
] }),
|
|
8630
|
-
/* @__PURE__ */
|
|
9058
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8631
9059
|
setIsWalletMenuOpen(false);
|
|
8632
9060
|
setIsManageWalletOpen(true);
|
|
8633
9061
|
}, 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: [
|
|
8634
|
-
/* @__PURE__ */
|
|
8635
|
-
/* @__PURE__ */
|
|
9062
|
+
/* @__PURE__ */ jsx33(CreditCard2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9063
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Manage Wallet" })
|
|
8636
9064
|
] }),
|
|
8637
|
-
/* @__PURE__ */
|
|
9065
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8638
9066
|
setIsWalletMenuOpen(false);
|
|
8639
9067
|
setIsSecurityOpen(true);
|
|
8640
9068
|
}, 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: [
|
|
8641
|
-
/* @__PURE__ */
|
|
8642
|
-
/* @__PURE__ */
|
|
9069
|
+
/* @__PURE__ */ jsx33(Lock3, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9070
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Security" })
|
|
8643
9071
|
] }),
|
|
8644
|
-
/* @__PURE__ */
|
|
9072
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
9073
|
+
setIsWalletMenuOpen(false);
|
|
9074
|
+
setIsBackupOpen(true);
|
|
9075
|
+
}, 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: [
|
|
9076
|
+
/* @__PURE__ */ jsx33(Shield5, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9077
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Keyshare Backup" })
|
|
9078
|
+
] }),
|
|
9079
|
+
/* @__PURE__ */ jsxs24("button", { onClick: async () => {
|
|
8645
9080
|
await handleDisconnect();
|
|
8646
9081
|
setIsWalletMenuOpen(false);
|
|
8647
9082
|
}, 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: [
|
|
8648
|
-
/* @__PURE__ */
|
|
8649
|
-
/* @__PURE__ */
|
|
9083
|
+
/* @__PURE__ */ jsx33(ArrowUpRight2, { className: "w-5 h-5 text-red-600" }),
|
|
9084
|
+
/* @__PURE__ */ jsx33("span", { className: "text-red-600", children: "Disconnect Wallet" })
|
|
8650
9085
|
] })
|
|
8651
9086
|
] })
|
|
8652
9087
|
] })
|
|
8653
9088
|
] }) }) }),
|
|
8654
|
-
/* @__PURE__ */
|
|
9089
|
+
/* @__PURE__ */ jsx33(
|
|
8655
9090
|
ManageWallet,
|
|
8656
9091
|
{
|
|
8657
9092
|
open: isManageWalletOpen,
|
|
@@ -8662,7 +9097,7 @@ var ConnectWalletButton = ({
|
|
|
8662
9097
|
}
|
|
8663
9098
|
}
|
|
8664
9099
|
),
|
|
8665
|
-
/* @__PURE__ */
|
|
9100
|
+
/* @__PURE__ */ jsx33(
|
|
8666
9101
|
SecurityModal,
|
|
8667
9102
|
{
|
|
8668
9103
|
open: isSecurityOpen,
|
|
@@ -8673,7 +9108,23 @@ var ConnectWalletButton = ({
|
|
|
8673
9108
|
}
|
|
8674
9109
|
}
|
|
8675
9110
|
),
|
|
8676
|
-
/* @__PURE__ */
|
|
9111
|
+
isBackupOpen && session?.mpcUserId && /* @__PURE__ */ jsx33(Dialog, { open: isBackupOpen, onOpenChange: setIsBackupOpen, children: /* @__PURE__ */ jsxs24(DialogContent, { className: "max-w-2xl", children: [
|
|
9112
|
+
/* @__PURE__ */ jsxs24(VisuallyHidden, { children: [
|
|
9113
|
+
/* @__PURE__ */ jsx33(DialogTitle, { children: "Keyshare Backup" }),
|
|
9114
|
+
/* @__PURE__ */ jsx33(DialogDescription, { children: "Create and manage encrypted backups of your keyshare" })
|
|
9115
|
+
] }),
|
|
9116
|
+
/* @__PURE__ */ jsx33(
|
|
9117
|
+
KeyshareBackup,
|
|
9118
|
+
{
|
|
9119
|
+
userId: session.mpcUserId,
|
|
9120
|
+
onClose: () => setIsBackupOpen(false),
|
|
9121
|
+
onBackupSuccess: () => {
|
|
9122
|
+
console.log("[ConnectWalletButton] Backup created successfully");
|
|
9123
|
+
}
|
|
9124
|
+
}
|
|
9125
|
+
)
|
|
9126
|
+
] }) }),
|
|
9127
|
+
/* @__PURE__ */ jsx33(
|
|
8677
9128
|
TransactionsModal,
|
|
8678
9129
|
{
|
|
8679
9130
|
open: isTransactionsOpen,
|
|
@@ -8684,7 +9135,7 @@ var ConnectWalletButton = ({
|
|
|
8684
9135
|
}
|
|
8685
9136
|
}
|
|
8686
9137
|
),
|
|
8687
|
-
/* @__PURE__ */
|
|
9138
|
+
/* @__PURE__ */ jsx33(
|
|
8688
9139
|
ViewAssetsModal,
|
|
8689
9140
|
{
|
|
8690
9141
|
open: isViewAssetsOpen,
|
|
@@ -8695,7 +9146,7 @@ var ConnectWalletButton = ({
|
|
|
8695
9146
|
}
|
|
8696
9147
|
}
|
|
8697
9148
|
),
|
|
8698
|
-
/* @__PURE__ */
|
|
9149
|
+
/* @__PURE__ */ jsx33(
|
|
8699
9150
|
SendModal,
|
|
8700
9151
|
{
|
|
8701
9152
|
open: isSendOpen,
|
|
@@ -8706,7 +9157,7 @@ var ConnectWalletButton = ({
|
|
|
8706
9157
|
}
|
|
8707
9158
|
}
|
|
8708
9159
|
),
|
|
8709
|
-
/* @__PURE__ */
|
|
9160
|
+
/* @__PURE__ */ jsx33(
|
|
8710
9161
|
ReceiveModal,
|
|
8711
9162
|
{
|
|
8712
9163
|
open: isReceiveOpen,
|
|
@@ -8717,7 +9168,7 @@ var ConnectWalletButton = ({
|
|
|
8717
9168
|
}
|
|
8718
9169
|
}
|
|
8719
9170
|
),
|
|
8720
|
-
/* @__PURE__ */
|
|
9171
|
+
/* @__PURE__ */ jsx33(
|
|
8721
9172
|
BuyModal,
|
|
8722
9173
|
{
|
|
8723
9174
|
open: isBuyOpen,
|
|
@@ -8728,7 +9179,7 @@ var ConnectWalletButton = ({
|
|
|
8728
9179
|
}
|
|
8729
9180
|
}
|
|
8730
9181
|
),
|
|
8731
|
-
/* @__PURE__ */
|
|
9182
|
+
/* @__PURE__ */ jsx33(
|
|
8732
9183
|
KycModal,
|
|
8733
9184
|
{
|
|
8734
9185
|
open: isKycOpen,
|
|
@@ -8739,7 +9190,7 @@ var ConnectWalletButton = ({
|
|
|
8739
9190
|
}
|
|
8740
9191
|
}
|
|
8741
9192
|
),
|
|
8742
|
-
/* @__PURE__ */
|
|
9193
|
+
/* @__PURE__ */ jsx33(
|
|
8743
9194
|
AuthModal,
|
|
8744
9195
|
{
|
|
8745
9196
|
open: isAuthModalOpen,
|
|
@@ -8784,7 +9235,7 @@ var ConnectWalletButton = ({
|
|
|
8784
9235
|
}
|
|
8785
9236
|
}
|
|
8786
9237
|
),
|
|
8787
|
-
/* @__PURE__ */
|
|
9238
|
+
/* @__PURE__ */ jsx33(
|
|
8788
9239
|
TssManagerWithRef,
|
|
8789
9240
|
{
|
|
8790
9241
|
ref: tssManagerRef,
|
|
@@ -8802,7 +9253,7 @@ var ConnectWalletButton = ({
|
|
|
8802
9253
|
};
|
|
8803
9254
|
|
|
8804
9255
|
// src/components/ThemeToggle.tsx
|
|
8805
|
-
import { jsx as
|
|
9256
|
+
import { jsx as jsx34, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
8806
9257
|
var ThemeToggle = () => {
|
|
8807
9258
|
const { config, updateConfig } = useLumiaPassportConfig();
|
|
8808
9259
|
const currentTheme = config.ui.theme;
|
|
@@ -8847,7 +9298,7 @@ var ThemeToggle = () => {
|
|
|
8847
9298
|
return "auto";
|
|
8848
9299
|
}
|
|
8849
9300
|
};
|
|
8850
|
-
return /* @__PURE__ */
|
|
9301
|
+
return /* @__PURE__ */ jsx34("div", { className: "lumia-scope", children: /* @__PURE__ */ jsxs25(
|
|
8851
9302
|
"button",
|
|
8852
9303
|
{
|
|
8853
9304
|
onClick: cycleTheme,
|
|
@@ -8863,29 +9314,29 @@ var ThemeToggle = () => {
|
|
|
8863
9314
|
};
|
|
8864
9315
|
|
|
8865
9316
|
// src/components/LumiaLogo.tsx
|
|
8866
|
-
import { jsx as
|
|
9317
|
+
import { jsx as jsx35, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
8867
9318
|
var LumiaLogo2 = ({ size = 80, className = "" }) => {
|
|
8868
|
-
return /* @__PURE__ */
|
|
9319
|
+
return /* @__PURE__ */ jsx35(
|
|
8869
9320
|
"div",
|
|
8870
9321
|
{
|
|
8871
9322
|
className: `flex items-center justify-center ${className}`,
|
|
8872
9323
|
style: { width: size, height: size },
|
|
8873
|
-
children: /* @__PURE__ */
|
|
8874
|
-
/* @__PURE__ */
|
|
8875
|
-
/* @__PURE__ */
|
|
8876
|
-
/* @__PURE__ */
|
|
8877
|
-
/* @__PURE__ */
|
|
8878
|
-
/* @__PURE__ */
|
|
9324
|
+
children: /* @__PURE__ */ jsxs26("svg", { viewBox: "0 0 512 512", width: size, height: size, children: [
|
|
9325
|
+
/* @__PURE__ */ jsx35("circle", { cx: "256", cy: "256", r: "256", fill: "#060117", strokeWidth: "0" }),
|
|
9326
|
+
/* @__PURE__ */ jsx35("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" }),
|
|
9327
|
+
/* @__PURE__ */ jsx35("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" }),
|
|
9328
|
+
/* @__PURE__ */ jsx35("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" }),
|
|
9329
|
+
/* @__PURE__ */ jsx35("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" })
|
|
8879
9330
|
] })
|
|
8880
9331
|
}
|
|
8881
9332
|
);
|
|
8882
9333
|
};
|
|
8883
9334
|
|
|
8884
9335
|
// src/hooks/useTheme.ts
|
|
8885
|
-
import { useMemo as
|
|
9336
|
+
import { useMemo as useMemo6, useState as useState16, useEffect as useEffect13 } from "react";
|
|
8886
9337
|
function useTheme2(configTheme) {
|
|
8887
|
-
const [systemTheme, setSystemTheme] =
|
|
8888
|
-
|
|
9338
|
+
const [systemTheme, setSystemTheme] = useState16("light");
|
|
9339
|
+
useEffect13(() => {
|
|
8889
9340
|
if (typeof window === "undefined" || !window.matchMedia) return;
|
|
8890
9341
|
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
8891
9342
|
const updateSystemTheme = () => {
|
|
@@ -8895,14 +9346,14 @@ function useTheme2(configTheme) {
|
|
|
8895
9346
|
mediaQuery.addEventListener("change", updateSystemTheme);
|
|
8896
9347
|
return () => mediaQuery.removeEventListener("change", updateSystemTheme);
|
|
8897
9348
|
}, []);
|
|
8898
|
-
const resolvedTheme =
|
|
9349
|
+
const resolvedTheme = useMemo6(() => {
|
|
8899
9350
|
if (configTheme === "auto") {
|
|
8900
9351
|
return systemTheme;
|
|
8901
9352
|
}
|
|
8902
9353
|
return configTheme;
|
|
8903
9354
|
}, [configTheme, systemTheme]);
|
|
8904
9355
|
const isDark = resolvedTheme === "dark";
|
|
8905
|
-
const themeClasses =
|
|
9356
|
+
const themeClasses = useMemo6(
|
|
8906
9357
|
() => ({
|
|
8907
9358
|
// Modal background
|
|
8908
9359
|
modalBg: isDark ? "bg-gray-900" : "bg-white",
|
|
@@ -8938,9 +9389,9 @@ function useTheme2(configTheme) {
|
|
|
8938
9389
|
}
|
|
8939
9390
|
|
|
8940
9391
|
// src/internal/components/Hash.tsx
|
|
8941
|
-
import * as
|
|
9392
|
+
import * as React29 from "react";
|
|
8942
9393
|
import { Copy as Copy6, ExternalLink as ExternalLink5 } from "lucide-react";
|
|
8943
|
-
import { jsx as
|
|
9394
|
+
import { jsx as jsx36, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
8944
9395
|
function toExplorerUrl(kind, value, chain) {
|
|
8945
9396
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
8946
9397
|
if (!base2) return null;
|
|
@@ -8963,12 +9414,12 @@ var Hash = ({
|
|
|
8963
9414
|
}) => {
|
|
8964
9415
|
const value = hash || "";
|
|
8965
9416
|
const explorer = toExplorerUrl(kind, value, chain || void 0);
|
|
8966
|
-
const [copied, setCopied] =
|
|
8967
|
-
if (!value) return /* @__PURE__ */
|
|
8968
|
-
return /* @__PURE__ */
|
|
8969
|
-
label && /* @__PURE__ */
|
|
8970
|
-
/* @__PURE__ */
|
|
8971
|
-
showCopy && /* @__PURE__ */
|
|
9417
|
+
const [copied, setCopied] = React29.useState(false);
|
|
9418
|
+
if (!value) return /* @__PURE__ */ jsx36("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
9419
|
+
return /* @__PURE__ */ jsxs27("div", { className: cn2("flex items-center gap-2", className), children: [
|
|
9420
|
+
label && /* @__PURE__ */ jsx36("span", { className: "text-sm font-medium", children: label }),
|
|
9421
|
+
/* @__PURE__ */ jsx36("code", { className: "text-xs bg-background px-2 py-1 rounded break-all", children: truncate ? short2(value) : value }),
|
|
9422
|
+
showCopy && /* @__PURE__ */ jsx36(
|
|
8972
9423
|
Button,
|
|
8973
9424
|
{
|
|
8974
9425
|
variant: "ghost",
|
|
@@ -8982,10 +9433,10 @@ var Hash = ({
|
|
|
8982
9433
|
} catch {
|
|
8983
9434
|
}
|
|
8984
9435
|
},
|
|
8985
|
-
children: /* @__PURE__ */
|
|
9436
|
+
children: /* @__PURE__ */ jsx36(Copy6, { className: "h-4 w-4" })
|
|
8986
9437
|
}
|
|
8987
9438
|
),
|
|
8988
|
-
showExplorer && explorer && /* @__PURE__ */
|
|
9439
|
+
showExplorer && explorer && /* @__PURE__ */ jsx36(
|
|
8989
9440
|
"a",
|
|
8990
9441
|
{
|
|
8991
9442
|
href: explorer,
|
|
@@ -8993,7 +9444,7 @@ var Hash = ({
|
|
|
8993
9444
|
rel: "noreferrer noopener",
|
|
8994
9445
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
8995
9446
|
title: "Open in explorer",
|
|
8996
|
-
children: /* @__PURE__ */
|
|
9447
|
+
children: /* @__PURE__ */ jsx36(ExternalLink5, { className: "h-4 w-4" })
|
|
8997
9448
|
}
|
|
8998
9449
|
)
|
|
8999
9450
|
] });
|
|
@@ -9001,16 +9452,16 @@ var Hash = ({
|
|
|
9001
9452
|
|
|
9002
9453
|
// src/internal/components/TransactionsList.tsx
|
|
9003
9454
|
init_base();
|
|
9004
|
-
import { useState as
|
|
9005
|
-
import { jsx as
|
|
9455
|
+
import { useState as useState18, useEffect as useEffect14 } from "react";
|
|
9456
|
+
import { jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
9006
9457
|
var TransactionsList = ({
|
|
9007
9458
|
address,
|
|
9008
9459
|
itemsCount = 10
|
|
9009
9460
|
}) => {
|
|
9010
|
-
const [transactions, setTransactions] =
|
|
9011
|
-
const [loading, setLoading] =
|
|
9012
|
-
const [error, setError] =
|
|
9013
|
-
|
|
9461
|
+
const [transactions, setTransactions] = useState18([]);
|
|
9462
|
+
const [loading, setLoading] = useState18(true);
|
|
9463
|
+
const [error, setError] = useState18(null);
|
|
9464
|
+
useEffect14(() => {
|
|
9014
9465
|
const fetchTransactions = async () => {
|
|
9015
9466
|
try {
|
|
9016
9467
|
setLoading(true);
|
|
@@ -9056,15 +9507,15 @@ var TransactionsList = ({
|
|
|
9056
9507
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
9057
9508
|
};
|
|
9058
9509
|
if (loading) {
|
|
9059
|
-
return /* @__PURE__ */
|
|
9060
|
-
/* @__PURE__ */
|
|
9061
|
-
/* @__PURE__ */
|
|
9510
|
+
return /* @__PURE__ */ jsxs28("div", { className: "p-4 text-center", children: [
|
|
9511
|
+
/* @__PURE__ */ jsx37("div", { className: "animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full" }),
|
|
9512
|
+
/* @__PURE__ */ jsx37("p", { className: "mt-2 text-sm text-gray-600", children: "Loading transactions..." })
|
|
9062
9513
|
] });
|
|
9063
9514
|
}
|
|
9064
9515
|
if (error) {
|
|
9065
|
-
return /* @__PURE__ */
|
|
9066
|
-
/* @__PURE__ */
|
|
9067
|
-
/* @__PURE__ */
|
|
9516
|
+
return /* @__PURE__ */ jsxs28("div", { className: "p-4 text-center", children: [
|
|
9517
|
+
/* @__PURE__ */ jsx37("p", { className: "text-red-600 text-sm", children: error }),
|
|
9518
|
+
/* @__PURE__ */ jsx37(
|
|
9068
9519
|
"button",
|
|
9069
9520
|
{
|
|
9070
9521
|
onClick: () => window.location.reload(),
|
|
@@ -9075,54 +9526,54 @@ var TransactionsList = ({
|
|
|
9075
9526
|
] });
|
|
9076
9527
|
}
|
|
9077
9528
|
if (transactions.length === 0) {
|
|
9078
|
-
return /* @__PURE__ */
|
|
9529
|
+
return /* @__PURE__ */ jsx37("div", { className: "p-4 text-center", children: /* @__PURE__ */ jsx37("p", { className: "text-gray-600 text-sm", children: "No transactions found" }) });
|
|
9079
9530
|
}
|
|
9080
|
-
return /* @__PURE__ */
|
|
9531
|
+
return /* @__PURE__ */ jsx37("div", { className: "max-h-96 overflow-y-auto", children: /* @__PURE__ */ jsx37("div", { className: "space-y-2 p-2", children: transactions.map((tx) => /* @__PURE__ */ jsxs28(
|
|
9081
9532
|
"div",
|
|
9082
9533
|
{
|
|
9083
9534
|
className: "border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors",
|
|
9084
9535
|
onClick: () => openTransaction(tx.hash),
|
|
9085
9536
|
children: [
|
|
9086
|
-
/* @__PURE__ */
|
|
9087
|
-
/* @__PURE__ */
|
|
9088
|
-
/* @__PURE__ */
|
|
9089
|
-
/* @__PURE__ */
|
|
9090
|
-
/* @__PURE__ */
|
|
9537
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex justify-between items-start mb-2", children: [
|
|
9538
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex-1", children: [
|
|
9539
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center space-x-2 mb-1", children: [
|
|
9540
|
+
/* @__PURE__ */ jsx37("span", { className: "text-xs font-mono bg-gray-100 px-2 py-1 rounded", children: formatAddress(tx.hash) }),
|
|
9541
|
+
/* @__PURE__ */ jsx37("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" })
|
|
9091
9542
|
] }),
|
|
9092
|
-
/* @__PURE__ */
|
|
9093
|
-
/* @__PURE__ */
|
|
9094
|
-
/* @__PURE__ */
|
|
9095
|
-
/* @__PURE__ */
|
|
9543
|
+
/* @__PURE__ */ jsxs28("div", { className: "text-sm space-y-1", children: [
|
|
9544
|
+
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9545
|
+
/* @__PURE__ */ jsx37("span", { className: "text-gray-600", children: "From:" }),
|
|
9546
|
+
/* @__PURE__ */ jsxs28("span", { className: "font-mono ml-1", children: [
|
|
9096
9547
|
formatAddress(tx.from.hash),
|
|
9097
|
-
tx.from.is_contract && /* @__PURE__ */
|
|
9548
|
+
tx.from.is_contract && /* @__PURE__ */ jsx37("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9098
9549
|
] })
|
|
9099
9550
|
] }),
|
|
9100
|
-
/* @__PURE__ */
|
|
9101
|
-
/* @__PURE__ */
|
|
9102
|
-
/* @__PURE__ */
|
|
9551
|
+
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9552
|
+
/* @__PURE__ */ jsx37("span", { className: "text-gray-600", children: "To:" }),
|
|
9553
|
+
/* @__PURE__ */ jsxs28("span", { className: "font-mono ml-1", children: [
|
|
9103
9554
|
formatAddress(tx.to.hash),
|
|
9104
|
-
tx.to.is_contract && /* @__PURE__ */
|
|
9555
|
+
tx.to.is_contract && /* @__PURE__ */ jsx37("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9105
9556
|
] })
|
|
9106
9557
|
] }),
|
|
9107
|
-
/* @__PURE__ */
|
|
9108
|
-
/* @__PURE__ */
|
|
9109
|
-
/* @__PURE__ */
|
|
9558
|
+
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9559
|
+
/* @__PURE__ */ jsx37("span", { className: "text-gray-600", children: "Value:" }),
|
|
9560
|
+
/* @__PURE__ */ jsxs28("span", { className: "font-semibold ml-1", children: [
|
|
9110
9561
|
formatValue(tx.value),
|
|
9111
9562
|
" LUMIA"
|
|
9112
9563
|
] })
|
|
9113
9564
|
] })
|
|
9114
9565
|
] })
|
|
9115
9566
|
] }),
|
|
9116
|
-
/* @__PURE__ */
|
|
9117
|
-
/* @__PURE__ */
|
|
9118
|
-
/* @__PURE__ */
|
|
9567
|
+
/* @__PURE__ */ jsxs28("div", { className: "text-right text-xs text-gray-500", children: [
|
|
9568
|
+
/* @__PURE__ */ jsx37("div", { children: formatDate2(tx.timestamp) }),
|
|
9569
|
+
/* @__PURE__ */ jsxs28("div", { className: "mt-1", children: [
|
|
9119
9570
|
"Gas: ",
|
|
9120
9571
|
parseInt(tx.gas_used).toLocaleString()
|
|
9121
9572
|
] }),
|
|
9122
|
-
tx.method && /* @__PURE__ */
|
|
9573
|
+
tx.method && /* @__PURE__ */ jsx37("div", { className: "mt-1 text-blue-600", children: tx.method })
|
|
9123
9574
|
] })
|
|
9124
9575
|
] }),
|
|
9125
|
-
tx.transaction_types.length > 0 && /* @__PURE__ */
|
|
9576
|
+
tx.transaction_types.length > 0 && /* @__PURE__ */ jsx37("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ jsx37(
|
|
9126
9577
|
"span",
|
|
9127
9578
|
{
|
|
9128
9579
|
className: "text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full",
|
|
@@ -9136,247 +9587,6 @@ var TransactionsList = ({
|
|
|
9136
9587
|
)) }) });
|
|
9137
9588
|
};
|
|
9138
9589
|
|
|
9139
|
-
// src/internal/components/KeyshareBackup.tsx
|
|
9140
|
-
import * as React30 from "react";
|
|
9141
|
-
import { Shield as Shield5, Server as Server4, CheckCircle2 as CheckCircle28, AlertCircle as AlertCircle5, Key as Key5, X as X3, Eye as Eye3, EyeOff as EyeOff3, Download as Download2, Cloud as Cloud4, Lock as Lock3 } from "lucide-react";
|
|
9142
|
-
init_vaultClient();
|
|
9143
|
-
import { Fragment as Fragment7, jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
9144
|
-
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
9145
|
-
const [backupStatus, setBackupStatus] = React30.useState(() => getBackupStatus(userId));
|
|
9146
|
-
const [loading, setLoading] = React30.useState({
|
|
9147
|
-
server: false,
|
|
9148
|
-
cloud: false,
|
|
9149
|
-
local: false
|
|
9150
|
-
});
|
|
9151
|
-
const [error, setError] = React30.useState(null);
|
|
9152
|
-
const [success, setSuccess] = React30.useState(null);
|
|
9153
|
-
const [showPassword, setShowPassword] = React30.useState(false);
|
|
9154
|
-
const [useCustomPassword, setUseCustomPassword] = React30.useState(false);
|
|
9155
|
-
const [customPassword, setCustomPassword] = React30.useState("");
|
|
9156
|
-
const [cloudProviders, setCloudProviders] = React30.useState([]);
|
|
9157
|
-
const [selectedCloudProvider, setSelectedCloudProvider] = React30.useState(null);
|
|
9158
|
-
const hasKeyshareData = React30.useMemo(() => {
|
|
9159
|
-
return !!getCurrentKeyshareBackupData(userId);
|
|
9160
|
-
}, [userId]);
|
|
9161
|
-
React30.useEffect(() => {
|
|
9162
|
-
getAvailableCloudProviders2().then((providers) => {
|
|
9163
|
-
setCloudProviders(providers);
|
|
9164
|
-
if (providers.length > 0 && !selectedCloudProvider) {
|
|
9165
|
-
setSelectedCloudProvider(providers[0].id);
|
|
9166
|
-
}
|
|
9167
|
-
});
|
|
9168
|
-
}, [selectedCloudProvider]);
|
|
9169
|
-
const refreshStatus = React30.useCallback(() => {
|
|
9170
|
-
setBackupStatus(getBackupStatus(userId));
|
|
9171
|
-
}, [userId]);
|
|
9172
|
-
React30.useEffect(() => {
|
|
9173
|
-
refreshStatus();
|
|
9174
|
-
}, [refreshStatus]);
|
|
9175
|
-
const handleBackup = async (method) => {
|
|
9176
|
-
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
9177
|
-
setError(null);
|
|
9178
|
-
setSuccess(null);
|
|
9179
|
-
try {
|
|
9180
|
-
const password = useCustomPassword ? customPassword : void 0;
|
|
9181
|
-
switch (method) {
|
|
9182
|
-
case "server":
|
|
9183
|
-
await backupToServer(userId, password);
|
|
9184
|
-
setSuccess("Successfully created server backup");
|
|
9185
|
-
break;
|
|
9186
|
-
case "cloud": {
|
|
9187
|
-
await backupToCloud(userId, password, selectedCloudProvider || void 0);
|
|
9188
|
-
setSuccess(`Successfully created cloud backup`);
|
|
9189
|
-
const updatedProviders = await getAvailableCloudProviders2();
|
|
9190
|
-
setCloudProviders(updatedProviders);
|
|
9191
|
-
break;
|
|
9192
|
-
}
|
|
9193
|
-
case "local":
|
|
9194
|
-
await backupToLocalFile(userId, password);
|
|
9195
|
-
setSuccess("Backup file downloaded successfully");
|
|
9196
|
-
break;
|
|
9197
|
-
}
|
|
9198
|
-
refreshStatus();
|
|
9199
|
-
setTimeout(() => {
|
|
9200
|
-
if (typeof window !== "undefined") {
|
|
9201
|
-
window.dispatchEvent(
|
|
9202
|
-
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
9203
|
-
detail: { method, success: true }
|
|
9204
|
-
})
|
|
9205
|
-
);
|
|
9206
|
-
}
|
|
9207
|
-
onBackupSuccess?.();
|
|
9208
|
-
}, 100);
|
|
9209
|
-
} catch (err) {
|
|
9210
|
-
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
9211
|
-
setError(errorMsg);
|
|
9212
|
-
updateBackupStatus(userId, method, { error: errorMsg });
|
|
9213
|
-
refreshStatus();
|
|
9214
|
-
} finally {
|
|
9215
|
-
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
9216
|
-
}
|
|
9217
|
-
};
|
|
9218
|
-
const formatLastBackup = (timestamp) => {
|
|
9219
|
-
if (!timestamp) return "Never";
|
|
9220
|
-
const date = new Date(timestamp);
|
|
9221
|
-
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
9222
|
-
};
|
|
9223
|
-
return /* @__PURE__ */ jsxs28(Card, { className: "border-green-200 bg-green-50", children: [
|
|
9224
|
-
/* @__PURE__ */ jsx37(CardHeader, { className: "pb-4", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between", children: [
|
|
9225
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3", children: [
|
|
9226
|
-
/* @__PURE__ */ jsx37(Shield5, { className: "h-6 w-6 text-green-600" }),
|
|
9227
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9228
|
-
/* @__PURE__ */ jsx37(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
9229
|
-
/* @__PURE__ */ jsx37(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
9230
|
-
] })
|
|
9231
|
-
] }),
|
|
9232
|
-
onClose && /* @__PURE__ */ jsx37("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ jsx37(X3, { className: "h-4 w-4" }) })
|
|
9233
|
-
] }) }),
|
|
9234
|
-
/* @__PURE__ */ jsxs28(CardContent, { className: "space-y-6", children: [
|
|
9235
|
-
error && /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
9236
|
-
/* @__PURE__ */ jsx37(AlertCircle5, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9237
|
-
/* @__PURE__ */ jsx37("span", { children: error })
|
|
9238
|
-
] }),
|
|
9239
|
-
success && /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
9240
|
-
/* @__PURE__ */ jsx37(CheckCircle28, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9241
|
-
/* @__PURE__ */ jsx37("span", { children: success })
|
|
9242
|
-
] }),
|
|
9243
|
-
/* @__PURE__ */ jsxs28("div", { className: "space-y-3", children: [
|
|
9244
|
-
/* @__PURE__ */ jsx37("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
9245
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
9246
|
-
/* @__PURE__ */ jsx37(
|
|
9247
|
-
"input",
|
|
9248
|
-
{
|
|
9249
|
-
type: "checkbox",
|
|
9250
|
-
id: "use-backup-password",
|
|
9251
|
-
checked: useCustomPassword,
|
|
9252
|
-
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
9253
|
-
className: "rounded"
|
|
9254
|
-
}
|
|
9255
|
-
),
|
|
9256
|
-
/* @__PURE__ */ jsx37("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
9257
|
-
] }),
|
|
9258
|
-
!useCustomPassword && /* @__PURE__ */ jsx37("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
9259
|
-
/* @__PURE__ */ jsx37(Key5, { className: "h-4 w-4" }),
|
|
9260
|
-
/* @__PURE__ */ jsx37("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
9261
|
-
] }) }),
|
|
9262
|
-
useCustomPassword && /* @__PURE__ */ jsxs28("div", { className: "relative", children: [
|
|
9263
|
-
/* @__PURE__ */ jsx37(
|
|
9264
|
-
Input,
|
|
9265
|
-
{
|
|
9266
|
-
type: showPassword ? "text" : "password",
|
|
9267
|
-
placeholder: "Enter backup encryption password",
|
|
9268
|
-
value: customPassword,
|
|
9269
|
-
onChange: (e) => setCustomPassword(e.target.value),
|
|
9270
|
-
className: "pr-10"
|
|
9271
|
-
}
|
|
9272
|
-
),
|
|
9273
|
-
/* @__PURE__ */ jsx37(
|
|
9274
|
-
"button",
|
|
9275
|
-
{
|
|
9276
|
-
type: "button",
|
|
9277
|
-
onClick: () => setShowPassword(!showPassword),
|
|
9278
|
-
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
9279
|
-
children: showPassword ? /* @__PURE__ */ jsx37(EyeOff3, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx37(Eye3, { className: "h-4 w-4" })
|
|
9280
|
-
}
|
|
9281
|
-
)
|
|
9282
|
-
] })
|
|
9283
|
-
] }),
|
|
9284
|
-
/* @__PURE__ */ jsxs28("div", { className: "space-y-4", children: [
|
|
9285
|
-
/* @__PURE__ */ jsx37("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
9286
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
9287
|
-
/* @__PURE__ */ jsx37("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3", children: [
|
|
9288
|
-
/* @__PURE__ */ jsx37(Server4, { className: "h-5 w-5 text-blue-600" }),
|
|
9289
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9290
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
9291
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
9292
|
-
] })
|
|
9293
|
-
] }) }),
|
|
9294
|
-
/* @__PURE__ */ jsx37(
|
|
9295
|
-
Button,
|
|
9296
|
-
{
|
|
9297
|
-
onClick: () => handleBackup("server"),
|
|
9298
|
-
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9299
|
-
className: "px-4 py-2",
|
|
9300
|
-
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9301
|
-
}
|
|
9302
|
-
),
|
|
9303
|
-
/* @__PURE__ */ jsxs28("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9304
|
-
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
9305
|
-
formatLastBackup(backupStatus.server.lastBackup)
|
|
9306
|
-
] })
|
|
9307
|
-
] }),
|
|
9308
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
9309
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9310
|
-
/* @__PURE__ */ jsx37(Cloud4, { className: "h-5 w-5 text-sky-600" }),
|
|
9311
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9312
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
9313
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
9314
|
-
] })
|
|
9315
|
-
] }),
|
|
9316
|
-
cloudProviders.length > 1 && /* @__PURE__ */ jsx37("div", { className: "mb-3", children: /* @__PURE__ */ jsx37(
|
|
9317
|
-
"select",
|
|
9318
|
-
{
|
|
9319
|
-
value: selectedCloudProvider || "",
|
|
9320
|
-
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
9321
|
-
className: "text-sm border rounded px-2 py-1 w-full",
|
|
9322
|
-
children: cloudProviders.map((provider) => /* @__PURE__ */ jsxs28("option", { value: provider.id, children: [
|
|
9323
|
-
provider.icon,
|
|
9324
|
-
" ",
|
|
9325
|
-
provider.name,
|
|
9326
|
-
" ",
|
|
9327
|
-
provider.isAuthenticated ? "\u2713" : ""
|
|
9328
|
-
] }, provider.id))
|
|
9329
|
-
}
|
|
9330
|
-
) }),
|
|
9331
|
-
/* @__PURE__ */ jsx37(
|
|
9332
|
-
Button,
|
|
9333
|
-
{
|
|
9334
|
-
onClick: () => handleBackup("cloud"),
|
|
9335
|
-
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
9336
|
-
className: "px-4 py-2",
|
|
9337
|
-
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9338
|
-
}
|
|
9339
|
-
),
|
|
9340
|
-
/* @__PURE__ */ jsx37("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)}` })
|
|
9341
|
-
] }),
|
|
9342
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
9343
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9344
|
-
/* @__PURE__ */ jsx37(Download2, { className: "h-5 w-5 text-purple-600" }),
|
|
9345
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9346
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
9347
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
9348
|
-
] })
|
|
9349
|
-
] }),
|
|
9350
|
-
/* @__PURE__ */ jsx37(
|
|
9351
|
-
Button,
|
|
9352
|
-
{
|
|
9353
|
-
onClick: () => handleBackup("local"),
|
|
9354
|
-
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9355
|
-
className: "w-full",
|
|
9356
|
-
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
9357
|
-
}
|
|
9358
|
-
),
|
|
9359
|
-
/* @__PURE__ */ jsxs28("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9360
|
-
"Download encrypted backup file to your device \u2022 Last: ",
|
|
9361
|
-
formatLastBackup(backupStatus.local.lastBackup)
|
|
9362
|
-
] })
|
|
9363
|
-
] })
|
|
9364
|
-
] }),
|
|
9365
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
9366
|
-
/* @__PURE__ */ jsx37(Lock3, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
9367
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9368
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium", children: "Security Notice" }),
|
|
9369
|
-
/* @__PURE__ */ jsxs28("div", { className: "mt-1", children: [
|
|
9370
|
-
useCustomPassword ? /* @__PURE__ */ jsx37(Fragment7, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ jsx37(Fragment7, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
9371
|
-
" ",
|
|
9372
|
-
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
9373
|
-
] })
|
|
9374
|
-
] })
|
|
9375
|
-
] })
|
|
9376
|
-
] })
|
|
9377
|
-
] });
|
|
9378
|
-
}
|
|
9379
|
-
|
|
9380
9590
|
// src/hooks/useUserOpStatus.ts
|
|
9381
9591
|
init_base();
|
|
9382
9592
|
import * as React31 from "react";
|