@lumiapassport/ui-kit 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -4
- package/dist/iframe/main.js +1251 -2
- package/dist/iframe/main.js.map +1 -1
- package/dist/index.cjs +901 -701
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +962 -762
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2395,6 +2395,7 @@ var init_iframe_manager = __esm({
|
|
|
2395
2395
|
this.iframe.style.zIndex = "999999";
|
|
2396
2396
|
this.iframe.style.background = "rgba(0, 0, 0, 0.5)";
|
|
2397
2397
|
this.iframe.setAttribute("sandbox", "allow-scripts allow-same-origin");
|
|
2398
|
+
this.iframe.setAttribute("allow", "publickey-credentials-get *; publickey-credentials-create *");
|
|
2398
2399
|
this.messageListener = this.handleMessage.bind(this);
|
|
2399
2400
|
window.addEventListener("message", this.messageListener);
|
|
2400
2401
|
document.body.appendChild(this.iframe);
|
|
@@ -2751,6 +2752,92 @@ var init_iframe_manager = __esm({
|
|
|
2751
2752
|
}
|
|
2752
2753
|
return false;
|
|
2753
2754
|
}
|
|
2755
|
+
/**
|
|
2756
|
+
* Create backup of keyshare
|
|
2757
|
+
*/
|
|
2758
|
+
async createBackup(userId, backupRequest, accessToken) {
|
|
2759
|
+
this.log("[IframeManager] Creating backup...");
|
|
2760
|
+
const response = await this.sendMessage("CREATE_BACKUP", {
|
|
2761
|
+
userId,
|
|
2762
|
+
backupRequest,
|
|
2763
|
+
accessToken
|
|
2764
|
+
// Pass access token for TSS API authentication
|
|
2765
|
+
});
|
|
2766
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_CREATED") {
|
|
2767
|
+
return response.result;
|
|
2768
|
+
}
|
|
2769
|
+
throw new Error("Unexpected response type");
|
|
2770
|
+
}
|
|
2771
|
+
/**
|
|
2772
|
+
* Restore keyshare from server backup
|
|
2773
|
+
*/
|
|
2774
|
+
async restoreFromServer(userId, password, accessToken) {
|
|
2775
|
+
this.log("[IframeManager] Restoring backup from server...");
|
|
2776
|
+
const response = await this.sendMessage("RESTORE_BACKUP", {
|
|
2777
|
+
userId,
|
|
2778
|
+
password,
|
|
2779
|
+
accessToken
|
|
2780
|
+
// Pass access token for TSS API authentication
|
|
2781
|
+
});
|
|
2782
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_RESTORED") {
|
|
2783
|
+
return response.result;
|
|
2784
|
+
}
|
|
2785
|
+
throw new Error("Unexpected response type");
|
|
2786
|
+
}
|
|
2787
|
+
/**
|
|
2788
|
+
* Encrypt backup data without uploading (for cloud/local backups)
|
|
2789
|
+
* Returns encrypted data that parent can upload/download
|
|
2790
|
+
*/
|
|
2791
|
+
async encryptBackupData(userId, password) {
|
|
2792
|
+
this.log("[IframeManager] Encrypting backup data...");
|
|
2793
|
+
const response = await this.sendMessage("ENCRYPT_BACKUP_DATA", {
|
|
2794
|
+
userId,
|
|
2795
|
+
password
|
|
2796
|
+
});
|
|
2797
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_ENCRYPTED") {
|
|
2798
|
+
return response.encryptedData;
|
|
2799
|
+
}
|
|
2800
|
+
throw new Error("Unexpected response type");
|
|
2801
|
+
}
|
|
2802
|
+
/**
|
|
2803
|
+
* Restore keyshare from local file backup
|
|
2804
|
+
*/
|
|
2805
|
+
async restoreFromLocalFile(userId, fileContent, password) {
|
|
2806
|
+
this.log("[IframeManager] Restoring backup from local file...");
|
|
2807
|
+
const response = await this.sendMessage("RESTORE_FROM_FILE", {
|
|
2808
|
+
userId,
|
|
2809
|
+
fileContent,
|
|
2810
|
+
password
|
|
2811
|
+
});
|
|
2812
|
+
if (response.type === "LUMIA_PASSPORT_FILE_RESTORED") {
|
|
2813
|
+
return response.result;
|
|
2814
|
+
}
|
|
2815
|
+
throw new Error("Unexpected response type");
|
|
2816
|
+
}
|
|
2817
|
+
/**
|
|
2818
|
+
* Get backup status for user
|
|
2819
|
+
*/
|
|
2820
|
+
async getBackupStatus(userId) {
|
|
2821
|
+
this.log("[IframeManager] Getting backup status...");
|
|
2822
|
+
const response = await this.sendMessage("GET_BACKUP_STATUS", {
|
|
2823
|
+
userId
|
|
2824
|
+
});
|
|
2825
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_STATUS") {
|
|
2826
|
+
return response.status;
|
|
2827
|
+
}
|
|
2828
|
+
throw new Error("Unexpected response type");
|
|
2829
|
+
}
|
|
2830
|
+
/**
|
|
2831
|
+
* Get available cloud providers
|
|
2832
|
+
*/
|
|
2833
|
+
async getCloudProviders() {
|
|
2834
|
+
this.log("[IframeManager] Getting cloud providers...");
|
|
2835
|
+
const response = await this.sendMessage("GET_CLOUD_PROVIDERS", {});
|
|
2836
|
+
if (response.type === "LUMIA_PASSPORT_CLOUD_PROVIDERS") {
|
|
2837
|
+
return response.providers;
|
|
2838
|
+
}
|
|
2839
|
+
throw new Error("Unexpected response type");
|
|
2840
|
+
}
|
|
2754
2841
|
/**
|
|
2755
2842
|
* Cleanup and destroy iframe
|
|
2756
2843
|
*/
|
|
@@ -2827,7 +2914,7 @@ __export(index_exports, {
|
|
|
2827
2914
|
module.exports = __toCommonJS(index_exports);
|
|
2828
2915
|
|
|
2829
2916
|
// src/styles/built.css
|
|
2830
|
-
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2917
|
+
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2831
2918
|
|
|
2832
2919
|
// src/context/LumiaPassportContext.tsx
|
|
2833
2920
|
var import_react = require("react");
|
|
@@ -3623,6 +3710,7 @@ Input.displayName = "Input";
|
|
|
3623
3710
|
|
|
3624
3711
|
// src/internal/components/KeyshareRestore.tsx
|
|
3625
3712
|
init_vaultClient();
|
|
3713
|
+
init_iframe_manager();
|
|
3626
3714
|
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
3627
3715
|
function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
3628
3716
|
const { config } = useLumiaPassportConfig();
|
|
@@ -3636,6 +3724,14 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3636
3724
|
const [restorePassword, setRestorePassword] = React10.useState("");
|
|
3637
3725
|
const [hasServerBackup, setHasServerBackup] = React10.useState(null);
|
|
3638
3726
|
const [checkingBackup, setCheckingBackup] = React10.useState(true);
|
|
3727
|
+
const iframeManager = React10.useMemo(() => {
|
|
3728
|
+
try {
|
|
3729
|
+
return getIframeManager();
|
|
3730
|
+
} catch (e) {
|
|
3731
|
+
console.error("[KeyshareRestore] Failed to get iframe manager:", e);
|
|
3732
|
+
return null;
|
|
3733
|
+
}
|
|
3734
|
+
}, []);
|
|
3639
3735
|
React10.useEffect(() => {
|
|
3640
3736
|
const checkBackupAvailability = async () => {
|
|
3641
3737
|
try {
|
|
@@ -3658,20 +3754,31 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3658
3754
|
}, [userId]);
|
|
3659
3755
|
const handleRestoreFromServer = async () => {
|
|
3660
3756
|
console.log("[KeyshareRestore] Starting server restore for userId:", userId);
|
|
3757
|
+
if (!iframeManager) {
|
|
3758
|
+
setError("Iframe manager not initialized");
|
|
3759
|
+
return;
|
|
3760
|
+
}
|
|
3661
3761
|
setLoading((prev) => ({ ...prev, server: true }));
|
|
3662
3762
|
setError(null);
|
|
3663
3763
|
setSuccess(null);
|
|
3664
3764
|
try {
|
|
3665
|
-
const passwordToUse = useCustomPassword ? restorePassword :
|
|
3666
|
-
console.log("[KeyshareRestore] Calling restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3667
|
-
await
|
|
3668
|
-
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3765
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3766
|
+
console.log("[KeyshareRestore] Calling iframeManager.restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3767
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
3768
|
+
const accessToken = jwt?.accessToken;
|
|
3769
|
+
const result = await iframeManager.restoreFromServer(userId, passwordToUse, accessToken);
|
|
3770
|
+
if (result.success) {
|
|
3771
|
+
console.log("[KeyshareRestore] Server restore successful");
|
|
3772
|
+
setSuccess("Successfully restored keyshare from server backup");
|
|
3773
|
+
setTimeout(() => {
|
|
3774
|
+
onRestoreSuccess?.();
|
|
3775
|
+
}, 100);
|
|
3776
|
+
} else {
|
|
3777
|
+
console.error("[KeyshareRestore] Server restore failed:", result.error);
|
|
3778
|
+
setError(result.error || "Server restore failed");
|
|
3779
|
+
}
|
|
3673
3780
|
} catch (err) {
|
|
3674
|
-
console.error("[KeyshareRestore] Server restore
|
|
3781
|
+
console.error("[KeyshareRestore] Server restore exception:", err);
|
|
3675
3782
|
const errorMsg = err instanceof Error ? err.message : "Server restore failed";
|
|
3676
3783
|
setError(errorMsg);
|
|
3677
3784
|
} finally {
|
|
@@ -3688,18 +3795,27 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3688
3795
|
setError("Please enter the backup password");
|
|
3689
3796
|
return;
|
|
3690
3797
|
}
|
|
3798
|
+
if (!iframeManager) {
|
|
3799
|
+
setError("Iframe manager not initialized");
|
|
3800
|
+
return;
|
|
3801
|
+
}
|
|
3691
3802
|
setLoading((prev) => ({ ...prev, file: true }));
|
|
3692
3803
|
setError(null);
|
|
3693
3804
|
setSuccess(null);
|
|
3694
3805
|
try {
|
|
3695
|
-
const
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3806
|
+
const fileContent = await restoreFile.text();
|
|
3807
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3808
|
+
const result = await iframeManager.restoreFromLocalFile(userId, fileContent, passwordToUse);
|
|
3809
|
+
if (result.success) {
|
|
3810
|
+
setSuccess("Successfully restored keyshare from backup file");
|
|
3811
|
+
setRestoreFile(null);
|
|
3812
|
+
setRestorePassword("");
|
|
3813
|
+
setTimeout(() => {
|
|
3814
|
+
onRestoreSuccess?.();
|
|
3815
|
+
}, 100);
|
|
3816
|
+
} else {
|
|
3817
|
+
setError(result.error || "File restore failed");
|
|
3818
|
+
}
|
|
3703
3819
|
} catch (err) {
|
|
3704
3820
|
const errorMsg = err instanceof Error ? err.message : "Restore failed";
|
|
3705
3821
|
setError(errorMsg);
|
|
@@ -6716,11 +6832,312 @@ var SecurityModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6716
6832
|
] });
|
|
6717
6833
|
};
|
|
6718
6834
|
|
|
6835
|
+
// src/internal/components/KeyshareBackup.tsx
|
|
6836
|
+
var React19 = __toESM(require("react"), 1);
|
|
6837
|
+
var import_lucide_react9 = require("lucide-react");
|
|
6838
|
+
init_iframe_manager();
|
|
6839
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
6840
|
+
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
6841
|
+
const [backupStatus, setBackupStatus] = React19.useState({
|
|
6842
|
+
server: {},
|
|
6843
|
+
cloud: {},
|
|
6844
|
+
local: {}
|
|
6845
|
+
});
|
|
6846
|
+
const [loading, setLoading] = React19.useState({
|
|
6847
|
+
server: false,
|
|
6848
|
+
cloud: false,
|
|
6849
|
+
local: false
|
|
6850
|
+
});
|
|
6851
|
+
const [error, setError] = React19.useState(null);
|
|
6852
|
+
const [success, setSuccess] = React19.useState(null);
|
|
6853
|
+
const [showPassword, setShowPassword] = React19.useState(false);
|
|
6854
|
+
const [useCustomPassword, setUseCustomPassword] = React19.useState(false);
|
|
6855
|
+
const [customPassword, setCustomPassword] = React19.useState("");
|
|
6856
|
+
const [cloudProviders, setCloudProviders] = React19.useState([]);
|
|
6857
|
+
const [selectedCloudProvider, setSelectedCloudProvider] = React19.useState(null);
|
|
6858
|
+
const [hasKeyshareData, setHasKeyshareData] = React19.useState(true);
|
|
6859
|
+
const iframeManager = React19.useMemo(() => {
|
|
6860
|
+
try {
|
|
6861
|
+
return getIframeManager();
|
|
6862
|
+
} catch (e) {
|
|
6863
|
+
console.error("[KeyshareBackup] Failed to get iframe manager:", e);
|
|
6864
|
+
return null;
|
|
6865
|
+
}
|
|
6866
|
+
}, []);
|
|
6867
|
+
React19.useEffect(() => {
|
|
6868
|
+
const loadCloudProviders = async () => {
|
|
6869
|
+
try {
|
|
6870
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6871
|
+
const availableProviders = getAvailableCloudProviders3();
|
|
6872
|
+
const providers = availableProviders.map((p) => ({
|
|
6873
|
+
id: p.id,
|
|
6874
|
+
name: p.name,
|
|
6875
|
+
available: p.isAvailable()
|
|
6876
|
+
}));
|
|
6877
|
+
setCloudProviders(providers);
|
|
6878
|
+
if (providers.length > 0 && !selectedCloudProvider) {
|
|
6879
|
+
setSelectedCloudProvider(providers[0].id);
|
|
6880
|
+
}
|
|
6881
|
+
} catch (error2) {
|
|
6882
|
+
console.error("[KeyshareBackup] Failed to load cloud providers:", error2);
|
|
6883
|
+
}
|
|
6884
|
+
};
|
|
6885
|
+
loadCloudProviders();
|
|
6886
|
+
}, [selectedCloudProvider]);
|
|
6887
|
+
const refreshStatus = React19.useCallback(async () => {
|
|
6888
|
+
if (!iframeManager) return;
|
|
6889
|
+
try {
|
|
6890
|
+
const status = await iframeManager.getBackupStatus(userId);
|
|
6891
|
+
setBackupStatus(status);
|
|
6892
|
+
} catch (error2) {
|
|
6893
|
+
console.error("[KeyshareBackup] Failed to get backup status:", error2);
|
|
6894
|
+
}
|
|
6895
|
+
}, [iframeManager, userId]);
|
|
6896
|
+
React19.useEffect(() => {
|
|
6897
|
+
refreshStatus();
|
|
6898
|
+
}, [refreshStatus]);
|
|
6899
|
+
const handleBackup = async (method) => {
|
|
6900
|
+
if (!iframeManager) {
|
|
6901
|
+
setError("Iframe manager not initialized");
|
|
6902
|
+
return;
|
|
6903
|
+
}
|
|
6904
|
+
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
6905
|
+
setError(null);
|
|
6906
|
+
setSuccess(null);
|
|
6907
|
+
try {
|
|
6908
|
+
const password = useCustomPassword ? customPassword : void 0;
|
|
6909
|
+
if (method === "server") {
|
|
6910
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
6911
|
+
const accessToken = jwt?.accessToken;
|
|
6912
|
+
const result = await iframeManager.createBackup(userId, {
|
|
6913
|
+
method,
|
|
6914
|
+
password
|
|
6915
|
+
}, accessToken);
|
|
6916
|
+
if (result.success) {
|
|
6917
|
+
setSuccess("Successfully created server backup");
|
|
6918
|
+
await refreshStatus();
|
|
6919
|
+
onBackupSuccess?.();
|
|
6920
|
+
} else {
|
|
6921
|
+
throw new Error(result.error || "Server backup failed");
|
|
6922
|
+
}
|
|
6923
|
+
} else if (method === "cloud") {
|
|
6924
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6925
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6926
|
+
const providers = getAvailableCloudProviders3();
|
|
6927
|
+
const provider = selectedCloudProvider ? providers.find((p) => p.id === selectedCloudProvider) : providers[0];
|
|
6928
|
+
if (!provider) {
|
|
6929
|
+
throw new Error("No cloud provider available");
|
|
6930
|
+
}
|
|
6931
|
+
if (!provider.isAuthenticated()) {
|
|
6932
|
+
const authenticated = await provider.authenticate();
|
|
6933
|
+
if (!authenticated) {
|
|
6934
|
+
throw new Error(`Failed to authenticate with ${provider.name}`);
|
|
6935
|
+
}
|
|
6936
|
+
}
|
|
6937
|
+
const timestamp = Date.now();
|
|
6938
|
+
const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;
|
|
6939
|
+
const fileContent = JSON.stringify(encryptedData, null, 2);
|
|
6940
|
+
await provider.upload(fileName, fileContent, true);
|
|
6941
|
+
setSuccess(`Successfully created cloud backup on ${provider.name}`);
|
|
6942
|
+
await refreshStatus();
|
|
6943
|
+
onBackupSuccess?.();
|
|
6944
|
+
} else if (method === "local") {
|
|
6945
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6946
|
+
const blob = new Blob([JSON.stringify(encryptedData, null, 2)], {
|
|
6947
|
+
type: "application/json"
|
|
6948
|
+
});
|
|
6949
|
+
const url = URL.createObjectURL(blob);
|
|
6950
|
+
const a = document.createElement("a");
|
|
6951
|
+
a.href = url;
|
|
6952
|
+
a.download = `lumia-passport-backup-${userId}-${Date.now()}.json`;
|
|
6953
|
+
document.body.appendChild(a);
|
|
6954
|
+
a.click();
|
|
6955
|
+
document.body.removeChild(a);
|
|
6956
|
+
URL.revokeObjectURL(url);
|
|
6957
|
+
setSuccess("Backup file downloaded successfully");
|
|
6958
|
+
await refreshStatus();
|
|
6959
|
+
onBackupSuccess?.();
|
|
6960
|
+
}
|
|
6961
|
+
if (typeof window !== "undefined") {
|
|
6962
|
+
window.dispatchEvent(
|
|
6963
|
+
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
6964
|
+
detail: { method, success: true }
|
|
6965
|
+
})
|
|
6966
|
+
);
|
|
6967
|
+
}
|
|
6968
|
+
} catch (err) {
|
|
6969
|
+
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
6970
|
+
setError(errorMsg);
|
|
6971
|
+
await refreshStatus();
|
|
6972
|
+
} finally {
|
|
6973
|
+
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
6974
|
+
}
|
|
6975
|
+
};
|
|
6976
|
+
const formatLastBackup = (timestamp) => {
|
|
6977
|
+
if (!timestamp) return "Never";
|
|
6978
|
+
const date = new Date(timestamp);
|
|
6979
|
+
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
6980
|
+
};
|
|
6981
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(Card, { className: "border-green-200 bg-green-50", children: [
|
|
6982
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardHeader, { className: "pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
6983
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
6984
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Shield, { className: "h-6 w-6 text-green-600" }),
|
|
6985
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
6986
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
6987
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
6988
|
+
] })
|
|
6989
|
+
] }),
|
|
6990
|
+
onClose && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.X, { className: "h-4 w-4" }) })
|
|
6991
|
+
] }) }),
|
|
6992
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
6993
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
6994
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.AlertCircle, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6995
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: error })
|
|
6996
|
+
] }),
|
|
6997
|
+
success && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
6998
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.CheckCircle2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6999
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: success })
|
|
7000
|
+
] }),
|
|
7001
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-3", children: [
|
|
7002
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
7003
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7004
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7005
|
+
"input",
|
|
7006
|
+
{
|
|
7007
|
+
type: "checkbox",
|
|
7008
|
+
id: "use-backup-password",
|
|
7009
|
+
checked: useCustomPassword,
|
|
7010
|
+
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
7011
|
+
className: "rounded"
|
|
7012
|
+
}
|
|
7013
|
+
),
|
|
7014
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
7015
|
+
] }),
|
|
7016
|
+
!useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7017
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Key, { className: "h-4 w-4" }),
|
|
7018
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
7019
|
+
] }) }),
|
|
7020
|
+
useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "relative", children: [
|
|
7021
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7022
|
+
Input,
|
|
7023
|
+
{
|
|
7024
|
+
type: showPassword ? "text" : "password",
|
|
7025
|
+
placeholder: "Enter backup encryption password",
|
|
7026
|
+
value: customPassword,
|
|
7027
|
+
onChange: (e) => setCustomPassword(e.target.value),
|
|
7028
|
+
className: "pr-10"
|
|
7029
|
+
}
|
|
7030
|
+
),
|
|
7031
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7032
|
+
"button",
|
|
7033
|
+
{
|
|
7034
|
+
type: "button",
|
|
7035
|
+
onClick: () => setShowPassword(!showPassword),
|
|
7036
|
+
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
7037
|
+
children: showPassword ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Eye, { className: "h-4 w-4" })
|
|
7038
|
+
}
|
|
7039
|
+
)
|
|
7040
|
+
] })
|
|
7041
|
+
] }),
|
|
7042
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-4", children: [
|
|
7043
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
7044
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
7045
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7046
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Server, { className: "h-5 w-5 text-blue-600" }),
|
|
7047
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7048
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
7049
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
7050
|
+
] })
|
|
7051
|
+
] }) }),
|
|
7052
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7053
|
+
Button,
|
|
7054
|
+
{
|
|
7055
|
+
onClick: () => handleBackup("server"),
|
|
7056
|
+
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7057
|
+
className: "px-4 py-2",
|
|
7058
|
+
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7059
|
+
}
|
|
7060
|
+
),
|
|
7061
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7062
|
+
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
7063
|
+
formatLastBackup(backupStatus.server.lastBackup)
|
|
7064
|
+
] })
|
|
7065
|
+
] }),
|
|
7066
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
7067
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7068
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Cloud, { className: "h-5 w-5 text-sky-600" }),
|
|
7069
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7070
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
7071
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
7072
|
+
] })
|
|
7073
|
+
] }),
|
|
7074
|
+
cloudProviders.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7075
|
+
"select",
|
|
7076
|
+
{
|
|
7077
|
+
value: selectedCloudProvider || "",
|
|
7078
|
+
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
7079
|
+
className: "text-sm border rounded px-2 py-1 w-full",
|
|
7080
|
+
children: cloudProviders.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("option", { value: provider.id, disabled: !provider.available, children: [
|
|
7081
|
+
provider.name,
|
|
7082
|
+
" ",
|
|
7083
|
+
provider.available ? "" : "(Not Available)"
|
|
7084
|
+
] }, provider.id))
|
|
7085
|
+
}
|
|
7086
|
+
) }),
|
|
7087
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7088
|
+
Button,
|
|
7089
|
+
{
|
|
7090
|
+
onClick: () => handleBackup("cloud"),
|
|
7091
|
+
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
7092
|
+
className: "px-4 py-2",
|
|
7093
|
+
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7094
|
+
}
|
|
7095
|
+
),
|
|
7096
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
7097
|
+
] }),
|
|
7098
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
7099
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7100
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Download, { className: "h-5 w-5 text-purple-600" }),
|
|
7101
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7102
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
7103
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
7104
|
+
] })
|
|
7105
|
+
] }),
|
|
7106
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7107
|
+
Button,
|
|
7108
|
+
{
|
|
7109
|
+
onClick: () => handleBackup("local"),
|
|
7110
|
+
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7111
|
+
className: "w-full",
|
|
7112
|
+
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
7113
|
+
}
|
|
7114
|
+
),
|
|
7115
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7116
|
+
"Download encrypted backup file to your device \u2022 Last: ",
|
|
7117
|
+
formatLastBackup(backupStatus.local.lastBackup)
|
|
7118
|
+
] })
|
|
7119
|
+
] })
|
|
7120
|
+
] }),
|
|
7121
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
7122
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Lock, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
7123
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7124
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium", children: "Security Notice" }),
|
|
7125
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "mt-1", children: [
|
|
7126
|
+
useCustomPassword ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
7127
|
+
" ",
|
|
7128
|
+
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
7129
|
+
] })
|
|
7130
|
+
] })
|
|
7131
|
+
] })
|
|
7132
|
+
] })
|
|
7133
|
+
] });
|
|
7134
|
+
}
|
|
7135
|
+
|
|
6719
7136
|
// src/internal/components/TransactionsModal.tsx
|
|
6720
7137
|
var import_react13 = __toESM(require("react"), 1);
|
|
6721
|
-
var
|
|
7138
|
+
var import_lucide_react10 = require("lucide-react");
|
|
6722
7139
|
init_base();
|
|
6723
|
-
var
|
|
7140
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
6724
7141
|
var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
6725
7142
|
const { address } = useLumiaSession();
|
|
6726
7143
|
const [transactions, setTransactions] = import_react13.default.useState([]);
|
|
@@ -6770,98 +7187,98 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6770
7187
|
}
|
|
6771
7188
|
};
|
|
6772
7189
|
const getStatusIcon = (status) => {
|
|
6773
|
-
return status === "ok" ? /* @__PURE__ */ (0,
|
|
7190
|
+
return status === "ok" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.CheckCircle2, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.XCircle, { className: "w-4 h-4 text-red-500" });
|
|
6774
7191
|
};
|
|
6775
7192
|
const getTransactionIcon = (from, to) => {
|
|
6776
7193
|
const isIncoming = to.toLowerCase() === address?.toLowerCase();
|
|
6777
|
-
return isIncoming ? /* @__PURE__ */ (0,
|
|
7194
|
+
return isIncoming ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowDownRight, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowUpRight, { className: "w-4 h-4 text-blue-500" });
|
|
6778
7195
|
};
|
|
6779
7196
|
const openInExplorer = (txHash) => {
|
|
6780
7197
|
const explorerUrl = getExplorerUrl();
|
|
6781
7198
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
6782
7199
|
};
|
|
6783
|
-
return /* @__PURE__ */ (0,
|
|
6784
|
-
/* @__PURE__ */ (0,
|
|
6785
|
-
/* @__PURE__ */ (0,
|
|
6786
|
-
/* @__PURE__ */ (0,
|
|
6787
|
-
onBack && /* @__PURE__ */ (0,
|
|
7200
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7201
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DialogTitle, { children: "Transaction History" }) }),
|
|
7202
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DialogDescription, { className: "sr-only", children: "View your transaction history" }),
|
|
7203
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7204
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6788
7205
|
"button",
|
|
6789
7206
|
{
|
|
6790
7207
|
onClick: onBack,
|
|
6791
7208
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6792
7209
|
title: "Back",
|
|
6793
|
-
children: /* @__PURE__ */ (0,
|
|
7210
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowLeft, { className: "h-4 w-4" })
|
|
6794
7211
|
}
|
|
6795
7212
|
),
|
|
6796
|
-
/* @__PURE__ */ (0,
|
|
6797
|
-
/* @__PURE__ */ (0,
|
|
6798
|
-
/* @__PURE__ */ (0,
|
|
6799
|
-
/* @__PURE__ */ (0,
|
|
7213
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7214
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Activity, { className: "h-5 w-5" }),
|
|
7215
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: "Transaction History" }),
|
|
7216
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6800
7217
|
"button",
|
|
6801
7218
|
{
|
|
6802
7219
|
onClick: loadTransactions,
|
|
6803
7220
|
disabled: loading,
|
|
6804
7221
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6805
7222
|
title: "Refresh transactions",
|
|
6806
|
-
children: /* @__PURE__ */ (0,
|
|
7223
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.RefreshCw, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` })
|
|
6807
7224
|
}
|
|
6808
7225
|
)
|
|
6809
7226
|
] })
|
|
6810
7227
|
] }) }),
|
|
6811
|
-
/* @__PURE__ */ (0,
|
|
6812
|
-
/* @__PURE__ */ (0,
|
|
6813
|
-
/* @__PURE__ */ (0,
|
|
6814
|
-
] }) : transactions.length === 0 ? /* @__PURE__ */ (0,
|
|
6815
|
-
/* @__PURE__ */ (0,
|
|
6816
|
-
/* @__PURE__ */ (0,
|
|
7228
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: loading ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `${theme.mutedText}`, children: "Loading transactions..." }) }) : error ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${isDark ? "text-red-400" : "text-red-500"}`, children: [
|
|
7229
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.XCircle, { className: "w-12 h-12 mb-2" }),
|
|
7230
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-center text-sm", children: error })
|
|
7231
|
+
] }) : transactions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7232
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Activity, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7233
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("p", { className: "text-center", children: [
|
|
6817
7234
|
"No transactions found",
|
|
6818
|
-
/* @__PURE__ */ (0,
|
|
6819
|
-
/* @__PURE__ */ (0,
|
|
7235
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("br", {}),
|
|
7236
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "text-xs mt-2", children: "Smart account transactions will appear here" })
|
|
6820
7237
|
] })
|
|
6821
|
-
] }) : /* @__PURE__ */ (0,
|
|
7238
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "space-y-3", children: transactions.map((tx) => {
|
|
6822
7239
|
const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();
|
|
6823
7240
|
const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;
|
|
6824
|
-
return /* @__PURE__ */ (0,
|
|
7241
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
|
|
6825
7242
|
"div",
|
|
6826
7243
|
{
|
|
6827
7244
|
className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors cursor-pointer`,
|
|
6828
7245
|
onClick: () => openInExplorer(tx.hash),
|
|
6829
7246
|
children: [
|
|
6830
|
-
/* @__PURE__ */ (0,
|
|
6831
|
-
/* @__PURE__ */ (0,
|
|
7247
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7248
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
6832
7249
|
getTransactionIcon(tx.from.hash, tx.to.hash),
|
|
6833
|
-
/* @__PURE__ */ (0,
|
|
7250
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `font-medium ${theme.titleText}`, children: isIncoming ? "Received" : "Sent" }),
|
|
6834
7251
|
getStatusIcon(tx.status)
|
|
6835
7252
|
] }),
|
|
6836
|
-
/* @__PURE__ */ (0,
|
|
7253
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `text-xs ${theme.mutedText}`, children: formatTime(tx.timestamp) })
|
|
6837
7254
|
] }),
|
|
6838
|
-
/* @__PURE__ */ (0,
|
|
6839
|
-
/* @__PURE__ */ (0,
|
|
6840
|
-
/* @__PURE__ */ (0,
|
|
6841
|
-
/* @__PURE__ */ (0,
|
|
7255
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1 text-sm", children: [
|
|
7256
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7257
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: isIncoming ? "From:" : "To:" }),
|
|
7258
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6842
7259
|
formatAddress(displayAddress),
|
|
6843
|
-
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ (0,
|
|
7260
|
+
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} ml-1`, children: "(Contract)" })
|
|
6844
7261
|
] })
|
|
6845
7262
|
] }),
|
|
6846
|
-
/* @__PURE__ */ (0,
|
|
6847
|
-
/* @__PURE__ */ (0,
|
|
6848
|
-
/* @__PURE__ */ (0,
|
|
7263
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7264
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Value:" }),
|
|
7265
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
6849
7266
|
formatValue(tx.value),
|
|
6850
7267
|
" LUMIA"
|
|
6851
7268
|
] })
|
|
6852
7269
|
] }),
|
|
6853
|
-
/* @__PURE__ */ (0,
|
|
6854
|
-
/* @__PURE__ */ (0,
|
|
6855
|
-
/* @__PURE__ */ (0,
|
|
7270
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7271
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Block:" }),
|
|
7272
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6856
7273
|
"#",
|
|
6857
7274
|
tx.block_number
|
|
6858
7275
|
] })
|
|
6859
7276
|
] }),
|
|
6860
|
-
tx.method && /* @__PURE__ */ (0,
|
|
6861
|
-
/* @__PURE__ */ (0,
|
|
6862
|
-
/* @__PURE__ */ (0,
|
|
7277
|
+
tx.method && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7278
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Method:" }),
|
|
7279
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${isDark ? "text-blue-400" : "text-blue-600"} text-xs`, children: tx.method })
|
|
6863
7280
|
] }),
|
|
6864
|
-
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ (0,
|
|
7281
|
+
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6865
7282
|
"span",
|
|
6866
7283
|
{
|
|
6867
7284
|
className: `text-xs ${isDark ? "bg-blue-900/30 text-blue-300" : "bg-blue-100 text-blue-800"} px-2 py-0.5 rounded-full`,
|
|
@@ -6875,7 +7292,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6875
7292
|
tx.hash
|
|
6876
7293
|
);
|
|
6877
7294
|
}) }) }),
|
|
6878
|
-
transactions.length > 0 && /* @__PURE__ */ (0,
|
|
7295
|
+
transactions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
6879
7296
|
"Total: ",
|
|
6880
7297
|
transactions.length,
|
|
6881
7298
|
" transaction",
|
|
@@ -7049,9 +7466,9 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
7049
7466
|
}
|
|
7050
7467
|
|
|
7051
7468
|
// src/internal/components/ViewAssetsModal.tsx
|
|
7052
|
-
var
|
|
7469
|
+
var import_lucide_react11 = require("lucide-react");
|
|
7053
7470
|
init_base();
|
|
7054
|
-
var
|
|
7471
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
7055
7472
|
var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
7056
7473
|
const { address } = useLumiaSession();
|
|
7057
7474
|
const { assets, refreshBalances, isLoading } = useAssets(address);
|
|
@@ -7070,107 +7487,107 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7070
7487
|
const openInExplorer = (address2) => {
|
|
7071
7488
|
window.open(`${LUMIA_EXPLORER_URL}/address/${address2}`, "_blank");
|
|
7072
7489
|
};
|
|
7073
|
-
return /* @__PURE__ */ (0,
|
|
7074
|
-
/* @__PURE__ */ (0,
|
|
7075
|
-
/* @__PURE__ */ (0,
|
|
7076
|
-
/* @__PURE__ */ (0,
|
|
7077
|
-
onBack && /* @__PURE__ */ (0,
|
|
7490
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7491
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DialogTitle, { children: "View Assets" }) }),
|
|
7492
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DialogDescription, { className: "sr-only", children: "View your token balances and assets" }),
|
|
7493
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7494
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7078
7495
|
"button",
|
|
7079
7496
|
{
|
|
7080
7497
|
onClick: onBack,
|
|
7081
7498
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7082
7499
|
title: "Back",
|
|
7083
|
-
children: /* @__PURE__ */ (0,
|
|
7500
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ArrowLeft, { className: "h-4 w-4" })
|
|
7084
7501
|
}
|
|
7085
7502
|
),
|
|
7086
|
-
/* @__PURE__ */ (0,
|
|
7087
|
-
/* @__PURE__ */ (0,
|
|
7088
|
-
/* @__PURE__ */ (0,
|
|
7089
|
-
/* @__PURE__ */ (0,
|
|
7503
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7504
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Gem, { className: "h-5 w-5" }),
|
|
7505
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { children: "Your Assets" }),
|
|
7506
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7090
7507
|
"button",
|
|
7091
7508
|
{
|
|
7092
7509
|
onClick: refreshBalances,
|
|
7093
7510
|
disabled: isLoading,
|
|
7094
7511
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
7095
7512
|
title: "Refresh balances",
|
|
7096
|
-
children: /* @__PURE__ */ (0,
|
|
7513
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.RefreshCw, { className: `h-4 w-4 ${isLoading ? "animate-spin" : ""}` })
|
|
7097
7514
|
}
|
|
7098
7515
|
)
|
|
7099
7516
|
] })
|
|
7100
7517
|
] }) }),
|
|
7101
|
-
/* @__PURE__ */ (0,
|
|
7102
|
-
/* @__PURE__ */ (0,
|
|
7103
|
-
/* @__PURE__ */ (0,
|
|
7104
|
-
] }) : /* @__PURE__ */ (0,
|
|
7105
|
-
/* @__PURE__ */ (0,
|
|
7106
|
-
/* @__PURE__ */ (0,
|
|
7107
|
-
/* @__PURE__ */ (0,
|
|
7108
|
-
/* @__PURE__ */ (0,
|
|
7109
|
-
/* @__PURE__ */ (0,
|
|
7110
|
-
/* @__PURE__ */ (0,
|
|
7518
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `${theme.mutedText}`, children: "Loading assets..." }) }) : assets.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7519
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Gem, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7520
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { children: "No assets found" })
|
|
7521
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "space-y-3", children: assets.map((asset, index) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors`, children: [
|
|
7522
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7523
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7524
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "w-10 h-10 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-white font-bold text-sm", children: asset.symbol.charAt(0) }) }),
|
|
7525
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { children: [
|
|
7526
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `font-medium ${theme.titleText}`, children: asset.name }),
|
|
7527
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
7111
7528
|
] })
|
|
7112
7529
|
] }),
|
|
7113
|
-
/* @__PURE__ */ (0,
|
|
7114
|
-
/* @__PURE__ */ (0,
|
|
7115
|
-
/* @__PURE__ */ (0,
|
|
7530
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "text-right", children: [
|
|
7531
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `font-mono ${theme.titleText}`, children: asset.formattedBalance }),
|
|
7532
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
7116
7533
|
] })
|
|
7117
7534
|
] }),
|
|
7118
|
-
asset.address && /* @__PURE__ */ (0,
|
|
7119
|
-
/* @__PURE__ */ (0,
|
|
7120
|
-
/* @__PURE__ */ (0,
|
|
7121
|
-
/* @__PURE__ */ (0,
|
|
7122
|
-
/* @__PURE__ */ (0,
|
|
7123
|
-
/* @__PURE__ */ (0,
|
|
7535
|
+
asset.address && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `space-y-2 mt-3 pt-3 border-t ${theme.divider}`, children: [
|
|
7536
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7537
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Contract Address:" }),
|
|
7538
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7539
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` }),
|
|
7540
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7124
7541
|
"button",
|
|
7125
7542
|
{
|
|
7126
7543
|
onClick: () => handleCopy(asset.address, "address"),
|
|
7127
7544
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7128
7545
|
title: "Copy address",
|
|
7129
|
-
children: copied === "address" ? /* @__PURE__ */ (0,
|
|
7546
|
+
children: copied === "address" ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Copy, { className: "w-3 h-3" })
|
|
7130
7547
|
}
|
|
7131
7548
|
),
|
|
7132
|
-
/* @__PURE__ */ (0,
|
|
7549
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7133
7550
|
"button",
|
|
7134
7551
|
{
|
|
7135
7552
|
onClick: () => openInExplorer(asset.address),
|
|
7136
7553
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7137
7554
|
title: "View in explorer",
|
|
7138
|
-
children: /* @__PURE__ */ (0,
|
|
7555
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ExternalLink, { className: "w-3 h-3" })
|
|
7139
7556
|
}
|
|
7140
7557
|
)
|
|
7141
7558
|
] })
|
|
7142
7559
|
] }),
|
|
7143
|
-
asset.decimals && /* @__PURE__ */ (0,
|
|
7144
|
-
/* @__PURE__ */ (0,
|
|
7145
|
-
/* @__PURE__ */ (0,
|
|
7560
|
+
asset.decimals && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7561
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Decimals:" }),
|
|
7562
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.titleText}`, children: asset.decimals })
|
|
7146
7563
|
] })
|
|
7147
7564
|
] }),
|
|
7148
|
-
asset.type === "native" && address && /* @__PURE__ */ (0,
|
|
7149
|
-
/* @__PURE__ */ (0,
|
|
7150
|
-
/* @__PURE__ */ (0,
|
|
7151
|
-
/* @__PURE__ */ (0,
|
|
7152
|
-
/* @__PURE__ */ (0,
|
|
7565
|
+
asset.type === "native" && address && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "mt-3 pt-3 border-t border-gray-200", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7566
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Your Address:" }),
|
|
7567
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7568
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${address.slice(0, 6)}...${address.slice(-4)}` }),
|
|
7569
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7153
7570
|
"button",
|
|
7154
7571
|
{
|
|
7155
7572
|
onClick: () => handleCopy(address, "wallet"),
|
|
7156
7573
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7157
7574
|
title: "Copy wallet address",
|
|
7158
|
-
children: copied === "wallet" ? /* @__PURE__ */ (0,
|
|
7575
|
+
children: copied === "wallet" ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Copy, { className: "w-3 h-3" })
|
|
7159
7576
|
}
|
|
7160
7577
|
),
|
|
7161
|
-
/* @__PURE__ */ (0,
|
|
7578
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
7162
7579
|
"button",
|
|
7163
7580
|
{
|
|
7164
7581
|
onClick: () => openInExplorer(address),
|
|
7165
7582
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7166
7583
|
title: "View in explorer",
|
|
7167
|
-
children: /* @__PURE__ */ (0,
|
|
7584
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ExternalLink, { className: "w-3 h-3" })
|
|
7168
7585
|
}
|
|
7169
7586
|
)
|
|
7170
7587
|
] })
|
|
7171
7588
|
] }) })
|
|
7172
7589
|
] }, `${asset.type}-${asset.address || "native"}-${index}`)) }) }),
|
|
7173
|
-
assets.length > 0 && /* @__PURE__ */ (0,
|
|
7590
|
+
assets.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
7174
7591
|
"Total: ",
|
|
7175
7592
|
assets.length,
|
|
7176
7593
|
" asset",
|
|
@@ -7181,7 +7598,7 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7181
7598
|
|
|
7182
7599
|
// src/internal/components/SendModal.tsx
|
|
7183
7600
|
var import_react17 = require("react");
|
|
7184
|
-
var
|
|
7601
|
+
var import_lucide_react14 = require("lucide-react");
|
|
7185
7602
|
|
|
7186
7603
|
// src/hooks/useSendTransaction.ts
|
|
7187
7604
|
var import_react16 = require("react");
|
|
@@ -7247,8 +7664,8 @@ var import_viem6 = require("viem");
|
|
|
7247
7664
|
var import_wagmi7 = require("wagmi");
|
|
7248
7665
|
|
|
7249
7666
|
// src/internal/components/UserOpStatus.tsx
|
|
7250
|
-
var
|
|
7251
|
-
var
|
|
7667
|
+
var React24 = __toESM(require("react"), 1);
|
|
7668
|
+
var import_lucide_react13 = require("lucide-react");
|
|
7252
7669
|
|
|
7253
7670
|
// src/internal/components/ui/badge.tsx
|
|
7254
7671
|
var import_class_variance_authority2 = require("class-variance-authority");
|
|
@@ -7261,7 +7678,7 @@ function cn2(...inputs) {
|
|
|
7261
7678
|
}
|
|
7262
7679
|
|
|
7263
7680
|
// src/internal/components/ui/badge.tsx
|
|
7264
|
-
var
|
|
7681
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
7265
7682
|
var badgeVariants = (0, import_class_variance_authority2.cva)(
|
|
7266
7683
|
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
7267
7684
|
{
|
|
@@ -7281,13 +7698,13 @@ var badgeVariants = (0, import_class_variance_authority2.cva)(
|
|
|
7281
7698
|
}
|
|
7282
7699
|
);
|
|
7283
7700
|
function Badge({ className, variant, ...props }) {
|
|
7284
|
-
return /* @__PURE__ */ (0,
|
|
7701
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
7285
7702
|
}
|
|
7286
7703
|
|
|
7287
7704
|
// src/internal/components/Address.tsx
|
|
7288
|
-
var
|
|
7289
|
-
var
|
|
7290
|
-
var
|
|
7705
|
+
var React23 = __toESM(require("react"), 1);
|
|
7706
|
+
var import_lucide_react12 = require("lucide-react");
|
|
7707
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
7291
7708
|
function toExplorerAddressUrl(address, chain) {
|
|
7292
7709
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
7293
7710
|
if (!base2) return null;
|
|
@@ -7308,12 +7725,12 @@ var Address = ({
|
|
|
7308
7725
|
}) => {
|
|
7309
7726
|
const addr = address || "";
|
|
7310
7727
|
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
7311
|
-
const [copied, setCopied] =
|
|
7312
|
-
if (!addr) return /* @__PURE__ */ (0,
|
|
7313
|
-
return /* @__PURE__ */ (0,
|
|
7314
|
-
label && /* @__PURE__ */ (0,
|
|
7315
|
-
/* @__PURE__ */ (0,
|
|
7316
|
-
showCopy && /* @__PURE__ */ (0,
|
|
7728
|
+
const [copied, setCopied] = React23.useState(false);
|
|
7729
|
+
if (!addr) return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
7730
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: cn2("flex items-center gap-2", className), style: { listStyle: "none" }, children: [
|
|
7731
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "text-sm font-medium", children: label }),
|
|
7732
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("code", { className: "text-xs bg-background px-2 py-1 rounded select-all", children: truncate ? short(addr) : addr }),
|
|
7733
|
+
showCopy && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
7317
7734
|
Button,
|
|
7318
7735
|
{
|
|
7319
7736
|
variant: "ghost",
|
|
@@ -7327,10 +7744,10 @@ var Address = ({
|
|
|
7327
7744
|
} catch {
|
|
7328
7745
|
}
|
|
7329
7746
|
},
|
|
7330
|
-
children: /* @__PURE__ */ (0,
|
|
7747
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react12.Copy, { className: "h-4 w-4" })
|
|
7331
7748
|
}
|
|
7332
7749
|
),
|
|
7333
|
-
showExplorer && explorer && /* @__PURE__ */ (0,
|
|
7750
|
+
showExplorer && explorer && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
7334
7751
|
"a",
|
|
7335
7752
|
{
|
|
7336
7753
|
href: explorer,
|
|
@@ -7338,7 +7755,7 @@ var Address = ({
|
|
|
7338
7755
|
rel: "noreferrer noopener",
|
|
7339
7756
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
7340
7757
|
title: "Open in explorer",
|
|
7341
|
-
children: /* @__PURE__ */ (0,
|
|
7758
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react12.ExternalLink, { className: "h-4 w-4" })
|
|
7342
7759
|
}
|
|
7343
7760
|
)
|
|
7344
7761
|
] });
|
|
@@ -7346,7 +7763,7 @@ var Address = ({
|
|
|
7346
7763
|
|
|
7347
7764
|
// src/internal/components/UserOpStatus.tsx
|
|
7348
7765
|
init_base();
|
|
7349
|
-
var
|
|
7766
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
7350
7767
|
var UserOpStatus = ({
|
|
7351
7768
|
userOpHash,
|
|
7352
7769
|
chain,
|
|
@@ -7357,20 +7774,20 @@ var UserOpStatus = ({
|
|
|
7357
7774
|
externalState
|
|
7358
7775
|
}) => {
|
|
7359
7776
|
const useExternalState = !!externalState;
|
|
7360
|
-
const [internalReceipt, setInternalReceipt] =
|
|
7361
|
-
const [internalMempool, setInternalMempool] =
|
|
7362
|
-
const [internalError, setInternalError] =
|
|
7363
|
-
const [attempt, setAttempt] =
|
|
7364
|
-
const [internalRefreshing, setInternalRefreshing] =
|
|
7365
|
-
const [timedOut, setTimedOut] =
|
|
7366
|
-
const [rejected, setRejected] =
|
|
7367
|
-
const intervalRef =
|
|
7368
|
-
const startTimeRef =
|
|
7777
|
+
const [internalReceipt, setInternalReceipt] = React24.useState(null);
|
|
7778
|
+
const [internalMempool, setInternalMempool] = React24.useState(null);
|
|
7779
|
+
const [internalError, setInternalError] = React24.useState(null);
|
|
7780
|
+
const [attempt, setAttempt] = React24.useState(0);
|
|
7781
|
+
const [internalRefreshing, setInternalRefreshing] = React24.useState(false);
|
|
7782
|
+
const [timedOut, setTimedOut] = React24.useState(false);
|
|
7783
|
+
const [rejected, setRejected] = React24.useState(false);
|
|
7784
|
+
const intervalRef = React24.useRef(null);
|
|
7785
|
+
const startTimeRef = React24.useRef(Date.now());
|
|
7369
7786
|
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
7370
7787
|
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
7371
7788
|
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
7372
7789
|
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
7373
|
-
const rpc =
|
|
7790
|
+
const rpc = React24.useCallback(async (method, params) => {
|
|
7374
7791
|
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
7375
7792
|
const res = await fetch(getBundlerUrl(), {
|
|
7376
7793
|
method: "POST",
|
|
@@ -7381,14 +7798,14 @@ var UserOpStatus = ({
|
|
|
7381
7798
|
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
7382
7799
|
return json.result;
|
|
7383
7800
|
}, []);
|
|
7384
|
-
const extractMempoolInfo =
|
|
7801
|
+
const extractMempoolInfo = React24.useCallback((m) => {
|
|
7385
7802
|
if (!m) return null;
|
|
7386
7803
|
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
7387
7804
|
const sender = m.sender || m?.userOperation?.sender || null;
|
|
7388
7805
|
if (!entryPoint && !sender) return null;
|
|
7389
7806
|
return { entryPoint, sender };
|
|
7390
7807
|
}, []);
|
|
7391
|
-
const tick =
|
|
7808
|
+
const tick = React24.useCallback(async () => {
|
|
7392
7809
|
if (useExternalState) return;
|
|
7393
7810
|
const elapsed = Date.now() - startTimeRef.current;
|
|
7394
7811
|
if (elapsed > maxPollTimeMs) {
|
|
@@ -7432,7 +7849,7 @@ var UserOpStatus = ({
|
|
|
7432
7849
|
setAttempt((x) => x + 1);
|
|
7433
7850
|
}
|
|
7434
7851
|
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
7435
|
-
|
|
7852
|
+
React24.useEffect(() => {
|
|
7436
7853
|
if (useExternalState) return;
|
|
7437
7854
|
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
7438
7855
|
startTimeRef.current = Date.now();
|
|
@@ -7444,7 +7861,7 @@ var UserOpStatus = ({
|
|
|
7444
7861
|
setAttempt(0);
|
|
7445
7862
|
setInternalRefreshing(false);
|
|
7446
7863
|
}, [userOpHash, useExternalState]);
|
|
7447
|
-
|
|
7864
|
+
React24.useEffect(() => {
|
|
7448
7865
|
if (useExternalState) {
|
|
7449
7866
|
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
7450
7867
|
return;
|
|
@@ -7479,54 +7896,54 @@ var UserOpStatus = ({
|
|
|
7479
7896
|
const stateBadge = () => {
|
|
7480
7897
|
if (receipt) {
|
|
7481
7898
|
const ok = !!receipt.success;
|
|
7482
|
-
return /* @__PURE__ */ (0,
|
|
7483
|
-
ok ? /* @__PURE__ */ (0,
|
|
7899
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
7900
|
+
ok ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.CheckCircle2, { className: "h-3 w-3" }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7484
7901
|
ok ? "Included" : "Failed"
|
|
7485
7902
|
] });
|
|
7486
7903
|
}
|
|
7487
7904
|
if (rejected) {
|
|
7488
|
-
return /* @__PURE__ */ (0,
|
|
7489
|
-
/* @__PURE__ */ (0,
|
|
7905
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
7906
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7490
7907
|
" Rejected by bundler"
|
|
7491
7908
|
] });
|
|
7492
7909
|
}
|
|
7493
7910
|
if (timedOut) {
|
|
7494
|
-
return /* @__PURE__ */ (0,
|
|
7495
|
-
/* @__PURE__ */ (0,
|
|
7911
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "warning", className: "gap-1", children: [
|
|
7912
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7496
7913
|
" Timeout - may be rejected"
|
|
7497
7914
|
] });
|
|
7498
7915
|
}
|
|
7499
7916
|
if (mempool) {
|
|
7500
|
-
return /* @__PURE__ */ (0,
|
|
7501
|
-
/* @__PURE__ */ (0,
|
|
7917
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "outline", className: "gap-1", children: [
|
|
7918
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Clock, { className: "h-3 w-3" }),
|
|
7502
7919
|
" Pending in bundler"
|
|
7503
7920
|
] });
|
|
7504
7921
|
}
|
|
7505
|
-
return /* @__PURE__ */ (0,
|
|
7506
|
-
/* @__PURE__ */ (0,
|
|
7922
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
7923
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Clock, { className: "h-3 w-3" }),
|
|
7507
7924
|
" Waiting"
|
|
7508
7925
|
] });
|
|
7509
7926
|
};
|
|
7510
|
-
return /* @__PURE__ */ (0,
|
|
7927
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
7511
7928
|
"div",
|
|
7512
7929
|
{
|
|
7513
7930
|
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
7514
7931
|
style: { textAlign: "left", listStyle: "none" },
|
|
7515
7932
|
children: [
|
|
7516
|
-
/* @__PURE__ */ (0,
|
|
7517
|
-
/* @__PURE__ */ (0,
|
|
7933
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [
|
|
7934
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7518
7935
|
stateBadge(),
|
|
7519
|
-
/* @__PURE__ */ (0,
|
|
7936
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
7520
7937
|
] }),
|
|
7521
|
-
/* @__PURE__ */ (0,
|
|
7522
|
-
/* @__PURE__ */ (0,
|
|
7523
|
-
/* @__PURE__ */ (0,
|
|
7938
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Button, { variant: "ghost", size: "sm", onClick: () => tick(), disabled: refreshing, className: "h-8", children: [
|
|
7939
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.RefreshCw, { className: cn2("h-3.5 w-3.5 mr-1", refreshing && "animate-spin") }),
|
|
7940
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-xs", children: "Refresh" })
|
|
7524
7941
|
] })
|
|
7525
7942
|
] }),
|
|
7526
|
-
/* @__PURE__ */ (0,
|
|
7527
|
-
/* @__PURE__ */ (0,
|
|
7528
|
-
/* @__PURE__ */ (0,
|
|
7529
|
-
/* @__PURE__ */ (0,
|
|
7943
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
7944
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "UO Hash" }),
|
|
7945
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("code", { className: "text-xs font-mono flex-1 select-all", children: userOpHash }),
|
|
7946
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7530
7947
|
Button,
|
|
7531
7948
|
{
|
|
7532
7949
|
variant: "ghost",
|
|
@@ -7538,14 +7955,14 @@ var UserOpStatus = ({
|
|
|
7538
7955
|
} catch {
|
|
7539
7956
|
}
|
|
7540
7957
|
},
|
|
7541
|
-
children: /* @__PURE__ */ (0,
|
|
7958
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Copy, { className: "h-3.5 w-3.5" })
|
|
7542
7959
|
}
|
|
7543
7960
|
)
|
|
7544
7961
|
] }),
|
|
7545
|
-
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ (0,
|
|
7546
|
-
/* @__PURE__ */ (0,
|
|
7547
|
-
/* @__PURE__ */ (0,
|
|
7548
|
-
/* @__PURE__ */ (0,
|
|
7962
|
+
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
7963
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "Tx Hash" }),
|
|
7964
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("code", { className: "text-xs font-mono flex-1 select-all", children: receipt.receipt.transactionHash }),
|
|
7965
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7549
7966
|
Button,
|
|
7550
7967
|
{
|
|
7551
7968
|
variant: "ghost",
|
|
@@ -7557,10 +7974,10 @@ var UserOpStatus = ({
|
|
|
7557
7974
|
} catch {
|
|
7558
7975
|
}
|
|
7559
7976
|
},
|
|
7560
|
-
children: /* @__PURE__ */ (0,
|
|
7977
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Copy, { className: "h-3.5 w-3.5" })
|
|
7561
7978
|
}
|
|
7562
7979
|
),
|
|
7563
|
-
chain?.blockExplorers?.default?.url && /* @__PURE__ */ (0,
|
|
7980
|
+
chain?.blockExplorers?.default?.url && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7564
7981
|
"a",
|
|
7565
7982
|
{
|
|
7566
7983
|
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
@@ -7568,11 +7985,11 @@ var UserOpStatus = ({
|
|
|
7568
7985
|
rel: "noreferrer noopener",
|
|
7569
7986
|
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
7570
7987
|
title: "Open in explorer",
|
|
7571
|
-
children: /* @__PURE__ */ (0,
|
|
7988
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.ExternalLink, { className: "h-3.5 w-3.5" })
|
|
7572
7989
|
}
|
|
7573
7990
|
)
|
|
7574
7991
|
] }),
|
|
7575
|
-
receipt && /* @__PURE__ */ (0,
|
|
7992
|
+
receipt && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
7576
7993
|
"Block ",
|
|
7577
7994
|
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
7578
7995
|
" \u2022 Gas Used",
|
|
@@ -7581,32 +7998,32 @@ var UserOpStatus = ({
|
|
|
7581
7998
|
" \u2022 Success ",
|
|
7582
7999
|
String(!!receipt.success)
|
|
7583
8000
|
] }),
|
|
7584
|
-
/* @__PURE__ */ (0,
|
|
8001
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { className: "ml-2", children: [
|
|
7585
8002
|
"\u2022 Polling for ",
|
|
7586
8003
|
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
7587
8004
|
"s"
|
|
7588
8005
|
] }) }),
|
|
7589
|
-
mempool && /* @__PURE__ */ (0,
|
|
7590
|
-
/* @__PURE__ */ (0,
|
|
8006
|
+
mempool && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
8007
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { children: [
|
|
7591
8008
|
"Seen by bundler at ",
|
|
7592
|
-
/* @__PURE__ */ (0,
|
|
8009
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
7593
8010
|
] }),
|
|
7594
|
-
/* @__PURE__ */ (0,
|
|
8011
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { children: [
|
|
7595
8012
|
"sender ",
|
|
7596
|
-
/* @__PURE__ */ (0,
|
|
8013
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Address, { address: mempool.sender, chain, truncate: false })
|
|
7597
8014
|
] })
|
|
7598
8015
|
] }),
|
|
7599
|
-
error && /* @__PURE__ */ (0,
|
|
7600
|
-
/* @__PURE__ */ (0,
|
|
8016
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8017
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7601
8018
|
" ",
|
|
7602
8019
|
error
|
|
7603
8020
|
] }),
|
|
7604
|
-
rejected && /* @__PURE__ */ (0,
|
|
7605
|
-
/* @__PURE__ */ (0,
|
|
8021
|
+
rejected && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8022
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7606
8023
|
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
7607
8024
|
] }),
|
|
7608
|
-
timedOut && /* @__PURE__ */ (0,
|
|
7609
|
-
/* @__PURE__ */ (0,
|
|
8025
|
+
timedOut && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8026
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7610
8027
|
"Stopped polling after ",
|
|
7611
8028
|
Math.round(maxPollTimeMs / 1e3),
|
|
7612
8029
|
"s. UserOperation may have been rejected by the bundler."
|
|
@@ -7618,7 +8035,7 @@ var UserOpStatus = ({
|
|
|
7618
8035
|
|
|
7619
8036
|
// src/internal/components/SendModal.tsx
|
|
7620
8037
|
init_base();
|
|
7621
|
-
var
|
|
8038
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
7622
8039
|
var SendModal = ({
|
|
7623
8040
|
open,
|
|
7624
8041
|
onOpenChange,
|
|
@@ -7701,7 +8118,7 @@ var SendModal = ({
|
|
|
7701
8118
|
const maxAmount = Math.max(0, balance - 1e-3);
|
|
7702
8119
|
setAmount(maxAmount.toFixed(6));
|
|
7703
8120
|
};
|
|
7704
|
-
return /* @__PURE__ */ (0,
|
|
8121
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
7705
8122
|
DialogContent,
|
|
7706
8123
|
{
|
|
7707
8124
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7713,28 +8130,28 @@ var SendModal = ({
|
|
|
7713
8130
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7714
8131
|
},
|
|
7715
8132
|
children: [
|
|
7716
|
-
/* @__PURE__ */ (0,
|
|
7717
|
-
/* @__PURE__ */ (0,
|
|
7718
|
-
/* @__PURE__ */ (0,
|
|
7719
|
-
onBack && txStep === "input" && /* @__PURE__ */ (0,
|
|
8133
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogTitle, { children: "Send Transaction" }) }),
|
|
8134
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogDescription, { className: "sr-only", children: "Send LUMIA tokens to another address" }),
|
|
8135
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8136
|
+
onBack && txStep === "input" && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7720
8137
|
"button",
|
|
7721
8138
|
{
|
|
7722
8139
|
onClick: onBack,
|
|
7723
8140
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7724
8141
|
title: "Back",
|
|
7725
|
-
children: /* @__PURE__ */ (0,
|
|
8142
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.ArrowLeft, { className: "h-4 w-4" })
|
|
7726
8143
|
}
|
|
7727
8144
|
),
|
|
7728
|
-
/* @__PURE__ */ (0,
|
|
7729
|
-
/* @__PURE__ */ (0,
|
|
7730
|
-
/* @__PURE__ */ (0,
|
|
8145
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8146
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Send, { className: "h-5 w-5" }),
|
|
8147
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { children: "Send LUMIA" })
|
|
7731
8148
|
] })
|
|
7732
8149
|
] }) }),
|
|
7733
|
-
/* @__PURE__ */ (0,
|
|
7734
|
-
txStep === "input" && /* @__PURE__ */ (0,
|
|
7735
|
-
/* @__PURE__ */ (0,
|
|
7736
|
-
/* @__PURE__ */ (0,
|
|
7737
|
-
/* @__PURE__ */ (0,
|
|
8150
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "p-5", children: [
|
|
8151
|
+
txStep === "input" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8152
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8153
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Recipient Address" }),
|
|
8154
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7738
8155
|
"input",
|
|
7739
8156
|
{
|
|
7740
8157
|
type: "text",
|
|
@@ -7745,17 +8162,17 @@ var SendModal = ({
|
|
|
7745
8162
|
}
|
|
7746
8163
|
)
|
|
7747
8164
|
] }),
|
|
7748
|
-
/* @__PURE__ */ (0,
|
|
7749
|
-
/* @__PURE__ */ (0,
|
|
7750
|
-
/* @__PURE__ */ (0,
|
|
7751
|
-
/* @__PURE__ */ (0,
|
|
8165
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8166
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between items-center mb-2", children: [
|
|
8167
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { className: `text-sm font-medium ${theme.bodyText}`, children: "Amount" }),
|
|
8168
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
7752
8169
|
"Balance: ",
|
|
7753
8170
|
balance.toFixed(4),
|
|
7754
8171
|
" LUMIA"
|
|
7755
8172
|
] })
|
|
7756
8173
|
] }),
|
|
7757
|
-
/* @__PURE__ */ (0,
|
|
7758
|
-
/* @__PURE__ */ (0,
|
|
8174
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "relative", children: [
|
|
8175
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7759
8176
|
"input",
|
|
7760
8177
|
{
|
|
7761
8178
|
type: "number",
|
|
@@ -7766,7 +8183,7 @@ var SendModal = ({
|
|
|
7766
8183
|
className: `w-full px-3 py-2 pr-16 border ${isDark ? "bg-gray-800 border-gray-600 text-white placeholder:text-gray-400" : "bg-white border-gray-300 text-gray-900 placeholder:text-gray-400"} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`
|
|
7767
8184
|
}
|
|
7768
8185
|
),
|
|
7769
|
-
/* @__PURE__ */ (0,
|
|
8186
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7770
8187
|
"button",
|
|
7771
8188
|
{
|
|
7772
8189
|
onClick: handleMaxAmount,
|
|
@@ -7776,11 +8193,11 @@ var SendModal = ({
|
|
|
7776
8193
|
)
|
|
7777
8194
|
] })
|
|
7778
8195
|
] }),
|
|
7779
|
-
(validationError || error) && /* @__PURE__ */ (0,
|
|
7780
|
-
/* @__PURE__ */ (0,
|
|
7781
|
-
/* @__PURE__ */ (0,
|
|
8196
|
+
(validationError || error) && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `flex items-center gap-2 p-3 ${isDark ? "bg-red-900/30 text-red-400" : "bg-red-50 text-red-700"} rounded-lg`, children: [
|
|
8197
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.AlertCircle, { className: "h-4 w-4" }),
|
|
8198
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "text-sm", children: validationError || error })
|
|
7782
8199
|
] }),
|
|
7783
|
-
/* @__PURE__ */ (0,
|
|
8200
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7784
8201
|
Button,
|
|
7785
8202
|
{
|
|
7786
8203
|
onClick: handleSend,
|
|
@@ -7791,29 +8208,29 @@ var SendModal = ({
|
|
|
7791
8208
|
}
|
|
7792
8209
|
)
|
|
7793
8210
|
] }),
|
|
7794
|
-
txStep === "confirm" && /* @__PURE__ */ (0,
|
|
7795
|
-
/* @__PURE__ */ (0,
|
|
7796
|
-
/* @__PURE__ */ (0,
|
|
7797
|
-
/* @__PURE__ */ (0,
|
|
7798
|
-
/* @__PURE__ */ (0,
|
|
7799
|
-
/* @__PURE__ */ (0,
|
|
7800
|
-
/* @__PURE__ */ (0,
|
|
8211
|
+
txStep === "confirm" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8212
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8213
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("h3", { className: `font-medium ${theme.titleText} mb-3`, children: "Transaction Details" }),
|
|
8214
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-2 text-sm", children: [
|
|
8215
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8216
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "To:" }),
|
|
8217
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `font-mono ${theme.titleText}`, children: `${recipient.slice(0, 6)}...${recipient.slice(-4)}` })
|
|
7801
8218
|
] }),
|
|
7802
|
-
/* @__PURE__ */ (0,
|
|
7803
|
-
/* @__PURE__ */ (0,
|
|
7804
|
-
/* @__PURE__ */ (0,
|
|
8219
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8220
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "Amount:" }),
|
|
8221
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
7805
8222
|
amount,
|
|
7806
8223
|
" LUMIA"
|
|
7807
8224
|
] })
|
|
7808
8225
|
] }),
|
|
7809
|
-
/* @__PURE__ */ (0,
|
|
7810
|
-
/* @__PURE__ */ (0,
|
|
7811
|
-
/* @__PURE__ */ (0,
|
|
8226
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8227
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "Network:" }),
|
|
8228
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.titleText}`, children: "Lumia Beam" })
|
|
7812
8229
|
] })
|
|
7813
8230
|
] })
|
|
7814
8231
|
] }),
|
|
7815
|
-
/* @__PURE__ */ (0,
|
|
7816
|
-
/* @__PURE__ */ (0,
|
|
8232
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex gap-2", children: [
|
|
8233
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7817
8234
|
Button,
|
|
7818
8235
|
{
|
|
7819
8236
|
onClick: () => setTxStep("input"),
|
|
@@ -7823,7 +8240,7 @@ var SendModal = ({
|
|
|
7823
8240
|
children: "Back"
|
|
7824
8241
|
}
|
|
7825
8242
|
),
|
|
7826
|
-
/* @__PURE__ */ (0,
|
|
8243
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
7827
8244
|
Button,
|
|
7828
8245
|
{
|
|
7829
8246
|
onClick: handleConfirm,
|
|
@@ -7831,28 +8248,28 @@ var SendModal = ({
|
|
|
7831
8248
|
className: "flex-1",
|
|
7832
8249
|
size: "lg",
|
|
7833
8250
|
children: [
|
|
7834
|
-
isLoading && /* @__PURE__ */ (0,
|
|
8251
|
+
isLoading && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
7835
8252
|
"Confirm"
|
|
7836
8253
|
]
|
|
7837
8254
|
}
|
|
7838
8255
|
)
|
|
7839
8256
|
] })
|
|
7840
8257
|
] }),
|
|
7841
|
-
txStep === "pending" && /* @__PURE__ */ (0,
|
|
7842
|
-
/* @__PURE__ */ (0,
|
|
7843
|
-
/* @__PURE__ */ (0,
|
|
7844
|
-
/* @__PURE__ */ (0,
|
|
7845
|
-
/* @__PURE__ */ (0,
|
|
8258
|
+
txStep === "pending" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "py-8 text-center space-y-4", children: [
|
|
8259
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Loader2, { className: `h-12 w-12 animate-spin ${isDark ? "text-blue-400" : "text-blue-600"} mx-auto` }),
|
|
8260
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8261
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Pending" }),
|
|
8262
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Please wait while we process your transaction" })
|
|
7846
8263
|
] })
|
|
7847
8264
|
] }),
|
|
7848
|
-
txStep === "success" && userOpHash && /* @__PURE__ */ (0,
|
|
7849
|
-
/* @__PURE__ */ (0,
|
|
7850
|
-
/* @__PURE__ */ (0,
|
|
7851
|
-
/* @__PURE__ */ (0,
|
|
7852
|
-
/* @__PURE__ */ (0,
|
|
8265
|
+
txStep === "success" && userOpHash && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8266
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "text-center py-4", children: [
|
|
8267
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.CheckCircle2, { className: `h-12 w-12 ${isDark ? "text-green-400" : "text-green-500"} mx-auto mb-3` }),
|
|
8268
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Sent!" }),
|
|
8269
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Your transaction is being processed" })
|
|
7853
8270
|
] }),
|
|
7854
|
-
/* @__PURE__ */ (0,
|
|
7855
|
-
/* @__PURE__ */ (0,
|
|
8271
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(UserOpStatus, { userOpHash, chain: lumiaBeam }) }),
|
|
8272
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7856
8273
|
Button,
|
|
7857
8274
|
{
|
|
7858
8275
|
onClick: handleClose,
|
|
@@ -7870,9 +8287,9 @@ var SendModal = ({
|
|
|
7870
8287
|
|
|
7871
8288
|
// src/internal/components/ReceiveModal.tsx
|
|
7872
8289
|
var import_react18 = require("react");
|
|
7873
|
-
var
|
|
8290
|
+
var import_lucide_react15 = require("lucide-react");
|
|
7874
8291
|
var import_qrcode = __toESM(require("qrcode"), 1);
|
|
7875
|
-
var
|
|
8292
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
7876
8293
|
var ReceiveModal = ({
|
|
7877
8294
|
open,
|
|
7878
8295
|
onOpenChange,
|
|
@@ -7913,7 +8330,7 @@ var ReceiveModal = ({
|
|
|
7913
8330
|
if (!addr) return "";
|
|
7914
8331
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7915
8332
|
};
|
|
7916
|
-
return /* @__PURE__ */ (0,
|
|
8333
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
7917
8334
|
DialogContent,
|
|
7918
8335
|
{
|
|
7919
8336
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7925,51 +8342,51 @@ var ReceiveModal = ({
|
|
|
7925
8342
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7926
8343
|
},
|
|
7927
8344
|
children: [
|
|
7928
|
-
/* @__PURE__ */ (0,
|
|
7929
|
-
/* @__PURE__ */ (0,
|
|
7930
|
-
/* @__PURE__ */ (0,
|
|
7931
|
-
onBack && /* @__PURE__ */ (0,
|
|
8345
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DialogTitle, { children: "Receive LUMIA" }) }),
|
|
8346
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DialogDescription, { className: "sr-only", children: "Your wallet address and QR code for receiving LUMIA" }),
|
|
8347
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8348
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
7932
8349
|
"button",
|
|
7933
8350
|
{
|
|
7934
8351
|
onClick: onBack,
|
|
7935
8352
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7936
8353
|
title: "Back",
|
|
7937
|
-
children: /* @__PURE__ */ (0,
|
|
8354
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.ArrowLeft, { className: "h-4 w-4" })
|
|
7938
8355
|
}
|
|
7939
8356
|
),
|
|
7940
|
-
/* @__PURE__ */ (0,
|
|
7941
|
-
/* @__PURE__ */ (0,
|
|
7942
|
-
/* @__PURE__ */ (0,
|
|
8357
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8358
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.QrCode, { className: "h-5 w-5" }),
|
|
8359
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Receive LUMIA" })
|
|
7943
8360
|
] })
|
|
7944
8361
|
] }) }),
|
|
7945
|
-
/* @__PURE__ */ (0,
|
|
7946
|
-
qrCodeUrl && /* @__PURE__ */ (0,
|
|
7947
|
-
/* @__PURE__ */ (0,
|
|
7948
|
-
/* @__PURE__ */ (0,
|
|
7949
|
-
/* @__PURE__ */ (0,
|
|
8362
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "p-5 space-y-4", children: [
|
|
8363
|
+
qrCodeUrl && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `${isDark ? "bg-white" : "bg-white"} p-4 rounded-xl border ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("img", { src: qrCodeUrl, alt: "Wallet QR Code", className: "w-48 h-48" }) }) }),
|
|
8364
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `${isDark ? "bg-blue-900/30 border-blue-600" : "bg-blue-50 border-blue-200"} rounded-lg p-3`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `flex items-center gap-2 ${isDark ? "text-blue-300" : "text-blue-700"} text-sm`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex-1", children: [
|
|
8365
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "font-medium", children: "Network: Lumia Beam" }),
|
|
8366
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} mt-0.5`, children: "Ensure sender is on the same network" })
|
|
7950
8367
|
] }) }) }),
|
|
7951
|
-
/* @__PURE__ */ (0,
|
|
7952
|
-
/* @__PURE__ */ (0,
|
|
7953
|
-
/* @__PURE__ */ (0,
|
|
7954
|
-
/* @__PURE__ */ (0,
|
|
8368
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8369
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Your Wallet Address" }),
|
|
8370
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `flex-1 font-mono text-sm ${isDark ? "text-white bg-gray-700 border-gray-600" : "text-gray-900 bg-white border-gray-300"} rounded-lg px-3 py-2 break-all`, children: address }) }),
|
|
8371
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
7955
8372
|
Button,
|
|
7956
8373
|
{
|
|
7957
8374
|
onClick: handleCopy,
|
|
7958
8375
|
className: "w-full mt-3",
|
|
7959
8376
|
size: "lg",
|
|
7960
|
-
children: copied ? /* @__PURE__ */ (0,
|
|
7961
|
-
/* @__PURE__ */ (0,
|
|
7962
|
-
/* @__PURE__ */ (0,
|
|
7963
|
-
] }) : /* @__PURE__ */ (0,
|
|
7964
|
-
/* @__PURE__ */ (0,
|
|
7965
|
-
/* @__PURE__ */ (0,
|
|
8377
|
+
children: copied ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
|
|
8378
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.CheckCircle2, { className: "h-4 w-4" }),
|
|
8379
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Copied!" })
|
|
8380
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
|
|
8381
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.Copy, { className: "h-4 w-4" }),
|
|
8382
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Copy Address" })
|
|
7966
8383
|
] })
|
|
7967
8384
|
}
|
|
7968
8385
|
)
|
|
7969
8386
|
] }),
|
|
7970
|
-
/* @__PURE__ */ (0,
|
|
7971
|
-
/* @__PURE__ */ (0,
|
|
7972
|
-
/* @__PURE__ */ (0,
|
|
8387
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
8388
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { children: "Share this address to receive LUMIA tokens." }),
|
|
8389
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "mt-1", children: "Only send LUMIA tokens to this address on Lumia Beam network." })
|
|
7973
8390
|
] })
|
|
7974
8391
|
] })
|
|
7975
8392
|
]
|
|
@@ -7978,12 +8395,12 @@ var ReceiveModal = ({
|
|
|
7978
8395
|
};
|
|
7979
8396
|
|
|
7980
8397
|
// src/internal/components/BuyModal.tsx
|
|
7981
|
-
var
|
|
7982
|
-
var
|
|
8398
|
+
var import_lucide_react16 = require("lucide-react");
|
|
8399
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
7983
8400
|
var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
7984
8401
|
const { config } = useLumiaPassportConfig();
|
|
7985
8402
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7986
|
-
return /* @__PURE__ */ (0,
|
|
8403
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
|
|
7987
8404
|
DialogContent,
|
|
7988
8405
|
{
|
|
7989
8406
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7995,26 +8412,26 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7995
8412
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7996
8413
|
},
|
|
7997
8414
|
children: [
|
|
7998
|
-
/* @__PURE__ */ (0,
|
|
7999
|
-
/* @__PURE__ */ (0,
|
|
8000
|
-
/* @__PURE__ */ (0,
|
|
8001
|
-
onBack && /* @__PURE__ */ (0,
|
|
8415
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DialogTitle, { children: "Buy Crypto" }) }),
|
|
8416
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DialogDescription, { className: "sr-only", children: "On-ramp placeholder" }),
|
|
8417
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8418
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
8002
8419
|
"button",
|
|
8003
8420
|
{
|
|
8004
8421
|
onClick: onBack,
|
|
8005
8422
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8006
8423
|
title: "Back",
|
|
8007
|
-
children: /* @__PURE__ */ (0,
|
|
8424
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_lucide_react16.ArrowLeft, { className: "h-4 w-4" })
|
|
8008
8425
|
}
|
|
8009
8426
|
),
|
|
8010
|
-
/* @__PURE__ */ (0,
|
|
8011
|
-
/* @__PURE__ */ (0,
|
|
8012
|
-
/* @__PURE__ */ (0,
|
|
8427
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8428
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_lucide_react16.CreditCard, { className: "h-5 w-5" }),
|
|
8429
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: "Buy" })
|
|
8013
8430
|
] })
|
|
8014
8431
|
] }) }),
|
|
8015
|
-
/* @__PURE__ */ (0,
|
|
8016
|
-
/* @__PURE__ */ (0,
|
|
8017
|
-
/* @__PURE__ */ (0,
|
|
8432
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "p-5", children: [
|
|
8433
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "On-ramp coming soon\u2026" }) }),
|
|
8434
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "pt-4", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
8018
8435
|
] })
|
|
8019
8436
|
]
|
|
8020
8437
|
}
|
|
@@ -8022,14 +8439,14 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8022
8439
|
};
|
|
8023
8440
|
|
|
8024
8441
|
// src/internal/components/KycModal.tsx
|
|
8025
|
-
var
|
|
8026
|
-
var
|
|
8442
|
+
var import_lucide_react17 = require("lucide-react");
|
|
8443
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
8027
8444
|
var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
8028
8445
|
const { config } = useLumiaPassportConfig();
|
|
8029
8446
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
8030
8447
|
const provider = config.kyc?.provider;
|
|
8031
8448
|
const options = config.kyc?.options || {};
|
|
8032
|
-
return /* @__PURE__ */ (0,
|
|
8449
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
|
|
8033
8450
|
DialogContent,
|
|
8034
8451
|
{
|
|
8035
8452
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8041,32 +8458,32 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8041
8458
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8042
8459
|
},
|
|
8043
8460
|
children: [
|
|
8044
|
-
/* @__PURE__ */ (0,
|
|
8045
|
-
/* @__PURE__ */ (0,
|
|
8046
|
-
/* @__PURE__ */ (0,
|
|
8047
|
-
onBack && /* @__PURE__ */ (0,
|
|
8461
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(DialogTitle, { children: "KYC" }) }),
|
|
8462
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(DialogDescription, { className: "sr-only", children: "KYC placeholder" }),
|
|
8463
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8464
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
|
|
8048
8465
|
"button",
|
|
8049
8466
|
{
|
|
8050
8467
|
onClick: onBack,
|
|
8051
8468
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8052
8469
|
title: "Back",
|
|
8053
|
-
children: /* @__PURE__ */ (0,
|
|
8470
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react17.ArrowLeft, { className: "h-4 w-4" })
|
|
8054
8471
|
}
|
|
8055
8472
|
),
|
|
8056
|
-
/* @__PURE__ */ (0,
|
|
8057
|
-
/* @__PURE__ */ (0,
|
|
8058
|
-
/* @__PURE__ */ (0,
|
|
8473
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8474
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react17.ShieldCheck, { className: "h-5 w-5" }),
|
|
8475
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: "KYC" })
|
|
8059
8476
|
] })
|
|
8060
8477
|
] }) }),
|
|
8061
|
-
/* @__PURE__ */ (0,
|
|
8062
|
-
provider ? /* @__PURE__ */ (0,
|
|
8063
|
-
/* @__PURE__ */ (0,
|
|
8478
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "p-5", children: [
|
|
8479
|
+
provider ? /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `rounded-xl p-4 ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: [
|
|
8480
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `text-sm ${theme.titleText} mb-2`, children: [
|
|
8064
8481
|
"KYC provider: ",
|
|
8065
|
-
/* @__PURE__ */ (0,
|
|
8482
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "font-medium", children: provider })
|
|
8066
8483
|
] }),
|
|
8067
|
-
Object.keys(options).length > 0 ? /* @__PURE__ */ (0,
|
|
8068
|
-
] }) : /* @__PURE__ */ (0,
|
|
8069
|
-
/* @__PURE__ */ (0,
|
|
8484
|
+
Object.keys(options).length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-xs ${theme.mutedText} break-words whitespace-pre-wrap`, children: JSON.stringify(options, null, 2) }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "No provider options configured." })
|
|
8485
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "KYC verification coming soon\u2026" }) }),
|
|
8486
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pt-4", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
8070
8487
|
] })
|
|
8071
8488
|
]
|
|
8072
8489
|
}
|
|
@@ -8075,20 +8492,20 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8075
8492
|
|
|
8076
8493
|
// src/components/ConnectWalletButton.tsx
|
|
8077
8494
|
init_auth();
|
|
8078
|
-
var
|
|
8495
|
+
var import_lucide_react18 = require("lucide-react");
|
|
8079
8496
|
init_base();
|
|
8080
8497
|
|
|
8081
8498
|
// src/modules/linkedProfiles.ts
|
|
8082
|
-
var
|
|
8499
|
+
var React27 = __toESM(require("react"), 1);
|
|
8083
8500
|
init_common();
|
|
8084
8501
|
init_types();
|
|
8085
8502
|
init_auth();
|
|
8086
8503
|
function useLumiaPassportLinkedProfiles() {
|
|
8087
|
-
const [profiles, setProfiles] =
|
|
8088
|
-
const [avatar, setAvatar] =
|
|
8089
|
-
const [isLoading, setIsLoading] =
|
|
8090
|
-
const [error, setError] =
|
|
8091
|
-
const load =
|
|
8504
|
+
const [profiles, setProfiles] = React27.useState([]);
|
|
8505
|
+
const [avatar, setAvatar] = React27.useState(null);
|
|
8506
|
+
const [isLoading, setIsLoading] = React27.useState(false);
|
|
8507
|
+
const [error, setError] = React27.useState(null);
|
|
8508
|
+
const load = React27.useCallback(async () => {
|
|
8092
8509
|
setIsLoading(true);
|
|
8093
8510
|
setError(null);
|
|
8094
8511
|
try {
|
|
@@ -8114,14 +8531,14 @@ function useLumiaPassportLinkedProfiles() {
|
|
|
8114
8531
|
setIsLoading(false);
|
|
8115
8532
|
}
|
|
8116
8533
|
}, []);
|
|
8117
|
-
|
|
8534
|
+
React27.useEffect(() => {
|
|
8118
8535
|
load();
|
|
8119
8536
|
}, [load]);
|
|
8120
8537
|
return { profiles, avatar, isLoading, error, refresh: load };
|
|
8121
8538
|
}
|
|
8122
8539
|
|
|
8123
8540
|
// src/components/ConnectWalletButton.tsx
|
|
8124
|
-
var
|
|
8541
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
8125
8542
|
var ConnectWalletButton = ({
|
|
8126
8543
|
className,
|
|
8127
8544
|
label = "Connect Wallet",
|
|
@@ -8173,6 +8590,7 @@ var ConnectWalletButton = ({
|
|
|
8173
8590
|
const [copied, setCopied] = import_react19.default.useState(false);
|
|
8174
8591
|
const [isManageWalletOpen, setIsManageWalletOpen] = import_react19.default.useState(false);
|
|
8175
8592
|
const [isSecurityOpen, setIsSecurityOpen] = import_react19.default.useState(false);
|
|
8593
|
+
const [isBackupOpen, setIsBackupOpen] = import_react19.default.useState(false);
|
|
8176
8594
|
const [isTransactionsOpen, setIsTransactionsOpen] = import_react19.default.useState(false);
|
|
8177
8595
|
const [isViewAssetsOpen, setIsViewAssetsOpen] = import_react19.default.useState(false);
|
|
8178
8596
|
const [isSendOpen, setIsSendOpen] = import_react19.default.useState(false);
|
|
@@ -8423,8 +8841,8 @@ var ConnectWalletButton = ({
|
|
|
8423
8841
|
refetchBalance();
|
|
8424
8842
|
}
|
|
8425
8843
|
}, [address]);
|
|
8426
|
-
return /* @__PURE__ */ (0,
|
|
8427
|
-
/* @__PURE__ */ (0,
|
|
8844
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: [className, "lumia-scope"].filter(Boolean).join(" "), children: [
|
|
8845
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "inline-flex items-center gap-2", children: !address ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8428
8846
|
"button",
|
|
8429
8847
|
{
|
|
8430
8848
|
onClick: () => {
|
|
@@ -8461,56 +8879,56 @@ var ConnectWalletButton = ({
|
|
|
8461
8879
|
},
|
|
8462
8880
|
children: label || "Connect"
|
|
8463
8881
|
}
|
|
8464
|
-
) }) : /* @__PURE__ */ (0,
|
|
8882
|
+
) }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8465
8883
|
"div",
|
|
8466
8884
|
{
|
|
8467
8885
|
className: `relative rounded-2xl p-4 shadow-lg cursor-pointer transition-all duration-200 hover:scale-105 hover:shadow-xl max-w-sm min-w-[280px] ${isDark ? "bg-gray-900/40 backdrop-blur border border-gray-700" : "bg-white backdrop-blur border border-gray-200"}`,
|
|
8468
8886
|
onClick: () => setIsWalletMenuOpen(true),
|
|
8469
|
-
children: /* @__PURE__ */ (0,
|
|
8470
|
-
/* @__PURE__ */ (0,
|
|
8887
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-3", children: [
|
|
8888
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 overflow-hidden bg-gradient-to-br from-purple-500 to-blue-600", children: avatar ? (
|
|
8471
8889
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8472
|
-
/* @__PURE__ */ (0,
|
|
8473
|
-
) : /* @__PURE__ */ (0,
|
|
8474
|
-
/* @__PURE__ */ (0,
|
|
8475
|
-
/* @__PURE__ */ (0,
|
|
8476
|
-
/* @__PURE__ */ (0,
|
|
8890
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8891
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white font-bold text-sm", children: "LP" }) }),
|
|
8892
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "text-left flex-1 min-w-0", children: [
|
|
8893
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `font-semibold text-base truncate ${theme.titleText}`, children: mode === "compact" && displayName ? displayName : formatAddress(address) }),
|
|
8894
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
8477
8895
|
formatBalance(),
|
|
8478
8896
|
" LUMIA"
|
|
8479
8897
|
] })
|
|
8480
8898
|
] }),
|
|
8481
|
-
/* @__PURE__ */ (0,
|
|
8482
|
-
/* @__PURE__ */ (0,
|
|
8483
|
-
/* @__PURE__ */ (0,
|
|
8484
|
-
|
|
8899
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
8900
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8901
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8902
|
+
import_lucide_react18.Cloud,
|
|
8485
8903
|
{
|
|
8486
8904
|
className: `w-3 h-3 ${indicators.server ? "text-green-500" : "text-orange-400"}`
|
|
8487
8905
|
}
|
|
8488
8906
|
),
|
|
8489
|
-
/* @__PURE__ */ (0,
|
|
8907
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8490
8908
|
"Server Keyshare: ",
|
|
8491
8909
|
indicators.server ? "Available" : "Missing"
|
|
8492
8910
|
] })
|
|
8493
8911
|
] }),
|
|
8494
|
-
/* @__PURE__ */ (0,
|
|
8495
|
-
/* @__PURE__ */ (0,
|
|
8496
|
-
|
|
8912
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8913
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8914
|
+
import_lucide_react18.Laptop,
|
|
8497
8915
|
{
|
|
8498
8916
|
className: `w-3 h-3 ${indicators.local ? "text-green-500" : "text-orange-400"}`
|
|
8499
8917
|
}
|
|
8500
8918
|
),
|
|
8501
|
-
/* @__PURE__ */ (0,
|
|
8919
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8502
8920
|
"Local Keyshare: ",
|
|
8503
8921
|
indicators.local ? "Available" : "Missing"
|
|
8504
8922
|
] })
|
|
8505
8923
|
] }),
|
|
8506
|
-
/* @__PURE__ */ (0,
|
|
8507
|
-
/* @__PURE__ */ (0,
|
|
8508
|
-
|
|
8924
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8925
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8926
|
+
import_lucide_react18.Shield,
|
|
8509
8927
|
{
|
|
8510
8928
|
className: `w-3 h-3 ${indicators.backup ? "text-green-500" : "text-orange-400"}`
|
|
8511
8929
|
}
|
|
8512
8930
|
),
|
|
8513
|
-
/* @__PURE__ */ (0,
|
|
8931
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8514
8932
|
"Vault Backup: ",
|
|
8515
8933
|
indicators.backup ? "Available" : "Not Found"
|
|
8516
8934
|
] })
|
|
@@ -8519,59 +8937,59 @@ var ConnectWalletButton = ({
|
|
|
8519
8937
|
] })
|
|
8520
8938
|
}
|
|
8521
8939
|
) }),
|
|
8522
|
-
isWalletMenuOpen && address && /* @__PURE__ */ (0,
|
|
8523
|
-
/* @__PURE__ */ (0,
|
|
8524
|
-
/* @__PURE__ */ (0,
|
|
8525
|
-
/* @__PURE__ */ (0,
|
|
8526
|
-
/* @__PURE__ */ (0,
|
|
8940
|
+
isWalletMenuOpen && address && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "fixed inset-0 z-[60]", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Dialog, { open: isWalletMenuOpen, onOpenChange: setIsWalletMenuOpen, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
8941
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogTitle, { children: "Wallet Menu" }) }),
|
|
8942
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogDescription, { className: "sr-only", children: "Smart Account wallet actions and status" }),
|
|
8943
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `p-4 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-4", children: [
|
|
8944
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center relative overflow-hidden", children: avatar ? (
|
|
8527
8945
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8528
|
-
/* @__PURE__ */ (0,
|
|
8529
|
-
) : /* @__PURE__ */ (0,
|
|
8530
|
-
/* @__PURE__ */ (0,
|
|
8531
|
-
/* @__PURE__ */ (0,
|
|
8532
|
-
/* @__PURE__ */ (0,
|
|
8533
|
-
/* @__PURE__ */ (0,
|
|
8534
|
-
/* @__PURE__ */ (0,
|
|
8946
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8947
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white font-bold text-lg", children: "L" }) }),
|
|
8948
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
8949
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `font-medium text-lg ${theme.titleText}`, children: displayName || "Smart Account" }),
|
|
8950
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
8951
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: formatAddress(address) }),
|
|
8952
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("button", { onClick: async () => {
|
|
8535
8953
|
try {
|
|
8536
8954
|
await navigator.clipboard.writeText(address);
|
|
8537
8955
|
setCopied(true);
|
|
8538
8956
|
setTimeout(() => setCopied(false), 1500);
|
|
8539
8957
|
} catch {
|
|
8540
8958
|
}
|
|
8541
|
-
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ (0,
|
|
8959
|
+
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-green-500 text-sm", children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Copy, { className: "w-4 h-4" }) })
|
|
8542
8960
|
] })
|
|
8543
8961
|
] })
|
|
8544
8962
|
] }) }) }),
|
|
8545
|
-
/* @__PURE__ */ (0,
|
|
8546
|
-
/* @__PURE__ */ (0,
|
|
8547
|
-
/* @__PURE__ */ (0,
|
|
8963
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "p-4", children: [
|
|
8964
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "grid grid-cols-3 gap-2 mb-4", children: [
|
|
8965
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8548
8966
|
setIsWalletMenuOpen(false);
|
|
8549
8967
|
setIsSendOpen(true);
|
|
8550
8968
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-blue-400" : "bg-blue-50 hover:bg-blue-100 text-blue-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8551
|
-
/* @__PURE__ */ (0,
|
|
8552
|
-
/* @__PURE__ */ (0,
|
|
8969
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUp, { className: "w-5 h-5" }),
|
|
8970
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Send" })
|
|
8553
8971
|
] }),
|
|
8554
|
-
/* @__PURE__ */ (0,
|
|
8972
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8555
8973
|
setIsWalletMenuOpen(false);
|
|
8556
8974
|
setIsReceiveOpen(true);
|
|
8557
8975
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-green-400" : "bg-green-50 hover:bg-green-100 text-green-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8558
|
-
/* @__PURE__ */ (0,
|
|
8559
|
-
/* @__PURE__ */ (0,
|
|
8976
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowDown, { className: "w-5 h-5" }),
|
|
8977
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Receive" })
|
|
8560
8978
|
] }),
|
|
8561
|
-
/* @__PURE__ */ (0,
|
|
8979
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8562
8980
|
setIsWalletMenuOpen(false);
|
|
8563
8981
|
setIsBuyOpen(true);
|
|
8564
8982
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-purple-400" : "bg-purple-50 hover:bg-purple-100 text-purple-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8565
|
-
/* @__PURE__ */ (0,
|
|
8566
|
-
/* @__PURE__ */ (0,
|
|
8983
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Plus, { className: "w-5 h-5" }),
|
|
8984
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Buy" })
|
|
8567
8985
|
] })
|
|
8568
8986
|
] }),
|
|
8569
|
-
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ (0,
|
|
8570
|
-
/* @__PURE__ */ (0,
|
|
8571
|
-
/* @__PURE__ */ (0,
|
|
8572
|
-
/* @__PURE__ */ (0,
|
|
8573
|
-
/* @__PURE__ */ (0,
|
|
8574
|
-
/* @__PURE__ */ (0,
|
|
8987
|
+
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-orange-900/20 border border-orange-900/40" : "bg-orange-50 border border-orange-200"}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-start space-x-3", children: [
|
|
8988
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.AlertTriangle, { className: `w-5 h-5 ${isDark ? "text-orange-400" : "text-orange-500"} mt-0.5 flex-shrink-0` }),
|
|
8989
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
8990
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm font-medium ${isDark ? "text-orange-300" : "text-orange-700"}`, children: "Backup Not Created" }),
|
|
8991
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-xs mt-1 ${isDark ? "text-orange-400/80" : "text-orange-600"}`, children: "Secure your wallet with an encrypted vault backup to protect against device loss." }),
|
|
8992
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
8575
8993
|
"button",
|
|
8576
8994
|
{
|
|
8577
8995
|
onClick: () => {
|
|
@@ -8580,19 +8998,19 @@ var ConnectWalletButton = ({
|
|
|
8580
8998
|
},
|
|
8581
8999
|
className: `mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${isDark ? "bg-orange-900/40 hover:bg-orange-900/60 text-orange-300" : "bg-orange-100 hover:bg-orange-200 text-orange-700"}`,
|
|
8582
9000
|
children: [
|
|
8583
|
-
/* @__PURE__ */ (0,
|
|
9001
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: "w-3 h-3 inline mr-1" }),
|
|
8584
9002
|
"Create Backup"
|
|
8585
9003
|
]
|
|
8586
9004
|
}
|
|
8587
9005
|
)
|
|
8588
9006
|
] })
|
|
8589
9007
|
] }) }),
|
|
8590
|
-
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ (0,
|
|
8591
|
-
/* @__PURE__ */ (0,
|
|
8592
|
-
/* @__PURE__ */ (0,
|
|
8593
|
-
/* @__PURE__ */ (0,
|
|
8594
|
-
/* @__PURE__ */ (0,
|
|
8595
|
-
/* @__PURE__ */ (0,
|
|
9008
|
+
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-blue-900/20 border border-blue-900/40" : "bg-blue-50 border border-blue-200"}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-start space-x-3", children: [
|
|
9009
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.AlertTriangle, { className: `w-5 h-5 ${isDark ? "text-blue-400" : "text-blue-500"} mt-0.5 flex-shrink-0` }),
|
|
9010
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
9011
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm font-medium ${isDark ? "text-blue-300" : "text-blue-700"}`, children: "Email Not Connected" }),
|
|
9012
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-xs mt-1 ${isDark ? "text-blue-400/80" : "text-blue-600"}`, children: "Connect your email for easier account recovery and additional security." }),
|
|
9013
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
8596
9014
|
"button",
|
|
8597
9015
|
{
|
|
8598
9016
|
onClick: () => {
|
|
@@ -8601,80 +9019,87 @@ var ConnectWalletButton = ({
|
|
|
8601
9019
|
},
|
|
8602
9020
|
className: `mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${isDark ? "bg-blue-900/40 hover:bg-blue-900/60 text-blue-300" : "bg-blue-100 hover:bg-blue-200 text-blue-700"}`,
|
|
8603
9021
|
children: [
|
|
8604
|
-
/* @__PURE__ */ (0,
|
|
9022
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: "w-3 h-3 inline mr-1" }),
|
|
8605
9023
|
"Connect Email"
|
|
8606
9024
|
]
|
|
8607
9025
|
}
|
|
8608
9026
|
)
|
|
8609
9027
|
] })
|
|
8610
9028
|
] }) }),
|
|
8611
|
-
/* @__PURE__ */ (0,
|
|
9029
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8612
9030
|
"button",
|
|
8613
9031
|
{
|
|
8614
9032
|
onClick: () => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank"),
|
|
8615
9033
|
className: `w-full ${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-3 mb-3 transition-colors cursor-pointer text-left`,
|
|
8616
|
-
children: /* @__PURE__ */ (0,
|
|
8617
|
-
/* @__PURE__ */ (0,
|
|
8618
|
-
/* @__PURE__ */ (0,
|
|
8619
|
-
/* @__PURE__ */ (0,
|
|
8620
|
-
/* @__PURE__ */ (0,
|
|
8621
|
-
/* @__PURE__ */ (0,
|
|
9034
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9035
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-3", children: [
|
|
9036
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden", children: lumiaBeam.logoDataUri ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: lumiaBeam.logoDataUri, alt: "Chain logo", className: "w-full h-full object-cover" }) : lumiaBeam.logo === "lumia" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(LumiaLogo, { size: 32 }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white text-xs font-bold", children: (lumiaBeam.name || "L").charAt(0) }) }),
|
|
9037
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
|
|
9038
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `${theme.titleText} font-medium`, children: lumiaBeam.name }),
|
|
9039
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: theme.mutedText + " text-sm", children: [
|
|
8622
9040
|
formatBalance(),
|
|
8623
9041
|
" LUMIA"
|
|
8624
9042
|
] })
|
|
8625
9043
|
] })
|
|
8626
9044
|
] }),
|
|
8627
|
-
/* @__PURE__ */ (0,
|
|
9045
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: theme.iconColor, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUpRight, { className: "w-4 h-4" }) })
|
|
8628
9046
|
] })
|
|
8629
9047
|
}
|
|
8630
9048
|
),
|
|
8631
|
-
/* @__PURE__ */ (0,
|
|
8632
|
-
config.features?.kycNeeded && /* @__PURE__ */ (0,
|
|
9049
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "space-y-1", children: [
|
|
9050
|
+
config.features?.kycNeeded && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8633
9051
|
setIsWalletMenuOpen(false);
|
|
8634
9052
|
setIsKycOpen(true);
|
|
8635
9053
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8636
|
-
/* @__PURE__ */ (0,
|
|
8637
|
-
/* @__PURE__ */ (0,
|
|
9054
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9055
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "KYC" })
|
|
8638
9056
|
] }),
|
|
8639
|
-
/* @__PURE__ */ (0,
|
|
9057
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8640
9058
|
setIsWalletMenuOpen(false);
|
|
8641
9059
|
setIsTransactionsOpen(true);
|
|
8642
9060
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8643
|
-
/* @__PURE__ */ (0,
|
|
8644
|
-
/* @__PURE__ */ (0,
|
|
9061
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Activity, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9062
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Transactions" })
|
|
8645
9063
|
] }),
|
|
8646
|
-
/* @__PURE__ */ (0,
|
|
9064
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8647
9065
|
setIsWalletMenuOpen(false);
|
|
8648
9066
|
setIsViewAssetsOpen(true);
|
|
8649
9067
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8650
|
-
/* @__PURE__ */ (0,
|
|
8651
|
-
/* @__PURE__ */ (0,
|
|
9068
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Gem, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9069
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "View Assets" })
|
|
8652
9070
|
] }),
|
|
8653
|
-
/* @__PURE__ */ (0,
|
|
9071
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8654
9072
|
setIsWalletMenuOpen(false);
|
|
8655
9073
|
setIsManageWalletOpen(true);
|
|
8656
9074
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8657
|
-
/* @__PURE__ */ (0,
|
|
8658
|
-
/* @__PURE__ */ (0,
|
|
9075
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.CreditCard, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9076
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Manage Wallet" })
|
|
8659
9077
|
] }),
|
|
8660
|
-
/* @__PURE__ */ (0,
|
|
9078
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8661
9079
|
setIsWalletMenuOpen(false);
|
|
8662
9080
|
setIsSecurityOpen(true);
|
|
8663
9081
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8664
|
-
/* @__PURE__ */ (0,
|
|
8665
|
-
/* @__PURE__ */ (0,
|
|
9082
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Lock, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9083
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Security" })
|
|
8666
9084
|
] }),
|
|
8667
|
-
/* @__PURE__ */ (0,
|
|
9085
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
9086
|
+
setIsWalletMenuOpen(false);
|
|
9087
|
+
setIsBackupOpen(true);
|
|
9088
|
+
}, 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: [
|
|
9089
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Shield, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9090
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Keyshare Backup" })
|
|
9091
|
+
] }),
|
|
9092
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: async () => {
|
|
8668
9093
|
await handleDisconnect();
|
|
8669
9094
|
setIsWalletMenuOpen(false);
|
|
8670
9095
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-red-900/20" : "hover:bg-red-50"} transition-colors flex items-center space-x-3`, children: [
|
|
8671
|
-
/* @__PURE__ */ (0,
|
|
8672
|
-
/* @__PURE__ */ (0,
|
|
9096
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUpRight, { className: "w-5 h-5 text-red-600" }),
|
|
9097
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-red-600", children: "Disconnect Wallet" })
|
|
8673
9098
|
] })
|
|
8674
9099
|
] })
|
|
8675
9100
|
] })
|
|
8676
9101
|
] }) }) }),
|
|
8677
|
-
/* @__PURE__ */ (0,
|
|
9102
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8678
9103
|
ManageWallet,
|
|
8679
9104
|
{
|
|
8680
9105
|
open: isManageWalletOpen,
|
|
@@ -8685,7 +9110,7 @@ var ConnectWalletButton = ({
|
|
|
8685
9110
|
}
|
|
8686
9111
|
}
|
|
8687
9112
|
),
|
|
8688
|
-
/* @__PURE__ */ (0,
|
|
9113
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8689
9114
|
SecurityModal,
|
|
8690
9115
|
{
|
|
8691
9116
|
open: isSecurityOpen,
|
|
@@ -8696,7 +9121,23 @@ var ConnectWalletButton = ({
|
|
|
8696
9121
|
}
|
|
8697
9122
|
}
|
|
8698
9123
|
),
|
|
8699
|
-
/* @__PURE__ */ (0,
|
|
9124
|
+
isBackupOpen && session?.mpcUserId && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Dialog, { open: isBackupOpen, onOpenChange: setIsBackupOpen, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
9125
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(VisuallyHidden, { children: [
|
|
9126
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogTitle, { children: "Keyshare Backup" }),
|
|
9127
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogDescription, { children: "Create and manage encrypted backups of your keyshare" })
|
|
9128
|
+
] }),
|
|
9129
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
9130
|
+
KeyshareBackup,
|
|
9131
|
+
{
|
|
9132
|
+
userId: session.mpcUserId,
|
|
9133
|
+
onClose: () => setIsBackupOpen(false),
|
|
9134
|
+
onBackupSuccess: () => {
|
|
9135
|
+
console.log("[ConnectWalletButton] Backup created successfully");
|
|
9136
|
+
}
|
|
9137
|
+
}
|
|
9138
|
+
)
|
|
9139
|
+
] }) }),
|
|
9140
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8700
9141
|
TransactionsModal,
|
|
8701
9142
|
{
|
|
8702
9143
|
open: isTransactionsOpen,
|
|
@@ -8707,7 +9148,7 @@ var ConnectWalletButton = ({
|
|
|
8707
9148
|
}
|
|
8708
9149
|
}
|
|
8709
9150
|
),
|
|
8710
|
-
/* @__PURE__ */ (0,
|
|
9151
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8711
9152
|
ViewAssetsModal,
|
|
8712
9153
|
{
|
|
8713
9154
|
open: isViewAssetsOpen,
|
|
@@ -8718,7 +9159,7 @@ var ConnectWalletButton = ({
|
|
|
8718
9159
|
}
|
|
8719
9160
|
}
|
|
8720
9161
|
),
|
|
8721
|
-
/* @__PURE__ */ (0,
|
|
9162
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8722
9163
|
SendModal,
|
|
8723
9164
|
{
|
|
8724
9165
|
open: isSendOpen,
|
|
@@ -8729,7 +9170,7 @@ var ConnectWalletButton = ({
|
|
|
8729
9170
|
}
|
|
8730
9171
|
}
|
|
8731
9172
|
),
|
|
8732
|
-
/* @__PURE__ */ (0,
|
|
9173
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8733
9174
|
ReceiveModal,
|
|
8734
9175
|
{
|
|
8735
9176
|
open: isReceiveOpen,
|
|
@@ -8740,7 +9181,7 @@ var ConnectWalletButton = ({
|
|
|
8740
9181
|
}
|
|
8741
9182
|
}
|
|
8742
9183
|
),
|
|
8743
|
-
/* @__PURE__ */ (0,
|
|
9184
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8744
9185
|
BuyModal,
|
|
8745
9186
|
{
|
|
8746
9187
|
open: isBuyOpen,
|
|
@@ -8751,7 +9192,7 @@ var ConnectWalletButton = ({
|
|
|
8751
9192
|
}
|
|
8752
9193
|
}
|
|
8753
9194
|
),
|
|
8754
|
-
/* @__PURE__ */ (0,
|
|
9195
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8755
9196
|
KycModal,
|
|
8756
9197
|
{
|
|
8757
9198
|
open: isKycOpen,
|
|
@@ -8762,7 +9203,7 @@ var ConnectWalletButton = ({
|
|
|
8762
9203
|
}
|
|
8763
9204
|
}
|
|
8764
9205
|
),
|
|
8765
|
-
/* @__PURE__ */ (0,
|
|
9206
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8766
9207
|
AuthModal,
|
|
8767
9208
|
{
|
|
8768
9209
|
open: isAuthModalOpen,
|
|
@@ -8807,7 +9248,7 @@ var ConnectWalletButton = ({
|
|
|
8807
9248
|
}
|
|
8808
9249
|
}
|
|
8809
9250
|
),
|
|
8810
|
-
/* @__PURE__ */ (0,
|
|
9251
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8811
9252
|
TssManagerWithRef,
|
|
8812
9253
|
{
|
|
8813
9254
|
ref: tssManagerRef,
|
|
@@ -8825,7 +9266,7 @@ var ConnectWalletButton = ({
|
|
|
8825
9266
|
};
|
|
8826
9267
|
|
|
8827
9268
|
// src/components/ThemeToggle.tsx
|
|
8828
|
-
var
|
|
9269
|
+
var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
8829
9270
|
var ThemeToggle = () => {
|
|
8830
9271
|
const { config, updateConfig } = useLumiaPassportConfig();
|
|
8831
9272
|
const currentTheme = config.ui.theme;
|
|
@@ -8870,7 +9311,7 @@ var ThemeToggle = () => {
|
|
|
8870
9311
|
return "auto";
|
|
8871
9312
|
}
|
|
8872
9313
|
};
|
|
8873
|
-
return /* @__PURE__ */ (0,
|
|
9314
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "lumia-scope", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
|
|
8874
9315
|
"button",
|
|
8875
9316
|
{
|
|
8876
9317
|
onClick: cycleTheme,
|
|
@@ -8886,19 +9327,19 @@ var ThemeToggle = () => {
|
|
|
8886
9327
|
};
|
|
8887
9328
|
|
|
8888
9329
|
// src/components/LumiaLogo.tsx
|
|
8889
|
-
var
|
|
9330
|
+
var import_jsx_runtime35 = require("react/jsx-runtime");
|
|
8890
9331
|
var LumiaLogo2 = ({ size = 80, className = "" }) => {
|
|
8891
|
-
return /* @__PURE__ */ (0,
|
|
9332
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
8892
9333
|
"div",
|
|
8893
9334
|
{
|
|
8894
9335
|
className: `flex items-center justify-center ${className}`,
|
|
8895
9336
|
style: { width: size, height: size },
|
|
8896
|
-
children: /* @__PURE__ */ (0,
|
|
8897
|
-
/* @__PURE__ */ (0,
|
|
8898
|
-
/* @__PURE__ */ (0,
|
|
8899
|
-
/* @__PURE__ */ (0,
|
|
8900
|
-
/* @__PURE__ */ (0,
|
|
8901
|
-
/* @__PURE__ */ (0,
|
|
9337
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("svg", { viewBox: "0 0 512 512", width: size, height: size, children: [
|
|
9338
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("circle", { cx: "256", cy: "256", r: "256", fill: "#060117", strokeWidth: "0" }),
|
|
9339
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9340
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9341
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9342
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z", fill: "#fefdff", strokeWidth: "0" })
|
|
8902
9343
|
] })
|
|
8903
9344
|
}
|
|
8904
9345
|
);
|
|
@@ -8961,9 +9402,9 @@ function useTheme2(configTheme) {
|
|
|
8961
9402
|
}
|
|
8962
9403
|
|
|
8963
9404
|
// src/internal/components/Hash.tsx
|
|
8964
|
-
var
|
|
8965
|
-
var
|
|
8966
|
-
var
|
|
9405
|
+
var React29 = __toESM(require("react"), 1);
|
|
9406
|
+
var import_lucide_react19 = require("lucide-react");
|
|
9407
|
+
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
8967
9408
|
function toExplorerUrl(kind, value, chain) {
|
|
8968
9409
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
8969
9410
|
if (!base2) return null;
|
|
@@ -8986,12 +9427,12 @@ var Hash = ({
|
|
|
8986
9427
|
}) => {
|
|
8987
9428
|
const value = hash || "";
|
|
8988
9429
|
const explorer = toExplorerUrl(kind, value, chain || void 0);
|
|
8989
|
-
const [copied, setCopied] =
|
|
8990
|
-
if (!value) return /* @__PURE__ */ (0,
|
|
8991
|
-
return /* @__PURE__ */ (0,
|
|
8992
|
-
label && /* @__PURE__ */ (0,
|
|
8993
|
-
/* @__PURE__ */ (0,
|
|
8994
|
-
showCopy && /* @__PURE__ */ (0,
|
|
9430
|
+
const [copied, setCopied] = React29.useState(false);
|
|
9431
|
+
if (!value) return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
9432
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cn2("flex items-center gap-2", className), children: [
|
|
9433
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "text-sm font-medium", children: label }),
|
|
9434
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("code", { className: "text-xs bg-background px-2 py-1 rounded break-all", children: truncate ? short2(value) : value }),
|
|
9435
|
+
showCopy && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8995
9436
|
Button,
|
|
8996
9437
|
{
|
|
8997
9438
|
variant: "ghost",
|
|
@@ -9005,10 +9446,10 @@ var Hash = ({
|
|
|
9005
9446
|
} catch {
|
|
9006
9447
|
}
|
|
9007
9448
|
},
|
|
9008
|
-
children: /* @__PURE__ */ (0,
|
|
9449
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react19.Copy, { className: "h-4 w-4" })
|
|
9009
9450
|
}
|
|
9010
9451
|
),
|
|
9011
|
-
showExplorer && explorer && /* @__PURE__ */ (0,
|
|
9452
|
+
showExplorer && explorer && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
9012
9453
|
"a",
|
|
9013
9454
|
{
|
|
9014
9455
|
href: explorer,
|
|
@@ -9016,7 +9457,7 @@ var Hash = ({
|
|
|
9016
9457
|
rel: "noreferrer noopener",
|
|
9017
9458
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
9018
9459
|
title: "Open in explorer",
|
|
9019
|
-
children: /* @__PURE__ */ (0,
|
|
9460
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react19.ExternalLink, { className: "h-4 w-4" })
|
|
9020
9461
|
}
|
|
9021
9462
|
)
|
|
9022
9463
|
] });
|
|
@@ -9025,7 +9466,7 @@ var Hash = ({
|
|
|
9025
9466
|
// src/internal/components/TransactionsList.tsx
|
|
9026
9467
|
var import_react21 = require("react");
|
|
9027
9468
|
init_base();
|
|
9028
|
-
var
|
|
9469
|
+
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
9029
9470
|
var TransactionsList = ({
|
|
9030
9471
|
address,
|
|
9031
9472
|
itemsCount = 10
|
|
@@ -9079,15 +9520,15 @@ var TransactionsList = ({
|
|
|
9079
9520
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
9080
9521
|
};
|
|
9081
9522
|
if (loading) {
|
|
9082
|
-
return /* @__PURE__ */ (0,
|
|
9083
|
-
/* @__PURE__ */ (0,
|
|
9084
|
-
/* @__PURE__ */ (0,
|
|
9523
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 text-center", children: [
|
|
9524
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full" }),
|
|
9525
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "mt-2 text-sm text-gray-600", children: "Loading transactions..." })
|
|
9085
9526
|
] });
|
|
9086
9527
|
}
|
|
9087
9528
|
if (error) {
|
|
9088
|
-
return /* @__PURE__ */ (0,
|
|
9089
|
-
/* @__PURE__ */ (0,
|
|
9090
|
-
/* @__PURE__ */ (0,
|
|
9529
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 text-center", children: [
|
|
9530
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "text-red-600 text-sm", children: error }),
|
|
9531
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9091
9532
|
"button",
|
|
9092
9533
|
{
|
|
9093
9534
|
onClick: () => window.location.reload(),
|
|
@@ -9098,54 +9539,54 @@ var TransactionsList = ({
|
|
|
9098
9539
|
] });
|
|
9099
9540
|
}
|
|
9100
9541
|
if (transactions.length === 0) {
|
|
9101
|
-
return /* @__PURE__ */ (0,
|
|
9542
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "p-4 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "text-gray-600 text-sm", children: "No transactions found" }) });
|
|
9102
9543
|
}
|
|
9103
|
-
return /* @__PURE__ */ (0,
|
|
9544
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "max-h-96 overflow-y-auto", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "space-y-2 p-2", children: transactions.map((tx) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
|
|
9104
9545
|
"div",
|
|
9105
9546
|
{
|
|
9106
9547
|
className: "border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors",
|
|
9107
9548
|
onClick: () => openTransaction(tx.hash),
|
|
9108
9549
|
children: [
|
|
9109
|
-
/* @__PURE__ */ (0,
|
|
9110
|
-
/* @__PURE__ */ (0,
|
|
9111
|
-
/* @__PURE__ */ (0,
|
|
9112
|
-
/* @__PURE__ */ (0,
|
|
9113
|
-
/* @__PURE__ */ (0,
|
|
9550
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex justify-between items-start mb-2", children: [
|
|
9551
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex-1", children: [
|
|
9552
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center space-x-2 mb-1", children: [
|
|
9553
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs font-mono bg-gray-100 px-2 py-1 rounded", children: formatAddress(tx.hash) }),
|
|
9554
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: `text-xs px-2 py-1 rounded ${tx.status === "ok" ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800"}`, children: tx.status === "ok" ? "Success" : "Failed" })
|
|
9114
9555
|
] }),
|
|
9115
|
-
/* @__PURE__ */ (0,
|
|
9116
|
-
/* @__PURE__ */ (0,
|
|
9117
|
-
/* @__PURE__ */ (0,
|
|
9118
|
-
/* @__PURE__ */ (0,
|
|
9556
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-sm space-y-1", children: [
|
|
9557
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9558
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "From:" }),
|
|
9559
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-mono ml-1", children: [
|
|
9119
9560
|
formatAddress(tx.from.hash),
|
|
9120
|
-
tx.from.is_contract && /* @__PURE__ */ (0,
|
|
9561
|
+
tx.from.is_contract && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9121
9562
|
] })
|
|
9122
9563
|
] }),
|
|
9123
|
-
/* @__PURE__ */ (0,
|
|
9124
|
-
/* @__PURE__ */ (0,
|
|
9125
|
-
/* @__PURE__ */ (0,
|
|
9564
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9565
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "To:" }),
|
|
9566
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-mono ml-1", children: [
|
|
9126
9567
|
formatAddress(tx.to.hash),
|
|
9127
|
-
tx.to.is_contract && /* @__PURE__ */ (0,
|
|
9568
|
+
tx.to.is_contract && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9128
9569
|
] })
|
|
9129
9570
|
] }),
|
|
9130
|
-
/* @__PURE__ */ (0,
|
|
9131
|
-
/* @__PURE__ */ (0,
|
|
9132
|
-
/* @__PURE__ */ (0,
|
|
9571
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9572
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "Value:" }),
|
|
9573
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-semibold ml-1", children: [
|
|
9133
9574
|
formatValue(tx.value),
|
|
9134
9575
|
" LUMIA"
|
|
9135
9576
|
] })
|
|
9136
9577
|
] })
|
|
9137
9578
|
] })
|
|
9138
9579
|
] }),
|
|
9139
|
-
/* @__PURE__ */ (0,
|
|
9140
|
-
/* @__PURE__ */ (0,
|
|
9141
|
-
/* @__PURE__ */ (0,
|
|
9580
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-right text-xs text-gray-500", children: [
|
|
9581
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { children: formatDate2(tx.timestamp) }),
|
|
9582
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "mt-1", children: [
|
|
9142
9583
|
"Gas: ",
|
|
9143
9584
|
parseInt(tx.gas_used).toLocaleString()
|
|
9144
9585
|
] }),
|
|
9145
|
-
tx.method && /* @__PURE__ */ (0,
|
|
9586
|
+
tx.method && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "mt-1 text-blue-600", children: tx.method })
|
|
9146
9587
|
] })
|
|
9147
9588
|
] }),
|
|
9148
|
-
tx.transaction_types.length > 0 && /* @__PURE__ */ (0,
|
|
9589
|
+
tx.transaction_types.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9149
9590
|
"span",
|
|
9150
9591
|
{
|
|
9151
9592
|
className: "text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full",
|
|
@@ -9159,247 +9600,6 @@ var TransactionsList = ({
|
|
|
9159
9600
|
)) }) });
|
|
9160
9601
|
};
|
|
9161
9602
|
|
|
9162
|
-
// src/internal/components/KeyshareBackup.tsx
|
|
9163
|
-
var React30 = __toESM(require("react"), 1);
|
|
9164
|
-
var import_lucide_react19 = require("lucide-react");
|
|
9165
|
-
init_vaultClient();
|
|
9166
|
-
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
9167
|
-
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
9168
|
-
const [backupStatus, setBackupStatus] = React30.useState(() => getBackupStatus(userId));
|
|
9169
|
-
const [loading, setLoading] = React30.useState({
|
|
9170
|
-
server: false,
|
|
9171
|
-
cloud: false,
|
|
9172
|
-
local: false
|
|
9173
|
-
});
|
|
9174
|
-
const [error, setError] = React30.useState(null);
|
|
9175
|
-
const [success, setSuccess] = React30.useState(null);
|
|
9176
|
-
const [showPassword, setShowPassword] = React30.useState(false);
|
|
9177
|
-
const [useCustomPassword, setUseCustomPassword] = React30.useState(false);
|
|
9178
|
-
const [customPassword, setCustomPassword] = React30.useState("");
|
|
9179
|
-
const [cloudProviders, setCloudProviders] = React30.useState([]);
|
|
9180
|
-
const [selectedCloudProvider, setSelectedCloudProvider] = React30.useState(null);
|
|
9181
|
-
const hasKeyshareData = React30.useMemo(() => {
|
|
9182
|
-
return !!getCurrentKeyshareBackupData(userId);
|
|
9183
|
-
}, [userId]);
|
|
9184
|
-
React30.useEffect(() => {
|
|
9185
|
-
getAvailableCloudProviders2().then((providers) => {
|
|
9186
|
-
setCloudProviders(providers);
|
|
9187
|
-
if (providers.length > 0 && !selectedCloudProvider) {
|
|
9188
|
-
setSelectedCloudProvider(providers[0].id);
|
|
9189
|
-
}
|
|
9190
|
-
});
|
|
9191
|
-
}, [selectedCloudProvider]);
|
|
9192
|
-
const refreshStatus = React30.useCallback(() => {
|
|
9193
|
-
setBackupStatus(getBackupStatus(userId));
|
|
9194
|
-
}, [userId]);
|
|
9195
|
-
React30.useEffect(() => {
|
|
9196
|
-
refreshStatus();
|
|
9197
|
-
}, [refreshStatus]);
|
|
9198
|
-
const handleBackup = async (method) => {
|
|
9199
|
-
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
9200
|
-
setError(null);
|
|
9201
|
-
setSuccess(null);
|
|
9202
|
-
try {
|
|
9203
|
-
const password = useCustomPassword ? customPassword : void 0;
|
|
9204
|
-
switch (method) {
|
|
9205
|
-
case "server":
|
|
9206
|
-
await backupToServer(userId, password);
|
|
9207
|
-
setSuccess("Successfully created server backup");
|
|
9208
|
-
break;
|
|
9209
|
-
case "cloud": {
|
|
9210
|
-
await backupToCloud(userId, password, selectedCloudProvider || void 0);
|
|
9211
|
-
setSuccess(`Successfully created cloud backup`);
|
|
9212
|
-
const updatedProviders = await getAvailableCloudProviders2();
|
|
9213
|
-
setCloudProviders(updatedProviders);
|
|
9214
|
-
break;
|
|
9215
|
-
}
|
|
9216
|
-
case "local":
|
|
9217
|
-
await backupToLocalFile(userId, password);
|
|
9218
|
-
setSuccess("Backup file downloaded successfully");
|
|
9219
|
-
break;
|
|
9220
|
-
}
|
|
9221
|
-
refreshStatus();
|
|
9222
|
-
setTimeout(() => {
|
|
9223
|
-
if (typeof window !== "undefined") {
|
|
9224
|
-
window.dispatchEvent(
|
|
9225
|
-
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
9226
|
-
detail: { method, success: true }
|
|
9227
|
-
})
|
|
9228
|
-
);
|
|
9229
|
-
}
|
|
9230
|
-
onBackupSuccess?.();
|
|
9231
|
-
}, 100);
|
|
9232
|
-
} catch (err) {
|
|
9233
|
-
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
9234
|
-
setError(errorMsg);
|
|
9235
|
-
updateBackupStatus(userId, method, { error: errorMsg });
|
|
9236
|
-
refreshStatus();
|
|
9237
|
-
} finally {
|
|
9238
|
-
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
9239
|
-
}
|
|
9240
|
-
};
|
|
9241
|
-
const formatLastBackup = (timestamp) => {
|
|
9242
|
-
if (!timestamp) return "Never";
|
|
9243
|
-
const date = new Date(timestamp);
|
|
9244
|
-
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
9245
|
-
};
|
|
9246
|
-
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(Card, { className: "border-green-200 bg-green-50", children: [
|
|
9247
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardHeader, { className: "pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9248
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
9249
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Shield, { className: "h-6 w-6 text-green-600" }),
|
|
9250
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9251
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
9252
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
9253
|
-
] })
|
|
9254
|
-
] }),
|
|
9255
|
-
onClose && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.X, { className: "h-4 w-4" }) })
|
|
9256
|
-
] }) }),
|
|
9257
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
9258
|
-
error && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
9259
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.AlertCircle, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9260
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: error })
|
|
9261
|
-
] }),
|
|
9262
|
-
success && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
9263
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.CheckCircle2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9264
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: success })
|
|
9265
|
-
] }),
|
|
9266
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "space-y-3", children: [
|
|
9267
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
9268
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9269
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9270
|
-
"input",
|
|
9271
|
-
{
|
|
9272
|
-
type: "checkbox",
|
|
9273
|
-
id: "use-backup-password",
|
|
9274
|
-
checked: useCustomPassword,
|
|
9275
|
-
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
9276
|
-
className: "rounded"
|
|
9277
|
-
}
|
|
9278
|
-
),
|
|
9279
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
9280
|
-
] }),
|
|
9281
|
-
!useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9282
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Key, { className: "h-4 w-4" }),
|
|
9283
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
9284
|
-
] }) }),
|
|
9285
|
-
useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "relative", children: [
|
|
9286
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9287
|
-
Input,
|
|
9288
|
-
{
|
|
9289
|
-
type: showPassword ? "text" : "password",
|
|
9290
|
-
placeholder: "Enter backup encryption password",
|
|
9291
|
-
value: customPassword,
|
|
9292
|
-
onChange: (e) => setCustomPassword(e.target.value),
|
|
9293
|
-
className: "pr-10"
|
|
9294
|
-
}
|
|
9295
|
-
),
|
|
9296
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9297
|
-
"button",
|
|
9298
|
-
{
|
|
9299
|
-
type: "button",
|
|
9300
|
-
onClick: () => setShowPassword(!showPassword),
|
|
9301
|
-
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
9302
|
-
children: showPassword ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Eye, { className: "h-4 w-4" })
|
|
9303
|
-
}
|
|
9304
|
-
)
|
|
9305
|
-
] })
|
|
9306
|
-
] }),
|
|
9307
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "space-y-4", children: [
|
|
9308
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
9309
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
9310
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
9311
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Server, { className: "h-5 w-5 text-blue-600" }),
|
|
9312
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9313
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
9314
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
9315
|
-
] })
|
|
9316
|
-
] }) }),
|
|
9317
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9318
|
-
Button,
|
|
9319
|
-
{
|
|
9320
|
-
onClick: () => handleBackup("server"),
|
|
9321
|
-
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9322
|
-
className: "px-4 py-2",
|
|
9323
|
-
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9324
|
-
}
|
|
9325
|
-
),
|
|
9326
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9327
|
-
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
9328
|
-
formatLastBackup(backupStatus.server.lastBackup)
|
|
9329
|
-
] })
|
|
9330
|
-
] }),
|
|
9331
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
9332
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9333
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Cloud, { className: "h-5 w-5 text-sky-600" }),
|
|
9334
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9335
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
9336
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
9337
|
-
] })
|
|
9338
|
-
] }),
|
|
9339
|
-
cloudProviders.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9340
|
-
"select",
|
|
9341
|
-
{
|
|
9342
|
-
value: selectedCloudProvider || "",
|
|
9343
|
-
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
9344
|
-
className: "text-sm border rounded px-2 py-1 w-full",
|
|
9345
|
-
children: cloudProviders.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("option", { value: provider.id, children: [
|
|
9346
|
-
provider.icon,
|
|
9347
|
-
" ",
|
|
9348
|
-
provider.name,
|
|
9349
|
-
" ",
|
|
9350
|
-
provider.isAuthenticated ? "\u2713" : ""
|
|
9351
|
-
] }, provider.id))
|
|
9352
|
-
}
|
|
9353
|
-
) }),
|
|
9354
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9355
|
-
Button,
|
|
9356
|
-
{
|
|
9357
|
-
onClick: () => handleBackup("cloud"),
|
|
9358
|
-
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
9359
|
-
className: "px-4 py-2",
|
|
9360
|
-
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9361
|
-
}
|
|
9362
|
-
),
|
|
9363
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
9364
|
-
] }),
|
|
9365
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
9366
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9367
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Download, { className: "h-5 w-5 text-purple-600" }),
|
|
9368
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9369
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
9370
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
9371
|
-
] })
|
|
9372
|
-
] }),
|
|
9373
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9374
|
-
Button,
|
|
9375
|
-
{
|
|
9376
|
-
onClick: () => handleBackup("local"),
|
|
9377
|
-
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9378
|
-
className: "w-full",
|
|
9379
|
-
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
9380
|
-
}
|
|
9381
|
-
),
|
|
9382
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9383
|
-
"Download encrypted backup file to your device \u2022 Last: ",
|
|
9384
|
-
formatLastBackup(backupStatus.local.lastBackup)
|
|
9385
|
-
] })
|
|
9386
|
-
] })
|
|
9387
|
-
] }),
|
|
9388
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
9389
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Lock, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
9390
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9391
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium", children: "Security Notice" }),
|
|
9392
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "mt-1", children: [
|
|
9393
|
-
useCustomPassword ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
9394
|
-
" ",
|
|
9395
|
-
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
9396
|
-
] })
|
|
9397
|
-
] })
|
|
9398
|
-
] })
|
|
9399
|
-
] })
|
|
9400
|
-
] });
|
|
9401
|
-
}
|
|
9402
|
-
|
|
9403
9603
|
// src/hooks/useUserOpStatus.ts
|
|
9404
9604
|
var React31 = __toESM(require("react"), 1);
|
|
9405
9605
|
init_base();
|