@lumiapassport/ui-kit 1.1.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 +456 -0
- package/dist/iframe/main.js +1251 -2
- package/dist/iframe/main.js.map +1 -1
- package/dist/index.cjs +1154 -750
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +1213 -810
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2396,6 +2396,7 @@ var init_iframe_manager = __esm({
|
|
|
2396
2396
|
this.iframe.style.zIndex = "999999";
|
|
2397
2397
|
this.iframe.style.background = "rgba(0, 0, 0, 0.5)";
|
|
2398
2398
|
this.iframe.setAttribute("sandbox", "allow-scripts allow-same-origin");
|
|
2399
|
+
this.iframe.setAttribute("allow", "publickey-credentials-get *; publickey-credentials-create *");
|
|
2399
2400
|
this.messageListener = this.handleMessage.bind(this);
|
|
2400
2401
|
window.addEventListener("message", this.messageListener);
|
|
2401
2402
|
document.body.appendChild(this.iframe);
|
|
@@ -2752,6 +2753,92 @@ var init_iframe_manager = __esm({
|
|
|
2752
2753
|
}
|
|
2753
2754
|
return false;
|
|
2754
2755
|
}
|
|
2756
|
+
/**
|
|
2757
|
+
* Create backup of keyshare
|
|
2758
|
+
*/
|
|
2759
|
+
async createBackup(userId, backupRequest, accessToken) {
|
|
2760
|
+
this.log("[IframeManager] Creating backup...");
|
|
2761
|
+
const response = await this.sendMessage("CREATE_BACKUP", {
|
|
2762
|
+
userId,
|
|
2763
|
+
backupRequest,
|
|
2764
|
+
accessToken
|
|
2765
|
+
// Pass access token for TSS API authentication
|
|
2766
|
+
});
|
|
2767
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_CREATED") {
|
|
2768
|
+
return response.result;
|
|
2769
|
+
}
|
|
2770
|
+
throw new Error("Unexpected response type");
|
|
2771
|
+
}
|
|
2772
|
+
/**
|
|
2773
|
+
* Restore keyshare from server backup
|
|
2774
|
+
*/
|
|
2775
|
+
async restoreFromServer(userId, password, accessToken) {
|
|
2776
|
+
this.log("[IframeManager] Restoring backup from server...");
|
|
2777
|
+
const response = await this.sendMessage("RESTORE_BACKUP", {
|
|
2778
|
+
userId,
|
|
2779
|
+
password,
|
|
2780
|
+
accessToken
|
|
2781
|
+
// Pass access token for TSS API authentication
|
|
2782
|
+
});
|
|
2783
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_RESTORED") {
|
|
2784
|
+
return response.result;
|
|
2785
|
+
}
|
|
2786
|
+
throw new Error("Unexpected response type");
|
|
2787
|
+
}
|
|
2788
|
+
/**
|
|
2789
|
+
* Encrypt backup data without uploading (for cloud/local backups)
|
|
2790
|
+
* Returns encrypted data that parent can upload/download
|
|
2791
|
+
*/
|
|
2792
|
+
async encryptBackupData(userId, password) {
|
|
2793
|
+
this.log("[IframeManager] Encrypting backup data...");
|
|
2794
|
+
const response = await this.sendMessage("ENCRYPT_BACKUP_DATA", {
|
|
2795
|
+
userId,
|
|
2796
|
+
password
|
|
2797
|
+
});
|
|
2798
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_ENCRYPTED") {
|
|
2799
|
+
return response.encryptedData;
|
|
2800
|
+
}
|
|
2801
|
+
throw new Error("Unexpected response type");
|
|
2802
|
+
}
|
|
2803
|
+
/**
|
|
2804
|
+
* Restore keyshare from local file backup
|
|
2805
|
+
*/
|
|
2806
|
+
async restoreFromLocalFile(userId, fileContent, password) {
|
|
2807
|
+
this.log("[IframeManager] Restoring backup from local file...");
|
|
2808
|
+
const response = await this.sendMessage("RESTORE_FROM_FILE", {
|
|
2809
|
+
userId,
|
|
2810
|
+
fileContent,
|
|
2811
|
+
password
|
|
2812
|
+
});
|
|
2813
|
+
if (response.type === "LUMIA_PASSPORT_FILE_RESTORED") {
|
|
2814
|
+
return response.result;
|
|
2815
|
+
}
|
|
2816
|
+
throw new Error("Unexpected response type");
|
|
2817
|
+
}
|
|
2818
|
+
/**
|
|
2819
|
+
* Get backup status for user
|
|
2820
|
+
*/
|
|
2821
|
+
async getBackupStatus(userId) {
|
|
2822
|
+
this.log("[IframeManager] Getting backup status...");
|
|
2823
|
+
const response = await this.sendMessage("GET_BACKUP_STATUS", {
|
|
2824
|
+
userId
|
|
2825
|
+
});
|
|
2826
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_STATUS") {
|
|
2827
|
+
return response.status;
|
|
2828
|
+
}
|
|
2829
|
+
throw new Error("Unexpected response type");
|
|
2830
|
+
}
|
|
2831
|
+
/**
|
|
2832
|
+
* Get available cloud providers
|
|
2833
|
+
*/
|
|
2834
|
+
async getCloudProviders() {
|
|
2835
|
+
this.log("[IframeManager] Getting cloud providers...");
|
|
2836
|
+
const response = await this.sendMessage("GET_CLOUD_PROVIDERS", {});
|
|
2837
|
+
if (response.type === "LUMIA_PASSPORT_CLOUD_PROVIDERS") {
|
|
2838
|
+
return response.providers;
|
|
2839
|
+
}
|
|
2840
|
+
throw new Error("Unexpected response type");
|
|
2841
|
+
}
|
|
2755
2842
|
/**
|
|
2756
2843
|
* Cleanup and destroy iframe
|
|
2757
2844
|
*/
|
|
@@ -2791,7 +2878,7 @@ var init_iframe_manager = __esm({
|
|
|
2791
2878
|
});
|
|
2792
2879
|
|
|
2793
2880
|
// src/styles/built.css
|
|
2794
|
-
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2881
|
+
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2795
2882
|
|
|
2796
2883
|
// src/context/LumiaPassportContext.tsx
|
|
2797
2884
|
init_lumiaPassport();
|
|
@@ -3260,7 +3347,7 @@ var LumiaRainbowKitProvider = ({ children }) => {
|
|
|
3260
3347
|
};
|
|
3261
3348
|
|
|
3262
3349
|
// src/components/ConnectWalletButton.tsx
|
|
3263
|
-
import
|
|
3350
|
+
import React28 from "react";
|
|
3264
3351
|
import { useBalance as useBalance3 } from "wagmi";
|
|
3265
3352
|
|
|
3266
3353
|
// src/internal/components/ui/dialog.tsx
|
|
@@ -3596,6 +3683,7 @@ Input.displayName = "Input";
|
|
|
3596
3683
|
|
|
3597
3684
|
// src/internal/components/KeyshareRestore.tsx
|
|
3598
3685
|
init_vaultClient();
|
|
3686
|
+
init_iframe_manager();
|
|
3599
3687
|
import { Fragment as Fragment2, jsx as jsx16, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
3600
3688
|
function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
3601
3689
|
const { config } = useLumiaPassportConfig();
|
|
@@ -3609,6 +3697,14 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3609
3697
|
const [restorePassword, setRestorePassword] = React10.useState("");
|
|
3610
3698
|
const [hasServerBackup, setHasServerBackup] = React10.useState(null);
|
|
3611
3699
|
const [checkingBackup, setCheckingBackup] = React10.useState(true);
|
|
3700
|
+
const iframeManager = React10.useMemo(() => {
|
|
3701
|
+
try {
|
|
3702
|
+
return getIframeManager();
|
|
3703
|
+
} catch (e) {
|
|
3704
|
+
console.error("[KeyshareRestore] Failed to get iframe manager:", e);
|
|
3705
|
+
return null;
|
|
3706
|
+
}
|
|
3707
|
+
}, []);
|
|
3612
3708
|
React10.useEffect(() => {
|
|
3613
3709
|
const checkBackupAvailability = async () => {
|
|
3614
3710
|
try {
|
|
@@ -3631,20 +3727,31 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3631
3727
|
}, [userId]);
|
|
3632
3728
|
const handleRestoreFromServer = async () => {
|
|
3633
3729
|
console.log("[KeyshareRestore] Starting server restore for userId:", userId);
|
|
3730
|
+
if (!iframeManager) {
|
|
3731
|
+
setError("Iframe manager not initialized");
|
|
3732
|
+
return;
|
|
3733
|
+
}
|
|
3634
3734
|
setLoading((prev) => ({ ...prev, server: true }));
|
|
3635
3735
|
setError(null);
|
|
3636
3736
|
setSuccess(null);
|
|
3637
3737
|
try {
|
|
3638
|
-
const passwordToUse = useCustomPassword ? restorePassword :
|
|
3639
|
-
console.log("[KeyshareRestore] Calling restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3640
|
-
await
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3738
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3739
|
+
console.log("[KeyshareRestore] Calling iframeManager.restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3740
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
3741
|
+
const accessToken = jwt?.accessToken;
|
|
3742
|
+
const result = await iframeManager.restoreFromServer(userId, passwordToUse, accessToken);
|
|
3743
|
+
if (result.success) {
|
|
3744
|
+
console.log("[KeyshareRestore] Server restore successful");
|
|
3745
|
+
setSuccess("Successfully restored keyshare from server backup");
|
|
3746
|
+
setTimeout(() => {
|
|
3747
|
+
onRestoreSuccess?.();
|
|
3748
|
+
}, 100);
|
|
3749
|
+
} else {
|
|
3750
|
+
console.error("[KeyshareRestore] Server restore failed:", result.error);
|
|
3751
|
+
setError(result.error || "Server restore failed");
|
|
3752
|
+
}
|
|
3646
3753
|
} catch (err) {
|
|
3647
|
-
console.error("[KeyshareRestore] Server restore
|
|
3754
|
+
console.error("[KeyshareRestore] Server restore exception:", err);
|
|
3648
3755
|
const errorMsg = err instanceof Error ? err.message : "Server restore failed";
|
|
3649
3756
|
setError(errorMsg);
|
|
3650
3757
|
} finally {
|
|
@@ -3661,18 +3768,27 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3661
3768
|
setError("Please enter the backup password");
|
|
3662
3769
|
return;
|
|
3663
3770
|
}
|
|
3771
|
+
if (!iframeManager) {
|
|
3772
|
+
setError("Iframe manager not initialized");
|
|
3773
|
+
return;
|
|
3774
|
+
}
|
|
3664
3775
|
setLoading((prev) => ({ ...prev, file: true }));
|
|
3665
3776
|
setError(null);
|
|
3666
3777
|
setSuccess(null);
|
|
3667
3778
|
try {
|
|
3668
|
-
const
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3779
|
+
const fileContent = await restoreFile.text();
|
|
3780
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3781
|
+
const result = await iframeManager.restoreFromLocalFile(userId, fileContent, passwordToUse);
|
|
3782
|
+
if (result.success) {
|
|
3783
|
+
setSuccess("Successfully restored keyshare from backup file");
|
|
3784
|
+
setRestoreFile(null);
|
|
3785
|
+
setRestorePassword("");
|
|
3786
|
+
setTimeout(() => {
|
|
3787
|
+
onRestoreSuccess?.();
|
|
3788
|
+
}, 100);
|
|
3789
|
+
} else {
|
|
3790
|
+
setError(result.error || "File restore failed");
|
|
3791
|
+
}
|
|
3676
3792
|
} catch (err) {
|
|
3677
3793
|
const errorMsg = err instanceof Error ? err.message : "Restore failed";
|
|
3678
3794
|
setError(errorMsg);
|
|
@@ -3910,7 +4026,7 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3910
4026
|
}
|
|
3911
4027
|
|
|
3912
4028
|
// src/internal/components/VerificationCodeInput.tsx
|
|
3913
|
-
import { useEffect as useEffect4, useMemo as
|
|
4029
|
+
import { useEffect as useEffect4, useMemo as useMemo3, useRef, useState as useState4 } from "react";
|
|
3914
4030
|
import { jsx as jsx17, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
3915
4031
|
var VerificationCodeInput = ({ onVerifyCode, onResendCode, isLoading, expiresIn, error }) => {
|
|
3916
4032
|
const { config } = useLumiaPassportConfig();
|
|
@@ -3926,7 +4042,7 @@ var VerificationCodeInput = ({ onVerifyCode, onResendCode, isLoading, expiresIn,
|
|
|
3926
4042
|
const [digits, setDigits] = useState4(["", "", "", "", "", ""]);
|
|
3927
4043
|
const inputsRef = useRef([]);
|
|
3928
4044
|
const lastSubmittedRef = useRef(null);
|
|
3929
|
-
const code =
|
|
4045
|
+
const code = useMemo3(() => digits.join(""), [digits]);
|
|
3930
4046
|
useEffect4(() => {
|
|
3931
4047
|
if (code.length === 6 && digits.every((d) => d !== "") && !isLoading) {
|
|
3932
4048
|
if (lastSubmittedRef.current !== code) {
|
|
@@ -5272,6 +5388,208 @@ async function sendUserOperation(session, callTarget, amountWei, innerData = "0x
|
|
|
5272
5388
|
}
|
|
5273
5389
|
return hash;
|
|
5274
5390
|
}
|
|
5391
|
+
async function prepareUserOperation(session, callTarget, amountWei, innerData = "0x", feeType = "standard", entryPointVersion = "v0.7") {
|
|
5392
|
+
const entryPointAddress = entryPointVersion === "v0.6" ? ENTRYPOINT_V06 : ENTRYPOINT_V07;
|
|
5393
|
+
const amountWeiBigInt = BigInt(amountWei);
|
|
5394
|
+
const isMinimalTest = callTarget === "0x0000000000000000000000000000000000000000" && amountWei === "0" && innerData === "0x";
|
|
5395
|
+
let callData;
|
|
5396
|
+
if (isMinimalTest) {
|
|
5397
|
+
callData = "0x";
|
|
5398
|
+
} else {
|
|
5399
|
+
callData = encodeFunctionData({ abi: executeAbi, functionName: "execute", args: [callTarget, amountWeiBigInt, innerData] });
|
|
5400
|
+
}
|
|
5401
|
+
let isDeployed = false;
|
|
5402
|
+
let deploymentMethod = "unknown";
|
|
5403
|
+
try {
|
|
5404
|
+
const code = await publicClient.getCode({ address: session.smartAccountAddress });
|
|
5405
|
+
if (code && code !== "0x" && code.length > 2) {
|
|
5406
|
+
isDeployed = true;
|
|
5407
|
+
deploymentMethod = "getCode";
|
|
5408
|
+
}
|
|
5409
|
+
} catch {
|
|
5410
|
+
}
|
|
5411
|
+
const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress);
|
|
5412
|
+
const nonceValue = BigInt(nonce);
|
|
5413
|
+
if (!isDeployed && nonceValue !== 0n) throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);
|
|
5414
|
+
const shouldIncludeFactory = !isDeployed;
|
|
5415
|
+
let userOp;
|
|
5416
|
+
if (shouldIncludeFactory) {
|
|
5417
|
+
const compatCreateAbi = [{ type: "function", name: "createAccount", stateMutability: "payable", inputs: [{ name: "owner", type: "address" }, { name: "salt", type: "bytes32" }], outputs: [{ name: "", type: "address" }] }];
|
|
5418
|
+
const saltZero = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
5419
|
+
const factoryData = encodeFunctionData({ abi: compatCreateAbi, functionName: "createAccount", args: [session.ownerAddress, saltZero] });
|
|
5420
|
+
userOp = await createUserOperationWithDynamicFees(
|
|
5421
|
+
session.smartAccountAddress,
|
|
5422
|
+
nonce,
|
|
5423
|
+
callData,
|
|
5424
|
+
true,
|
|
5425
|
+
session.factoryAddress,
|
|
5426
|
+
factoryData,
|
|
5427
|
+
feeType
|
|
5428
|
+
);
|
|
5429
|
+
} else {
|
|
5430
|
+
userOp = await createUserOperationWithDynamicFees(
|
|
5431
|
+
session.smartAccountAddress,
|
|
5432
|
+
nonce,
|
|
5433
|
+
callData,
|
|
5434
|
+
false,
|
|
5435
|
+
void 0,
|
|
5436
|
+
void 0,
|
|
5437
|
+
feeType
|
|
5438
|
+
);
|
|
5439
|
+
}
|
|
5440
|
+
const ensureGenerousDefaults = () => {
|
|
5441
|
+
const toHex2 = (v) => `0x${v.toString(16)}`;
|
|
5442
|
+
const minCallGas = 0x493e0n;
|
|
5443
|
+
const minVerificationGas = 0x989680n;
|
|
5444
|
+
const minPreVerificationGas = 0x30d40n;
|
|
5445
|
+
if (BigInt(userOp.callGasLimit || "0x0") < minCallGas) userOp.callGasLimit = toHex2(minCallGas);
|
|
5446
|
+
if (BigInt(userOp.verificationGasLimit || "0x0") < minVerificationGas) userOp.verificationGasLimit = toHex2(minVerificationGas);
|
|
5447
|
+
if (BigInt(userOp.preVerificationGas || "0x0") < minPreVerificationGas) userOp.preVerificationGas = toHex2(minPreVerificationGas);
|
|
5448
|
+
};
|
|
5449
|
+
const enforceCaps = (usePaymaster) => {
|
|
5450
|
+
try {
|
|
5451
|
+
const envCaps = typeof import.meta !== "undefined" && import.meta.env || {};
|
|
5452
|
+
const maxBundlerVerifGas = envCaps.VITE_MAX_VERIFICATION_GAS ? BigInt(envCaps.VITE_MAX_VERIFICATION_GAS) : MAX_BUNDLER_VERIFICATION_GAS;
|
|
5453
|
+
const maxCallGas = envCaps.VITE_MAX_CALL_GAS_LIMIT ? BigInt(envCaps.VITE_MAX_CALL_GAS_LIMIT) : 0x7a120n;
|
|
5454
|
+
const toHex2 = (v) => `0x${v.toString(16)}`;
|
|
5455
|
+
const maxAccountVerifGas = usePaymaster ? maxBundlerVerifGas - PAYMASTER_VERIFICATION_GAS : maxBundlerVerifGas;
|
|
5456
|
+
const verGas = BigInt(userOp.verificationGasLimit || "0x0");
|
|
5457
|
+
if (verGas > maxAccountVerifGas) userOp.verificationGasLimit = toHex2(maxAccountVerifGas);
|
|
5458
|
+
const callGas = BigInt(userOp.callGasLimit || "0x0");
|
|
5459
|
+
if (callGas > maxCallGas) userOp.callGasLimit = toHex2(maxCallGas);
|
|
5460
|
+
} catch {
|
|
5461
|
+
}
|
|
5462
|
+
};
|
|
5463
|
+
let estimated = false;
|
|
5464
|
+
try {
|
|
5465
|
+
const gasEst = await estimateUserOperationGas({ ...userOp, signature: `0x${"00".repeat(65)}` });
|
|
5466
|
+
userOp.callGasLimit = gasEst.callGasLimit;
|
|
5467
|
+
userOp.verificationGasLimit = gasEst.verificationGasLimit;
|
|
5468
|
+
userOp.preVerificationGas = gasEst.preVerificationGas;
|
|
5469
|
+
ensureGenerousDefaults();
|
|
5470
|
+
enforceCaps(session.usePaymaster);
|
|
5471
|
+
estimated = true;
|
|
5472
|
+
} catch {
|
|
5473
|
+
ensureGenerousDefaults();
|
|
5474
|
+
enforceCaps(session.usePaymaster);
|
|
5475
|
+
}
|
|
5476
|
+
try {
|
|
5477
|
+
const toHex2 = (v) => `0x${v.toString(16)}`;
|
|
5478
|
+
const isContractCall = !!userOp.callData && userOp.callData !== "0x";
|
|
5479
|
+
if (isContractCall) {
|
|
5480
|
+
const currentVer = BigInt(userOp.verificationGasLimit || "0x0");
|
|
5481
|
+
const call = BigInt(userOp.callGasLimit || "0x0");
|
|
5482
|
+
const postOp = 150000n;
|
|
5483
|
+
const safety10k = 10000n;
|
|
5484
|
+
let buffer = call + postOp + safety10k;
|
|
5485
|
+
buffer += buffer / 63n;
|
|
5486
|
+
const newVer = currentVer + buffer;
|
|
5487
|
+
userOp.verificationGasLimit = toHex2(newVer);
|
|
5488
|
+
enforceCaps(session.usePaymaster);
|
|
5489
|
+
}
|
|
5490
|
+
} catch {
|
|
5491
|
+
}
|
|
5492
|
+
if (session.usePaymaster && LUMIA_PAYMASTER_ADDRESS) {
|
|
5493
|
+
userOp.paymaster = LUMIA_PAYMASTER_ADDRESS;
|
|
5494
|
+
userOp.paymasterData = "0x";
|
|
5495
|
+
userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;
|
|
5496
|
+
userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;
|
|
5497
|
+
}
|
|
5498
|
+
userOp.nonce = nonce;
|
|
5499
|
+
let opHash;
|
|
5500
|
+
if (entryPointVersion === "v0.6") {
|
|
5501
|
+
const userOpV06 = convertUserOpV07ToV06(userOp);
|
|
5502
|
+
opHash = await publicClient.readContract({
|
|
5503
|
+
address: entryPointAddress,
|
|
5504
|
+
abi: [{ type: "function", name: "getUserOpHash", inputs: [{ name: "userOp", type: "tuple", components: [{ name: "sender", type: "address" }, { name: "nonce", type: "uint256" }, { name: "initCode", type: "bytes" }, { name: "callData", type: "bytes" }, { name: "callGasLimit", type: "uint256" }, { name: "verificationGasLimit", type: "uint256" }, { name: "preVerificationGas", type: "uint256" }, { name: "maxFeePerGas", type: "uint256" }, { name: "maxPriorityFeePerGas", type: "uint256" }, { name: "paymasterAndData", type: "bytes" }, { name: "signature", type: "bytes" }] }], outputs: [{ name: "", type: "bytes32" }] }],
|
|
5505
|
+
functionName: "getUserOpHash",
|
|
5506
|
+
args: [{
|
|
5507
|
+
sender: userOpV06.sender,
|
|
5508
|
+
nonce: BigInt(userOpV06.nonce),
|
|
5509
|
+
initCode: userOpV06.initCode,
|
|
5510
|
+
callData: userOpV06.callData,
|
|
5511
|
+
callGasLimit: BigInt(userOpV06.callGasLimit),
|
|
5512
|
+
verificationGasLimit: BigInt(userOpV06.verificationGasLimit),
|
|
5513
|
+
preVerificationGas: BigInt(userOpV06.preVerificationGas),
|
|
5514
|
+
maxFeePerGas: BigInt(userOpV06.maxFeePerGas),
|
|
5515
|
+
maxPriorityFeePerGas: BigInt(userOpV06.maxPriorityFeePerGas),
|
|
5516
|
+
paymasterAndData: userOpV06.paymasterAndData,
|
|
5517
|
+
signature: "0x"
|
|
5518
|
+
}]
|
|
5519
|
+
});
|
|
5520
|
+
} else {
|
|
5521
|
+
const hasFactoryData = !!(userOp.factory && userOp.factoryData);
|
|
5522
|
+
const initCode = hasFactoryData ? (() => {
|
|
5523
|
+
const factoryAddr = userOp.factory.startsWith("0x") ? userOp.factory.slice(2) : userOp.factory;
|
|
5524
|
+
const factoryDataClean = userOp.factoryData.startsWith("0x") ? userOp.factoryData.slice(2) : userOp.factoryData;
|
|
5525
|
+
return `0x${factoryAddr}${factoryDataClean}`;
|
|
5526
|
+
})() : "0x";
|
|
5527
|
+
const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit));
|
|
5528
|
+
const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas));
|
|
5529
|
+
let paymasterAndData = "0x";
|
|
5530
|
+
if (userOp.paymaster && userOp.paymaster !== "0x0000000000000000000000000000000000000000") {
|
|
5531
|
+
const verificationGasLimit = userOp.paymasterVerificationGasLimit || "0x186a0";
|
|
5532
|
+
const postOpGasLimit = userOp.paymasterPostOpGasLimit || "0x186a0";
|
|
5533
|
+
const paymasterDataField = userOp.paymasterData || "0x";
|
|
5534
|
+
const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit));
|
|
5535
|
+
const paymasterAddr = userOp.paymaster.startsWith("0x") ? userOp.paymaster.slice(2) : userOp.paymaster;
|
|
5536
|
+
const paymasterDataClean = paymasterDataField === "0x" ? "" : paymasterDataField.startsWith("0x") ? paymasterDataField.slice(2) : paymasterDataField;
|
|
5537
|
+
paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}`;
|
|
5538
|
+
}
|
|
5539
|
+
const packedForHash = {
|
|
5540
|
+
sender: session.smartAccountAddress,
|
|
5541
|
+
nonce: BigInt(nonce),
|
|
5542
|
+
initCode,
|
|
5543
|
+
callData,
|
|
5544
|
+
accountGasLimits,
|
|
5545
|
+
preVerificationGas: BigInt(userOp.preVerificationGas),
|
|
5546
|
+
gasFees,
|
|
5547
|
+
paymasterAndData,
|
|
5548
|
+
signature: "0x"
|
|
5549
|
+
};
|
|
5550
|
+
opHash = await publicClient.readContract({
|
|
5551
|
+
address: entryPointAddress,
|
|
5552
|
+
abi: entryPoint07Abi,
|
|
5553
|
+
functionName: "getUserOpHash",
|
|
5554
|
+
args: [packedForHash]
|
|
5555
|
+
});
|
|
5556
|
+
}
|
|
5557
|
+
let signature;
|
|
5558
|
+
if (session.mpcUserId) {
|
|
5559
|
+
const mpcSig = await signDigestWithMpc(session.mpcUserId, opHash, {
|
|
5560
|
+
sender: userOp.sender,
|
|
5561
|
+
nonce: userOp.nonce,
|
|
5562
|
+
callData: userOp.callData,
|
|
5563
|
+
callGasLimit: userOp.callGasLimit,
|
|
5564
|
+
verificationGasLimit: userOp.verificationGasLimit,
|
|
5565
|
+
preVerificationGas: userOp.preVerificationGas,
|
|
5566
|
+
maxFeePerGas: userOp.maxFeePerGas,
|
|
5567
|
+
maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,
|
|
5568
|
+
paymaster: userOp.paymaster,
|
|
5569
|
+
factory: userOp.factory,
|
|
5570
|
+
factoryData: userOp.factoryData
|
|
5571
|
+
});
|
|
5572
|
+
if (!mpcSig) throw new Error("MPC signing failed");
|
|
5573
|
+
signature = mpcSig;
|
|
5574
|
+
} else if (session.ownerPrivateKey) {
|
|
5575
|
+
const account = privateKeyToAccount(session.ownerPrivateKey);
|
|
5576
|
+
const rawSig = await account.sign({ hash: opHash });
|
|
5577
|
+
signature = normalizeSignature(rawSig);
|
|
5578
|
+
} else {
|
|
5579
|
+
throw new Error("No signing method available");
|
|
5580
|
+
}
|
|
5581
|
+
userOp.signature = signature;
|
|
5582
|
+
if (typeof userOp.sender !== "string") {
|
|
5583
|
+
userOp.sender = session.smartAccountAddress;
|
|
5584
|
+
}
|
|
5585
|
+
console.log("[Account] \u2705 Prepared signed UserOp (not sent):", JSON.stringify(userOp, (key, value) => typeof value === "bigint" ? `0x${value.toString(16)}` : value, 2));
|
|
5586
|
+
console.log("[Account] \u{1F511} UserOp Hash:", opHash);
|
|
5587
|
+
if (entryPointVersion === "v0.6") {
|
|
5588
|
+
const userOpV06 = convertUserOpV07ToV06(userOp);
|
|
5589
|
+
return { userOp: userOpV06, userOpHash: opHash };
|
|
5590
|
+
}
|
|
5591
|
+
return { userOp, userOpHash: opHash };
|
|
5592
|
+
}
|
|
5275
5593
|
async function getEntryPointDeposit(address, entryPointVersion = "v0.7") {
|
|
5276
5594
|
const entryPointAddress = entryPointVersion === "v0.6" ? ENTRYPOINT_V06 : ENTRYPOINT_V07;
|
|
5277
5595
|
const depositAbi = [{ type: "function", name: "balanceOf", stateMutability: "view", inputs: [{ name: "account", type: "address" }], outputs: [{ name: "", type: "uint256" }] }];
|
|
@@ -6491,152 +6809,453 @@ var SecurityModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6491
6809
|
] });
|
|
6492
6810
|
};
|
|
6493
6811
|
|
|
6494
|
-
// src/internal/components/
|
|
6495
|
-
import React19 from "react";
|
|
6496
|
-
|
|
6497
|
-
|
|
6498
|
-
import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
6499
|
-
|
|
6500
|
-
const
|
|
6501
|
-
|
|
6502
|
-
|
|
6812
|
+
// src/internal/components/KeyshareBackup.tsx
|
|
6813
|
+
import * as React19 from "react";
|
|
6814
|
+
import { Shield as Shield4, Server as Server4, CheckCircle2 as CheckCircle24, AlertCircle as AlertCircle3, Key as Key5, X as X3, Eye as Eye3, EyeOff as EyeOff3, Download as Download2, Cloud as Cloud3, Lock as Lock2 } from "lucide-react";
|
|
6815
|
+
init_iframe_manager();
|
|
6816
|
+
import { Fragment as Fragment6, jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
6817
|
+
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
6818
|
+
const [backupStatus, setBackupStatus] = React19.useState({
|
|
6819
|
+
server: {},
|
|
6820
|
+
cloud: {},
|
|
6821
|
+
local: {}
|
|
6822
|
+
});
|
|
6823
|
+
const [loading, setLoading] = React19.useState({
|
|
6824
|
+
server: false,
|
|
6825
|
+
cloud: false,
|
|
6826
|
+
local: false
|
|
6827
|
+
});
|
|
6503
6828
|
const [error, setError] = React19.useState(null);
|
|
6504
|
-
const
|
|
6505
|
-
const
|
|
6506
|
-
const
|
|
6507
|
-
|
|
6508
|
-
|
|
6509
|
-
|
|
6829
|
+
const [success, setSuccess] = React19.useState(null);
|
|
6830
|
+
const [showPassword, setShowPassword] = React19.useState(false);
|
|
6831
|
+
const [useCustomPassword, setUseCustomPassword] = React19.useState(false);
|
|
6832
|
+
const [customPassword, setCustomPassword] = React19.useState("");
|
|
6833
|
+
const [cloudProviders, setCloudProviders] = React19.useState([]);
|
|
6834
|
+
const [selectedCloudProvider, setSelectedCloudProvider] = React19.useState(null);
|
|
6835
|
+
const [hasKeyshareData, setHasKeyshareData] = React19.useState(true);
|
|
6836
|
+
const iframeManager = React19.useMemo(() => {
|
|
6510
6837
|
try {
|
|
6511
|
-
|
|
6512
|
-
|
|
6513
|
-
|
|
6514
|
-
|
|
6515
|
-
|
|
6516
|
-
|
|
6838
|
+
return getIframeManager();
|
|
6839
|
+
} catch (e) {
|
|
6840
|
+
console.error("[KeyshareBackup] Failed to get iframe manager:", e);
|
|
6841
|
+
return null;
|
|
6842
|
+
}
|
|
6843
|
+
}, []);
|
|
6844
|
+
React19.useEffect(() => {
|
|
6845
|
+
const loadCloudProviders = async () => {
|
|
6846
|
+
try {
|
|
6847
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6848
|
+
const availableProviders = getAvailableCloudProviders3();
|
|
6849
|
+
const providers = availableProviders.map((p) => ({
|
|
6850
|
+
id: p.id,
|
|
6851
|
+
name: p.name,
|
|
6852
|
+
available: p.isAvailable()
|
|
6853
|
+
}));
|
|
6854
|
+
setCloudProviders(providers);
|
|
6855
|
+
if (providers.length > 0 && !selectedCloudProvider) {
|
|
6856
|
+
setSelectedCloudProvider(providers[0].id);
|
|
6857
|
+
}
|
|
6858
|
+
} catch (error2) {
|
|
6859
|
+
console.error("[KeyshareBackup] Failed to load cloud providers:", error2);
|
|
6517
6860
|
}
|
|
6518
|
-
|
|
6519
|
-
|
|
6861
|
+
};
|
|
6862
|
+
loadCloudProviders();
|
|
6863
|
+
}, [selectedCloudProvider]);
|
|
6864
|
+
const refreshStatus = React19.useCallback(async () => {
|
|
6865
|
+
if (!iframeManager) return;
|
|
6866
|
+
try {
|
|
6867
|
+
const status = await iframeManager.getBackupStatus(userId);
|
|
6868
|
+
setBackupStatus(status);
|
|
6520
6869
|
} catch (error2) {
|
|
6521
|
-
console.error("Failed to
|
|
6522
|
-
setError(error2 instanceof Error ? error2.message : "Failed to load transactions");
|
|
6523
|
-
} finally {
|
|
6524
|
-
setLoading(false);
|
|
6870
|
+
console.error("[KeyshareBackup] Failed to get backup status:", error2);
|
|
6525
6871
|
}
|
|
6526
|
-
}, [
|
|
6872
|
+
}, [iframeManager, userId]);
|
|
6527
6873
|
React19.useEffect(() => {
|
|
6528
|
-
|
|
6529
|
-
|
|
6874
|
+
refreshStatus();
|
|
6875
|
+
}, [refreshStatus]);
|
|
6876
|
+
const handleBackup = async (method) => {
|
|
6877
|
+
if (!iframeManager) {
|
|
6878
|
+
setError("Iframe manager not initialized");
|
|
6879
|
+
return;
|
|
6530
6880
|
}
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
};
|
|
6535
|
-
const formatTime = (timestamp) => {
|
|
6536
|
-
return new Date(timestamp).toLocaleString();
|
|
6537
|
-
};
|
|
6538
|
-
const formatValue = (value) => {
|
|
6881
|
+
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
6882
|
+
setError(null);
|
|
6883
|
+
setSuccess(null);
|
|
6539
6884
|
try {
|
|
6540
|
-
const
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6885
|
+
const password = useCustomPassword ? customPassword : void 0;
|
|
6886
|
+
if (method === "server") {
|
|
6887
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
6888
|
+
const accessToken = jwt?.accessToken;
|
|
6889
|
+
const result = await iframeManager.createBackup(userId, {
|
|
6890
|
+
method,
|
|
6891
|
+
password
|
|
6892
|
+
}, accessToken);
|
|
6893
|
+
if (result.success) {
|
|
6894
|
+
setSuccess("Successfully created server backup");
|
|
6895
|
+
await refreshStatus();
|
|
6896
|
+
onBackupSuccess?.();
|
|
6897
|
+
} else {
|
|
6898
|
+
throw new Error(result.error || "Server backup failed");
|
|
6899
|
+
}
|
|
6900
|
+
} else if (method === "cloud") {
|
|
6901
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6902
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6903
|
+
const providers = getAvailableCloudProviders3();
|
|
6904
|
+
const provider = selectedCloudProvider ? providers.find((p) => p.id === selectedCloudProvider) : providers[0];
|
|
6905
|
+
if (!provider) {
|
|
6906
|
+
throw new Error("No cloud provider available");
|
|
6907
|
+
}
|
|
6908
|
+
if (!provider.isAuthenticated()) {
|
|
6909
|
+
const authenticated = await provider.authenticate();
|
|
6910
|
+
if (!authenticated) {
|
|
6911
|
+
throw new Error(`Failed to authenticate with ${provider.name}`);
|
|
6912
|
+
}
|
|
6913
|
+
}
|
|
6914
|
+
const timestamp = Date.now();
|
|
6915
|
+
const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;
|
|
6916
|
+
const fileContent = JSON.stringify(encryptedData, null, 2);
|
|
6917
|
+
await provider.upload(fileName, fileContent, true);
|
|
6918
|
+
setSuccess(`Successfully created cloud backup on ${provider.name}`);
|
|
6919
|
+
await refreshStatus();
|
|
6920
|
+
onBackupSuccess?.();
|
|
6921
|
+
} else if (method === "local") {
|
|
6922
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6923
|
+
const blob = new Blob([JSON.stringify(encryptedData, null, 2)], {
|
|
6924
|
+
type: "application/json"
|
|
6925
|
+
});
|
|
6926
|
+
const url = URL.createObjectURL(blob);
|
|
6927
|
+
const a = document.createElement("a");
|
|
6928
|
+
a.href = url;
|
|
6929
|
+
a.download = `lumia-passport-backup-${userId}-${Date.now()}.json`;
|
|
6930
|
+
document.body.appendChild(a);
|
|
6931
|
+
a.click();
|
|
6932
|
+
document.body.removeChild(a);
|
|
6933
|
+
URL.revokeObjectURL(url);
|
|
6934
|
+
setSuccess("Backup file downloaded successfully");
|
|
6935
|
+
await refreshStatus();
|
|
6936
|
+
onBackupSuccess?.();
|
|
6937
|
+
}
|
|
6938
|
+
if (typeof window !== "undefined") {
|
|
6939
|
+
window.dispatchEvent(
|
|
6940
|
+
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
6941
|
+
detail: { method, success: true }
|
|
6942
|
+
})
|
|
6943
|
+
);
|
|
6944
|
+
}
|
|
6945
|
+
} catch (err) {
|
|
6946
|
+
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
6947
|
+
setError(errorMsg);
|
|
6948
|
+
await refreshStatus();
|
|
6949
|
+
} finally {
|
|
6950
|
+
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
6951
|
+
}
|
|
6952
|
+
};
|
|
6953
|
+
const formatLastBackup = (timestamp) => {
|
|
6954
|
+
if (!timestamp) return "Never";
|
|
6955
|
+
const date = new Date(timestamp);
|
|
6956
|
+
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
6957
|
+
};
|
|
6958
|
+
return /* @__PURE__ */ jsxs15(Card, { className: "border-green-200 bg-green-50", children: [
|
|
6959
|
+
/* @__PURE__ */ jsx23(CardHeader, { className: "pb-4", children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between", children: [
|
|
6960
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
|
|
6961
|
+
/* @__PURE__ */ jsx23(Shield4, { className: "h-6 w-6 text-green-600" }),
|
|
6962
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
6963
|
+
/* @__PURE__ */ jsx23(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
6964
|
+
/* @__PURE__ */ jsx23(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
6965
|
+
] })
|
|
6966
|
+
] }),
|
|
6967
|
+
onClose && /* @__PURE__ */ jsx23("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ jsx23(X3, { className: "h-4 w-4" }) })
|
|
6968
|
+
] }) }),
|
|
6969
|
+
/* @__PURE__ */ jsxs15(CardContent, { className: "space-y-6", children: [
|
|
6970
|
+
error && /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
6971
|
+
/* @__PURE__ */ jsx23(AlertCircle3, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6972
|
+
/* @__PURE__ */ jsx23("span", { children: error })
|
|
6973
|
+
] }),
|
|
6974
|
+
success && /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
6975
|
+
/* @__PURE__ */ jsx23(CheckCircle24, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6976
|
+
/* @__PURE__ */ jsx23("span", { children: success })
|
|
6977
|
+
] }),
|
|
6978
|
+
/* @__PURE__ */ jsxs15("div", { className: "space-y-3", children: [
|
|
6979
|
+
/* @__PURE__ */ jsx23("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
6980
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
|
|
6981
|
+
/* @__PURE__ */ jsx23(
|
|
6982
|
+
"input",
|
|
6983
|
+
{
|
|
6984
|
+
type: "checkbox",
|
|
6985
|
+
id: "use-backup-password",
|
|
6986
|
+
checked: useCustomPassword,
|
|
6987
|
+
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
6988
|
+
className: "rounded"
|
|
6989
|
+
}
|
|
6990
|
+
),
|
|
6991
|
+
/* @__PURE__ */ jsx23("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
6992
|
+
] }),
|
|
6993
|
+
!useCustomPassword && /* @__PURE__ */ jsx23("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
|
|
6994
|
+
/* @__PURE__ */ jsx23(Key5, { className: "h-4 w-4" }),
|
|
6995
|
+
/* @__PURE__ */ jsx23("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
6996
|
+
] }) }),
|
|
6997
|
+
useCustomPassword && /* @__PURE__ */ jsxs15("div", { className: "relative", children: [
|
|
6998
|
+
/* @__PURE__ */ jsx23(
|
|
6999
|
+
Input,
|
|
7000
|
+
{
|
|
7001
|
+
type: showPassword ? "text" : "password",
|
|
7002
|
+
placeholder: "Enter backup encryption password",
|
|
7003
|
+
value: customPassword,
|
|
7004
|
+
onChange: (e) => setCustomPassword(e.target.value),
|
|
7005
|
+
className: "pr-10"
|
|
7006
|
+
}
|
|
7007
|
+
),
|
|
7008
|
+
/* @__PURE__ */ jsx23(
|
|
7009
|
+
"button",
|
|
7010
|
+
{
|
|
7011
|
+
type: "button",
|
|
7012
|
+
onClick: () => setShowPassword(!showPassword),
|
|
7013
|
+
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
7014
|
+
children: showPassword ? /* @__PURE__ */ jsx23(EyeOff3, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx23(Eye3, { className: "h-4 w-4" })
|
|
7015
|
+
}
|
|
7016
|
+
)
|
|
7017
|
+
] })
|
|
7018
|
+
] }),
|
|
7019
|
+
/* @__PURE__ */ jsxs15("div", { className: "space-y-4", children: [
|
|
7020
|
+
/* @__PURE__ */ jsx23("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
7021
|
+
/* @__PURE__ */ jsxs15("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
7022
|
+
/* @__PURE__ */ jsx23("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
|
|
7023
|
+
/* @__PURE__ */ jsx23(Server4, { className: "h-5 w-5 text-blue-600" }),
|
|
7024
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7025
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
7026
|
+
/* @__PURE__ */ jsx23("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
7027
|
+
] })
|
|
7028
|
+
] }) }),
|
|
7029
|
+
/* @__PURE__ */ jsx23(
|
|
7030
|
+
Button,
|
|
7031
|
+
{
|
|
7032
|
+
onClick: () => handleBackup("server"),
|
|
7033
|
+
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7034
|
+
className: "px-4 py-2",
|
|
7035
|
+
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7036
|
+
}
|
|
7037
|
+
),
|
|
7038
|
+
/* @__PURE__ */ jsxs15("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7039
|
+
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
7040
|
+
formatLastBackup(backupStatus.server.lastBackup)
|
|
7041
|
+
] })
|
|
7042
|
+
] }),
|
|
7043
|
+
/* @__PURE__ */ jsxs15("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
7044
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7045
|
+
/* @__PURE__ */ jsx23(Cloud3, { className: "h-5 w-5 text-sky-600" }),
|
|
7046
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7047
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
7048
|
+
/* @__PURE__ */ jsx23("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
7049
|
+
] })
|
|
7050
|
+
] }),
|
|
7051
|
+
cloudProviders.length > 1 && /* @__PURE__ */ jsx23("div", { className: "mb-3", children: /* @__PURE__ */ jsx23(
|
|
7052
|
+
"select",
|
|
7053
|
+
{
|
|
7054
|
+
value: selectedCloudProvider || "",
|
|
7055
|
+
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
7056
|
+
className: "text-sm border rounded px-2 py-1 w-full",
|
|
7057
|
+
children: cloudProviders.map((provider) => /* @__PURE__ */ jsxs15("option", { value: provider.id, disabled: !provider.available, children: [
|
|
7058
|
+
provider.name,
|
|
7059
|
+
" ",
|
|
7060
|
+
provider.available ? "" : "(Not Available)"
|
|
7061
|
+
] }, provider.id))
|
|
7062
|
+
}
|
|
7063
|
+
) }),
|
|
7064
|
+
/* @__PURE__ */ jsx23(
|
|
7065
|
+
Button,
|
|
7066
|
+
{
|
|
7067
|
+
onClick: () => handleBackup("cloud"),
|
|
7068
|
+
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
7069
|
+
className: "px-4 py-2",
|
|
7070
|
+
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7071
|
+
}
|
|
7072
|
+
),
|
|
7073
|
+
/* @__PURE__ */ jsx23("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
7074
|
+
] }),
|
|
7075
|
+
/* @__PURE__ */ jsxs15("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
7076
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7077
|
+
/* @__PURE__ */ jsx23(Download2, { className: "h-5 w-5 text-purple-600" }),
|
|
7078
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7079
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
7080
|
+
/* @__PURE__ */ jsx23("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
7081
|
+
] })
|
|
7082
|
+
] }),
|
|
7083
|
+
/* @__PURE__ */ jsx23(
|
|
7084
|
+
Button,
|
|
7085
|
+
{
|
|
7086
|
+
onClick: () => handleBackup("local"),
|
|
7087
|
+
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7088
|
+
className: "w-full",
|
|
7089
|
+
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
7090
|
+
}
|
|
7091
|
+
),
|
|
7092
|
+
/* @__PURE__ */ jsxs15("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7093
|
+
"Download encrypted backup file to your device \u2022 Last: ",
|
|
7094
|
+
formatLastBackup(backupStatus.local.lastBackup)
|
|
7095
|
+
] })
|
|
7096
|
+
] })
|
|
7097
|
+
] }),
|
|
7098
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
7099
|
+
/* @__PURE__ */ jsx23(Lock2, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
7100
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
7101
|
+
/* @__PURE__ */ jsx23("div", { className: "font-medium", children: "Security Notice" }),
|
|
7102
|
+
/* @__PURE__ */ jsxs15("div", { className: "mt-1", children: [
|
|
7103
|
+
useCustomPassword ? /* @__PURE__ */ jsx23(Fragment6, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ jsx23(Fragment6, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
7104
|
+
" ",
|
|
7105
|
+
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
7106
|
+
] })
|
|
7107
|
+
] })
|
|
7108
|
+
] })
|
|
7109
|
+
] })
|
|
7110
|
+
] });
|
|
7111
|
+
}
|
|
7112
|
+
|
|
7113
|
+
// src/internal/components/TransactionsModal.tsx
|
|
7114
|
+
import React20 from "react";
|
|
7115
|
+
init_base();
|
|
7116
|
+
import { Activity, ArrowUpRight, ArrowDownRight, CheckCircle2 as CheckCircle25, XCircle, ArrowLeft as ArrowLeft5, RefreshCw as RefreshCw3 } from "lucide-react";
|
|
7117
|
+
import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
7118
|
+
var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
7119
|
+
const { address } = useLumiaSession();
|
|
7120
|
+
const [transactions, setTransactions] = React20.useState([]);
|
|
7121
|
+
const [loading, setLoading] = React20.useState(false);
|
|
7122
|
+
const [error, setError] = React20.useState(null);
|
|
7123
|
+
const { config } = useLumiaPassportConfig();
|
|
7124
|
+
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7125
|
+
const loadTransactions = React20.useCallback(async () => {
|
|
7126
|
+
if (!address) return;
|
|
7127
|
+
setLoading(true);
|
|
7128
|
+
setError(null);
|
|
7129
|
+
try {
|
|
7130
|
+
const explorerUrl = getExplorerUrl();
|
|
7131
|
+
const baseUrl = explorerUrl.replace(/\/$/, "");
|
|
7132
|
+
const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=20`;
|
|
7133
|
+
const response = await fetch(apiUrl);
|
|
7134
|
+
if (!response.ok) {
|
|
7135
|
+
throw new Error(`Failed to fetch transactions: ${response.status}`);
|
|
7136
|
+
}
|
|
7137
|
+
const data = await response.json();
|
|
7138
|
+
setTransactions(data.items || []);
|
|
7139
|
+
} catch (error2) {
|
|
7140
|
+
console.error("Failed to load transactions:", error2);
|
|
7141
|
+
setError(error2 instanceof Error ? error2.message : "Failed to load transactions");
|
|
7142
|
+
} finally {
|
|
7143
|
+
setLoading(false);
|
|
7144
|
+
}
|
|
7145
|
+
}, [address]);
|
|
7146
|
+
React20.useEffect(() => {
|
|
7147
|
+
if (open && address && !loading && transactions.length === 0) {
|
|
7148
|
+
loadTransactions();
|
|
7149
|
+
}
|
|
7150
|
+
}, [open]);
|
|
7151
|
+
const formatAddress = (addr) => {
|
|
7152
|
+
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7153
|
+
};
|
|
7154
|
+
const formatTime = (timestamp) => {
|
|
7155
|
+
return new Date(timestamp).toLocaleString();
|
|
7156
|
+
};
|
|
7157
|
+
const formatValue = (value) => {
|
|
7158
|
+
try {
|
|
7159
|
+
const wei = BigInt(value);
|
|
7160
|
+
const eth = Number(wei) / 1e18;
|
|
7161
|
+
return eth.toFixed(4);
|
|
7162
|
+
} catch {
|
|
7163
|
+
return "0.0000";
|
|
7164
|
+
}
|
|
7165
|
+
};
|
|
7166
|
+
const getStatusIcon = (status) => {
|
|
7167
|
+
return status === "ok" ? /* @__PURE__ */ jsx24(CheckCircle25, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx24(XCircle, { className: "w-4 h-4 text-red-500" });
|
|
7168
|
+
};
|
|
7169
|
+
const getTransactionIcon = (from, to) => {
|
|
7170
|
+
const isIncoming = to.toLowerCase() === address?.toLowerCase();
|
|
7171
|
+
return isIncoming ? /* @__PURE__ */ jsx24(ArrowDownRight, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx24(ArrowUpRight, { className: "w-4 h-4 text-blue-500" });
|
|
7172
|
+
};
|
|
7173
|
+
const openInExplorer = (txHash) => {
|
|
7174
|
+
const explorerUrl = getExplorerUrl();
|
|
7175
|
+
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
7176
|
+
};
|
|
7177
|
+
return /* @__PURE__ */ jsx24(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs16(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7178
|
+
/* @__PURE__ */ jsx24(VisuallyHidden, { children: /* @__PURE__ */ jsx24(DialogTitle, { children: "Transaction History" }) }),
|
|
7179
|
+
/* @__PURE__ */ jsx24(DialogDescription, { className: "sr-only", children: "View your transaction history" }),
|
|
7180
|
+
/* @__PURE__ */ jsx24("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
|
|
7181
|
+
onBack && /* @__PURE__ */ jsx24(
|
|
7182
|
+
"button",
|
|
7183
|
+
{
|
|
6565
7184
|
onClick: onBack,
|
|
6566
7185
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6567
7186
|
title: "Back",
|
|
6568
|
-
children: /* @__PURE__ */
|
|
7187
|
+
children: /* @__PURE__ */ jsx24(ArrowLeft5, { className: "h-4 w-4" })
|
|
6569
7188
|
}
|
|
6570
7189
|
),
|
|
6571
|
-
/* @__PURE__ */
|
|
6572
|
-
/* @__PURE__ */
|
|
6573
|
-
/* @__PURE__ */
|
|
6574
|
-
/* @__PURE__ */
|
|
7190
|
+
/* @__PURE__ */ jsxs16("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7191
|
+
/* @__PURE__ */ jsx24(Activity, { className: "h-5 w-5" }),
|
|
7192
|
+
/* @__PURE__ */ jsx24("span", { children: "Transaction History" }),
|
|
7193
|
+
/* @__PURE__ */ jsx24(
|
|
6575
7194
|
"button",
|
|
6576
7195
|
{
|
|
6577
7196
|
onClick: loadTransactions,
|
|
6578
7197
|
disabled: loading,
|
|
6579
7198
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6580
7199
|
title: "Refresh transactions",
|
|
6581
|
-
children: /* @__PURE__ */
|
|
7200
|
+
children: /* @__PURE__ */ jsx24(RefreshCw3, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` })
|
|
6582
7201
|
}
|
|
6583
7202
|
)
|
|
6584
7203
|
] })
|
|
6585
7204
|
] }) }),
|
|
6586
|
-
/* @__PURE__ */
|
|
6587
|
-
/* @__PURE__ */
|
|
6588
|
-
/* @__PURE__ */
|
|
6589
|
-
] }) : transactions.length === 0 ? /* @__PURE__ */
|
|
6590
|
-
/* @__PURE__ */
|
|
6591
|
-
/* @__PURE__ */
|
|
7205
|
+
/* @__PURE__ */ jsx24("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: loading ? /* @__PURE__ */ jsx24("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsx24("div", { className: `${theme.mutedText}`, children: "Loading transactions..." }) }) : error ? /* @__PURE__ */ jsxs16("div", { className: `flex flex-col items-center justify-center py-8 ${isDark ? "text-red-400" : "text-red-500"}`, children: [
|
|
7206
|
+
/* @__PURE__ */ jsx24(XCircle, { className: "w-12 h-12 mb-2" }),
|
|
7207
|
+
/* @__PURE__ */ jsx24("p", { className: "text-center text-sm", children: error })
|
|
7208
|
+
] }) : transactions.length === 0 ? /* @__PURE__ */ jsxs16("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7209
|
+
/* @__PURE__ */ jsx24(Activity, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7210
|
+
/* @__PURE__ */ jsxs16("p", { className: "text-center", children: [
|
|
6592
7211
|
"No transactions found",
|
|
6593
|
-
/* @__PURE__ */
|
|
6594
|
-
/* @__PURE__ */
|
|
7212
|
+
/* @__PURE__ */ jsx24("br", {}),
|
|
7213
|
+
/* @__PURE__ */ jsx24("span", { className: "text-xs mt-2", children: "Smart account transactions will appear here" })
|
|
6595
7214
|
] })
|
|
6596
|
-
] }) : /* @__PURE__ */
|
|
7215
|
+
] }) : /* @__PURE__ */ jsx24("div", { className: "space-y-3", children: transactions.map((tx) => {
|
|
6597
7216
|
const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();
|
|
6598
7217
|
const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;
|
|
6599
|
-
return /* @__PURE__ */
|
|
7218
|
+
return /* @__PURE__ */ jsxs16(
|
|
6600
7219
|
"div",
|
|
6601
7220
|
{
|
|
6602
7221
|
className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors cursor-pointer`,
|
|
6603
7222
|
onClick: () => openInExplorer(tx.hash),
|
|
6604
7223
|
children: [
|
|
6605
|
-
/* @__PURE__ */
|
|
6606
|
-
/* @__PURE__ */
|
|
7224
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7225
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
|
|
6607
7226
|
getTransactionIcon(tx.from.hash, tx.to.hash),
|
|
6608
|
-
/* @__PURE__ */
|
|
7227
|
+
/* @__PURE__ */ jsx24("span", { className: `font-medium ${theme.titleText}`, children: isIncoming ? "Received" : "Sent" }),
|
|
6609
7228
|
getStatusIcon(tx.status)
|
|
6610
7229
|
] }),
|
|
6611
|
-
/* @__PURE__ */
|
|
7230
|
+
/* @__PURE__ */ jsx24("div", { className: `text-xs ${theme.mutedText}`, children: formatTime(tx.timestamp) })
|
|
6612
7231
|
] }),
|
|
6613
|
-
/* @__PURE__ */
|
|
6614
|
-
/* @__PURE__ */
|
|
6615
|
-
/* @__PURE__ */
|
|
6616
|
-
/* @__PURE__ */
|
|
7232
|
+
/* @__PURE__ */ jsxs16("div", { className: "space-y-1 text-sm", children: [
|
|
7233
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7234
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: isIncoming ? "From:" : "To:" }),
|
|
7235
|
+
/* @__PURE__ */ jsxs16("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6617
7236
|
formatAddress(displayAddress),
|
|
6618
|
-
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */
|
|
7237
|
+
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ jsx24("span", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} ml-1`, children: "(Contract)" })
|
|
6619
7238
|
] })
|
|
6620
7239
|
] }),
|
|
6621
|
-
/* @__PURE__ */
|
|
6622
|
-
/* @__PURE__ */
|
|
6623
|
-
/* @__PURE__ */
|
|
7240
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7241
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: "Value:" }),
|
|
7242
|
+
/* @__PURE__ */ jsxs16("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
6624
7243
|
formatValue(tx.value),
|
|
6625
7244
|
" LUMIA"
|
|
6626
7245
|
] })
|
|
6627
7246
|
] }),
|
|
6628
|
-
/* @__PURE__ */
|
|
6629
|
-
/* @__PURE__ */
|
|
6630
|
-
/* @__PURE__ */
|
|
7247
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7248
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: "Block:" }),
|
|
7249
|
+
/* @__PURE__ */ jsxs16("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6631
7250
|
"#",
|
|
6632
7251
|
tx.block_number
|
|
6633
7252
|
] })
|
|
6634
7253
|
] }),
|
|
6635
|
-
tx.method && /* @__PURE__ */
|
|
6636
|
-
/* @__PURE__ */
|
|
6637
|
-
/* @__PURE__ */
|
|
7254
|
+
tx.method && /* @__PURE__ */ jsxs16("div", { className: "flex justify-between", children: [
|
|
7255
|
+
/* @__PURE__ */ jsx24("span", { className: `${theme.bodyText}`, children: "Method:" }),
|
|
7256
|
+
/* @__PURE__ */ jsx24("span", { className: `${isDark ? "text-blue-400" : "text-blue-600"} text-xs`, children: tx.method })
|
|
6638
7257
|
] }),
|
|
6639
|
-
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */
|
|
7258
|
+
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ jsx24("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ jsx24(
|
|
6640
7259
|
"span",
|
|
6641
7260
|
{
|
|
6642
7261
|
className: `text-xs ${isDark ? "bg-blue-900/30 text-blue-300" : "bg-blue-100 text-blue-800"} px-2 py-0.5 rounded-full`,
|
|
@@ -6650,7 +7269,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6650
7269
|
tx.hash
|
|
6651
7270
|
);
|
|
6652
7271
|
}) }) }),
|
|
6653
|
-
transactions.length > 0 && /* @__PURE__ */
|
|
7272
|
+
transactions.length > 0 && /* @__PURE__ */ jsx24("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ jsxs16("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
6654
7273
|
"Total: ",
|
|
6655
7274
|
transactions.length,
|
|
6656
7275
|
" transaction",
|
|
@@ -6660,11 +7279,11 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6660
7279
|
};
|
|
6661
7280
|
|
|
6662
7281
|
// src/internal/components/ViewAssetsModal.tsx
|
|
6663
|
-
import
|
|
7282
|
+
import React22 from "react";
|
|
6664
7283
|
|
|
6665
7284
|
// src/modules/assets.ts
|
|
6666
7285
|
init_base();
|
|
6667
|
-
import
|
|
7286
|
+
import React21 from "react";
|
|
6668
7287
|
import { useBalance, useReadContract, useReadContracts } from "wagmi";
|
|
6669
7288
|
import { formatUnits, erc20Abi } from "viem";
|
|
6670
7289
|
var COMMON_TOKENS = [
|
|
@@ -6810,7 +7429,7 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
6810
7429
|
}
|
|
6811
7430
|
});
|
|
6812
7431
|
const { tokenInfo } = useTokenInfo(tokenAddress);
|
|
6813
|
-
const formattedBalance =
|
|
7432
|
+
const formattedBalance = React21.useMemo(() => {
|
|
6814
7433
|
if (!balance || !tokenInfo) return "0";
|
|
6815
7434
|
return formatUnits(balance, tokenInfo.decimals);
|
|
6816
7435
|
}, [balance, tokenInfo]);
|
|
@@ -6826,11 +7445,11 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
6826
7445
|
// src/internal/components/ViewAssetsModal.tsx
|
|
6827
7446
|
init_base();
|
|
6828
7447
|
import { Gem, RefreshCw as RefreshCw4, Copy, ExternalLink as ExternalLink2, ArrowLeft as ArrowLeft6 } from "lucide-react";
|
|
6829
|
-
import { jsx as
|
|
7448
|
+
import { jsx as jsx25, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
6830
7449
|
var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
6831
7450
|
const { address } = useLumiaSession();
|
|
6832
7451
|
const { assets, refreshBalances, isLoading } = useAssets(address);
|
|
6833
|
-
const [copied, setCopied] =
|
|
7452
|
+
const [copied, setCopied] = React22.useState(null);
|
|
6834
7453
|
const { config } = useLumiaPassportConfig();
|
|
6835
7454
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
6836
7455
|
const handleCopy = async (text, type) => {
|
|
@@ -6845,107 +7464,107 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6845
7464
|
const openInExplorer = (address2) => {
|
|
6846
7465
|
window.open(`${LUMIA_EXPLORER_URL}/address/${address2}`, "_blank");
|
|
6847
7466
|
};
|
|
6848
|
-
return /* @__PURE__ */
|
|
6849
|
-
/* @__PURE__ */
|
|
6850
|
-
/* @__PURE__ */
|
|
6851
|
-
/* @__PURE__ */
|
|
6852
|
-
onBack && /* @__PURE__ */
|
|
7467
|
+
return /* @__PURE__ */ jsx25(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs17(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7468
|
+
/* @__PURE__ */ jsx25(VisuallyHidden, { children: /* @__PURE__ */ jsx25(DialogTitle, { children: "View Assets" }) }),
|
|
7469
|
+
/* @__PURE__ */ jsx25(DialogDescription, { className: "sr-only", children: "View your token balances and assets" }),
|
|
7470
|
+
/* @__PURE__ */ jsx25("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
|
|
7471
|
+
onBack && /* @__PURE__ */ jsx25(
|
|
6853
7472
|
"button",
|
|
6854
7473
|
{
|
|
6855
7474
|
onClick: onBack,
|
|
6856
7475
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6857
7476
|
title: "Back",
|
|
6858
|
-
children: /* @__PURE__ */
|
|
7477
|
+
children: /* @__PURE__ */ jsx25(ArrowLeft6, { className: "h-4 w-4" })
|
|
6859
7478
|
}
|
|
6860
7479
|
),
|
|
6861
|
-
/* @__PURE__ */
|
|
6862
|
-
/* @__PURE__ */
|
|
6863
|
-
/* @__PURE__ */
|
|
6864
|
-
/* @__PURE__ */
|
|
7480
|
+
/* @__PURE__ */ jsxs17("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7481
|
+
/* @__PURE__ */ jsx25(Gem, { className: "h-5 w-5" }),
|
|
7482
|
+
/* @__PURE__ */ jsx25("span", { children: "Your Assets" }),
|
|
7483
|
+
/* @__PURE__ */ jsx25(
|
|
6865
7484
|
"button",
|
|
6866
7485
|
{
|
|
6867
7486
|
onClick: refreshBalances,
|
|
6868
7487
|
disabled: isLoading,
|
|
6869
7488
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6870
7489
|
title: "Refresh balances",
|
|
6871
|
-
children: /* @__PURE__ */
|
|
7490
|
+
children: /* @__PURE__ */ jsx25(RefreshCw4, { className: `h-4 w-4 ${isLoading ? "animate-spin" : ""}` })
|
|
6872
7491
|
}
|
|
6873
7492
|
)
|
|
6874
7493
|
] })
|
|
6875
7494
|
] }) }),
|
|
6876
|
-
/* @__PURE__ */
|
|
6877
|
-
/* @__PURE__ */
|
|
6878
|
-
/* @__PURE__ */
|
|
6879
|
-
] }) : /* @__PURE__ */
|
|
6880
|
-
/* @__PURE__ */
|
|
6881
|
-
/* @__PURE__ */
|
|
6882
|
-
/* @__PURE__ */
|
|
6883
|
-
/* @__PURE__ */
|
|
6884
|
-
/* @__PURE__ */
|
|
6885
|
-
/* @__PURE__ */
|
|
7495
|
+
/* @__PURE__ */ jsx25("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: isLoading ? /* @__PURE__ */ jsx25("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsx25("div", { className: `${theme.mutedText}`, children: "Loading assets..." }) }) : assets.length === 0 ? /* @__PURE__ */ jsxs17("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7496
|
+
/* @__PURE__ */ jsx25(Gem, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7497
|
+
/* @__PURE__ */ jsx25("p", { children: "No assets found" })
|
|
7498
|
+
] }) : /* @__PURE__ */ jsx25("div", { className: "space-y-3", children: assets.map((asset, index) => /* @__PURE__ */ jsxs17("div", { className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors`, children: [
|
|
7499
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7500
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3", children: [
|
|
7501
|
+
/* @__PURE__ */ jsx25("div", { className: "w-10 h-10 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center", children: /* @__PURE__ */ jsx25("span", { className: "text-white font-bold text-sm", children: asset.symbol.charAt(0) }) }),
|
|
7502
|
+
/* @__PURE__ */ jsxs17("div", { children: [
|
|
7503
|
+
/* @__PURE__ */ jsx25("div", { className: `font-medium ${theme.titleText}`, children: asset.name }),
|
|
7504
|
+
/* @__PURE__ */ jsx25("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
6886
7505
|
] })
|
|
6887
7506
|
] }),
|
|
6888
|
-
/* @__PURE__ */
|
|
6889
|
-
/* @__PURE__ */
|
|
6890
|
-
/* @__PURE__ */
|
|
7507
|
+
/* @__PURE__ */ jsxs17("div", { className: "text-right", children: [
|
|
7508
|
+
/* @__PURE__ */ jsx25("div", { className: `font-mono ${theme.titleText}`, children: asset.formattedBalance }),
|
|
7509
|
+
/* @__PURE__ */ jsx25("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
6891
7510
|
] })
|
|
6892
7511
|
] }),
|
|
6893
|
-
asset.address && /* @__PURE__ */
|
|
6894
|
-
/* @__PURE__ */
|
|
6895
|
-
/* @__PURE__ */
|
|
6896
|
-
/* @__PURE__ */
|
|
6897
|
-
/* @__PURE__ */
|
|
6898
|
-
/* @__PURE__ */
|
|
7512
|
+
asset.address && /* @__PURE__ */ jsxs17("div", { className: `space-y-2 mt-3 pt-3 border-t ${theme.divider}`, children: [
|
|
7513
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7514
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Contract Address:" }),
|
|
7515
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
|
|
7516
|
+
/* @__PURE__ */ jsx25("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` }),
|
|
7517
|
+
/* @__PURE__ */ jsx25(
|
|
6899
7518
|
"button",
|
|
6900
7519
|
{
|
|
6901
7520
|
onClick: () => handleCopy(asset.address, "address"),
|
|
6902
7521
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6903
7522
|
title: "Copy address",
|
|
6904
|
-
children: copied === "address" ? /* @__PURE__ */
|
|
7523
|
+
children: copied === "address" ? /* @__PURE__ */ jsx25("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ jsx25(Copy, { className: "w-3 h-3" })
|
|
6905
7524
|
}
|
|
6906
7525
|
),
|
|
6907
|
-
/* @__PURE__ */
|
|
7526
|
+
/* @__PURE__ */ jsx25(
|
|
6908
7527
|
"button",
|
|
6909
7528
|
{
|
|
6910
7529
|
onClick: () => openInExplorer(asset.address),
|
|
6911
7530
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6912
7531
|
title: "View in explorer",
|
|
6913
|
-
children: /* @__PURE__ */
|
|
7532
|
+
children: /* @__PURE__ */ jsx25(ExternalLink2, { className: "w-3 h-3" })
|
|
6914
7533
|
}
|
|
6915
7534
|
)
|
|
6916
7535
|
] })
|
|
6917
7536
|
] }),
|
|
6918
|
-
asset.decimals && /* @__PURE__ */
|
|
6919
|
-
/* @__PURE__ */
|
|
6920
|
-
/* @__PURE__ */
|
|
7537
|
+
asset.decimals && /* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7538
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Decimals:" }),
|
|
7539
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.titleText}`, children: asset.decimals })
|
|
6921
7540
|
] })
|
|
6922
7541
|
] }),
|
|
6923
|
-
asset.type === "native" && address && /* @__PURE__ */
|
|
6924
|
-
/* @__PURE__ */
|
|
6925
|
-
/* @__PURE__ */
|
|
6926
|
-
/* @__PURE__ */
|
|
6927
|
-
/* @__PURE__ */
|
|
7542
|
+
asset.type === "native" && address && /* @__PURE__ */ jsx25("div", { className: "mt-3 pt-3 border-t border-gray-200", children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7543
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Your Address:" }),
|
|
7544
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
|
|
7545
|
+
/* @__PURE__ */ jsx25("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${address.slice(0, 6)}...${address.slice(-4)}` }),
|
|
7546
|
+
/* @__PURE__ */ jsx25(
|
|
6928
7547
|
"button",
|
|
6929
7548
|
{
|
|
6930
7549
|
onClick: () => handleCopy(address, "wallet"),
|
|
6931
7550
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6932
7551
|
title: "Copy wallet address",
|
|
6933
|
-
children: copied === "wallet" ? /* @__PURE__ */
|
|
7552
|
+
children: copied === "wallet" ? /* @__PURE__ */ jsx25("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ jsx25(Copy, { className: "w-3 h-3" })
|
|
6934
7553
|
}
|
|
6935
7554
|
),
|
|
6936
|
-
/* @__PURE__ */
|
|
7555
|
+
/* @__PURE__ */ jsx25(
|
|
6937
7556
|
"button",
|
|
6938
7557
|
{
|
|
6939
7558
|
onClick: () => openInExplorer(address),
|
|
6940
7559
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6941
7560
|
title: "View in explorer",
|
|
6942
|
-
children: /* @__PURE__ */
|
|
7561
|
+
children: /* @__PURE__ */ jsx25(ExternalLink2, { className: "w-3 h-3" })
|
|
6943
7562
|
}
|
|
6944
7563
|
)
|
|
6945
7564
|
] })
|
|
6946
7565
|
] }) })
|
|
6947
7566
|
] }, `${asset.type}-${asset.address || "native"}-${index}`)) }) }),
|
|
6948
|
-
assets.length > 0 && /* @__PURE__ */
|
|
7567
|
+
assets.length > 0 && /* @__PURE__ */ jsx25("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ jsxs17("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
6949
7568
|
"Total: ",
|
|
6950
7569
|
assets.length,
|
|
6951
7570
|
" asset",
|
|
@@ -6955,18 +7574,18 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6955
7574
|
};
|
|
6956
7575
|
|
|
6957
7576
|
// src/internal/components/SendModal.tsx
|
|
6958
|
-
import { useState as
|
|
6959
|
-
import { Send, ArrowLeft as ArrowLeft7, Loader2, CheckCircle2 as
|
|
7577
|
+
import { useState as useState13, useEffect as useEffect10 } from "react";
|
|
7578
|
+
import { Send, ArrowLeft as ArrowLeft7, Loader2, CheckCircle2 as CheckCircle27, AlertCircle as AlertCircle5 } from "lucide-react";
|
|
6960
7579
|
|
|
6961
7580
|
// src/hooks/useSendTransaction.ts
|
|
6962
|
-
import { useState as
|
|
7581
|
+
import { useState as useState10, useCallback as useCallback4 } from "react";
|
|
6963
7582
|
import { parseEther as parseEther2, isAddress } from "viem";
|
|
6964
7583
|
function useSendTransaction() {
|
|
6965
7584
|
const { session, address } = useLumiaSession();
|
|
6966
|
-
const [isLoading, setIsLoading] =
|
|
6967
|
-
const [error, setError] =
|
|
6968
|
-
const [userOpHash, setUserOpHash] =
|
|
6969
|
-
const sendTransaction =
|
|
7585
|
+
const [isLoading, setIsLoading] = useState10(false);
|
|
7586
|
+
const [error, setError] = useState10(null);
|
|
7587
|
+
const [userOpHash, setUserOpHash] = useState10(null);
|
|
7588
|
+
const sendTransaction = useCallback4(async (params) => {
|
|
6970
7589
|
if (!session || !address) {
|
|
6971
7590
|
setError("No active session");
|
|
6972
7591
|
return null;
|
|
@@ -7003,7 +7622,7 @@ function useSendTransaction() {
|
|
|
7003
7622
|
setIsLoading(false);
|
|
7004
7623
|
}
|
|
7005
7624
|
}, [session, address]);
|
|
7006
|
-
const reset =
|
|
7625
|
+
const reset = useCallback4(() => {
|
|
7007
7626
|
setError(null);
|
|
7008
7627
|
setUserOpHash(null);
|
|
7009
7628
|
setIsLoading(false);
|
|
@@ -7022,8 +7641,8 @@ import { isAddress as isAddress2 } from "viem";
|
|
|
7022
7641
|
import { useBalance as useBalance2 } from "wagmi";
|
|
7023
7642
|
|
|
7024
7643
|
// src/internal/components/UserOpStatus.tsx
|
|
7025
|
-
import * as
|
|
7026
|
-
import { AlertCircle as
|
|
7644
|
+
import * as React24 from "react";
|
|
7645
|
+
import { AlertCircle as AlertCircle4, CheckCircle2 as CheckCircle26, Clock as Clock3, Copy as Copy3, ExternalLink as ExternalLink4, RefreshCw as RefreshCw5 } from "lucide-react";
|
|
7027
7646
|
|
|
7028
7647
|
// src/internal/components/ui/badge.tsx
|
|
7029
7648
|
import { cva as cva2 } from "class-variance-authority";
|
|
@@ -7036,7 +7655,7 @@ function cn2(...inputs) {
|
|
|
7036
7655
|
}
|
|
7037
7656
|
|
|
7038
7657
|
// src/internal/components/ui/badge.tsx
|
|
7039
|
-
import { jsx as
|
|
7658
|
+
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
7040
7659
|
var badgeVariants = cva2(
|
|
7041
7660
|
"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",
|
|
7042
7661
|
{
|
|
@@ -7056,13 +7675,13 @@ var badgeVariants = cva2(
|
|
|
7056
7675
|
}
|
|
7057
7676
|
);
|
|
7058
7677
|
function Badge({ className, variant, ...props }) {
|
|
7059
|
-
return /* @__PURE__ */
|
|
7678
|
+
return /* @__PURE__ */ jsx26("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
7060
7679
|
}
|
|
7061
7680
|
|
|
7062
7681
|
// src/internal/components/Address.tsx
|
|
7063
|
-
import * as
|
|
7682
|
+
import * as React23 from "react";
|
|
7064
7683
|
import { Copy as Copy2, ExternalLink as ExternalLink3 } from "lucide-react";
|
|
7065
|
-
import { jsx as
|
|
7684
|
+
import { jsx as jsx27, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
7066
7685
|
function toExplorerAddressUrl(address, chain) {
|
|
7067
7686
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
7068
7687
|
if (!base2) return null;
|
|
@@ -7083,12 +7702,12 @@ var Address = ({
|
|
|
7083
7702
|
}) => {
|
|
7084
7703
|
const addr = address || "";
|
|
7085
7704
|
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
7086
|
-
const [copied, setCopied] =
|
|
7087
|
-
if (!addr) return /* @__PURE__ */
|
|
7088
|
-
return /* @__PURE__ */
|
|
7089
|
-
label && /* @__PURE__ */
|
|
7090
|
-
/* @__PURE__ */
|
|
7091
|
-
showCopy && /* @__PURE__ */
|
|
7705
|
+
const [copied, setCopied] = React23.useState(false);
|
|
7706
|
+
if (!addr) return /* @__PURE__ */ jsx27("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
7707
|
+
return /* @__PURE__ */ jsxs18("div", { className: cn2("flex items-center gap-2", className), style: { listStyle: "none" }, children: [
|
|
7708
|
+
label && /* @__PURE__ */ jsx27("span", { className: "text-sm font-medium", children: label }),
|
|
7709
|
+
/* @__PURE__ */ jsx27("code", { className: "text-xs bg-background px-2 py-1 rounded select-all", children: truncate ? short(addr) : addr }),
|
|
7710
|
+
showCopy && /* @__PURE__ */ jsx27(
|
|
7092
7711
|
Button,
|
|
7093
7712
|
{
|
|
7094
7713
|
variant: "ghost",
|
|
@@ -7102,10 +7721,10 @@ var Address = ({
|
|
|
7102
7721
|
} catch {
|
|
7103
7722
|
}
|
|
7104
7723
|
},
|
|
7105
|
-
children: /* @__PURE__ */
|
|
7724
|
+
children: /* @__PURE__ */ jsx27(Copy2, { className: "h-4 w-4" })
|
|
7106
7725
|
}
|
|
7107
7726
|
),
|
|
7108
|
-
showExplorer && explorer && /* @__PURE__ */
|
|
7727
|
+
showExplorer && explorer && /* @__PURE__ */ jsx27(
|
|
7109
7728
|
"a",
|
|
7110
7729
|
{
|
|
7111
7730
|
href: explorer,
|
|
@@ -7113,7 +7732,7 @@ var Address = ({
|
|
|
7113
7732
|
rel: "noreferrer noopener",
|
|
7114
7733
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
7115
7734
|
title: "Open in explorer",
|
|
7116
|
-
children: /* @__PURE__ */
|
|
7735
|
+
children: /* @__PURE__ */ jsx27(ExternalLink3, { className: "h-4 w-4" })
|
|
7117
7736
|
}
|
|
7118
7737
|
)
|
|
7119
7738
|
] });
|
|
@@ -7121,7 +7740,7 @@ var Address = ({
|
|
|
7121
7740
|
|
|
7122
7741
|
// src/internal/components/UserOpStatus.tsx
|
|
7123
7742
|
init_base();
|
|
7124
|
-
import { jsx as
|
|
7743
|
+
import { jsx as jsx28, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
7125
7744
|
var UserOpStatus = ({
|
|
7126
7745
|
userOpHash,
|
|
7127
7746
|
chain,
|
|
@@ -7132,20 +7751,20 @@ var UserOpStatus = ({
|
|
|
7132
7751
|
externalState
|
|
7133
7752
|
}) => {
|
|
7134
7753
|
const useExternalState = !!externalState;
|
|
7135
|
-
const [internalReceipt, setInternalReceipt] =
|
|
7136
|
-
const [internalMempool, setInternalMempool] =
|
|
7137
|
-
const [internalError, setInternalError] =
|
|
7138
|
-
const [attempt, setAttempt] =
|
|
7139
|
-
const [internalRefreshing, setInternalRefreshing] =
|
|
7140
|
-
const [timedOut, setTimedOut] =
|
|
7141
|
-
const [rejected, setRejected] =
|
|
7142
|
-
const intervalRef =
|
|
7143
|
-
const startTimeRef =
|
|
7754
|
+
const [internalReceipt, setInternalReceipt] = React24.useState(null);
|
|
7755
|
+
const [internalMempool, setInternalMempool] = React24.useState(null);
|
|
7756
|
+
const [internalError, setInternalError] = React24.useState(null);
|
|
7757
|
+
const [attempt, setAttempt] = React24.useState(0);
|
|
7758
|
+
const [internalRefreshing, setInternalRefreshing] = React24.useState(false);
|
|
7759
|
+
const [timedOut, setTimedOut] = React24.useState(false);
|
|
7760
|
+
const [rejected, setRejected] = React24.useState(false);
|
|
7761
|
+
const intervalRef = React24.useRef(null);
|
|
7762
|
+
const startTimeRef = React24.useRef(Date.now());
|
|
7144
7763
|
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
7145
7764
|
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
7146
7765
|
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
7147
7766
|
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
7148
|
-
const rpc =
|
|
7767
|
+
const rpc = React24.useCallback(async (method, params) => {
|
|
7149
7768
|
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
7150
7769
|
const res = await fetch(getBundlerUrl(), {
|
|
7151
7770
|
method: "POST",
|
|
@@ -7156,14 +7775,14 @@ var UserOpStatus = ({
|
|
|
7156
7775
|
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
7157
7776
|
return json.result;
|
|
7158
7777
|
}, []);
|
|
7159
|
-
const extractMempoolInfo =
|
|
7778
|
+
const extractMempoolInfo = React24.useCallback((m) => {
|
|
7160
7779
|
if (!m) return null;
|
|
7161
7780
|
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
7162
7781
|
const sender = m.sender || m?.userOperation?.sender || null;
|
|
7163
7782
|
if (!entryPoint && !sender) return null;
|
|
7164
7783
|
return { entryPoint, sender };
|
|
7165
7784
|
}, []);
|
|
7166
|
-
const tick =
|
|
7785
|
+
const tick = React24.useCallback(async () => {
|
|
7167
7786
|
if (useExternalState) return;
|
|
7168
7787
|
const elapsed = Date.now() - startTimeRef.current;
|
|
7169
7788
|
if (elapsed > maxPollTimeMs) {
|
|
@@ -7207,7 +7826,7 @@ var UserOpStatus = ({
|
|
|
7207
7826
|
setAttempt((x) => x + 1);
|
|
7208
7827
|
}
|
|
7209
7828
|
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
7210
|
-
|
|
7829
|
+
React24.useEffect(() => {
|
|
7211
7830
|
if (useExternalState) return;
|
|
7212
7831
|
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
7213
7832
|
startTimeRef.current = Date.now();
|
|
@@ -7219,7 +7838,7 @@ var UserOpStatus = ({
|
|
|
7219
7838
|
setAttempt(0);
|
|
7220
7839
|
setInternalRefreshing(false);
|
|
7221
7840
|
}, [userOpHash, useExternalState]);
|
|
7222
|
-
|
|
7841
|
+
React24.useEffect(() => {
|
|
7223
7842
|
if (useExternalState) {
|
|
7224
7843
|
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
7225
7844
|
return;
|
|
@@ -7254,54 +7873,54 @@ var UserOpStatus = ({
|
|
|
7254
7873
|
const stateBadge = () => {
|
|
7255
7874
|
if (receipt) {
|
|
7256
7875
|
const ok = !!receipt.success;
|
|
7257
|
-
return /* @__PURE__ */
|
|
7258
|
-
ok ? /* @__PURE__ */
|
|
7876
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
7877
|
+
ok ? /* @__PURE__ */ jsx28(CheckCircle26, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7259
7878
|
ok ? "Included" : "Failed"
|
|
7260
7879
|
] });
|
|
7261
7880
|
}
|
|
7262
7881
|
if (rejected) {
|
|
7263
|
-
return /* @__PURE__ */
|
|
7264
|
-
/* @__PURE__ */
|
|
7882
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
7883
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7265
7884
|
" Rejected by bundler"
|
|
7266
7885
|
] });
|
|
7267
7886
|
}
|
|
7268
7887
|
if (timedOut) {
|
|
7269
|
-
return /* @__PURE__ */
|
|
7270
|
-
/* @__PURE__ */
|
|
7888
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "warning", className: "gap-1", children: [
|
|
7889
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7271
7890
|
" Timeout - may be rejected"
|
|
7272
7891
|
] });
|
|
7273
7892
|
}
|
|
7274
7893
|
if (mempool) {
|
|
7275
|
-
return /* @__PURE__ */
|
|
7276
|
-
/* @__PURE__ */
|
|
7894
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "outline", className: "gap-1", children: [
|
|
7895
|
+
/* @__PURE__ */ jsx28(Clock3, { className: "h-3 w-3" }),
|
|
7277
7896
|
" Pending in bundler"
|
|
7278
7897
|
] });
|
|
7279
7898
|
}
|
|
7280
|
-
return /* @__PURE__ */
|
|
7281
|
-
/* @__PURE__ */
|
|
7899
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
7900
|
+
/* @__PURE__ */ jsx28(Clock3, { className: "h-3 w-3" }),
|
|
7282
7901
|
" Waiting"
|
|
7283
7902
|
] });
|
|
7284
7903
|
};
|
|
7285
|
-
return /* @__PURE__ */
|
|
7904
|
+
return /* @__PURE__ */ jsxs19(
|
|
7286
7905
|
"div",
|
|
7287
7906
|
{
|
|
7288
7907
|
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
7289
7908
|
style: { textAlign: "left", listStyle: "none" },
|
|
7290
7909
|
children: [
|
|
7291
|
-
/* @__PURE__ */
|
|
7292
|
-
/* @__PURE__ */
|
|
7910
|
+
/* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between mb-3", children: [
|
|
7911
|
+
/* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2", children: [
|
|
7293
7912
|
stateBadge(),
|
|
7294
|
-
/* @__PURE__ */
|
|
7913
|
+
/* @__PURE__ */ jsx28("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
7295
7914
|
] }),
|
|
7296
|
-
/* @__PURE__ */
|
|
7297
|
-
/* @__PURE__ */
|
|
7298
|
-
/* @__PURE__ */
|
|
7915
|
+
/* @__PURE__ */ jsxs19(Button, { variant: "ghost", size: "sm", onClick: () => tick(), disabled: refreshing, className: "h-8", children: [
|
|
7916
|
+
/* @__PURE__ */ jsx28(RefreshCw5, { className: cn2("h-3.5 w-3.5 mr-1", refreshing && "animate-spin") }),
|
|
7917
|
+
/* @__PURE__ */ jsx28("span", { className: "text-xs", children: "Refresh" })
|
|
7299
7918
|
] })
|
|
7300
7919
|
] }),
|
|
7301
|
-
/* @__PURE__ */
|
|
7302
|
-
/* @__PURE__ */
|
|
7303
|
-
/* @__PURE__ */
|
|
7304
|
-
/* @__PURE__ */
|
|
7920
|
+
/* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
7921
|
+
/* @__PURE__ */ jsx28("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "UO Hash" }),
|
|
7922
|
+
/* @__PURE__ */ jsx28("code", { className: "text-xs font-mono flex-1 select-all", children: userOpHash }),
|
|
7923
|
+
/* @__PURE__ */ jsx28(
|
|
7305
7924
|
Button,
|
|
7306
7925
|
{
|
|
7307
7926
|
variant: "ghost",
|
|
@@ -7313,14 +7932,14 @@ var UserOpStatus = ({
|
|
|
7313
7932
|
} catch {
|
|
7314
7933
|
}
|
|
7315
7934
|
},
|
|
7316
|
-
children: /* @__PURE__ */
|
|
7935
|
+
children: /* @__PURE__ */ jsx28(Copy3, { className: "h-3.5 w-3.5" })
|
|
7317
7936
|
}
|
|
7318
7937
|
)
|
|
7319
7938
|
] }),
|
|
7320
|
-
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */
|
|
7321
|
-
/* @__PURE__ */
|
|
7322
|
-
/* @__PURE__ */
|
|
7323
|
-
/* @__PURE__ */
|
|
7939
|
+
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
7940
|
+
/* @__PURE__ */ jsx28("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "Tx Hash" }),
|
|
7941
|
+
/* @__PURE__ */ jsx28("code", { className: "text-xs font-mono flex-1 select-all", children: receipt.receipt.transactionHash }),
|
|
7942
|
+
/* @__PURE__ */ jsx28(
|
|
7324
7943
|
Button,
|
|
7325
7944
|
{
|
|
7326
7945
|
variant: "ghost",
|
|
@@ -7332,10 +7951,10 @@ var UserOpStatus = ({
|
|
|
7332
7951
|
} catch {
|
|
7333
7952
|
}
|
|
7334
7953
|
},
|
|
7335
|
-
children: /* @__PURE__ */
|
|
7954
|
+
children: /* @__PURE__ */ jsx28(Copy3, { className: "h-3.5 w-3.5" })
|
|
7336
7955
|
}
|
|
7337
7956
|
),
|
|
7338
|
-
chain?.blockExplorers?.default?.url && /* @__PURE__ */
|
|
7957
|
+
chain?.blockExplorers?.default?.url && /* @__PURE__ */ jsx28(
|
|
7339
7958
|
"a",
|
|
7340
7959
|
{
|
|
7341
7960
|
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
@@ -7343,11 +7962,11 @@ var UserOpStatus = ({
|
|
|
7343
7962
|
rel: "noreferrer noopener",
|
|
7344
7963
|
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
7345
7964
|
title: "Open in explorer",
|
|
7346
|
-
children: /* @__PURE__ */
|
|
7965
|
+
children: /* @__PURE__ */ jsx28(ExternalLink4, { className: "h-3.5 w-3.5" })
|
|
7347
7966
|
}
|
|
7348
7967
|
)
|
|
7349
7968
|
] }),
|
|
7350
|
-
receipt && /* @__PURE__ */
|
|
7969
|
+
receipt && /* @__PURE__ */ jsxs19("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
7351
7970
|
"Block ",
|
|
7352
7971
|
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
7353
7972
|
" \u2022 Gas Used",
|
|
@@ -7356,32 +7975,32 @@ var UserOpStatus = ({
|
|
|
7356
7975
|
" \u2022 Success ",
|
|
7357
7976
|
String(!!receipt.success)
|
|
7358
7977
|
] }),
|
|
7359
|
-
/* @__PURE__ */
|
|
7978
|
+
/* @__PURE__ */ jsx28("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ jsxs19("span", { className: "ml-2", children: [
|
|
7360
7979
|
"\u2022 Polling for ",
|
|
7361
7980
|
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
7362
7981
|
"s"
|
|
7363
7982
|
] }) }),
|
|
7364
|
-
mempool && /* @__PURE__ */
|
|
7365
|
-
/* @__PURE__ */
|
|
7983
|
+
mempool && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
7984
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
7366
7985
|
"Seen by bundler at ",
|
|
7367
|
-
/* @__PURE__ */
|
|
7986
|
+
/* @__PURE__ */ jsx28(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
7368
7987
|
] }),
|
|
7369
|
-
/* @__PURE__ */
|
|
7988
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
7370
7989
|
"sender ",
|
|
7371
|
-
/* @__PURE__ */
|
|
7990
|
+
/* @__PURE__ */ jsx28(Address, { address: mempool.sender, chain, truncate: false })
|
|
7372
7991
|
] })
|
|
7373
7992
|
] }),
|
|
7374
|
-
error && /* @__PURE__ */
|
|
7375
|
-
/* @__PURE__ */
|
|
7993
|
+
error && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
7994
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-4 w-4" }),
|
|
7376
7995
|
" ",
|
|
7377
7996
|
error
|
|
7378
7997
|
] }),
|
|
7379
|
-
rejected && /* @__PURE__ */
|
|
7380
|
-
/* @__PURE__ */
|
|
7998
|
+
rejected && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
7999
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-4 w-4" }),
|
|
7381
8000
|
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
7382
8001
|
] }),
|
|
7383
|
-
timedOut && /* @__PURE__ */
|
|
7384
|
-
/* @__PURE__ */
|
|
8002
|
+
timedOut && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8003
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-4 w-4" }),
|
|
7385
8004
|
"Stopped polling after ",
|
|
7386
8005
|
Math.round(maxPollTimeMs / 1e3),
|
|
7387
8006
|
"s. UserOperation may have been rejected by the bundler."
|
|
@@ -7393,7 +8012,7 @@ var UserOpStatus = ({
|
|
|
7393
8012
|
|
|
7394
8013
|
// src/internal/components/SendModal.tsx
|
|
7395
8014
|
init_base();
|
|
7396
|
-
import { jsx as
|
|
8015
|
+
import { jsx as jsx29, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
7397
8016
|
var SendModal = ({
|
|
7398
8017
|
open,
|
|
7399
8018
|
onOpenChange,
|
|
@@ -7410,13 +8029,13 @@ var SendModal = ({
|
|
|
7410
8029
|
address,
|
|
7411
8030
|
chainId: lumiaBeam.id
|
|
7412
8031
|
});
|
|
7413
|
-
const [recipient, setRecipient] =
|
|
7414
|
-
const [amount, setAmount] =
|
|
7415
|
-
const [txStep, setTxStep] =
|
|
7416
|
-
const [validationError, setValidationError] =
|
|
8032
|
+
const [recipient, setRecipient] = useState13(initialRecipient);
|
|
8033
|
+
const [amount, setAmount] = useState13(initialAmount);
|
|
8034
|
+
const [txStep, setTxStep] = useState13("input");
|
|
8035
|
+
const [validationError, setValidationError] = useState13(null);
|
|
7417
8036
|
const nativeAsset = assets.find((a) => a.type === "native");
|
|
7418
8037
|
const balance = nativeAsset ? parseFloat(nativeAsset.formattedBalance) : 0;
|
|
7419
|
-
|
|
8038
|
+
useEffect10(() => {
|
|
7420
8039
|
if (open) {
|
|
7421
8040
|
setTxStep("input");
|
|
7422
8041
|
setValidationError(null);
|
|
@@ -7476,7 +8095,7 @@ var SendModal = ({
|
|
|
7476
8095
|
const maxAmount = Math.max(0, balance - 1e-3);
|
|
7477
8096
|
setAmount(maxAmount.toFixed(6));
|
|
7478
8097
|
};
|
|
7479
|
-
return /* @__PURE__ */
|
|
8098
|
+
return /* @__PURE__ */ jsx29(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs20(
|
|
7480
8099
|
DialogContent,
|
|
7481
8100
|
{
|
|
7482
8101
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7488,28 +8107,28 @@ var SendModal = ({
|
|
|
7488
8107
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7489
8108
|
},
|
|
7490
8109
|
children: [
|
|
7491
|
-
/* @__PURE__ */
|
|
7492
|
-
/* @__PURE__ */
|
|
7493
|
-
/* @__PURE__ */
|
|
7494
|
-
onBack && txStep === "input" && /* @__PURE__ */
|
|
8110
|
+
/* @__PURE__ */ jsx29(VisuallyHidden, { children: /* @__PURE__ */ jsx29(DialogTitle, { children: "Send Transaction" }) }),
|
|
8111
|
+
/* @__PURE__ */ jsx29(DialogDescription, { className: "sr-only", children: "Send LUMIA tokens to another address" }),
|
|
8112
|
+
/* @__PURE__ */ jsx29("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
|
|
8113
|
+
onBack && txStep === "input" && /* @__PURE__ */ jsx29(
|
|
7495
8114
|
"button",
|
|
7496
8115
|
{
|
|
7497
8116
|
onClick: onBack,
|
|
7498
8117
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7499
8118
|
title: "Back",
|
|
7500
|
-
children: /* @__PURE__ */
|
|
8119
|
+
children: /* @__PURE__ */ jsx29(ArrowLeft7, { className: "h-4 w-4" })
|
|
7501
8120
|
}
|
|
7502
8121
|
),
|
|
7503
|
-
/* @__PURE__ */
|
|
7504
|
-
/* @__PURE__ */
|
|
7505
|
-
/* @__PURE__ */
|
|
8122
|
+
/* @__PURE__ */ jsxs20("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8123
|
+
/* @__PURE__ */ jsx29(Send, { className: "h-5 w-5" }),
|
|
8124
|
+
/* @__PURE__ */ jsx29("span", { children: "Send LUMIA" })
|
|
7506
8125
|
] })
|
|
7507
8126
|
] }) }),
|
|
7508
|
-
/* @__PURE__ */
|
|
7509
|
-
txStep === "input" && /* @__PURE__ */
|
|
7510
|
-
/* @__PURE__ */
|
|
7511
|
-
/* @__PURE__ */
|
|
7512
|
-
/* @__PURE__ */
|
|
8127
|
+
/* @__PURE__ */ jsxs20("div", { className: "p-5", children: [
|
|
8128
|
+
txStep === "input" && /* @__PURE__ */ jsxs20("div", { className: "space-y-4", children: [
|
|
8129
|
+
/* @__PURE__ */ jsxs20("div", { children: [
|
|
8130
|
+
/* @__PURE__ */ jsx29("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Recipient Address" }),
|
|
8131
|
+
/* @__PURE__ */ jsx29(
|
|
7513
8132
|
"input",
|
|
7514
8133
|
{
|
|
7515
8134
|
type: "text",
|
|
@@ -7520,17 +8139,17 @@ var SendModal = ({
|
|
|
7520
8139
|
}
|
|
7521
8140
|
)
|
|
7522
8141
|
] }),
|
|
7523
|
-
/* @__PURE__ */
|
|
7524
|
-
/* @__PURE__ */
|
|
7525
|
-
/* @__PURE__ */
|
|
7526
|
-
/* @__PURE__ */
|
|
8142
|
+
/* @__PURE__ */ jsxs20("div", { children: [
|
|
8143
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between items-center mb-2", children: [
|
|
8144
|
+
/* @__PURE__ */ jsx29("label", { className: `text-sm font-medium ${theme.bodyText}`, children: "Amount" }),
|
|
8145
|
+
/* @__PURE__ */ jsxs20("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
7527
8146
|
"Balance: ",
|
|
7528
8147
|
balance.toFixed(4),
|
|
7529
8148
|
" LUMIA"
|
|
7530
8149
|
] })
|
|
7531
8150
|
] }),
|
|
7532
|
-
/* @__PURE__ */
|
|
7533
|
-
/* @__PURE__ */
|
|
8151
|
+
/* @__PURE__ */ jsxs20("div", { className: "relative", children: [
|
|
8152
|
+
/* @__PURE__ */ jsx29(
|
|
7534
8153
|
"input",
|
|
7535
8154
|
{
|
|
7536
8155
|
type: "number",
|
|
@@ -7541,7 +8160,7 @@ var SendModal = ({
|
|
|
7541
8160
|
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`
|
|
7542
8161
|
}
|
|
7543
8162
|
),
|
|
7544
|
-
/* @__PURE__ */
|
|
8163
|
+
/* @__PURE__ */ jsx29(
|
|
7545
8164
|
"button",
|
|
7546
8165
|
{
|
|
7547
8166
|
onClick: handleMaxAmount,
|
|
@@ -7551,11 +8170,11 @@ var SendModal = ({
|
|
|
7551
8170
|
)
|
|
7552
8171
|
] })
|
|
7553
8172
|
] }),
|
|
7554
|
-
(validationError || error) && /* @__PURE__ */
|
|
7555
|
-
/* @__PURE__ */
|
|
7556
|
-
/* @__PURE__ */
|
|
8173
|
+
(validationError || error) && /* @__PURE__ */ jsxs20("div", { className: `flex items-center gap-2 p-3 ${isDark ? "bg-red-900/30 text-red-400" : "bg-red-50 text-red-700"} rounded-lg`, children: [
|
|
8174
|
+
/* @__PURE__ */ jsx29(AlertCircle5, { className: "h-4 w-4" }),
|
|
8175
|
+
/* @__PURE__ */ jsx29("span", { className: "text-sm", children: validationError || error })
|
|
7557
8176
|
] }),
|
|
7558
|
-
/* @__PURE__ */
|
|
8177
|
+
/* @__PURE__ */ jsx29(
|
|
7559
8178
|
Button,
|
|
7560
8179
|
{
|
|
7561
8180
|
onClick: handleSend,
|
|
@@ -7566,29 +8185,29 @@ var SendModal = ({
|
|
|
7566
8185
|
}
|
|
7567
8186
|
)
|
|
7568
8187
|
] }),
|
|
7569
|
-
txStep === "confirm" && /* @__PURE__ */
|
|
7570
|
-
/* @__PURE__ */
|
|
7571
|
-
/* @__PURE__ */
|
|
7572
|
-
/* @__PURE__ */
|
|
7573
|
-
/* @__PURE__ */
|
|
7574
|
-
/* @__PURE__ */
|
|
7575
|
-
/* @__PURE__ */
|
|
8188
|
+
txStep === "confirm" && /* @__PURE__ */ jsxs20("div", { className: "space-y-4", children: [
|
|
8189
|
+
/* @__PURE__ */ jsxs20("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8190
|
+
/* @__PURE__ */ jsx29("h3", { className: `font-medium ${theme.titleText} mb-3`, children: "Transaction Details" }),
|
|
8191
|
+
/* @__PURE__ */ jsxs20("div", { className: "space-y-2 text-sm", children: [
|
|
8192
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between", children: [
|
|
8193
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.bodyText}`, children: "To:" }),
|
|
8194
|
+
/* @__PURE__ */ jsx29("span", { className: `font-mono ${theme.titleText}`, children: `${recipient.slice(0, 6)}...${recipient.slice(-4)}` })
|
|
7576
8195
|
] }),
|
|
7577
|
-
/* @__PURE__ */
|
|
7578
|
-
/* @__PURE__ */
|
|
7579
|
-
/* @__PURE__ */
|
|
8196
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between", children: [
|
|
8197
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.bodyText}`, children: "Amount:" }),
|
|
8198
|
+
/* @__PURE__ */ jsxs20("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
7580
8199
|
amount,
|
|
7581
8200
|
" LUMIA"
|
|
7582
8201
|
] })
|
|
7583
8202
|
] }),
|
|
7584
|
-
/* @__PURE__ */
|
|
7585
|
-
/* @__PURE__ */
|
|
7586
|
-
/* @__PURE__ */
|
|
8203
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex justify-between", children: [
|
|
8204
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.bodyText}`, children: "Network:" }),
|
|
8205
|
+
/* @__PURE__ */ jsx29("span", { className: `${theme.titleText}`, children: "Lumia Beam" })
|
|
7587
8206
|
] })
|
|
7588
8207
|
] })
|
|
7589
8208
|
] }),
|
|
7590
|
-
/* @__PURE__ */
|
|
7591
|
-
/* @__PURE__ */
|
|
8209
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex gap-2", children: [
|
|
8210
|
+
/* @__PURE__ */ jsx29(
|
|
7592
8211
|
Button,
|
|
7593
8212
|
{
|
|
7594
8213
|
onClick: () => setTxStep("input"),
|
|
@@ -7598,7 +8217,7 @@ var SendModal = ({
|
|
|
7598
8217
|
children: "Back"
|
|
7599
8218
|
}
|
|
7600
8219
|
),
|
|
7601
|
-
/* @__PURE__ */
|
|
8220
|
+
/* @__PURE__ */ jsxs20(
|
|
7602
8221
|
Button,
|
|
7603
8222
|
{
|
|
7604
8223
|
onClick: handleConfirm,
|
|
@@ -7606,28 +8225,28 @@ var SendModal = ({
|
|
|
7606
8225
|
className: "flex-1",
|
|
7607
8226
|
size: "lg",
|
|
7608
8227
|
children: [
|
|
7609
|
-
isLoading && /* @__PURE__ */
|
|
8228
|
+
isLoading && /* @__PURE__ */ jsx29(Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
7610
8229
|
"Confirm"
|
|
7611
8230
|
]
|
|
7612
8231
|
}
|
|
7613
8232
|
)
|
|
7614
8233
|
] })
|
|
7615
8234
|
] }),
|
|
7616
|
-
txStep === "pending" && /* @__PURE__ */
|
|
7617
|
-
/* @__PURE__ */
|
|
7618
|
-
/* @__PURE__ */
|
|
7619
|
-
/* @__PURE__ */
|
|
7620
|
-
/* @__PURE__ */
|
|
8235
|
+
txStep === "pending" && /* @__PURE__ */ jsxs20("div", { className: "py-8 text-center space-y-4", children: [
|
|
8236
|
+
/* @__PURE__ */ jsx29(Loader2, { className: `h-12 w-12 animate-spin ${isDark ? "text-blue-400" : "text-blue-600"} mx-auto` }),
|
|
8237
|
+
/* @__PURE__ */ jsxs20("div", { children: [
|
|
8238
|
+
/* @__PURE__ */ jsx29("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Pending" }),
|
|
8239
|
+
/* @__PURE__ */ jsx29("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Please wait while we process your transaction" })
|
|
7621
8240
|
] })
|
|
7622
8241
|
] }),
|
|
7623
|
-
txStep === "success" && userOpHash && /* @__PURE__ */
|
|
7624
|
-
/* @__PURE__ */
|
|
7625
|
-
/* @__PURE__ */
|
|
7626
|
-
/* @__PURE__ */
|
|
7627
|
-
/* @__PURE__ */
|
|
8242
|
+
txStep === "success" && userOpHash && /* @__PURE__ */ jsxs20("div", { className: "space-y-4", children: [
|
|
8243
|
+
/* @__PURE__ */ jsxs20("div", { className: "text-center py-4", children: [
|
|
8244
|
+
/* @__PURE__ */ jsx29(CheckCircle27, { className: `h-12 w-12 ${isDark ? "text-green-400" : "text-green-500"} mx-auto mb-3` }),
|
|
8245
|
+
/* @__PURE__ */ jsx29("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Sent!" }),
|
|
8246
|
+
/* @__PURE__ */ jsx29("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Your transaction is being processed" })
|
|
7628
8247
|
] }),
|
|
7629
|
-
/* @__PURE__ */
|
|
7630
|
-
/* @__PURE__ */
|
|
8248
|
+
/* @__PURE__ */ jsx29("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: /* @__PURE__ */ jsx29(UserOpStatus, { userOpHash, chain: lumiaBeam }) }),
|
|
8249
|
+
/* @__PURE__ */ jsx29(
|
|
7631
8250
|
Button,
|
|
7632
8251
|
{
|
|
7633
8252
|
onClick: handleClose,
|
|
@@ -7644,21 +8263,21 @@ var SendModal = ({
|
|
|
7644
8263
|
};
|
|
7645
8264
|
|
|
7646
8265
|
// src/internal/components/ReceiveModal.tsx
|
|
7647
|
-
import { useState as
|
|
7648
|
-
import { QrCode, Copy as Copy4, ArrowLeft as ArrowLeft8, CheckCircle2 as
|
|
8266
|
+
import { useState as useState14, useEffect as useEffect11 } from "react";
|
|
8267
|
+
import { QrCode, Copy as Copy4, ArrowLeft as ArrowLeft8, CheckCircle2 as CheckCircle28 } from "lucide-react";
|
|
7649
8268
|
import QRCode from "qrcode";
|
|
7650
|
-
import { Fragment as
|
|
8269
|
+
import { Fragment as Fragment7, jsx as jsx30, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
7651
8270
|
var ReceiveModal = ({
|
|
7652
8271
|
open,
|
|
7653
8272
|
onOpenChange,
|
|
7654
8273
|
onBack
|
|
7655
8274
|
}) => {
|
|
7656
8275
|
const { address } = useLumiaSession();
|
|
7657
|
-
const [qrCodeUrl, setQrCodeUrl] =
|
|
8276
|
+
const [qrCodeUrl, setQrCodeUrl] = useState14("");
|
|
7658
8277
|
const { config } = useLumiaPassportConfig();
|
|
7659
8278
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7660
|
-
const [copied, setCopied] =
|
|
7661
|
-
|
|
8279
|
+
const [copied, setCopied] = useState14(false);
|
|
8280
|
+
useEffect11(() => {
|
|
7662
8281
|
if (open && address) {
|
|
7663
8282
|
QRCode.toDataURL(address, {
|
|
7664
8283
|
width: 200,
|
|
@@ -7688,7 +8307,7 @@ var ReceiveModal = ({
|
|
|
7688
8307
|
if (!addr) return "";
|
|
7689
8308
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7690
8309
|
};
|
|
7691
|
-
return /* @__PURE__ */
|
|
8310
|
+
return /* @__PURE__ */ jsx30(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs21(
|
|
7692
8311
|
DialogContent,
|
|
7693
8312
|
{
|
|
7694
8313
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7700,51 +8319,51 @@ var ReceiveModal = ({
|
|
|
7700
8319
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7701
8320
|
},
|
|
7702
8321
|
children: [
|
|
7703
|
-
/* @__PURE__ */
|
|
7704
|
-
/* @__PURE__ */
|
|
7705
|
-
/* @__PURE__ */
|
|
7706
|
-
onBack && /* @__PURE__ */
|
|
8322
|
+
/* @__PURE__ */ jsx30(VisuallyHidden, { children: /* @__PURE__ */ jsx30(DialogTitle, { children: "Receive LUMIA" }) }),
|
|
8323
|
+
/* @__PURE__ */ jsx30(DialogDescription, { className: "sr-only", children: "Your wallet address and QR code for receiving LUMIA" }),
|
|
8324
|
+
/* @__PURE__ */ jsx30("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-2", children: [
|
|
8325
|
+
onBack && /* @__PURE__ */ jsx30(
|
|
7707
8326
|
"button",
|
|
7708
8327
|
{
|
|
7709
8328
|
onClick: onBack,
|
|
7710
8329
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7711
8330
|
title: "Back",
|
|
7712
|
-
children: /* @__PURE__ */
|
|
8331
|
+
children: /* @__PURE__ */ jsx30(ArrowLeft8, { className: "h-4 w-4" })
|
|
7713
8332
|
}
|
|
7714
8333
|
),
|
|
7715
|
-
/* @__PURE__ */
|
|
7716
|
-
/* @__PURE__ */
|
|
7717
|
-
/* @__PURE__ */
|
|
8334
|
+
/* @__PURE__ */ jsxs21("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8335
|
+
/* @__PURE__ */ jsx30(QrCode, { className: "h-5 w-5" }),
|
|
8336
|
+
/* @__PURE__ */ jsx30("span", { children: "Receive LUMIA" })
|
|
7718
8337
|
] })
|
|
7719
8338
|
] }) }),
|
|
7720
|
-
/* @__PURE__ */
|
|
7721
|
-
qrCodeUrl && /* @__PURE__ */
|
|
7722
|
-
/* @__PURE__ */
|
|
7723
|
-
/* @__PURE__ */
|
|
7724
|
-
/* @__PURE__ */
|
|
8339
|
+
/* @__PURE__ */ jsxs21("div", { className: "p-5 space-y-4", children: [
|
|
8340
|
+
qrCodeUrl && /* @__PURE__ */ jsx30("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx30("div", { className: `${isDark ? "bg-white" : "bg-white"} p-4 rounded-xl border ${theme.divider}`, children: /* @__PURE__ */ jsx30("img", { src: qrCodeUrl, alt: "Wallet QR Code", className: "w-48 h-48" }) }) }),
|
|
8341
|
+
/* @__PURE__ */ jsx30("div", { className: `${isDark ? "bg-blue-900/30 border-blue-600" : "bg-blue-50 border-blue-200"} rounded-lg p-3`, children: /* @__PURE__ */ jsx30("div", { className: `flex items-center gap-2 ${isDark ? "text-blue-300" : "text-blue-700"} text-sm`, children: /* @__PURE__ */ jsxs21("div", { className: "flex-1", children: [
|
|
8342
|
+
/* @__PURE__ */ jsx30("p", { className: "font-medium", children: "Network: Lumia Beam" }),
|
|
8343
|
+
/* @__PURE__ */ jsx30("p", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} mt-0.5`, children: "Ensure sender is on the same network" })
|
|
7725
8344
|
] }) }) }),
|
|
7726
|
-
/* @__PURE__ */
|
|
7727
|
-
/* @__PURE__ */
|
|
7728
|
-
/* @__PURE__ */
|
|
7729
|
-
/* @__PURE__ */
|
|
8345
|
+
/* @__PURE__ */ jsxs21("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8346
|
+
/* @__PURE__ */ jsx30("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Your Wallet Address" }),
|
|
8347
|
+
/* @__PURE__ */ jsx30("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx30("div", { className: `flex-1 font-mono text-sm ${isDark ? "text-white bg-gray-700 border-gray-600" : "text-gray-900 bg-white border-gray-300"} rounded-lg px-3 py-2 break-all`, children: address }) }),
|
|
8348
|
+
/* @__PURE__ */ jsx30(
|
|
7730
8349
|
Button,
|
|
7731
8350
|
{
|
|
7732
8351
|
onClick: handleCopy,
|
|
7733
8352
|
className: "w-full mt-3",
|
|
7734
8353
|
size: "lg",
|
|
7735
|
-
children: copied ? /* @__PURE__ */
|
|
7736
|
-
/* @__PURE__ */
|
|
7737
|
-
/* @__PURE__ */
|
|
7738
|
-
] }) : /* @__PURE__ */
|
|
7739
|
-
/* @__PURE__ */
|
|
7740
|
-
/* @__PURE__ */
|
|
8354
|
+
children: copied ? /* @__PURE__ */ jsxs21(Fragment7, { children: [
|
|
8355
|
+
/* @__PURE__ */ jsx30(CheckCircle28, { className: "h-4 w-4" }),
|
|
8356
|
+
/* @__PURE__ */ jsx30("span", { children: "Copied!" })
|
|
8357
|
+
] }) : /* @__PURE__ */ jsxs21(Fragment7, { children: [
|
|
8358
|
+
/* @__PURE__ */ jsx30(Copy4, { className: "h-4 w-4" }),
|
|
8359
|
+
/* @__PURE__ */ jsx30("span", { children: "Copy Address" })
|
|
7741
8360
|
] })
|
|
7742
8361
|
}
|
|
7743
8362
|
)
|
|
7744
8363
|
] }),
|
|
7745
|
-
/* @__PURE__ */
|
|
7746
|
-
/* @__PURE__ */
|
|
7747
|
-
/* @__PURE__ */
|
|
8364
|
+
/* @__PURE__ */ jsxs21("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
8365
|
+
/* @__PURE__ */ jsx30("p", { children: "Share this address to receive LUMIA tokens." }),
|
|
8366
|
+
/* @__PURE__ */ jsx30("p", { className: "mt-1", children: "Only send LUMIA tokens to this address on Lumia Beam network." })
|
|
7748
8367
|
] })
|
|
7749
8368
|
] })
|
|
7750
8369
|
]
|
|
@@ -7754,11 +8373,11 @@ var ReceiveModal = ({
|
|
|
7754
8373
|
|
|
7755
8374
|
// src/internal/components/BuyModal.tsx
|
|
7756
8375
|
import { CreditCard, ArrowLeft as ArrowLeft9 } from "lucide-react";
|
|
7757
|
-
import { jsx as
|
|
8376
|
+
import { jsx as jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
7758
8377
|
var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
7759
8378
|
const { config } = useLumiaPassportConfig();
|
|
7760
8379
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7761
|
-
return /* @__PURE__ */
|
|
8380
|
+
return /* @__PURE__ */ jsx31(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs22(
|
|
7762
8381
|
DialogContent,
|
|
7763
8382
|
{
|
|
7764
8383
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7770,26 +8389,26 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7770
8389
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7771
8390
|
},
|
|
7772
8391
|
children: [
|
|
7773
|
-
/* @__PURE__ */
|
|
7774
|
-
/* @__PURE__ */
|
|
7775
|
-
/* @__PURE__ */
|
|
7776
|
-
onBack && /* @__PURE__ */
|
|
8392
|
+
/* @__PURE__ */ jsx31(VisuallyHidden, { children: /* @__PURE__ */ jsx31(DialogTitle, { children: "Buy Crypto" }) }),
|
|
8393
|
+
/* @__PURE__ */ jsx31(DialogDescription, { className: "sr-only", children: "On-ramp placeholder" }),
|
|
8394
|
+
/* @__PURE__ */ jsx31("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2", children: [
|
|
8395
|
+
onBack && /* @__PURE__ */ jsx31(
|
|
7777
8396
|
"button",
|
|
7778
8397
|
{
|
|
7779
8398
|
onClick: onBack,
|
|
7780
8399
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7781
8400
|
title: "Back",
|
|
7782
|
-
children: /* @__PURE__ */
|
|
8401
|
+
children: /* @__PURE__ */ jsx31(ArrowLeft9, { className: "h-4 w-4" })
|
|
7783
8402
|
}
|
|
7784
8403
|
),
|
|
7785
|
-
/* @__PURE__ */
|
|
7786
|
-
/* @__PURE__ */
|
|
7787
|
-
/* @__PURE__ */
|
|
8404
|
+
/* @__PURE__ */ jsxs22("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8405
|
+
/* @__PURE__ */ jsx31(CreditCard, { className: "h-5 w-5" }),
|
|
8406
|
+
/* @__PURE__ */ jsx31("span", { children: "Buy" })
|
|
7788
8407
|
] })
|
|
7789
8408
|
] }) }),
|
|
7790
|
-
/* @__PURE__ */
|
|
7791
|
-
/* @__PURE__ */
|
|
7792
|
-
/* @__PURE__ */
|
|
8409
|
+
/* @__PURE__ */ jsxs22("div", { className: "p-5", children: [
|
|
8410
|
+
/* @__PURE__ */ jsx31("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ jsx31("div", { className: `text-sm ${theme.mutedText}`, children: "On-ramp coming soon\u2026" }) }),
|
|
8411
|
+
/* @__PURE__ */ jsx31("div", { className: "pt-4", children: /* @__PURE__ */ jsx31(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
7793
8412
|
] })
|
|
7794
8413
|
]
|
|
7795
8414
|
}
|
|
@@ -7798,13 +8417,13 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7798
8417
|
|
|
7799
8418
|
// src/internal/components/KycModal.tsx
|
|
7800
8419
|
import { ShieldCheck, ArrowLeft as ArrowLeft10 } from "lucide-react";
|
|
7801
|
-
import { jsx as
|
|
8420
|
+
import { jsx as jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
7802
8421
|
var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
7803
8422
|
const { config } = useLumiaPassportConfig();
|
|
7804
8423
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7805
8424
|
const provider = config.kyc?.provider;
|
|
7806
8425
|
const options = config.kyc?.options || {};
|
|
7807
|
-
return /* @__PURE__ */
|
|
8426
|
+
return /* @__PURE__ */ jsx32(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs23(
|
|
7808
8427
|
DialogContent,
|
|
7809
8428
|
{
|
|
7810
8429
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7816,32 +8435,32 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7816
8435
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7817
8436
|
},
|
|
7818
8437
|
children: [
|
|
7819
|
-
/* @__PURE__ */
|
|
7820
|
-
/* @__PURE__ */
|
|
7821
|
-
/* @__PURE__ */
|
|
7822
|
-
onBack && /* @__PURE__ */
|
|
8438
|
+
/* @__PURE__ */ jsx32(VisuallyHidden, { children: /* @__PURE__ */ jsx32(DialogTitle, { children: "KYC" }) }),
|
|
8439
|
+
/* @__PURE__ */ jsx32(DialogDescription, { className: "sr-only", children: "KYC placeholder" }),
|
|
8440
|
+
/* @__PURE__ */ jsx32("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2", children: [
|
|
8441
|
+
onBack && /* @__PURE__ */ jsx32(
|
|
7823
8442
|
"button",
|
|
7824
8443
|
{
|
|
7825
8444
|
onClick: onBack,
|
|
7826
8445
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7827
8446
|
title: "Back",
|
|
7828
|
-
children: /* @__PURE__ */
|
|
8447
|
+
children: /* @__PURE__ */ jsx32(ArrowLeft10, { className: "h-4 w-4" })
|
|
7829
8448
|
}
|
|
7830
8449
|
),
|
|
7831
|
-
/* @__PURE__ */
|
|
7832
|
-
/* @__PURE__ */
|
|
7833
|
-
/* @__PURE__ */
|
|
8450
|
+
/* @__PURE__ */ jsxs23("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8451
|
+
/* @__PURE__ */ jsx32(ShieldCheck, { className: "h-5 w-5" }),
|
|
8452
|
+
/* @__PURE__ */ jsx32("span", { children: "KYC" })
|
|
7834
8453
|
] })
|
|
7835
8454
|
] }) }),
|
|
7836
|
-
/* @__PURE__ */
|
|
7837
|
-
provider ? /* @__PURE__ */
|
|
7838
|
-
/* @__PURE__ */
|
|
8455
|
+
/* @__PURE__ */ jsxs23("div", { className: "p-5", children: [
|
|
8456
|
+
provider ? /* @__PURE__ */ jsxs23("div", { className: `rounded-xl p-4 ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: [
|
|
8457
|
+
/* @__PURE__ */ jsxs23("div", { className: `text-sm ${theme.titleText} mb-2`, children: [
|
|
7839
8458
|
"KYC provider: ",
|
|
7840
|
-
/* @__PURE__ */
|
|
8459
|
+
/* @__PURE__ */ jsx32("span", { className: "font-medium", children: provider })
|
|
7841
8460
|
] }),
|
|
7842
|
-
Object.keys(options).length > 0 ? /* @__PURE__ */
|
|
7843
|
-
] }) : /* @__PURE__ */
|
|
7844
|
-
/* @__PURE__ */
|
|
8461
|
+
Object.keys(options).length > 0 ? /* @__PURE__ */ jsx32("div", { className: `text-xs ${theme.mutedText} break-words whitespace-pre-wrap`, children: JSON.stringify(options, null, 2) }) : /* @__PURE__ */ jsx32("div", { className: `text-sm ${theme.mutedText}`, children: "No provider options configured." })
|
|
8462
|
+
] }) : /* @__PURE__ */ jsx32("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ jsx32("div", { className: `text-sm ${theme.mutedText}`, children: "KYC verification coming soon\u2026" }) }),
|
|
8463
|
+
/* @__PURE__ */ jsx32("div", { className: "pt-4", children: /* @__PURE__ */ jsx32(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
7845
8464
|
] })
|
|
7846
8465
|
]
|
|
7847
8466
|
}
|
|
@@ -7850,20 +8469,20 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7850
8469
|
|
|
7851
8470
|
// src/components/ConnectWalletButton.tsx
|
|
7852
8471
|
init_auth();
|
|
7853
|
-
import { Cloud as
|
|
8472
|
+
import { Cloud as Cloud4, Laptop as Laptop2, Shield as Shield5, Copy as Copy5, ArrowUp, ArrowDown, Plus as Plus2, Activity as Activity2, Gem as Gem2, CreditCard as CreditCard2, Lock as Lock3, ArrowUpRight as ArrowUpRight2, AlertTriangle as AlertTriangle4, ShieldCheck as ShieldCheck2 } from "lucide-react";
|
|
7854
8473
|
init_base();
|
|
7855
8474
|
|
|
7856
8475
|
// src/modules/linkedProfiles.ts
|
|
7857
8476
|
init_common();
|
|
7858
8477
|
init_types();
|
|
7859
8478
|
init_auth();
|
|
7860
|
-
import * as
|
|
8479
|
+
import * as React27 from "react";
|
|
7861
8480
|
function useLumiaPassportLinkedProfiles() {
|
|
7862
|
-
const [profiles, setProfiles] =
|
|
7863
|
-
const [avatar, setAvatar] =
|
|
7864
|
-
const [isLoading, setIsLoading] =
|
|
7865
|
-
const [error, setError] =
|
|
7866
|
-
const load =
|
|
8481
|
+
const [profiles, setProfiles] = React27.useState([]);
|
|
8482
|
+
const [avatar, setAvatar] = React27.useState(null);
|
|
8483
|
+
const [isLoading, setIsLoading] = React27.useState(false);
|
|
8484
|
+
const [error, setError] = React27.useState(null);
|
|
8485
|
+
const load = React27.useCallback(async () => {
|
|
7867
8486
|
setIsLoading(true);
|
|
7868
8487
|
setError(null);
|
|
7869
8488
|
try {
|
|
@@ -7889,14 +8508,14 @@ function useLumiaPassportLinkedProfiles() {
|
|
|
7889
8508
|
setIsLoading(false);
|
|
7890
8509
|
}
|
|
7891
8510
|
}, []);
|
|
7892
|
-
|
|
8511
|
+
React27.useEffect(() => {
|
|
7893
8512
|
load();
|
|
7894
8513
|
}, [load]);
|
|
7895
8514
|
return { profiles, avatar, isLoading, error, refresh: load };
|
|
7896
8515
|
}
|
|
7897
8516
|
|
|
7898
8517
|
// src/components/ConnectWalletButton.tsx
|
|
7899
|
-
import { jsx as
|
|
8518
|
+
import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
7900
8519
|
var ConnectWalletButton = ({
|
|
7901
8520
|
className,
|
|
7902
8521
|
label = "Connect Wallet",
|
|
@@ -7908,7 +8527,7 @@ var ConnectWalletButton = ({
|
|
|
7908
8527
|
}) => {
|
|
7909
8528
|
console.log("[ConnectWalletButton] Component rendering");
|
|
7910
8529
|
const { config, callbacks: contextCallbacks } = useLumiaPassportConfig();
|
|
7911
|
-
const callbacks =
|
|
8530
|
+
const callbacks = React28.useMemo(() => ({
|
|
7912
8531
|
onLumiaPassportConnecting: buttonCallbacks?.onLumiaPassportConnecting ?? contextCallbacks?.onLumiaPassportConnecting,
|
|
7913
8532
|
onLumiaPassportConnect: buttonCallbacks?.onLumiaPassportConnect ?? contextCallbacks?.onLumiaPassportConnect,
|
|
7914
8533
|
onLumiaPassportAccount: buttonCallbacks?.onLumiaPassportAccount ?? contextCallbacks?.onLumiaPassportAccount,
|
|
@@ -7926,14 +8545,14 @@ var ConnectWalletButton = ({
|
|
|
7926
8545
|
isAuthenticated: jwtTokenManager2.isAuthenticated?.(),
|
|
7927
8546
|
hasTokens: !!jwtTokenManager2.getTokens()
|
|
7928
8547
|
});
|
|
7929
|
-
|
|
8548
|
+
React28.useEffect(() => {
|
|
7930
8549
|
if (!profilesLoading && profiles.length > 0) {
|
|
7931
8550
|
console.log("[ConnectWalletButton] Profiles loaded:", profiles.map((p) => ({ provider: p.provider, externalId: p.externalId })));
|
|
7932
8551
|
const hasEmail = profiles.some((p) => p.provider?.toLowerCase() === "email");
|
|
7933
8552
|
console.log("[ConnectWalletButton] Has email provider:", hasEmail);
|
|
7934
8553
|
}
|
|
7935
8554
|
}, [profiles, profilesLoading]);
|
|
7936
|
-
|
|
8555
|
+
React28.useEffect(() => {
|
|
7937
8556
|
console.log("[ConnectWalletButton] Theme state:", {
|
|
7938
8557
|
configTheme: config.ui.theme,
|
|
7939
8558
|
resolvedTheme,
|
|
@@ -7941,20 +8560,21 @@ var ConnectWalletButton = ({
|
|
|
7941
8560
|
bodyClasses: document.body.className
|
|
7942
8561
|
});
|
|
7943
8562
|
}, [config.ui.theme, resolvedTheme, isDark]);
|
|
7944
|
-
const [isAuthModalOpen, setIsAuthModalOpen] =
|
|
7945
|
-
const [recoveryUserId, setRecoveryUserId] =
|
|
7946
|
-
const tssManagerRef =
|
|
7947
|
-
const [isWalletMenuOpen, setIsWalletMenuOpen] =
|
|
7948
|
-
const [copied, setCopied] =
|
|
7949
|
-
const [isManageWalletOpen, setIsManageWalletOpen] =
|
|
7950
|
-
const [isSecurityOpen, setIsSecurityOpen] =
|
|
7951
|
-
const [
|
|
7952
|
-
const [
|
|
7953
|
-
const [
|
|
7954
|
-
const [
|
|
7955
|
-
const [
|
|
7956
|
-
const [
|
|
7957
|
-
|
|
8563
|
+
const [isAuthModalOpen, setIsAuthModalOpen] = React28.useState(false);
|
|
8564
|
+
const [recoveryUserId, setRecoveryUserId] = React28.useState(null);
|
|
8565
|
+
const tssManagerRef = React28.useRef(null);
|
|
8566
|
+
const [isWalletMenuOpen, setIsWalletMenuOpen] = React28.useState(false);
|
|
8567
|
+
const [copied, setCopied] = React28.useState(false);
|
|
8568
|
+
const [isManageWalletOpen, setIsManageWalletOpen] = React28.useState(false);
|
|
8569
|
+
const [isSecurityOpen, setIsSecurityOpen] = React28.useState(false);
|
|
8570
|
+
const [isBackupOpen, setIsBackupOpen] = React28.useState(false);
|
|
8571
|
+
const [isTransactionsOpen, setIsTransactionsOpen] = React28.useState(false);
|
|
8572
|
+
const [isViewAssetsOpen, setIsViewAssetsOpen] = React28.useState(false);
|
|
8573
|
+
const [isSendOpen, setIsSendOpen] = React28.useState(false);
|
|
8574
|
+
const [isReceiveOpen, setIsReceiveOpen] = React28.useState(false);
|
|
8575
|
+
const [isBuyOpen, setIsBuyOpen] = React28.useState(false);
|
|
8576
|
+
const [isKycOpen, setIsKycOpen] = React28.useState(false);
|
|
8577
|
+
React28.useEffect(() => {
|
|
7958
8578
|
try {
|
|
7959
8579
|
const shouldAutoOpen = authOpen ?? config?.ui?.authOpen;
|
|
7960
8580
|
if (!address && !session && shouldAutoOpen) {
|
|
@@ -7981,25 +8601,25 @@ var ConnectWalletButton = ({
|
|
|
7981
8601
|
refetchOnWindowFocus: true
|
|
7982
8602
|
}
|
|
7983
8603
|
});
|
|
7984
|
-
const formatAddress =
|
|
8604
|
+
const formatAddress = React28.useCallback((addr) => {
|
|
7985
8605
|
if (!addr) return "";
|
|
7986
8606
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7987
8607
|
}, []);
|
|
7988
|
-
const avatar =
|
|
7989
|
-
const displayName =
|
|
7990
|
-
const formatBalance =
|
|
8608
|
+
const avatar = React28.useMemo(() => jwtTokenManager2.getAvatar(), [isAuthModalOpen, status]);
|
|
8609
|
+
const displayName = React28.useMemo(() => jwtTokenManager2.getDisplayName(), [isAuthModalOpen, status]);
|
|
8610
|
+
const formatBalance = React28.useCallback(() => {
|
|
7991
8611
|
if (!balance || balanceLoading) return "0.0000";
|
|
7992
8612
|
return parseFloat(balance.formatted).toFixed(4);
|
|
7993
8613
|
}, [balance, balanceLoading]);
|
|
7994
|
-
const [hasServerVault, setHasServerVault] =
|
|
7995
|
-
const indicators =
|
|
8614
|
+
const [hasServerVault, setHasServerVault] = React28.useState(false);
|
|
8615
|
+
const indicators = React28.useMemo(() => {
|
|
7996
8616
|
const userId = jwtTokenManager2.getUserId();
|
|
7997
8617
|
if (!userId) return { server: false, local: false, backup: false };
|
|
7998
8618
|
const server = jwtTokenManager2.getHasKeyshare() ?? false;
|
|
7999
8619
|
const local = !!address;
|
|
8000
8620
|
return { server, local, backup: hasServerVault };
|
|
8001
8621
|
}, [session, address, hasServerVault]);
|
|
8002
|
-
const handleAuthModalSuccess =
|
|
8622
|
+
const handleAuthModalSuccess = React28.useCallback(async () => {
|
|
8003
8623
|
await new Promise((r) => setTimeout(r, 100));
|
|
8004
8624
|
const userId = jwtTokenManager2.getUserId();
|
|
8005
8625
|
const isAuthenticated = jwtTokenManager2.isAuthenticated();
|
|
@@ -8051,7 +8671,7 @@ var ConnectWalletButton = ({
|
|
|
8051
8671
|
}
|
|
8052
8672
|
}
|
|
8053
8673
|
}, [onConnected, setAddress, setError, setSession, setStatus]);
|
|
8054
|
-
const handleDisconnect =
|
|
8674
|
+
const handleDisconnect = React28.useCallback(async () => {
|
|
8055
8675
|
const prevAddress = address;
|
|
8056
8676
|
let userId = null;
|
|
8057
8677
|
try {
|
|
@@ -8071,7 +8691,7 @@ var ConnectWalletButton = ({
|
|
|
8071
8691
|
} catch {
|
|
8072
8692
|
}
|
|
8073
8693
|
}, [setAddress, setError, setSession, setStatus]);
|
|
8074
|
-
|
|
8694
|
+
React28.useEffect(() => {
|
|
8075
8695
|
if (address) {
|
|
8076
8696
|
(async () => {
|
|
8077
8697
|
try {
|
|
@@ -8088,7 +8708,7 @@ var ConnectWalletButton = ({
|
|
|
8088
8708
|
setHasServerVault(false);
|
|
8089
8709
|
}
|
|
8090
8710
|
}, [address]);
|
|
8091
|
-
|
|
8711
|
+
React28.useEffect(() => {
|
|
8092
8712
|
console.log("[UI-KIT][AutoConnect] useEffect mounted");
|
|
8093
8713
|
let cancelled = false;
|
|
8094
8714
|
const tryAutoConnect = async (attempt) => {
|
|
@@ -8193,13 +8813,13 @@ var ConnectWalletButton = ({
|
|
|
8193
8813
|
cancelled = true;
|
|
8194
8814
|
};
|
|
8195
8815
|
}, []);
|
|
8196
|
-
|
|
8816
|
+
React28.useEffect(() => {
|
|
8197
8817
|
if (address && refetchBalance) {
|
|
8198
8818
|
refetchBalance();
|
|
8199
8819
|
}
|
|
8200
8820
|
}, [address]);
|
|
8201
|
-
return /* @__PURE__ */
|
|
8202
|
-
/* @__PURE__ */
|
|
8821
|
+
return /* @__PURE__ */ jsxs24("div", { className: [className, "lumia-scope"].filter(Boolean).join(" "), children: [
|
|
8822
|
+
/* @__PURE__ */ jsx33("div", { className: "inline-flex items-center gap-2", children: !address ? /* @__PURE__ */ jsx33("div", { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx33(
|
|
8203
8823
|
"button",
|
|
8204
8824
|
{
|
|
8205
8825
|
onClick: () => {
|
|
@@ -8236,56 +8856,56 @@ var ConnectWalletButton = ({
|
|
|
8236
8856
|
},
|
|
8237
8857
|
children: label || "Connect"
|
|
8238
8858
|
}
|
|
8239
|
-
) }) : /* @__PURE__ */
|
|
8859
|
+
) }) : /* @__PURE__ */ jsx33(
|
|
8240
8860
|
"div",
|
|
8241
8861
|
{
|
|
8242
8862
|
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"}`,
|
|
8243
8863
|
onClick: () => setIsWalletMenuOpen(true),
|
|
8244
|
-
children: /* @__PURE__ */
|
|
8245
|
-
/* @__PURE__ */
|
|
8864
|
+
children: /* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-3", children: [
|
|
8865
|
+
/* @__PURE__ */ jsx33("div", { className: "w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 overflow-hidden bg-gradient-to-br from-purple-500 to-blue-600", children: avatar ? (
|
|
8246
8866
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8247
|
-
/* @__PURE__ */
|
|
8248
|
-
) : /* @__PURE__ */
|
|
8249
|
-
/* @__PURE__ */
|
|
8250
|
-
/* @__PURE__ */
|
|
8251
|
-
/* @__PURE__ */
|
|
8867
|
+
/* @__PURE__ */ jsx33("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8868
|
+
) : /* @__PURE__ */ jsx33("span", { className: "text-white font-bold text-sm", children: "LP" }) }),
|
|
8869
|
+
/* @__PURE__ */ jsxs24("div", { className: "text-left flex-1 min-w-0", children: [
|
|
8870
|
+
/* @__PURE__ */ jsx33("div", { className: `font-semibold text-base truncate ${theme.titleText}`, children: mode === "compact" && displayName ? displayName : formatAddress(address) }),
|
|
8871
|
+
/* @__PURE__ */ jsxs24("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
8252
8872
|
formatBalance(),
|
|
8253
8873
|
" LUMIA"
|
|
8254
8874
|
] })
|
|
8255
8875
|
] }),
|
|
8256
|
-
/* @__PURE__ */
|
|
8257
|
-
/* @__PURE__ */
|
|
8258
|
-
/* @__PURE__ */
|
|
8259
|
-
|
|
8876
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-1", children: [
|
|
8877
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8878
|
+
/* @__PURE__ */ jsx33(
|
|
8879
|
+
Cloud4,
|
|
8260
8880
|
{
|
|
8261
8881
|
className: `w-3 h-3 ${indicators.server ? "text-green-500" : "text-orange-400"}`
|
|
8262
8882
|
}
|
|
8263
8883
|
),
|
|
8264
|
-
/* @__PURE__ */
|
|
8884
|
+
/* @__PURE__ */ jsxs24("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8265
8885
|
"Server Keyshare: ",
|
|
8266
8886
|
indicators.server ? "Available" : "Missing"
|
|
8267
8887
|
] })
|
|
8268
8888
|
] }),
|
|
8269
|
-
/* @__PURE__ */
|
|
8270
|
-
/* @__PURE__ */
|
|
8889
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8890
|
+
/* @__PURE__ */ jsx33(
|
|
8271
8891
|
Laptop2,
|
|
8272
8892
|
{
|
|
8273
8893
|
className: `w-3 h-3 ${indicators.local ? "text-green-500" : "text-orange-400"}`
|
|
8274
8894
|
}
|
|
8275
8895
|
),
|
|
8276
|
-
/* @__PURE__ */
|
|
8896
|
+
/* @__PURE__ */ jsxs24("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8277
8897
|
"Local Keyshare: ",
|
|
8278
8898
|
indicators.local ? "Available" : "Missing"
|
|
8279
8899
|
] })
|
|
8280
8900
|
] }),
|
|
8281
|
-
/* @__PURE__ */
|
|
8282
|
-
/* @__PURE__ */
|
|
8283
|
-
|
|
8901
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8902
|
+
/* @__PURE__ */ jsx33(
|
|
8903
|
+
Shield5,
|
|
8284
8904
|
{
|
|
8285
8905
|
className: `w-3 h-3 ${indicators.backup ? "text-green-500" : "text-orange-400"}`
|
|
8286
8906
|
}
|
|
8287
8907
|
),
|
|
8288
|
-
/* @__PURE__ */
|
|
8908
|
+
/* @__PURE__ */ jsxs24("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8289
8909
|
"Vault Backup: ",
|
|
8290
8910
|
indicators.backup ? "Available" : "Not Found"
|
|
8291
8911
|
] })
|
|
@@ -8294,59 +8914,59 @@ var ConnectWalletButton = ({
|
|
|
8294
8914
|
] })
|
|
8295
8915
|
}
|
|
8296
8916
|
) }),
|
|
8297
|
-
isWalletMenuOpen && address && /* @__PURE__ */
|
|
8298
|
-
/* @__PURE__ */
|
|
8299
|
-
/* @__PURE__ */
|
|
8300
|
-
/* @__PURE__ */
|
|
8301
|
-
/* @__PURE__ */
|
|
8917
|
+
isWalletMenuOpen && address && /* @__PURE__ */ jsx33("div", { className: "fixed inset-0 z-[60]", children: /* @__PURE__ */ jsx33(Dialog, { open: isWalletMenuOpen, onOpenChange: setIsWalletMenuOpen, children: /* @__PURE__ */ jsxs24(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
8918
|
+
/* @__PURE__ */ jsx33(VisuallyHidden, { children: /* @__PURE__ */ jsx33(DialogTitle, { children: "Wallet Menu" }) }),
|
|
8919
|
+
/* @__PURE__ */ jsx33(DialogDescription, { className: "sr-only", children: "Smart Account wallet actions and status" }),
|
|
8920
|
+
/* @__PURE__ */ jsx33("div", { className: `p-4 border-b ${theme.divider}`, children: /* @__PURE__ */ jsx33("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-4", children: [
|
|
8921
|
+
/* @__PURE__ */ jsx33("div", { className: "w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center relative overflow-hidden", children: avatar ? (
|
|
8302
8922
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8303
|
-
/* @__PURE__ */
|
|
8304
|
-
) : /* @__PURE__ */
|
|
8305
|
-
/* @__PURE__ */
|
|
8306
|
-
/* @__PURE__ */
|
|
8307
|
-
/* @__PURE__ */
|
|
8308
|
-
/* @__PURE__ */
|
|
8309
|
-
/* @__PURE__ */
|
|
8923
|
+
/* @__PURE__ */ jsx33("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8924
|
+
) : /* @__PURE__ */ jsx33("span", { className: "text-white font-bold text-lg", children: "L" }) }),
|
|
8925
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex-1 min-w-0", children: [
|
|
8926
|
+
/* @__PURE__ */ jsx33("div", { className: `font-medium text-lg ${theme.titleText}`, children: displayName || "Smart Account" }),
|
|
8927
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-2", children: [
|
|
8928
|
+
/* @__PURE__ */ jsx33("div", { className: `text-sm ${theme.mutedText}`, children: formatAddress(address) }),
|
|
8929
|
+
/* @__PURE__ */ jsx33("button", { onClick: async () => {
|
|
8310
8930
|
try {
|
|
8311
8931
|
await navigator.clipboard.writeText(address);
|
|
8312
8932
|
setCopied(true);
|
|
8313
8933
|
setTimeout(() => setCopied(false), 1500);
|
|
8314
8934
|
} catch {
|
|
8315
8935
|
}
|
|
8316
|
-
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */
|
|
8936
|
+
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ jsx33("span", { className: "text-green-500 text-sm", children: "\u2713" }) : /* @__PURE__ */ jsx33(Copy5, { className: "w-4 h-4" }) })
|
|
8317
8937
|
] })
|
|
8318
8938
|
] })
|
|
8319
8939
|
] }) }) }),
|
|
8320
|
-
/* @__PURE__ */
|
|
8321
|
-
/* @__PURE__ */
|
|
8322
|
-
/* @__PURE__ */
|
|
8940
|
+
/* @__PURE__ */ jsxs24("div", { className: "p-4", children: [
|
|
8941
|
+
/* @__PURE__ */ jsxs24("div", { className: "grid grid-cols-3 gap-2 mb-4", children: [
|
|
8942
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8323
8943
|
setIsWalletMenuOpen(false);
|
|
8324
8944
|
setIsSendOpen(true);
|
|
8325
8945
|
}, 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: [
|
|
8326
|
-
/* @__PURE__ */
|
|
8327
|
-
/* @__PURE__ */
|
|
8946
|
+
/* @__PURE__ */ jsx33(ArrowUp, { className: "w-5 h-5" }),
|
|
8947
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Send" })
|
|
8328
8948
|
] }),
|
|
8329
|
-
/* @__PURE__ */
|
|
8949
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8330
8950
|
setIsWalletMenuOpen(false);
|
|
8331
8951
|
setIsReceiveOpen(true);
|
|
8332
8952
|
}, 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: [
|
|
8333
|
-
/* @__PURE__ */
|
|
8334
|
-
/* @__PURE__ */
|
|
8953
|
+
/* @__PURE__ */ jsx33(ArrowDown, { className: "w-5 h-5" }),
|
|
8954
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Receive" })
|
|
8335
8955
|
] }),
|
|
8336
|
-
/* @__PURE__ */
|
|
8956
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8337
8957
|
setIsWalletMenuOpen(false);
|
|
8338
8958
|
setIsBuyOpen(true);
|
|
8339
8959
|
}, 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: [
|
|
8340
|
-
/* @__PURE__ */
|
|
8341
|
-
/* @__PURE__ */
|
|
8960
|
+
/* @__PURE__ */ jsx33(Plus2, { className: "w-5 h-5" }),
|
|
8961
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Buy" })
|
|
8342
8962
|
] })
|
|
8343
8963
|
] }),
|
|
8344
|
-
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */
|
|
8345
|
-
/* @__PURE__ */
|
|
8346
|
-
/* @__PURE__ */
|
|
8347
|
-
/* @__PURE__ */
|
|
8348
|
-
/* @__PURE__ */
|
|
8349
|
-
/* @__PURE__ */
|
|
8964
|
+
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ jsx33("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-orange-900/20 border border-orange-900/40" : "bg-orange-50 border border-orange-200"}`, children: /* @__PURE__ */ jsxs24("div", { className: "flex items-start space-x-3", children: [
|
|
8965
|
+
/* @__PURE__ */ jsx33(AlertTriangle4, { className: `w-5 h-5 ${isDark ? "text-orange-400" : "text-orange-500"} mt-0.5 flex-shrink-0` }),
|
|
8966
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex-1 min-w-0", children: [
|
|
8967
|
+
/* @__PURE__ */ jsx33("div", { className: `text-sm font-medium ${isDark ? "text-orange-300" : "text-orange-700"}`, children: "Backup Not Created" }),
|
|
8968
|
+
/* @__PURE__ */ jsx33("div", { className: `text-xs mt-1 ${isDark ? "text-orange-400/80" : "text-orange-600"}`, children: "Secure your wallet with an encrypted vault backup to protect against device loss." }),
|
|
8969
|
+
/* @__PURE__ */ jsxs24(
|
|
8350
8970
|
"button",
|
|
8351
8971
|
{
|
|
8352
8972
|
onClick: () => {
|
|
@@ -8355,19 +8975,19 @@ var ConnectWalletButton = ({
|
|
|
8355
8975
|
},
|
|
8356
8976
|
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"}`,
|
|
8357
8977
|
children: [
|
|
8358
|
-
/* @__PURE__ */
|
|
8978
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: "w-3 h-3 inline mr-1" }),
|
|
8359
8979
|
"Create Backup"
|
|
8360
8980
|
]
|
|
8361
8981
|
}
|
|
8362
8982
|
)
|
|
8363
8983
|
] })
|
|
8364
8984
|
] }) }),
|
|
8365
|
-
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */
|
|
8366
|
-
/* @__PURE__ */
|
|
8367
|
-
/* @__PURE__ */
|
|
8368
|
-
/* @__PURE__ */
|
|
8369
|
-
/* @__PURE__ */
|
|
8370
|
-
/* @__PURE__ */
|
|
8985
|
+
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ jsx33("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-blue-900/20 border border-blue-900/40" : "bg-blue-50 border border-blue-200"}`, children: /* @__PURE__ */ jsxs24("div", { className: "flex items-start space-x-3", children: [
|
|
8986
|
+
/* @__PURE__ */ jsx33(AlertTriangle4, { className: `w-5 h-5 ${isDark ? "text-blue-400" : "text-blue-500"} mt-0.5 flex-shrink-0` }),
|
|
8987
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex-1 min-w-0", children: [
|
|
8988
|
+
/* @__PURE__ */ jsx33("div", { className: `text-sm font-medium ${isDark ? "text-blue-300" : "text-blue-700"}`, children: "Email Not Connected" }),
|
|
8989
|
+
/* @__PURE__ */ jsx33("div", { className: `text-xs mt-1 ${isDark ? "text-blue-400/80" : "text-blue-600"}`, children: "Connect your email for easier account recovery and additional security." }),
|
|
8990
|
+
/* @__PURE__ */ jsxs24(
|
|
8371
8991
|
"button",
|
|
8372
8992
|
{
|
|
8373
8993
|
onClick: () => {
|
|
@@ -8376,80 +8996,87 @@ var ConnectWalletButton = ({
|
|
|
8376
8996
|
},
|
|
8377
8997
|
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"}`,
|
|
8378
8998
|
children: [
|
|
8379
|
-
/* @__PURE__ */
|
|
8999
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: "w-3 h-3 inline mr-1" }),
|
|
8380
9000
|
"Connect Email"
|
|
8381
9001
|
]
|
|
8382
9002
|
}
|
|
8383
9003
|
)
|
|
8384
9004
|
] })
|
|
8385
9005
|
] }) }),
|
|
8386
|
-
/* @__PURE__ */
|
|
9006
|
+
/* @__PURE__ */ jsx33(
|
|
8387
9007
|
"button",
|
|
8388
9008
|
{
|
|
8389
9009
|
onClick: () => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank"),
|
|
8390
9010
|
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`,
|
|
8391
|
-
children: /* @__PURE__ */
|
|
8392
|
-
/* @__PURE__ */
|
|
8393
|
-
/* @__PURE__ */
|
|
8394
|
-
/* @__PURE__ */
|
|
8395
|
-
/* @__PURE__ */
|
|
8396
|
-
/* @__PURE__ */
|
|
9011
|
+
children: /* @__PURE__ */ jsxs24("div", { className: "flex items-center justify-between", children: [
|
|
9012
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex items-center space-x-3", children: [
|
|
9013
|
+
/* @__PURE__ */ jsx33("div", { className: "w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden", children: lumiaBeam.logoDataUri ? /* @__PURE__ */ jsx33("img", { src: lumiaBeam.logoDataUri, alt: "Chain logo", className: "w-full h-full object-cover" }) : lumiaBeam.logo === "lumia" ? /* @__PURE__ */ jsx33(LumiaLogo, { size: 32 }) : /* @__PURE__ */ jsx33("span", { className: "text-white text-xs font-bold", children: (lumiaBeam.name || "L").charAt(0) }) }),
|
|
9014
|
+
/* @__PURE__ */ jsxs24("div", { children: [
|
|
9015
|
+
/* @__PURE__ */ jsx33("div", { className: `${theme.titleText} font-medium`, children: lumiaBeam.name }),
|
|
9016
|
+
/* @__PURE__ */ jsxs24("div", { className: theme.mutedText + " text-sm", children: [
|
|
8397
9017
|
formatBalance(),
|
|
8398
9018
|
" LUMIA"
|
|
8399
9019
|
] })
|
|
8400
9020
|
] })
|
|
8401
9021
|
] }),
|
|
8402
|
-
/* @__PURE__ */
|
|
9022
|
+
/* @__PURE__ */ jsx33("div", { className: theme.iconColor, children: /* @__PURE__ */ jsx33(ArrowUpRight2, { className: "w-4 h-4" }) })
|
|
8403
9023
|
] })
|
|
8404
9024
|
}
|
|
8405
9025
|
),
|
|
8406
|
-
/* @__PURE__ */
|
|
8407
|
-
config.features?.kycNeeded && /* @__PURE__ */
|
|
9026
|
+
/* @__PURE__ */ jsxs24("div", { className: "space-y-1", children: [
|
|
9027
|
+
config.features?.kycNeeded && /* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8408
9028
|
setIsWalletMenuOpen(false);
|
|
8409
9029
|
setIsKycOpen(true);
|
|
8410
9030
|
}, 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: [
|
|
8411
|
-
/* @__PURE__ */
|
|
8412
|
-
/* @__PURE__ */
|
|
9031
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9032
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "KYC" })
|
|
8413
9033
|
] }),
|
|
8414
|
-
/* @__PURE__ */
|
|
9034
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8415
9035
|
setIsWalletMenuOpen(false);
|
|
8416
9036
|
setIsTransactionsOpen(true);
|
|
8417
9037
|
}, 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: [
|
|
8418
|
-
/* @__PURE__ */
|
|
8419
|
-
/* @__PURE__ */
|
|
9038
|
+
/* @__PURE__ */ jsx33(Activity2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9039
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Transactions" })
|
|
8420
9040
|
] }),
|
|
8421
|
-
/* @__PURE__ */
|
|
9041
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8422
9042
|
setIsWalletMenuOpen(false);
|
|
8423
9043
|
setIsViewAssetsOpen(true);
|
|
8424
9044
|
}, 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: [
|
|
8425
|
-
/* @__PURE__ */
|
|
8426
|
-
/* @__PURE__ */
|
|
9045
|
+
/* @__PURE__ */ jsx33(Gem2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9046
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "View Assets" })
|
|
8427
9047
|
] }),
|
|
8428
|
-
/* @__PURE__ */
|
|
9048
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8429
9049
|
setIsWalletMenuOpen(false);
|
|
8430
9050
|
setIsManageWalletOpen(true);
|
|
8431
9051
|
}, 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: [
|
|
8432
|
-
/* @__PURE__ */
|
|
8433
|
-
/* @__PURE__ */
|
|
9052
|
+
/* @__PURE__ */ jsx33(CreditCard2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9053
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Manage Wallet" })
|
|
8434
9054
|
] }),
|
|
8435
|
-
/* @__PURE__ */
|
|
9055
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8436
9056
|
setIsWalletMenuOpen(false);
|
|
8437
9057
|
setIsSecurityOpen(true);
|
|
8438
9058
|
}, 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: [
|
|
8439
|
-
/* @__PURE__ */
|
|
8440
|
-
/* @__PURE__ */
|
|
9059
|
+
/* @__PURE__ */ jsx33(Lock3, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9060
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Security" })
|
|
9061
|
+
] }),
|
|
9062
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
9063
|
+
setIsWalletMenuOpen(false);
|
|
9064
|
+
setIsBackupOpen(true);
|
|
9065
|
+
}, 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: [
|
|
9066
|
+
/* @__PURE__ */ jsx33(Shield5, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9067
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Keyshare Backup" })
|
|
8441
9068
|
] }),
|
|
8442
|
-
/* @__PURE__ */
|
|
9069
|
+
/* @__PURE__ */ jsxs24("button", { onClick: async () => {
|
|
8443
9070
|
await handleDisconnect();
|
|
8444
9071
|
setIsWalletMenuOpen(false);
|
|
8445
9072
|
}, 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: [
|
|
8446
|
-
/* @__PURE__ */
|
|
8447
|
-
/* @__PURE__ */
|
|
9073
|
+
/* @__PURE__ */ jsx33(ArrowUpRight2, { className: "w-5 h-5 text-red-600" }),
|
|
9074
|
+
/* @__PURE__ */ jsx33("span", { className: "text-red-600", children: "Disconnect Wallet" })
|
|
8448
9075
|
] })
|
|
8449
9076
|
] })
|
|
8450
9077
|
] })
|
|
8451
9078
|
] }) }) }),
|
|
8452
|
-
/* @__PURE__ */
|
|
9079
|
+
/* @__PURE__ */ jsx33(
|
|
8453
9080
|
ManageWallet,
|
|
8454
9081
|
{
|
|
8455
9082
|
open: isManageWalletOpen,
|
|
@@ -8460,7 +9087,7 @@ var ConnectWalletButton = ({
|
|
|
8460
9087
|
}
|
|
8461
9088
|
}
|
|
8462
9089
|
),
|
|
8463
|
-
/* @__PURE__ */
|
|
9090
|
+
/* @__PURE__ */ jsx33(
|
|
8464
9091
|
SecurityModal,
|
|
8465
9092
|
{
|
|
8466
9093
|
open: isSecurityOpen,
|
|
@@ -8471,7 +9098,23 @@ var ConnectWalletButton = ({
|
|
|
8471
9098
|
}
|
|
8472
9099
|
}
|
|
8473
9100
|
),
|
|
8474
|
-
/* @__PURE__ */
|
|
9101
|
+
isBackupOpen && session?.mpcUserId && /* @__PURE__ */ jsx33(Dialog, { open: isBackupOpen, onOpenChange: setIsBackupOpen, children: /* @__PURE__ */ jsxs24(DialogContent, { className: "max-w-2xl", children: [
|
|
9102
|
+
/* @__PURE__ */ jsxs24(VisuallyHidden, { children: [
|
|
9103
|
+
/* @__PURE__ */ jsx33(DialogTitle, { children: "Keyshare Backup" }),
|
|
9104
|
+
/* @__PURE__ */ jsx33(DialogDescription, { children: "Create and manage encrypted backups of your keyshare" })
|
|
9105
|
+
] }),
|
|
9106
|
+
/* @__PURE__ */ jsx33(
|
|
9107
|
+
KeyshareBackup,
|
|
9108
|
+
{
|
|
9109
|
+
userId: session.mpcUserId,
|
|
9110
|
+
onClose: () => setIsBackupOpen(false),
|
|
9111
|
+
onBackupSuccess: () => {
|
|
9112
|
+
console.log("[ConnectWalletButton] Backup created successfully");
|
|
9113
|
+
}
|
|
9114
|
+
}
|
|
9115
|
+
)
|
|
9116
|
+
] }) }),
|
|
9117
|
+
/* @__PURE__ */ jsx33(
|
|
8475
9118
|
TransactionsModal,
|
|
8476
9119
|
{
|
|
8477
9120
|
open: isTransactionsOpen,
|
|
@@ -8482,7 +9125,7 @@ var ConnectWalletButton = ({
|
|
|
8482
9125
|
}
|
|
8483
9126
|
}
|
|
8484
9127
|
),
|
|
8485
|
-
/* @__PURE__ */
|
|
9128
|
+
/* @__PURE__ */ jsx33(
|
|
8486
9129
|
ViewAssetsModal,
|
|
8487
9130
|
{
|
|
8488
9131
|
open: isViewAssetsOpen,
|
|
@@ -8493,7 +9136,7 @@ var ConnectWalletButton = ({
|
|
|
8493
9136
|
}
|
|
8494
9137
|
}
|
|
8495
9138
|
),
|
|
8496
|
-
/* @__PURE__ */
|
|
9139
|
+
/* @__PURE__ */ jsx33(
|
|
8497
9140
|
SendModal,
|
|
8498
9141
|
{
|
|
8499
9142
|
open: isSendOpen,
|
|
@@ -8504,7 +9147,7 @@ var ConnectWalletButton = ({
|
|
|
8504
9147
|
}
|
|
8505
9148
|
}
|
|
8506
9149
|
),
|
|
8507
|
-
/* @__PURE__ */
|
|
9150
|
+
/* @__PURE__ */ jsx33(
|
|
8508
9151
|
ReceiveModal,
|
|
8509
9152
|
{
|
|
8510
9153
|
open: isReceiveOpen,
|
|
@@ -8515,7 +9158,7 @@ var ConnectWalletButton = ({
|
|
|
8515
9158
|
}
|
|
8516
9159
|
}
|
|
8517
9160
|
),
|
|
8518
|
-
/* @__PURE__ */
|
|
9161
|
+
/* @__PURE__ */ jsx33(
|
|
8519
9162
|
BuyModal,
|
|
8520
9163
|
{
|
|
8521
9164
|
open: isBuyOpen,
|
|
@@ -8526,7 +9169,7 @@ var ConnectWalletButton = ({
|
|
|
8526
9169
|
}
|
|
8527
9170
|
}
|
|
8528
9171
|
),
|
|
8529
|
-
/* @__PURE__ */
|
|
9172
|
+
/* @__PURE__ */ jsx33(
|
|
8530
9173
|
KycModal,
|
|
8531
9174
|
{
|
|
8532
9175
|
open: isKycOpen,
|
|
@@ -8537,7 +9180,7 @@ var ConnectWalletButton = ({
|
|
|
8537
9180
|
}
|
|
8538
9181
|
}
|
|
8539
9182
|
),
|
|
8540
|
-
/* @__PURE__ */
|
|
9183
|
+
/* @__PURE__ */ jsx33(
|
|
8541
9184
|
AuthModal,
|
|
8542
9185
|
{
|
|
8543
9186
|
open: isAuthModalOpen,
|
|
@@ -8582,7 +9225,7 @@ var ConnectWalletButton = ({
|
|
|
8582
9225
|
}
|
|
8583
9226
|
}
|
|
8584
9227
|
),
|
|
8585
|
-
/* @__PURE__ */
|
|
9228
|
+
/* @__PURE__ */ jsx33(
|
|
8586
9229
|
TssManagerWithRef,
|
|
8587
9230
|
{
|
|
8588
9231
|
ref: tssManagerRef,
|
|
@@ -8600,7 +9243,7 @@ var ConnectWalletButton = ({
|
|
|
8600
9243
|
};
|
|
8601
9244
|
|
|
8602
9245
|
// src/components/ThemeToggle.tsx
|
|
8603
|
-
import { jsx as
|
|
9246
|
+
import { jsx as jsx34, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
8604
9247
|
var ThemeToggle = () => {
|
|
8605
9248
|
const { config, updateConfig } = useLumiaPassportConfig();
|
|
8606
9249
|
const currentTheme = config.ui.theme;
|
|
@@ -8645,7 +9288,7 @@ var ThemeToggle = () => {
|
|
|
8645
9288
|
return "auto";
|
|
8646
9289
|
}
|
|
8647
9290
|
};
|
|
8648
|
-
return /* @__PURE__ */
|
|
9291
|
+
return /* @__PURE__ */ jsx34("div", { className: "lumia-scope", children: /* @__PURE__ */ jsxs25(
|
|
8649
9292
|
"button",
|
|
8650
9293
|
{
|
|
8651
9294
|
onClick: cycleTheme,
|
|
@@ -8661,29 +9304,29 @@ var ThemeToggle = () => {
|
|
|
8661
9304
|
};
|
|
8662
9305
|
|
|
8663
9306
|
// src/components/LumiaLogo.tsx
|
|
8664
|
-
import { jsx as
|
|
9307
|
+
import { jsx as jsx35, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
8665
9308
|
var LumiaLogo2 = ({ size = 80, className = "" }) => {
|
|
8666
|
-
return /* @__PURE__ */
|
|
9309
|
+
return /* @__PURE__ */ jsx35(
|
|
8667
9310
|
"div",
|
|
8668
9311
|
{
|
|
8669
9312
|
className: `flex items-center justify-center ${className}`,
|
|
8670
9313
|
style: { width: size, height: size },
|
|
8671
|
-
children: /* @__PURE__ */
|
|
8672
|
-
/* @__PURE__ */
|
|
8673
|
-
/* @__PURE__ */
|
|
8674
|
-
/* @__PURE__ */
|
|
8675
|
-
/* @__PURE__ */
|
|
8676
|
-
/* @__PURE__ */
|
|
9314
|
+
children: /* @__PURE__ */ jsxs26("svg", { viewBox: "0 0 512 512", width: size, height: size, children: [
|
|
9315
|
+
/* @__PURE__ */ jsx35("circle", { cx: "256", cy: "256", r: "256", fill: "#060117", strokeWidth: "0" }),
|
|
9316
|
+
/* @__PURE__ */ jsx35("path", { d: "M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9317
|
+
/* @__PURE__ */ jsx35("path", { d: "M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9318
|
+
/* @__PURE__ */ jsx35("path", { d: "M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9319
|
+
/* @__PURE__ */ jsx35("path", { d: "M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z", fill: "#fefdff", strokeWidth: "0" })
|
|
8677
9320
|
] })
|
|
8678
9321
|
}
|
|
8679
9322
|
);
|
|
8680
9323
|
};
|
|
8681
9324
|
|
|
8682
9325
|
// src/hooks/useTheme.ts
|
|
8683
|
-
import { useMemo as
|
|
9326
|
+
import { useMemo as useMemo6, useState as useState16, useEffect as useEffect13 } from "react";
|
|
8684
9327
|
function useTheme2(configTheme) {
|
|
8685
|
-
const [systemTheme, setSystemTheme] =
|
|
8686
|
-
|
|
9328
|
+
const [systemTheme, setSystemTheme] = useState16("light");
|
|
9329
|
+
useEffect13(() => {
|
|
8687
9330
|
if (typeof window === "undefined" || !window.matchMedia) return;
|
|
8688
9331
|
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
8689
9332
|
const updateSystemTheme = () => {
|
|
@@ -8693,14 +9336,14 @@ function useTheme2(configTheme) {
|
|
|
8693
9336
|
mediaQuery.addEventListener("change", updateSystemTheme);
|
|
8694
9337
|
return () => mediaQuery.removeEventListener("change", updateSystemTheme);
|
|
8695
9338
|
}, []);
|
|
8696
|
-
const resolvedTheme =
|
|
9339
|
+
const resolvedTheme = useMemo6(() => {
|
|
8697
9340
|
if (configTheme === "auto") {
|
|
8698
9341
|
return systemTheme;
|
|
8699
9342
|
}
|
|
8700
9343
|
return configTheme;
|
|
8701
9344
|
}, [configTheme, systemTheme]);
|
|
8702
9345
|
const isDark = resolvedTheme === "dark";
|
|
8703
|
-
const themeClasses =
|
|
9346
|
+
const themeClasses = useMemo6(
|
|
8704
9347
|
() => ({
|
|
8705
9348
|
// Modal background
|
|
8706
9349
|
modalBg: isDark ? "bg-gray-900" : "bg-white",
|
|
@@ -8736,9 +9379,9 @@ function useTheme2(configTheme) {
|
|
|
8736
9379
|
}
|
|
8737
9380
|
|
|
8738
9381
|
// src/internal/components/Hash.tsx
|
|
8739
|
-
import * as
|
|
9382
|
+
import * as React29 from "react";
|
|
8740
9383
|
import { Copy as Copy6, ExternalLink as ExternalLink5 } from "lucide-react";
|
|
8741
|
-
import { jsx as
|
|
9384
|
+
import { jsx as jsx36, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
8742
9385
|
function toExplorerUrl(kind, value, chain) {
|
|
8743
9386
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
8744
9387
|
if (!base2) return null;
|
|
@@ -8761,12 +9404,12 @@ var Hash = ({
|
|
|
8761
9404
|
}) => {
|
|
8762
9405
|
const value = hash || "";
|
|
8763
9406
|
const explorer = toExplorerUrl(kind, value, chain || void 0);
|
|
8764
|
-
const [copied, setCopied] =
|
|
8765
|
-
if (!value) return /* @__PURE__ */
|
|
8766
|
-
return /* @__PURE__ */
|
|
8767
|
-
label && /* @__PURE__ */
|
|
8768
|
-
/* @__PURE__ */
|
|
8769
|
-
showCopy && /* @__PURE__ */
|
|
9407
|
+
const [copied, setCopied] = React29.useState(false);
|
|
9408
|
+
if (!value) return /* @__PURE__ */ jsx36("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
9409
|
+
return /* @__PURE__ */ jsxs27("div", { className: cn2("flex items-center gap-2", className), children: [
|
|
9410
|
+
label && /* @__PURE__ */ jsx36("span", { className: "text-sm font-medium", children: label }),
|
|
9411
|
+
/* @__PURE__ */ jsx36("code", { className: "text-xs bg-background px-2 py-1 rounded break-all", children: truncate ? short2(value) : value }),
|
|
9412
|
+
showCopy && /* @__PURE__ */ jsx36(
|
|
8770
9413
|
Button,
|
|
8771
9414
|
{
|
|
8772
9415
|
variant: "ghost",
|
|
@@ -8780,10 +9423,10 @@ var Hash = ({
|
|
|
8780
9423
|
} catch {
|
|
8781
9424
|
}
|
|
8782
9425
|
},
|
|
8783
|
-
children: /* @__PURE__ */
|
|
9426
|
+
children: /* @__PURE__ */ jsx36(Copy6, { className: "h-4 w-4" })
|
|
8784
9427
|
}
|
|
8785
9428
|
),
|
|
8786
|
-
showExplorer && explorer && /* @__PURE__ */
|
|
9429
|
+
showExplorer && explorer && /* @__PURE__ */ jsx36(
|
|
8787
9430
|
"a",
|
|
8788
9431
|
{
|
|
8789
9432
|
href: explorer,
|
|
@@ -8791,7 +9434,7 @@ var Hash = ({
|
|
|
8791
9434
|
rel: "noreferrer noopener",
|
|
8792
9435
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
8793
9436
|
title: "Open in explorer",
|
|
8794
|
-
children: /* @__PURE__ */
|
|
9437
|
+
children: /* @__PURE__ */ jsx36(ExternalLink5, { className: "h-4 w-4" })
|
|
8795
9438
|
}
|
|
8796
9439
|
)
|
|
8797
9440
|
] });
|
|
@@ -8799,16 +9442,16 @@ var Hash = ({
|
|
|
8799
9442
|
|
|
8800
9443
|
// src/internal/components/TransactionsList.tsx
|
|
8801
9444
|
init_base();
|
|
8802
|
-
import { useState as
|
|
8803
|
-
import { jsx as
|
|
9445
|
+
import { useState as useState18, useEffect as useEffect14 } from "react";
|
|
9446
|
+
import { jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
8804
9447
|
var TransactionsList = ({
|
|
8805
9448
|
address,
|
|
8806
9449
|
itemsCount = 10
|
|
8807
9450
|
}) => {
|
|
8808
|
-
const [transactions, setTransactions] =
|
|
8809
|
-
const [loading, setLoading] =
|
|
8810
|
-
const [error, setError] =
|
|
8811
|
-
|
|
9451
|
+
const [transactions, setTransactions] = useState18([]);
|
|
9452
|
+
const [loading, setLoading] = useState18(true);
|
|
9453
|
+
const [error, setError] = useState18(null);
|
|
9454
|
+
useEffect14(() => {
|
|
8812
9455
|
const fetchTransactions = async () => {
|
|
8813
9456
|
try {
|
|
8814
9457
|
setLoading(true);
|
|
@@ -8854,15 +9497,15 @@ var TransactionsList = ({
|
|
|
8854
9497
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
8855
9498
|
};
|
|
8856
9499
|
if (loading) {
|
|
8857
|
-
return /* @__PURE__ */
|
|
8858
|
-
/* @__PURE__ */
|
|
8859
|
-
/* @__PURE__ */
|
|
9500
|
+
return /* @__PURE__ */ jsxs28("div", { className: "p-4 text-center", children: [
|
|
9501
|
+
/* @__PURE__ */ jsx37("div", { className: "animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full" }),
|
|
9502
|
+
/* @__PURE__ */ jsx37("p", { className: "mt-2 text-sm text-gray-600", children: "Loading transactions..." })
|
|
8860
9503
|
] });
|
|
8861
9504
|
}
|
|
8862
9505
|
if (error) {
|
|
8863
|
-
return /* @__PURE__ */
|
|
8864
|
-
/* @__PURE__ */
|
|
8865
|
-
/* @__PURE__ */
|
|
9506
|
+
return /* @__PURE__ */ jsxs28("div", { className: "p-4 text-center", children: [
|
|
9507
|
+
/* @__PURE__ */ jsx37("p", { className: "text-red-600 text-sm", children: error }),
|
|
9508
|
+
/* @__PURE__ */ jsx37(
|
|
8866
9509
|
"button",
|
|
8867
9510
|
{
|
|
8868
9511
|
onClick: () => window.location.reload(),
|
|
@@ -8873,54 +9516,54 @@ var TransactionsList = ({
|
|
|
8873
9516
|
] });
|
|
8874
9517
|
}
|
|
8875
9518
|
if (transactions.length === 0) {
|
|
8876
|
-
return /* @__PURE__ */
|
|
9519
|
+
return /* @__PURE__ */ jsx37("div", { className: "p-4 text-center", children: /* @__PURE__ */ jsx37("p", { className: "text-gray-600 text-sm", children: "No transactions found" }) });
|
|
8877
9520
|
}
|
|
8878
|
-
return /* @__PURE__ */
|
|
9521
|
+
return /* @__PURE__ */ jsx37("div", { className: "max-h-96 overflow-y-auto", children: /* @__PURE__ */ jsx37("div", { className: "space-y-2 p-2", children: transactions.map((tx) => /* @__PURE__ */ jsxs28(
|
|
8879
9522
|
"div",
|
|
8880
9523
|
{
|
|
8881
9524
|
className: "border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors",
|
|
8882
9525
|
onClick: () => openTransaction(tx.hash),
|
|
8883
9526
|
children: [
|
|
8884
|
-
/* @__PURE__ */
|
|
8885
|
-
/* @__PURE__ */
|
|
8886
|
-
/* @__PURE__ */
|
|
8887
|
-
/* @__PURE__ */
|
|
8888
|
-
/* @__PURE__ */
|
|
9527
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex justify-between items-start mb-2", children: [
|
|
9528
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex-1", children: [
|
|
9529
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center space-x-2 mb-1", children: [
|
|
9530
|
+
/* @__PURE__ */ jsx37("span", { className: "text-xs font-mono bg-gray-100 px-2 py-1 rounded", children: formatAddress(tx.hash) }),
|
|
9531
|
+
/* @__PURE__ */ jsx37("span", { className: `text-xs px-2 py-1 rounded ${tx.status === "ok" ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800"}`, children: tx.status === "ok" ? "Success" : "Failed" })
|
|
8889
9532
|
] }),
|
|
8890
|
-
/* @__PURE__ */
|
|
8891
|
-
/* @__PURE__ */
|
|
8892
|
-
/* @__PURE__ */
|
|
8893
|
-
/* @__PURE__ */
|
|
9533
|
+
/* @__PURE__ */ jsxs28("div", { className: "text-sm space-y-1", children: [
|
|
9534
|
+
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9535
|
+
/* @__PURE__ */ jsx37("span", { className: "text-gray-600", children: "From:" }),
|
|
9536
|
+
/* @__PURE__ */ jsxs28("span", { className: "font-mono ml-1", children: [
|
|
8894
9537
|
formatAddress(tx.from.hash),
|
|
8895
|
-
tx.from.is_contract && /* @__PURE__ */
|
|
9538
|
+
tx.from.is_contract && /* @__PURE__ */ jsx37("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
8896
9539
|
] })
|
|
8897
9540
|
] }),
|
|
8898
|
-
/* @__PURE__ */
|
|
8899
|
-
/* @__PURE__ */
|
|
8900
|
-
/* @__PURE__ */
|
|
9541
|
+
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9542
|
+
/* @__PURE__ */ jsx37("span", { className: "text-gray-600", children: "To:" }),
|
|
9543
|
+
/* @__PURE__ */ jsxs28("span", { className: "font-mono ml-1", children: [
|
|
8901
9544
|
formatAddress(tx.to.hash),
|
|
8902
|
-
tx.to.is_contract && /* @__PURE__ */
|
|
9545
|
+
tx.to.is_contract && /* @__PURE__ */ jsx37("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
8903
9546
|
] })
|
|
8904
9547
|
] }),
|
|
8905
|
-
/* @__PURE__ */
|
|
8906
|
-
/* @__PURE__ */
|
|
8907
|
-
/* @__PURE__ */
|
|
9548
|
+
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9549
|
+
/* @__PURE__ */ jsx37("span", { className: "text-gray-600", children: "Value:" }),
|
|
9550
|
+
/* @__PURE__ */ jsxs28("span", { className: "font-semibold ml-1", children: [
|
|
8908
9551
|
formatValue(tx.value),
|
|
8909
9552
|
" LUMIA"
|
|
8910
9553
|
] })
|
|
8911
9554
|
] })
|
|
8912
9555
|
] })
|
|
8913
9556
|
] }),
|
|
8914
|
-
/* @__PURE__ */
|
|
8915
|
-
/* @__PURE__ */
|
|
8916
|
-
/* @__PURE__ */
|
|
9557
|
+
/* @__PURE__ */ jsxs28("div", { className: "text-right text-xs text-gray-500", children: [
|
|
9558
|
+
/* @__PURE__ */ jsx37("div", { children: formatDate2(tx.timestamp) }),
|
|
9559
|
+
/* @__PURE__ */ jsxs28("div", { className: "mt-1", children: [
|
|
8917
9560
|
"Gas: ",
|
|
8918
9561
|
parseInt(tx.gas_used).toLocaleString()
|
|
8919
9562
|
] }),
|
|
8920
|
-
tx.method && /* @__PURE__ */
|
|
9563
|
+
tx.method && /* @__PURE__ */ jsx37("div", { className: "mt-1 text-blue-600", children: tx.method })
|
|
8921
9564
|
] })
|
|
8922
9565
|
] }),
|
|
8923
|
-
tx.transaction_types.length > 0 && /* @__PURE__ */
|
|
9566
|
+
tx.transaction_types.length > 0 && /* @__PURE__ */ jsx37("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ jsx37(
|
|
8924
9567
|
"span",
|
|
8925
9568
|
{
|
|
8926
9569
|
className: "text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full",
|
|
@@ -8934,247 +9577,6 @@ var TransactionsList = ({
|
|
|
8934
9577
|
)) }) });
|
|
8935
9578
|
};
|
|
8936
9579
|
|
|
8937
|
-
// src/internal/components/KeyshareBackup.tsx
|
|
8938
|
-
import * as React30 from "react";
|
|
8939
|
-
import { Shield as Shield5, Server as Server4, CheckCircle2 as CheckCircle28, AlertCircle as AlertCircle5, Key as Key5, X as X3, Eye as Eye3, EyeOff as EyeOff3, Download as Download2, Cloud as Cloud4, Lock as Lock3 } from "lucide-react";
|
|
8940
|
-
init_vaultClient();
|
|
8941
|
-
import { Fragment as Fragment7, jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
8942
|
-
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
8943
|
-
const [backupStatus, setBackupStatus] = React30.useState(() => getBackupStatus(userId));
|
|
8944
|
-
const [loading, setLoading] = React30.useState({
|
|
8945
|
-
server: false,
|
|
8946
|
-
cloud: false,
|
|
8947
|
-
local: false
|
|
8948
|
-
});
|
|
8949
|
-
const [error, setError] = React30.useState(null);
|
|
8950
|
-
const [success, setSuccess] = React30.useState(null);
|
|
8951
|
-
const [showPassword, setShowPassword] = React30.useState(false);
|
|
8952
|
-
const [useCustomPassword, setUseCustomPassword] = React30.useState(false);
|
|
8953
|
-
const [customPassword, setCustomPassword] = React30.useState("");
|
|
8954
|
-
const [cloudProviders, setCloudProviders] = React30.useState([]);
|
|
8955
|
-
const [selectedCloudProvider, setSelectedCloudProvider] = React30.useState(null);
|
|
8956
|
-
const hasKeyshareData = React30.useMemo(() => {
|
|
8957
|
-
return !!getCurrentKeyshareBackupData(userId);
|
|
8958
|
-
}, [userId]);
|
|
8959
|
-
React30.useEffect(() => {
|
|
8960
|
-
getAvailableCloudProviders2().then((providers) => {
|
|
8961
|
-
setCloudProviders(providers);
|
|
8962
|
-
if (providers.length > 0 && !selectedCloudProvider) {
|
|
8963
|
-
setSelectedCloudProvider(providers[0].id);
|
|
8964
|
-
}
|
|
8965
|
-
});
|
|
8966
|
-
}, [selectedCloudProvider]);
|
|
8967
|
-
const refreshStatus = React30.useCallback(() => {
|
|
8968
|
-
setBackupStatus(getBackupStatus(userId));
|
|
8969
|
-
}, [userId]);
|
|
8970
|
-
React30.useEffect(() => {
|
|
8971
|
-
refreshStatus();
|
|
8972
|
-
}, [refreshStatus]);
|
|
8973
|
-
const handleBackup = async (method) => {
|
|
8974
|
-
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
8975
|
-
setError(null);
|
|
8976
|
-
setSuccess(null);
|
|
8977
|
-
try {
|
|
8978
|
-
const password = useCustomPassword ? customPassword : void 0;
|
|
8979
|
-
switch (method) {
|
|
8980
|
-
case "server":
|
|
8981
|
-
await backupToServer(userId, password);
|
|
8982
|
-
setSuccess("Successfully created server backup");
|
|
8983
|
-
break;
|
|
8984
|
-
case "cloud": {
|
|
8985
|
-
await backupToCloud(userId, password, selectedCloudProvider || void 0);
|
|
8986
|
-
setSuccess(`Successfully created cloud backup`);
|
|
8987
|
-
const updatedProviders = await getAvailableCloudProviders2();
|
|
8988
|
-
setCloudProviders(updatedProviders);
|
|
8989
|
-
break;
|
|
8990
|
-
}
|
|
8991
|
-
case "local":
|
|
8992
|
-
await backupToLocalFile(userId, password);
|
|
8993
|
-
setSuccess("Backup file downloaded successfully");
|
|
8994
|
-
break;
|
|
8995
|
-
}
|
|
8996
|
-
refreshStatus();
|
|
8997
|
-
setTimeout(() => {
|
|
8998
|
-
if (typeof window !== "undefined") {
|
|
8999
|
-
window.dispatchEvent(
|
|
9000
|
-
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
9001
|
-
detail: { method, success: true }
|
|
9002
|
-
})
|
|
9003
|
-
);
|
|
9004
|
-
}
|
|
9005
|
-
onBackupSuccess?.();
|
|
9006
|
-
}, 100);
|
|
9007
|
-
} catch (err) {
|
|
9008
|
-
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
9009
|
-
setError(errorMsg);
|
|
9010
|
-
updateBackupStatus(userId, method, { error: errorMsg });
|
|
9011
|
-
refreshStatus();
|
|
9012
|
-
} finally {
|
|
9013
|
-
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
9014
|
-
}
|
|
9015
|
-
};
|
|
9016
|
-
const formatLastBackup = (timestamp) => {
|
|
9017
|
-
if (!timestamp) return "Never";
|
|
9018
|
-
const date = new Date(timestamp);
|
|
9019
|
-
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
9020
|
-
};
|
|
9021
|
-
return /* @__PURE__ */ jsxs28(Card, { className: "border-green-200 bg-green-50", children: [
|
|
9022
|
-
/* @__PURE__ */ jsx37(CardHeader, { className: "pb-4", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between", children: [
|
|
9023
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3", children: [
|
|
9024
|
-
/* @__PURE__ */ jsx37(Shield5, { className: "h-6 w-6 text-green-600" }),
|
|
9025
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9026
|
-
/* @__PURE__ */ jsx37(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
9027
|
-
/* @__PURE__ */ jsx37(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
9028
|
-
] })
|
|
9029
|
-
] }),
|
|
9030
|
-
onClose && /* @__PURE__ */ jsx37("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ jsx37(X3, { className: "h-4 w-4" }) })
|
|
9031
|
-
] }) }),
|
|
9032
|
-
/* @__PURE__ */ jsxs28(CardContent, { className: "space-y-6", children: [
|
|
9033
|
-
error && /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
9034
|
-
/* @__PURE__ */ jsx37(AlertCircle5, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9035
|
-
/* @__PURE__ */ jsx37("span", { children: error })
|
|
9036
|
-
] }),
|
|
9037
|
-
success && /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
9038
|
-
/* @__PURE__ */ jsx37(CheckCircle28, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9039
|
-
/* @__PURE__ */ jsx37("span", { children: success })
|
|
9040
|
-
] }),
|
|
9041
|
-
/* @__PURE__ */ jsxs28("div", { className: "space-y-3", children: [
|
|
9042
|
-
/* @__PURE__ */ jsx37("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
9043
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
9044
|
-
/* @__PURE__ */ jsx37(
|
|
9045
|
-
"input",
|
|
9046
|
-
{
|
|
9047
|
-
type: "checkbox",
|
|
9048
|
-
id: "use-backup-password",
|
|
9049
|
-
checked: useCustomPassword,
|
|
9050
|
-
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
9051
|
-
className: "rounded"
|
|
9052
|
-
}
|
|
9053
|
-
),
|
|
9054
|
-
/* @__PURE__ */ jsx37("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
9055
|
-
] }),
|
|
9056
|
-
!useCustomPassword && /* @__PURE__ */ jsx37("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
9057
|
-
/* @__PURE__ */ jsx37(Key5, { className: "h-4 w-4" }),
|
|
9058
|
-
/* @__PURE__ */ jsx37("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
9059
|
-
] }) }),
|
|
9060
|
-
useCustomPassword && /* @__PURE__ */ jsxs28("div", { className: "relative", children: [
|
|
9061
|
-
/* @__PURE__ */ jsx37(
|
|
9062
|
-
Input,
|
|
9063
|
-
{
|
|
9064
|
-
type: showPassword ? "text" : "password",
|
|
9065
|
-
placeholder: "Enter backup encryption password",
|
|
9066
|
-
value: customPassword,
|
|
9067
|
-
onChange: (e) => setCustomPassword(e.target.value),
|
|
9068
|
-
className: "pr-10"
|
|
9069
|
-
}
|
|
9070
|
-
),
|
|
9071
|
-
/* @__PURE__ */ jsx37(
|
|
9072
|
-
"button",
|
|
9073
|
-
{
|
|
9074
|
-
type: "button",
|
|
9075
|
-
onClick: () => setShowPassword(!showPassword),
|
|
9076
|
-
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
9077
|
-
children: showPassword ? /* @__PURE__ */ jsx37(EyeOff3, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx37(Eye3, { className: "h-4 w-4" })
|
|
9078
|
-
}
|
|
9079
|
-
)
|
|
9080
|
-
] })
|
|
9081
|
-
] }),
|
|
9082
|
-
/* @__PURE__ */ jsxs28("div", { className: "space-y-4", children: [
|
|
9083
|
-
/* @__PURE__ */ jsx37("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
9084
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
9085
|
-
/* @__PURE__ */ jsx37("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3", children: [
|
|
9086
|
-
/* @__PURE__ */ jsx37(Server4, { className: "h-5 w-5 text-blue-600" }),
|
|
9087
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9088
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
9089
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
9090
|
-
] })
|
|
9091
|
-
] }) }),
|
|
9092
|
-
/* @__PURE__ */ jsx37(
|
|
9093
|
-
Button,
|
|
9094
|
-
{
|
|
9095
|
-
onClick: () => handleBackup("server"),
|
|
9096
|
-
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9097
|
-
className: "px-4 py-2",
|
|
9098
|
-
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9099
|
-
}
|
|
9100
|
-
),
|
|
9101
|
-
/* @__PURE__ */ jsxs28("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9102
|
-
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
9103
|
-
formatLastBackup(backupStatus.server.lastBackup)
|
|
9104
|
-
] })
|
|
9105
|
-
] }),
|
|
9106
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
9107
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9108
|
-
/* @__PURE__ */ jsx37(Cloud4, { className: "h-5 w-5 text-sky-600" }),
|
|
9109
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9110
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
9111
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
9112
|
-
] })
|
|
9113
|
-
] }),
|
|
9114
|
-
cloudProviders.length > 1 && /* @__PURE__ */ jsx37("div", { className: "mb-3", children: /* @__PURE__ */ jsx37(
|
|
9115
|
-
"select",
|
|
9116
|
-
{
|
|
9117
|
-
value: selectedCloudProvider || "",
|
|
9118
|
-
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
9119
|
-
className: "text-sm border rounded px-2 py-1 w-full",
|
|
9120
|
-
children: cloudProviders.map((provider) => /* @__PURE__ */ jsxs28("option", { value: provider.id, children: [
|
|
9121
|
-
provider.icon,
|
|
9122
|
-
" ",
|
|
9123
|
-
provider.name,
|
|
9124
|
-
" ",
|
|
9125
|
-
provider.isAuthenticated ? "\u2713" : ""
|
|
9126
|
-
] }, provider.id))
|
|
9127
|
-
}
|
|
9128
|
-
) }),
|
|
9129
|
-
/* @__PURE__ */ jsx37(
|
|
9130
|
-
Button,
|
|
9131
|
-
{
|
|
9132
|
-
onClick: () => handleBackup("cloud"),
|
|
9133
|
-
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
9134
|
-
className: "px-4 py-2",
|
|
9135
|
-
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9136
|
-
}
|
|
9137
|
-
),
|
|
9138
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
9139
|
-
] }),
|
|
9140
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
9141
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9142
|
-
/* @__PURE__ */ jsx37(Download2, { className: "h-5 w-5 text-purple-600" }),
|
|
9143
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9144
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
9145
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
9146
|
-
] })
|
|
9147
|
-
] }),
|
|
9148
|
-
/* @__PURE__ */ jsx37(
|
|
9149
|
-
Button,
|
|
9150
|
-
{
|
|
9151
|
-
onClick: () => handleBackup("local"),
|
|
9152
|
-
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9153
|
-
className: "w-full",
|
|
9154
|
-
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
9155
|
-
}
|
|
9156
|
-
),
|
|
9157
|
-
/* @__PURE__ */ jsxs28("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9158
|
-
"Download encrypted backup file to your device \u2022 Last: ",
|
|
9159
|
-
formatLastBackup(backupStatus.local.lastBackup)
|
|
9160
|
-
] })
|
|
9161
|
-
] })
|
|
9162
|
-
] }),
|
|
9163
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
9164
|
-
/* @__PURE__ */ jsx37(Lock3, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
9165
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9166
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium", children: "Security Notice" }),
|
|
9167
|
-
/* @__PURE__ */ jsxs28("div", { className: "mt-1", children: [
|
|
9168
|
-
useCustomPassword ? /* @__PURE__ */ jsx37(Fragment7, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ jsx37(Fragment7, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
9169
|
-
" ",
|
|
9170
|
-
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
9171
|
-
] })
|
|
9172
|
-
] })
|
|
9173
|
-
] })
|
|
9174
|
-
] })
|
|
9175
|
-
] });
|
|
9176
|
-
}
|
|
9177
|
-
|
|
9178
9580
|
// src/hooks/useUserOpStatus.ts
|
|
9179
9581
|
init_base();
|
|
9180
9582
|
import * as React31 from "react";
|
|
@@ -9501,6 +9903,7 @@ export {
|
|
|
9501
9903
|
UserOpStatus,
|
|
9502
9904
|
getUserProfile,
|
|
9503
9905
|
lumiaBeam,
|
|
9906
|
+
prepareUserOperation,
|
|
9504
9907
|
queryClient,
|
|
9505
9908
|
sendUserOperation,
|
|
9506
9909
|
updateUserProfile,
|