@lumiapassport/ui-kit 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -4
- package/dist/iframe/main.js +1251 -2
- package/dist/iframe/main.js.map +1 -1
- package/dist/index.cjs +901 -701
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +962 -762
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.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) {
|
|
@@ -6693,19 +6809,320 @@ var SecurityModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6693
6809
|
] });
|
|
6694
6810
|
};
|
|
6695
6811
|
|
|
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
|
+
});
|
|
6828
|
+
const [error, setError] = React19.useState(null);
|
|
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(() => {
|
|
6837
|
+
try {
|
|
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);
|
|
6860
|
+
}
|
|
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);
|
|
6869
|
+
} catch (error2) {
|
|
6870
|
+
console.error("[KeyshareBackup] Failed to get backup status:", error2);
|
|
6871
|
+
}
|
|
6872
|
+
}, [iframeManager, userId]);
|
|
6873
|
+
React19.useEffect(() => {
|
|
6874
|
+
refreshStatus();
|
|
6875
|
+
}, [refreshStatus]);
|
|
6876
|
+
const handleBackup = async (method) => {
|
|
6877
|
+
if (!iframeManager) {
|
|
6878
|
+
setError("Iframe manager not initialized");
|
|
6879
|
+
return;
|
|
6880
|
+
}
|
|
6881
|
+
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
6882
|
+
setError(null);
|
|
6883
|
+
setSuccess(null);
|
|
6884
|
+
try {
|
|
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
|
+
|
|
6696
7113
|
// src/internal/components/TransactionsModal.tsx
|
|
6697
|
-
import
|
|
7114
|
+
import React20 from "react";
|
|
6698
7115
|
init_base();
|
|
6699
|
-
import { Activity, ArrowUpRight, ArrowDownRight, CheckCircle2 as
|
|
6700
|
-
import { jsx as
|
|
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";
|
|
6701
7118
|
var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
6702
7119
|
const { address } = useLumiaSession();
|
|
6703
|
-
const [transactions, setTransactions] =
|
|
6704
|
-
const [loading, setLoading] =
|
|
6705
|
-
const [error, setError] =
|
|
7120
|
+
const [transactions, setTransactions] = React20.useState([]);
|
|
7121
|
+
const [loading, setLoading] = React20.useState(false);
|
|
7122
|
+
const [error, setError] = React20.useState(null);
|
|
6706
7123
|
const { config } = useLumiaPassportConfig();
|
|
6707
7124
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
6708
|
-
const loadTransactions =
|
|
7125
|
+
const loadTransactions = React20.useCallback(async () => {
|
|
6709
7126
|
if (!address) return;
|
|
6710
7127
|
setLoading(true);
|
|
6711
7128
|
setError(null);
|
|
@@ -6726,7 +7143,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6726
7143
|
setLoading(false);
|
|
6727
7144
|
}
|
|
6728
7145
|
}, [address]);
|
|
6729
|
-
|
|
7146
|
+
React20.useEffect(() => {
|
|
6730
7147
|
if (open && address && !loading && transactions.length === 0) {
|
|
6731
7148
|
loadTransactions();
|
|
6732
7149
|
}
|
|
@@ -6747,98 +7164,98 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6747
7164
|
}
|
|
6748
7165
|
};
|
|
6749
7166
|
const getStatusIcon = (status) => {
|
|
6750
|
-
return status === "ok" ? /* @__PURE__ */
|
|
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" });
|
|
6751
7168
|
};
|
|
6752
7169
|
const getTransactionIcon = (from, to) => {
|
|
6753
7170
|
const isIncoming = to.toLowerCase() === address?.toLowerCase();
|
|
6754
|
-
return isIncoming ? /* @__PURE__ */
|
|
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" });
|
|
6755
7172
|
};
|
|
6756
7173
|
const openInExplorer = (txHash) => {
|
|
6757
7174
|
const explorerUrl = getExplorerUrl();
|
|
6758
7175
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
6759
7176
|
};
|
|
6760
|
-
return /* @__PURE__ */
|
|
6761
|
-
/* @__PURE__ */
|
|
6762
|
-
/* @__PURE__ */
|
|
6763
|
-
/* @__PURE__ */
|
|
6764
|
-
onBack && /* @__PURE__ */
|
|
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(
|
|
6765
7182
|
"button",
|
|
6766
7183
|
{
|
|
6767
7184
|
onClick: onBack,
|
|
6768
7185
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6769
7186
|
title: "Back",
|
|
6770
|
-
children: /* @__PURE__ */
|
|
7187
|
+
children: /* @__PURE__ */ jsx24(ArrowLeft5, { className: "h-4 w-4" })
|
|
6771
7188
|
}
|
|
6772
7189
|
),
|
|
6773
|
-
/* @__PURE__ */
|
|
6774
|
-
/* @__PURE__ */
|
|
6775
|
-
/* @__PURE__ */
|
|
6776
|
-
/* @__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(
|
|
6777
7194
|
"button",
|
|
6778
7195
|
{
|
|
6779
7196
|
onClick: loadTransactions,
|
|
6780
7197
|
disabled: loading,
|
|
6781
7198
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6782
7199
|
title: "Refresh transactions",
|
|
6783
|
-
children: /* @__PURE__ */
|
|
7200
|
+
children: /* @__PURE__ */ jsx24(RefreshCw3, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` })
|
|
6784
7201
|
}
|
|
6785
7202
|
)
|
|
6786
7203
|
] })
|
|
6787
7204
|
] }) }),
|
|
6788
|
-
/* @__PURE__ */
|
|
6789
|
-
/* @__PURE__ */
|
|
6790
|
-
/* @__PURE__ */
|
|
6791
|
-
] }) : transactions.length === 0 ? /* @__PURE__ */
|
|
6792
|
-
/* @__PURE__ */
|
|
6793
|
-
/* @__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: [
|
|
6794
7211
|
"No transactions found",
|
|
6795
|
-
/* @__PURE__ */
|
|
6796
|
-
/* @__PURE__ */
|
|
7212
|
+
/* @__PURE__ */ jsx24("br", {}),
|
|
7213
|
+
/* @__PURE__ */ jsx24("span", { className: "text-xs mt-2", children: "Smart account transactions will appear here" })
|
|
6797
7214
|
] })
|
|
6798
|
-
] }) : /* @__PURE__ */
|
|
7215
|
+
] }) : /* @__PURE__ */ jsx24("div", { className: "space-y-3", children: transactions.map((tx) => {
|
|
6799
7216
|
const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();
|
|
6800
7217
|
const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;
|
|
6801
|
-
return /* @__PURE__ */
|
|
7218
|
+
return /* @__PURE__ */ jsxs16(
|
|
6802
7219
|
"div",
|
|
6803
7220
|
{
|
|
6804
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`,
|
|
6805
7222
|
onClick: () => openInExplorer(tx.hash),
|
|
6806
7223
|
children: [
|
|
6807
|
-
/* @__PURE__ */
|
|
6808
|
-
/* @__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: [
|
|
6809
7226
|
getTransactionIcon(tx.from.hash, tx.to.hash),
|
|
6810
|
-
/* @__PURE__ */
|
|
7227
|
+
/* @__PURE__ */ jsx24("span", { className: `font-medium ${theme.titleText}`, children: isIncoming ? "Received" : "Sent" }),
|
|
6811
7228
|
getStatusIcon(tx.status)
|
|
6812
7229
|
] }),
|
|
6813
|
-
/* @__PURE__ */
|
|
7230
|
+
/* @__PURE__ */ jsx24("div", { className: `text-xs ${theme.mutedText}`, children: formatTime(tx.timestamp) })
|
|
6814
7231
|
] }),
|
|
6815
|
-
/* @__PURE__ */
|
|
6816
|
-
/* @__PURE__ */
|
|
6817
|
-
/* @__PURE__ */
|
|
6818
|
-
/* @__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: [
|
|
6819
7236
|
formatAddress(displayAddress),
|
|
6820
|
-
(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)" })
|
|
6821
7238
|
] })
|
|
6822
7239
|
] }),
|
|
6823
|
-
/* @__PURE__ */
|
|
6824
|
-
/* @__PURE__ */
|
|
6825
|
-
/* @__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: [
|
|
6826
7243
|
formatValue(tx.value),
|
|
6827
7244
|
" LUMIA"
|
|
6828
7245
|
] })
|
|
6829
7246
|
] }),
|
|
6830
|
-
/* @__PURE__ */
|
|
6831
|
-
/* @__PURE__ */
|
|
6832
|
-
/* @__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: [
|
|
6833
7250
|
"#",
|
|
6834
7251
|
tx.block_number
|
|
6835
7252
|
] })
|
|
6836
7253
|
] }),
|
|
6837
|
-
tx.method && /* @__PURE__ */
|
|
6838
|
-
/* @__PURE__ */
|
|
6839
|
-
/* @__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 })
|
|
6840
7257
|
] }),
|
|
6841
|
-
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(
|
|
6842
7259
|
"span",
|
|
6843
7260
|
{
|
|
6844
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`,
|
|
@@ -6852,7 +7269,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6852
7269
|
tx.hash
|
|
6853
7270
|
);
|
|
6854
7271
|
}) }) }),
|
|
6855
|
-
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: [
|
|
6856
7273
|
"Total: ",
|
|
6857
7274
|
transactions.length,
|
|
6858
7275
|
" transaction",
|
|
@@ -6862,11 +7279,11 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6862
7279
|
};
|
|
6863
7280
|
|
|
6864
7281
|
// src/internal/components/ViewAssetsModal.tsx
|
|
6865
|
-
import
|
|
7282
|
+
import React22 from "react";
|
|
6866
7283
|
|
|
6867
7284
|
// src/modules/assets.ts
|
|
6868
7285
|
init_base();
|
|
6869
|
-
import
|
|
7286
|
+
import React21 from "react";
|
|
6870
7287
|
import { useBalance, useReadContract, useReadContracts } from "wagmi";
|
|
6871
7288
|
import { formatUnits, erc20Abi } from "viem";
|
|
6872
7289
|
var COMMON_TOKENS = [
|
|
@@ -7012,7 +7429,7 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
7012
7429
|
}
|
|
7013
7430
|
});
|
|
7014
7431
|
const { tokenInfo } = useTokenInfo(tokenAddress);
|
|
7015
|
-
const formattedBalance =
|
|
7432
|
+
const formattedBalance = React21.useMemo(() => {
|
|
7016
7433
|
if (!balance || !tokenInfo) return "0";
|
|
7017
7434
|
return formatUnits(balance, tokenInfo.decimals);
|
|
7018
7435
|
}, [balance, tokenInfo]);
|
|
@@ -7028,11 +7445,11 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
7028
7445
|
// src/internal/components/ViewAssetsModal.tsx
|
|
7029
7446
|
init_base();
|
|
7030
7447
|
import { Gem, RefreshCw as RefreshCw4, Copy, ExternalLink as ExternalLink2, ArrowLeft as ArrowLeft6 } from "lucide-react";
|
|
7031
|
-
import { jsx as
|
|
7448
|
+
import { jsx as jsx25, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
7032
7449
|
var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
7033
7450
|
const { address } = useLumiaSession();
|
|
7034
7451
|
const { assets, refreshBalances, isLoading } = useAssets(address);
|
|
7035
|
-
const [copied, setCopied] =
|
|
7452
|
+
const [copied, setCopied] = React22.useState(null);
|
|
7036
7453
|
const { config } = useLumiaPassportConfig();
|
|
7037
7454
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7038
7455
|
const handleCopy = async (text, type) => {
|
|
@@ -7047,107 +7464,107 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7047
7464
|
const openInExplorer = (address2) => {
|
|
7048
7465
|
window.open(`${LUMIA_EXPLORER_URL}/address/${address2}`, "_blank");
|
|
7049
7466
|
};
|
|
7050
|
-
return /* @__PURE__ */
|
|
7051
|
-
/* @__PURE__ */
|
|
7052
|
-
/* @__PURE__ */
|
|
7053
|
-
/* @__PURE__ */
|
|
7054
|
-
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(
|
|
7055
7472
|
"button",
|
|
7056
7473
|
{
|
|
7057
7474
|
onClick: onBack,
|
|
7058
7475
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7059
7476
|
title: "Back",
|
|
7060
|
-
children: /* @__PURE__ */
|
|
7477
|
+
children: /* @__PURE__ */ jsx25(ArrowLeft6, { className: "h-4 w-4" })
|
|
7061
7478
|
}
|
|
7062
7479
|
),
|
|
7063
|
-
/* @__PURE__ */
|
|
7064
|
-
/* @__PURE__ */
|
|
7065
|
-
/* @__PURE__ */
|
|
7066
|
-
/* @__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(
|
|
7067
7484
|
"button",
|
|
7068
7485
|
{
|
|
7069
7486
|
onClick: refreshBalances,
|
|
7070
7487
|
disabled: isLoading,
|
|
7071
7488
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
7072
7489
|
title: "Refresh balances",
|
|
7073
|
-
children: /* @__PURE__ */
|
|
7490
|
+
children: /* @__PURE__ */ jsx25(RefreshCw4, { className: `h-4 w-4 ${isLoading ? "animate-spin" : ""}` })
|
|
7074
7491
|
}
|
|
7075
7492
|
)
|
|
7076
7493
|
] })
|
|
7077
7494
|
] }) }),
|
|
7078
|
-
/* @__PURE__ */
|
|
7079
|
-
/* @__PURE__ */
|
|
7080
|
-
/* @__PURE__ */
|
|
7081
|
-
] }) : /* @__PURE__ */
|
|
7082
|
-
/* @__PURE__ */
|
|
7083
|
-
/* @__PURE__ */
|
|
7084
|
-
/* @__PURE__ */
|
|
7085
|
-
/* @__PURE__ */
|
|
7086
|
-
/* @__PURE__ */
|
|
7087
|
-
/* @__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 })
|
|
7088
7505
|
] })
|
|
7089
7506
|
] }),
|
|
7090
|
-
/* @__PURE__ */
|
|
7091
|
-
/* @__PURE__ */
|
|
7092
|
-
/* @__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 })
|
|
7093
7510
|
] })
|
|
7094
7511
|
] }),
|
|
7095
|
-
asset.address && /* @__PURE__ */
|
|
7096
|
-
/* @__PURE__ */
|
|
7097
|
-
/* @__PURE__ */
|
|
7098
|
-
/* @__PURE__ */
|
|
7099
|
-
/* @__PURE__ */
|
|
7100
|
-
/* @__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(
|
|
7101
7518
|
"button",
|
|
7102
7519
|
{
|
|
7103
7520
|
onClick: () => handleCopy(asset.address, "address"),
|
|
7104
7521
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7105
7522
|
title: "Copy address",
|
|
7106
|
-
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" })
|
|
7107
7524
|
}
|
|
7108
7525
|
),
|
|
7109
|
-
/* @__PURE__ */
|
|
7526
|
+
/* @__PURE__ */ jsx25(
|
|
7110
7527
|
"button",
|
|
7111
7528
|
{
|
|
7112
7529
|
onClick: () => openInExplorer(asset.address),
|
|
7113
7530
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7114
7531
|
title: "View in explorer",
|
|
7115
|
-
children: /* @__PURE__ */
|
|
7532
|
+
children: /* @__PURE__ */ jsx25(ExternalLink2, { className: "w-3 h-3" })
|
|
7116
7533
|
}
|
|
7117
7534
|
)
|
|
7118
7535
|
] })
|
|
7119
7536
|
] }),
|
|
7120
|
-
asset.decimals && /* @__PURE__ */
|
|
7121
|
-
/* @__PURE__ */
|
|
7122
|
-
/* @__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 })
|
|
7123
7540
|
] })
|
|
7124
7541
|
] }),
|
|
7125
|
-
asset.type === "native" && address && /* @__PURE__ */
|
|
7126
|
-
/* @__PURE__ */
|
|
7127
|
-
/* @__PURE__ */
|
|
7128
|
-
/* @__PURE__ */
|
|
7129
|
-
/* @__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(
|
|
7130
7547
|
"button",
|
|
7131
7548
|
{
|
|
7132
7549
|
onClick: () => handleCopy(address, "wallet"),
|
|
7133
7550
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7134
7551
|
title: "Copy wallet address",
|
|
7135
|
-
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" })
|
|
7136
7553
|
}
|
|
7137
7554
|
),
|
|
7138
|
-
/* @__PURE__ */
|
|
7555
|
+
/* @__PURE__ */ jsx25(
|
|
7139
7556
|
"button",
|
|
7140
7557
|
{
|
|
7141
7558
|
onClick: () => openInExplorer(address),
|
|
7142
7559
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7143
7560
|
title: "View in explorer",
|
|
7144
|
-
children: /* @__PURE__ */
|
|
7561
|
+
children: /* @__PURE__ */ jsx25(ExternalLink2, { className: "w-3 h-3" })
|
|
7145
7562
|
}
|
|
7146
7563
|
)
|
|
7147
7564
|
] })
|
|
7148
7565
|
] }) })
|
|
7149
7566
|
] }, `${asset.type}-${asset.address || "native"}-${index}`)) }) }),
|
|
7150
|
-
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: [
|
|
7151
7568
|
"Total: ",
|
|
7152
7569
|
assets.length,
|
|
7153
7570
|
" asset",
|
|
@@ -7157,18 +7574,18 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7157
7574
|
};
|
|
7158
7575
|
|
|
7159
7576
|
// src/internal/components/SendModal.tsx
|
|
7160
|
-
import { useState as
|
|
7161
|
-
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";
|
|
7162
7579
|
|
|
7163
7580
|
// src/hooks/useSendTransaction.ts
|
|
7164
|
-
import { useState as
|
|
7581
|
+
import { useState as useState10, useCallback as useCallback4 } from "react";
|
|
7165
7582
|
import { parseEther as parseEther2, isAddress } from "viem";
|
|
7166
7583
|
function useSendTransaction() {
|
|
7167
7584
|
const { session, address } = useLumiaSession();
|
|
7168
|
-
const [isLoading, setIsLoading] =
|
|
7169
|
-
const [error, setError] =
|
|
7170
|
-
const [userOpHash, setUserOpHash] =
|
|
7171
|
-
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) => {
|
|
7172
7589
|
if (!session || !address) {
|
|
7173
7590
|
setError("No active session");
|
|
7174
7591
|
return null;
|
|
@@ -7205,7 +7622,7 @@ function useSendTransaction() {
|
|
|
7205
7622
|
setIsLoading(false);
|
|
7206
7623
|
}
|
|
7207
7624
|
}, [session, address]);
|
|
7208
|
-
const reset =
|
|
7625
|
+
const reset = useCallback4(() => {
|
|
7209
7626
|
setError(null);
|
|
7210
7627
|
setUserOpHash(null);
|
|
7211
7628
|
setIsLoading(false);
|
|
@@ -7224,8 +7641,8 @@ import { isAddress as isAddress2 } from "viem";
|
|
|
7224
7641
|
import { useBalance as useBalance2 } from "wagmi";
|
|
7225
7642
|
|
|
7226
7643
|
// src/internal/components/UserOpStatus.tsx
|
|
7227
|
-
import * as
|
|
7228
|
-
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";
|
|
7229
7646
|
|
|
7230
7647
|
// src/internal/components/ui/badge.tsx
|
|
7231
7648
|
import { cva as cva2 } from "class-variance-authority";
|
|
@@ -7238,7 +7655,7 @@ function cn2(...inputs) {
|
|
|
7238
7655
|
}
|
|
7239
7656
|
|
|
7240
7657
|
// src/internal/components/ui/badge.tsx
|
|
7241
|
-
import { jsx as
|
|
7658
|
+
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
7242
7659
|
var badgeVariants = cva2(
|
|
7243
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",
|
|
7244
7661
|
{
|
|
@@ -7258,13 +7675,13 @@ var badgeVariants = cva2(
|
|
|
7258
7675
|
}
|
|
7259
7676
|
);
|
|
7260
7677
|
function Badge({ className, variant, ...props }) {
|
|
7261
|
-
return /* @__PURE__ */
|
|
7678
|
+
return /* @__PURE__ */ jsx26("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
7262
7679
|
}
|
|
7263
7680
|
|
|
7264
7681
|
// src/internal/components/Address.tsx
|
|
7265
|
-
import * as
|
|
7682
|
+
import * as React23 from "react";
|
|
7266
7683
|
import { Copy as Copy2, ExternalLink as ExternalLink3 } from "lucide-react";
|
|
7267
|
-
import { jsx as
|
|
7684
|
+
import { jsx as jsx27, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
7268
7685
|
function toExplorerAddressUrl(address, chain) {
|
|
7269
7686
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
7270
7687
|
if (!base2) return null;
|
|
@@ -7285,12 +7702,12 @@ var Address = ({
|
|
|
7285
7702
|
}) => {
|
|
7286
7703
|
const addr = address || "";
|
|
7287
7704
|
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
7288
|
-
const [copied, setCopied] =
|
|
7289
|
-
if (!addr) return /* @__PURE__ */
|
|
7290
|
-
return /* @__PURE__ */
|
|
7291
|
-
label && /* @__PURE__ */
|
|
7292
|
-
/* @__PURE__ */
|
|
7293
|
-
showCopy && /* @__PURE__ */
|
|
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(
|
|
7294
7711
|
Button,
|
|
7295
7712
|
{
|
|
7296
7713
|
variant: "ghost",
|
|
@@ -7304,10 +7721,10 @@ var Address = ({
|
|
|
7304
7721
|
} catch {
|
|
7305
7722
|
}
|
|
7306
7723
|
},
|
|
7307
|
-
children: /* @__PURE__ */
|
|
7724
|
+
children: /* @__PURE__ */ jsx27(Copy2, { className: "h-4 w-4" })
|
|
7308
7725
|
}
|
|
7309
7726
|
),
|
|
7310
|
-
showExplorer && explorer && /* @__PURE__ */
|
|
7727
|
+
showExplorer && explorer && /* @__PURE__ */ jsx27(
|
|
7311
7728
|
"a",
|
|
7312
7729
|
{
|
|
7313
7730
|
href: explorer,
|
|
@@ -7315,7 +7732,7 @@ var Address = ({
|
|
|
7315
7732
|
rel: "noreferrer noopener",
|
|
7316
7733
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
7317
7734
|
title: "Open in explorer",
|
|
7318
|
-
children: /* @__PURE__ */
|
|
7735
|
+
children: /* @__PURE__ */ jsx27(ExternalLink3, { className: "h-4 w-4" })
|
|
7319
7736
|
}
|
|
7320
7737
|
)
|
|
7321
7738
|
] });
|
|
@@ -7323,7 +7740,7 @@ var Address = ({
|
|
|
7323
7740
|
|
|
7324
7741
|
// src/internal/components/UserOpStatus.tsx
|
|
7325
7742
|
init_base();
|
|
7326
|
-
import { jsx as
|
|
7743
|
+
import { jsx as jsx28, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
7327
7744
|
var UserOpStatus = ({
|
|
7328
7745
|
userOpHash,
|
|
7329
7746
|
chain,
|
|
@@ -7334,20 +7751,20 @@ var UserOpStatus = ({
|
|
|
7334
7751
|
externalState
|
|
7335
7752
|
}) => {
|
|
7336
7753
|
const useExternalState = !!externalState;
|
|
7337
|
-
const [internalReceipt, setInternalReceipt] =
|
|
7338
|
-
const [internalMempool, setInternalMempool] =
|
|
7339
|
-
const [internalError, setInternalError] =
|
|
7340
|
-
const [attempt, setAttempt] =
|
|
7341
|
-
const [internalRefreshing, setInternalRefreshing] =
|
|
7342
|
-
const [timedOut, setTimedOut] =
|
|
7343
|
-
const [rejected, setRejected] =
|
|
7344
|
-
const intervalRef =
|
|
7345
|
-
const startTimeRef =
|
|
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());
|
|
7346
7763
|
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
7347
7764
|
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
7348
7765
|
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
7349
7766
|
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
7350
|
-
const rpc =
|
|
7767
|
+
const rpc = React24.useCallback(async (method, params) => {
|
|
7351
7768
|
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
7352
7769
|
const res = await fetch(getBundlerUrl(), {
|
|
7353
7770
|
method: "POST",
|
|
@@ -7358,14 +7775,14 @@ var UserOpStatus = ({
|
|
|
7358
7775
|
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
7359
7776
|
return json.result;
|
|
7360
7777
|
}, []);
|
|
7361
|
-
const extractMempoolInfo =
|
|
7778
|
+
const extractMempoolInfo = React24.useCallback((m) => {
|
|
7362
7779
|
if (!m) return null;
|
|
7363
7780
|
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
7364
7781
|
const sender = m.sender || m?.userOperation?.sender || null;
|
|
7365
7782
|
if (!entryPoint && !sender) return null;
|
|
7366
7783
|
return { entryPoint, sender };
|
|
7367
7784
|
}, []);
|
|
7368
|
-
const tick =
|
|
7785
|
+
const tick = React24.useCallback(async () => {
|
|
7369
7786
|
if (useExternalState) return;
|
|
7370
7787
|
const elapsed = Date.now() - startTimeRef.current;
|
|
7371
7788
|
if (elapsed > maxPollTimeMs) {
|
|
@@ -7409,7 +7826,7 @@ var UserOpStatus = ({
|
|
|
7409
7826
|
setAttempt((x) => x + 1);
|
|
7410
7827
|
}
|
|
7411
7828
|
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
7412
|
-
|
|
7829
|
+
React24.useEffect(() => {
|
|
7413
7830
|
if (useExternalState) return;
|
|
7414
7831
|
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
7415
7832
|
startTimeRef.current = Date.now();
|
|
@@ -7421,7 +7838,7 @@ var UserOpStatus = ({
|
|
|
7421
7838
|
setAttempt(0);
|
|
7422
7839
|
setInternalRefreshing(false);
|
|
7423
7840
|
}, [userOpHash, useExternalState]);
|
|
7424
|
-
|
|
7841
|
+
React24.useEffect(() => {
|
|
7425
7842
|
if (useExternalState) {
|
|
7426
7843
|
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
7427
7844
|
return;
|
|
@@ -7456,54 +7873,54 @@ var UserOpStatus = ({
|
|
|
7456
7873
|
const stateBadge = () => {
|
|
7457
7874
|
if (receipt) {
|
|
7458
7875
|
const ok = !!receipt.success;
|
|
7459
|
-
return /* @__PURE__ */
|
|
7460
|
-
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" }),
|
|
7461
7878
|
ok ? "Included" : "Failed"
|
|
7462
7879
|
] });
|
|
7463
7880
|
}
|
|
7464
7881
|
if (rejected) {
|
|
7465
|
-
return /* @__PURE__ */
|
|
7466
|
-
/* @__PURE__ */
|
|
7882
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
7883
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7467
7884
|
" Rejected by bundler"
|
|
7468
7885
|
] });
|
|
7469
7886
|
}
|
|
7470
7887
|
if (timedOut) {
|
|
7471
|
-
return /* @__PURE__ */
|
|
7472
|
-
/* @__PURE__ */
|
|
7888
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "warning", className: "gap-1", children: [
|
|
7889
|
+
/* @__PURE__ */ jsx28(AlertCircle4, { className: "h-3 w-3" }),
|
|
7473
7890
|
" Timeout - may be rejected"
|
|
7474
7891
|
] });
|
|
7475
7892
|
}
|
|
7476
7893
|
if (mempool) {
|
|
7477
|
-
return /* @__PURE__ */
|
|
7478
|
-
/* @__PURE__ */
|
|
7894
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "outline", className: "gap-1", children: [
|
|
7895
|
+
/* @__PURE__ */ jsx28(Clock3, { className: "h-3 w-3" }),
|
|
7479
7896
|
" Pending in bundler"
|
|
7480
7897
|
] });
|
|
7481
7898
|
}
|
|
7482
|
-
return /* @__PURE__ */
|
|
7483
|
-
/* @__PURE__ */
|
|
7899
|
+
return /* @__PURE__ */ jsxs19(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
7900
|
+
/* @__PURE__ */ jsx28(Clock3, { className: "h-3 w-3" }),
|
|
7484
7901
|
" Waiting"
|
|
7485
7902
|
] });
|
|
7486
7903
|
};
|
|
7487
|
-
return /* @__PURE__ */
|
|
7904
|
+
return /* @__PURE__ */ jsxs19(
|
|
7488
7905
|
"div",
|
|
7489
7906
|
{
|
|
7490
7907
|
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
7491
7908
|
style: { textAlign: "left", listStyle: "none" },
|
|
7492
7909
|
children: [
|
|
7493
|
-
/* @__PURE__ */
|
|
7494
|
-
/* @__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: [
|
|
7495
7912
|
stateBadge(),
|
|
7496
|
-
/* @__PURE__ */
|
|
7913
|
+
/* @__PURE__ */ jsx28("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
7497
7914
|
] }),
|
|
7498
|
-
/* @__PURE__ */
|
|
7499
|
-
/* @__PURE__ */
|
|
7500
|
-
/* @__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" })
|
|
7501
7918
|
] })
|
|
7502
7919
|
] }),
|
|
7503
|
-
/* @__PURE__ */
|
|
7504
|
-
/* @__PURE__ */
|
|
7505
|
-
/* @__PURE__ */
|
|
7506
|
-
/* @__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(
|
|
7507
7924
|
Button,
|
|
7508
7925
|
{
|
|
7509
7926
|
variant: "ghost",
|
|
@@ -7515,14 +7932,14 @@ var UserOpStatus = ({
|
|
|
7515
7932
|
} catch {
|
|
7516
7933
|
}
|
|
7517
7934
|
},
|
|
7518
|
-
children: /* @__PURE__ */
|
|
7935
|
+
children: /* @__PURE__ */ jsx28(Copy3, { className: "h-3.5 w-3.5" })
|
|
7519
7936
|
}
|
|
7520
7937
|
)
|
|
7521
7938
|
] }),
|
|
7522
|
-
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */
|
|
7523
|
-
/* @__PURE__ */
|
|
7524
|
-
/* @__PURE__ */
|
|
7525
|
-
/* @__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(
|
|
7526
7943
|
Button,
|
|
7527
7944
|
{
|
|
7528
7945
|
variant: "ghost",
|
|
@@ -7534,10 +7951,10 @@ var UserOpStatus = ({
|
|
|
7534
7951
|
} catch {
|
|
7535
7952
|
}
|
|
7536
7953
|
},
|
|
7537
|
-
children: /* @__PURE__ */
|
|
7954
|
+
children: /* @__PURE__ */ jsx28(Copy3, { className: "h-3.5 w-3.5" })
|
|
7538
7955
|
}
|
|
7539
7956
|
),
|
|
7540
|
-
chain?.blockExplorers?.default?.url && /* @__PURE__ */
|
|
7957
|
+
chain?.blockExplorers?.default?.url && /* @__PURE__ */ jsx28(
|
|
7541
7958
|
"a",
|
|
7542
7959
|
{
|
|
7543
7960
|
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
@@ -7545,11 +7962,11 @@ var UserOpStatus = ({
|
|
|
7545
7962
|
rel: "noreferrer noopener",
|
|
7546
7963
|
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
7547
7964
|
title: "Open in explorer",
|
|
7548
|
-
children: /* @__PURE__ */
|
|
7965
|
+
children: /* @__PURE__ */ jsx28(ExternalLink4, { className: "h-3.5 w-3.5" })
|
|
7549
7966
|
}
|
|
7550
7967
|
)
|
|
7551
7968
|
] }),
|
|
7552
|
-
receipt && /* @__PURE__ */
|
|
7969
|
+
receipt && /* @__PURE__ */ jsxs19("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
7553
7970
|
"Block ",
|
|
7554
7971
|
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
7555
7972
|
" \u2022 Gas Used",
|
|
@@ -7558,32 +7975,32 @@ var UserOpStatus = ({
|
|
|
7558
7975
|
" \u2022 Success ",
|
|
7559
7976
|
String(!!receipt.success)
|
|
7560
7977
|
] }),
|
|
7561
|
-
/* @__PURE__ */
|
|
7978
|
+
/* @__PURE__ */ jsx28("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ jsxs19("span", { className: "ml-2", children: [
|
|
7562
7979
|
"\u2022 Polling for ",
|
|
7563
7980
|
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
7564
7981
|
"s"
|
|
7565
7982
|
] }) }),
|
|
7566
|
-
mempool && /* @__PURE__ */
|
|
7567
|
-
/* @__PURE__ */
|
|
7983
|
+
mempool && /* @__PURE__ */ jsxs19("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
7984
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
7568
7985
|
"Seen by bundler at ",
|
|
7569
|
-
/* @__PURE__ */
|
|
7986
|
+
/* @__PURE__ */ jsx28(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
7570
7987
|
] }),
|
|
7571
|
-
/* @__PURE__ */
|
|
7988
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
7572
7989
|
"sender ",
|
|
7573
|
-
/* @__PURE__ */
|
|
7990
|
+
/* @__PURE__ */ jsx28(Address, { address: mempool.sender, chain, truncate: false })
|
|
7574
7991
|
] })
|
|
7575
7992
|
] }),
|
|
7576
|
-
error && /* @__PURE__ */
|
|
7577
|
-
/* @__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" }),
|
|
7578
7995
|
" ",
|
|
7579
7996
|
error
|
|
7580
7997
|
] }),
|
|
7581
|
-
rejected && /* @__PURE__ */
|
|
7582
|
-
/* @__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" }),
|
|
7583
8000
|
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
7584
8001
|
] }),
|
|
7585
|
-
timedOut && /* @__PURE__ */
|
|
7586
|
-
/* @__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" }),
|
|
7587
8004
|
"Stopped polling after ",
|
|
7588
8005
|
Math.round(maxPollTimeMs / 1e3),
|
|
7589
8006
|
"s. UserOperation may have been rejected by the bundler."
|
|
@@ -7595,7 +8012,7 @@ var UserOpStatus = ({
|
|
|
7595
8012
|
|
|
7596
8013
|
// src/internal/components/SendModal.tsx
|
|
7597
8014
|
init_base();
|
|
7598
|
-
import { jsx as
|
|
8015
|
+
import { jsx as jsx29, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
7599
8016
|
var SendModal = ({
|
|
7600
8017
|
open,
|
|
7601
8018
|
onOpenChange,
|
|
@@ -7612,13 +8029,13 @@ var SendModal = ({
|
|
|
7612
8029
|
address,
|
|
7613
8030
|
chainId: lumiaBeam.id
|
|
7614
8031
|
});
|
|
7615
|
-
const [recipient, setRecipient] =
|
|
7616
|
-
const [amount, setAmount] =
|
|
7617
|
-
const [txStep, setTxStep] =
|
|
7618
|
-
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);
|
|
7619
8036
|
const nativeAsset = assets.find((a) => a.type === "native");
|
|
7620
8037
|
const balance = nativeAsset ? parseFloat(nativeAsset.formattedBalance) : 0;
|
|
7621
|
-
|
|
8038
|
+
useEffect10(() => {
|
|
7622
8039
|
if (open) {
|
|
7623
8040
|
setTxStep("input");
|
|
7624
8041
|
setValidationError(null);
|
|
@@ -7678,7 +8095,7 @@ var SendModal = ({
|
|
|
7678
8095
|
const maxAmount = Math.max(0, balance - 1e-3);
|
|
7679
8096
|
setAmount(maxAmount.toFixed(6));
|
|
7680
8097
|
};
|
|
7681
|
-
return /* @__PURE__ */
|
|
8098
|
+
return /* @__PURE__ */ jsx29(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs20(
|
|
7682
8099
|
DialogContent,
|
|
7683
8100
|
{
|
|
7684
8101
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7690,28 +8107,28 @@ var SendModal = ({
|
|
|
7690
8107
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7691
8108
|
},
|
|
7692
8109
|
children: [
|
|
7693
|
-
/* @__PURE__ */
|
|
7694
|
-
/* @__PURE__ */
|
|
7695
|
-
/* @__PURE__ */
|
|
7696
|
-
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(
|
|
7697
8114
|
"button",
|
|
7698
8115
|
{
|
|
7699
8116
|
onClick: onBack,
|
|
7700
8117
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7701
8118
|
title: "Back",
|
|
7702
|
-
children: /* @__PURE__ */
|
|
8119
|
+
children: /* @__PURE__ */ jsx29(ArrowLeft7, { className: "h-4 w-4" })
|
|
7703
8120
|
}
|
|
7704
8121
|
),
|
|
7705
|
-
/* @__PURE__ */
|
|
7706
|
-
/* @__PURE__ */
|
|
7707
|
-
/* @__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" })
|
|
7708
8125
|
] })
|
|
7709
8126
|
] }) }),
|
|
7710
|
-
/* @__PURE__ */
|
|
7711
|
-
txStep === "input" && /* @__PURE__ */
|
|
7712
|
-
/* @__PURE__ */
|
|
7713
|
-
/* @__PURE__ */
|
|
7714
|
-
/* @__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(
|
|
7715
8132
|
"input",
|
|
7716
8133
|
{
|
|
7717
8134
|
type: "text",
|
|
@@ -7722,17 +8139,17 @@ var SendModal = ({
|
|
|
7722
8139
|
}
|
|
7723
8140
|
)
|
|
7724
8141
|
] }),
|
|
7725
|
-
/* @__PURE__ */
|
|
7726
|
-
/* @__PURE__ */
|
|
7727
|
-
/* @__PURE__ */
|
|
7728
|
-
/* @__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: [
|
|
7729
8146
|
"Balance: ",
|
|
7730
8147
|
balance.toFixed(4),
|
|
7731
8148
|
" LUMIA"
|
|
7732
8149
|
] })
|
|
7733
8150
|
] }),
|
|
7734
|
-
/* @__PURE__ */
|
|
7735
|
-
/* @__PURE__ */
|
|
8151
|
+
/* @__PURE__ */ jsxs20("div", { className: "relative", children: [
|
|
8152
|
+
/* @__PURE__ */ jsx29(
|
|
7736
8153
|
"input",
|
|
7737
8154
|
{
|
|
7738
8155
|
type: "number",
|
|
@@ -7743,7 +8160,7 @@ var SendModal = ({
|
|
|
7743
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`
|
|
7744
8161
|
}
|
|
7745
8162
|
),
|
|
7746
|
-
/* @__PURE__ */
|
|
8163
|
+
/* @__PURE__ */ jsx29(
|
|
7747
8164
|
"button",
|
|
7748
8165
|
{
|
|
7749
8166
|
onClick: handleMaxAmount,
|
|
@@ -7753,11 +8170,11 @@ var SendModal = ({
|
|
|
7753
8170
|
)
|
|
7754
8171
|
] })
|
|
7755
8172
|
] }),
|
|
7756
|
-
(validationError || error) && /* @__PURE__ */
|
|
7757
|
-
/* @__PURE__ */
|
|
7758
|
-
/* @__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 })
|
|
7759
8176
|
] }),
|
|
7760
|
-
/* @__PURE__ */
|
|
8177
|
+
/* @__PURE__ */ jsx29(
|
|
7761
8178
|
Button,
|
|
7762
8179
|
{
|
|
7763
8180
|
onClick: handleSend,
|
|
@@ -7768,29 +8185,29 @@ var SendModal = ({
|
|
|
7768
8185
|
}
|
|
7769
8186
|
)
|
|
7770
8187
|
] }),
|
|
7771
|
-
txStep === "confirm" && /* @__PURE__ */
|
|
7772
|
-
/* @__PURE__ */
|
|
7773
|
-
/* @__PURE__ */
|
|
7774
|
-
/* @__PURE__ */
|
|
7775
|
-
/* @__PURE__ */
|
|
7776
|
-
/* @__PURE__ */
|
|
7777
|
-
/* @__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)}` })
|
|
7778
8195
|
] }),
|
|
7779
|
-
/* @__PURE__ */
|
|
7780
|
-
/* @__PURE__ */
|
|
7781
|
-
/* @__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: [
|
|
7782
8199
|
amount,
|
|
7783
8200
|
" LUMIA"
|
|
7784
8201
|
] })
|
|
7785
8202
|
] }),
|
|
7786
|
-
/* @__PURE__ */
|
|
7787
|
-
/* @__PURE__ */
|
|
7788
|
-
/* @__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" })
|
|
7789
8206
|
] })
|
|
7790
8207
|
] })
|
|
7791
8208
|
] }),
|
|
7792
|
-
/* @__PURE__ */
|
|
7793
|
-
/* @__PURE__ */
|
|
8209
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex gap-2", children: [
|
|
8210
|
+
/* @__PURE__ */ jsx29(
|
|
7794
8211
|
Button,
|
|
7795
8212
|
{
|
|
7796
8213
|
onClick: () => setTxStep("input"),
|
|
@@ -7800,7 +8217,7 @@ var SendModal = ({
|
|
|
7800
8217
|
children: "Back"
|
|
7801
8218
|
}
|
|
7802
8219
|
),
|
|
7803
|
-
/* @__PURE__ */
|
|
8220
|
+
/* @__PURE__ */ jsxs20(
|
|
7804
8221
|
Button,
|
|
7805
8222
|
{
|
|
7806
8223
|
onClick: handleConfirm,
|
|
@@ -7808,28 +8225,28 @@ var SendModal = ({
|
|
|
7808
8225
|
className: "flex-1",
|
|
7809
8226
|
size: "lg",
|
|
7810
8227
|
children: [
|
|
7811
|
-
isLoading && /* @__PURE__ */
|
|
8228
|
+
isLoading && /* @__PURE__ */ jsx29(Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
7812
8229
|
"Confirm"
|
|
7813
8230
|
]
|
|
7814
8231
|
}
|
|
7815
8232
|
)
|
|
7816
8233
|
] })
|
|
7817
8234
|
] }),
|
|
7818
|
-
txStep === "pending" && /* @__PURE__ */
|
|
7819
|
-
/* @__PURE__ */
|
|
7820
|
-
/* @__PURE__ */
|
|
7821
|
-
/* @__PURE__ */
|
|
7822
|
-
/* @__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" })
|
|
7823
8240
|
] })
|
|
7824
8241
|
] }),
|
|
7825
|
-
txStep === "success" && userOpHash && /* @__PURE__ */
|
|
7826
|
-
/* @__PURE__ */
|
|
7827
|
-
/* @__PURE__ */
|
|
7828
|
-
/* @__PURE__ */
|
|
7829
|
-
/* @__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" })
|
|
7830
8247
|
] }),
|
|
7831
|
-
/* @__PURE__ */
|
|
7832
|
-
/* @__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(
|
|
7833
8250
|
Button,
|
|
7834
8251
|
{
|
|
7835
8252
|
onClick: handleClose,
|
|
@@ -7846,21 +8263,21 @@ var SendModal = ({
|
|
|
7846
8263
|
};
|
|
7847
8264
|
|
|
7848
8265
|
// src/internal/components/ReceiveModal.tsx
|
|
7849
|
-
import { useState as
|
|
7850
|
-
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";
|
|
7851
8268
|
import QRCode from "qrcode";
|
|
7852
|
-
import { Fragment as
|
|
8269
|
+
import { Fragment as Fragment7, jsx as jsx30, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
7853
8270
|
var ReceiveModal = ({
|
|
7854
8271
|
open,
|
|
7855
8272
|
onOpenChange,
|
|
7856
8273
|
onBack
|
|
7857
8274
|
}) => {
|
|
7858
8275
|
const { address } = useLumiaSession();
|
|
7859
|
-
const [qrCodeUrl, setQrCodeUrl] =
|
|
8276
|
+
const [qrCodeUrl, setQrCodeUrl] = useState14("");
|
|
7860
8277
|
const { config } = useLumiaPassportConfig();
|
|
7861
8278
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7862
|
-
const [copied, setCopied] =
|
|
7863
|
-
|
|
8279
|
+
const [copied, setCopied] = useState14(false);
|
|
8280
|
+
useEffect11(() => {
|
|
7864
8281
|
if (open && address) {
|
|
7865
8282
|
QRCode.toDataURL(address, {
|
|
7866
8283
|
width: 200,
|
|
@@ -7890,7 +8307,7 @@ var ReceiveModal = ({
|
|
|
7890
8307
|
if (!addr) return "";
|
|
7891
8308
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7892
8309
|
};
|
|
7893
|
-
return /* @__PURE__ */
|
|
8310
|
+
return /* @__PURE__ */ jsx30(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs21(
|
|
7894
8311
|
DialogContent,
|
|
7895
8312
|
{
|
|
7896
8313
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7902,51 +8319,51 @@ var ReceiveModal = ({
|
|
|
7902
8319
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7903
8320
|
},
|
|
7904
8321
|
children: [
|
|
7905
|
-
/* @__PURE__ */
|
|
7906
|
-
/* @__PURE__ */
|
|
7907
|
-
/* @__PURE__ */
|
|
7908
|
-
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(
|
|
7909
8326
|
"button",
|
|
7910
8327
|
{
|
|
7911
8328
|
onClick: onBack,
|
|
7912
8329
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7913
8330
|
title: "Back",
|
|
7914
|
-
children: /* @__PURE__ */
|
|
8331
|
+
children: /* @__PURE__ */ jsx30(ArrowLeft8, { className: "h-4 w-4" })
|
|
7915
8332
|
}
|
|
7916
8333
|
),
|
|
7917
|
-
/* @__PURE__ */
|
|
7918
|
-
/* @__PURE__ */
|
|
7919
|
-
/* @__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" })
|
|
7920
8337
|
] })
|
|
7921
8338
|
] }) }),
|
|
7922
|
-
/* @__PURE__ */
|
|
7923
|
-
qrCodeUrl && /* @__PURE__ */
|
|
7924
|
-
/* @__PURE__ */
|
|
7925
|
-
/* @__PURE__ */
|
|
7926
|
-
/* @__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" })
|
|
7927
8344
|
] }) }) }),
|
|
7928
|
-
/* @__PURE__ */
|
|
7929
|
-
/* @__PURE__ */
|
|
7930
|
-
/* @__PURE__ */
|
|
7931
|
-
/* @__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(
|
|
7932
8349
|
Button,
|
|
7933
8350
|
{
|
|
7934
8351
|
onClick: handleCopy,
|
|
7935
8352
|
className: "w-full mt-3",
|
|
7936
8353
|
size: "lg",
|
|
7937
|
-
children: copied ? /* @__PURE__ */
|
|
7938
|
-
/* @__PURE__ */
|
|
7939
|
-
/* @__PURE__ */
|
|
7940
|
-
] }) : /* @__PURE__ */
|
|
7941
|
-
/* @__PURE__ */
|
|
7942
|
-
/* @__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" })
|
|
7943
8360
|
] })
|
|
7944
8361
|
}
|
|
7945
8362
|
)
|
|
7946
8363
|
] }),
|
|
7947
|
-
/* @__PURE__ */
|
|
7948
|
-
/* @__PURE__ */
|
|
7949
|
-
/* @__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." })
|
|
7950
8367
|
] })
|
|
7951
8368
|
] })
|
|
7952
8369
|
]
|
|
@@ -7956,11 +8373,11 @@ var ReceiveModal = ({
|
|
|
7956
8373
|
|
|
7957
8374
|
// src/internal/components/BuyModal.tsx
|
|
7958
8375
|
import { CreditCard, ArrowLeft as ArrowLeft9 } from "lucide-react";
|
|
7959
|
-
import { jsx as
|
|
8376
|
+
import { jsx as jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
7960
8377
|
var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
7961
8378
|
const { config } = useLumiaPassportConfig();
|
|
7962
8379
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7963
|
-
return /* @__PURE__ */
|
|
8380
|
+
return /* @__PURE__ */ jsx31(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs22(
|
|
7964
8381
|
DialogContent,
|
|
7965
8382
|
{
|
|
7966
8383
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7972,26 +8389,26 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7972
8389
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7973
8390
|
},
|
|
7974
8391
|
children: [
|
|
7975
|
-
/* @__PURE__ */
|
|
7976
|
-
/* @__PURE__ */
|
|
7977
|
-
/* @__PURE__ */
|
|
7978
|
-
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(
|
|
7979
8396
|
"button",
|
|
7980
8397
|
{
|
|
7981
8398
|
onClick: onBack,
|
|
7982
8399
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7983
8400
|
title: "Back",
|
|
7984
|
-
children: /* @__PURE__ */
|
|
8401
|
+
children: /* @__PURE__ */ jsx31(ArrowLeft9, { className: "h-4 w-4" })
|
|
7985
8402
|
}
|
|
7986
8403
|
),
|
|
7987
|
-
/* @__PURE__ */
|
|
7988
|
-
/* @__PURE__ */
|
|
7989
|
-
/* @__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" })
|
|
7990
8407
|
] })
|
|
7991
8408
|
] }) }),
|
|
7992
|
-
/* @__PURE__ */
|
|
7993
|
-
/* @__PURE__ */
|
|
7994
|
-
/* @__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" }) })
|
|
7995
8412
|
] })
|
|
7996
8413
|
]
|
|
7997
8414
|
}
|
|
@@ -8000,13 +8417,13 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8000
8417
|
|
|
8001
8418
|
// src/internal/components/KycModal.tsx
|
|
8002
8419
|
import { ShieldCheck, ArrowLeft as ArrowLeft10 } from "lucide-react";
|
|
8003
|
-
import { jsx as
|
|
8420
|
+
import { jsx as jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
8004
8421
|
var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
8005
8422
|
const { config } = useLumiaPassportConfig();
|
|
8006
8423
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
8007
8424
|
const provider = config.kyc?.provider;
|
|
8008
8425
|
const options = config.kyc?.options || {};
|
|
8009
|
-
return /* @__PURE__ */
|
|
8426
|
+
return /* @__PURE__ */ jsx32(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs23(
|
|
8010
8427
|
DialogContent,
|
|
8011
8428
|
{
|
|
8012
8429
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8018,32 +8435,32 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8018
8435
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8019
8436
|
},
|
|
8020
8437
|
children: [
|
|
8021
|
-
/* @__PURE__ */
|
|
8022
|
-
/* @__PURE__ */
|
|
8023
|
-
/* @__PURE__ */
|
|
8024
|
-
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(
|
|
8025
8442
|
"button",
|
|
8026
8443
|
{
|
|
8027
8444
|
onClick: onBack,
|
|
8028
8445
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8029
8446
|
title: "Back",
|
|
8030
|
-
children: /* @__PURE__ */
|
|
8447
|
+
children: /* @__PURE__ */ jsx32(ArrowLeft10, { className: "h-4 w-4" })
|
|
8031
8448
|
}
|
|
8032
8449
|
),
|
|
8033
|
-
/* @__PURE__ */
|
|
8034
|
-
/* @__PURE__ */
|
|
8035
|
-
/* @__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" })
|
|
8036
8453
|
] })
|
|
8037
8454
|
] }) }),
|
|
8038
|
-
/* @__PURE__ */
|
|
8039
|
-
provider ? /* @__PURE__ */
|
|
8040
|
-
/* @__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: [
|
|
8041
8458
|
"KYC provider: ",
|
|
8042
|
-
/* @__PURE__ */
|
|
8459
|
+
/* @__PURE__ */ jsx32("span", { className: "font-medium", children: provider })
|
|
8043
8460
|
] }),
|
|
8044
|
-
Object.keys(options).length > 0 ? /* @__PURE__ */
|
|
8045
|
-
] }) : /* @__PURE__ */
|
|
8046
|
-
/* @__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" }) })
|
|
8047
8464
|
] })
|
|
8048
8465
|
]
|
|
8049
8466
|
}
|
|
@@ -8052,20 +8469,20 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
8052
8469
|
|
|
8053
8470
|
// src/components/ConnectWalletButton.tsx
|
|
8054
8471
|
init_auth();
|
|
8055
|
-
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";
|
|
8056
8473
|
init_base();
|
|
8057
8474
|
|
|
8058
8475
|
// src/modules/linkedProfiles.ts
|
|
8059
8476
|
init_common();
|
|
8060
8477
|
init_types();
|
|
8061
8478
|
init_auth();
|
|
8062
|
-
import * as
|
|
8479
|
+
import * as React27 from "react";
|
|
8063
8480
|
function useLumiaPassportLinkedProfiles() {
|
|
8064
|
-
const [profiles, setProfiles] =
|
|
8065
|
-
const [avatar, setAvatar] =
|
|
8066
|
-
const [isLoading, setIsLoading] =
|
|
8067
|
-
const [error, setError] =
|
|
8068
|
-
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 () => {
|
|
8069
8486
|
setIsLoading(true);
|
|
8070
8487
|
setError(null);
|
|
8071
8488
|
try {
|
|
@@ -8091,14 +8508,14 @@ function useLumiaPassportLinkedProfiles() {
|
|
|
8091
8508
|
setIsLoading(false);
|
|
8092
8509
|
}
|
|
8093
8510
|
}, []);
|
|
8094
|
-
|
|
8511
|
+
React27.useEffect(() => {
|
|
8095
8512
|
load();
|
|
8096
8513
|
}, [load]);
|
|
8097
8514
|
return { profiles, avatar, isLoading, error, refresh: load };
|
|
8098
8515
|
}
|
|
8099
8516
|
|
|
8100
8517
|
// src/components/ConnectWalletButton.tsx
|
|
8101
|
-
import { jsx as
|
|
8518
|
+
import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
8102
8519
|
var ConnectWalletButton = ({
|
|
8103
8520
|
className,
|
|
8104
8521
|
label = "Connect Wallet",
|
|
@@ -8110,7 +8527,7 @@ var ConnectWalletButton = ({
|
|
|
8110
8527
|
}) => {
|
|
8111
8528
|
console.log("[ConnectWalletButton] Component rendering");
|
|
8112
8529
|
const { config, callbacks: contextCallbacks } = useLumiaPassportConfig();
|
|
8113
|
-
const callbacks =
|
|
8530
|
+
const callbacks = React28.useMemo(() => ({
|
|
8114
8531
|
onLumiaPassportConnecting: buttonCallbacks?.onLumiaPassportConnecting ?? contextCallbacks?.onLumiaPassportConnecting,
|
|
8115
8532
|
onLumiaPassportConnect: buttonCallbacks?.onLumiaPassportConnect ?? contextCallbacks?.onLumiaPassportConnect,
|
|
8116
8533
|
onLumiaPassportAccount: buttonCallbacks?.onLumiaPassportAccount ?? contextCallbacks?.onLumiaPassportAccount,
|
|
@@ -8128,14 +8545,14 @@ var ConnectWalletButton = ({
|
|
|
8128
8545
|
isAuthenticated: jwtTokenManager2.isAuthenticated?.(),
|
|
8129
8546
|
hasTokens: !!jwtTokenManager2.getTokens()
|
|
8130
8547
|
});
|
|
8131
|
-
|
|
8548
|
+
React28.useEffect(() => {
|
|
8132
8549
|
if (!profilesLoading && profiles.length > 0) {
|
|
8133
8550
|
console.log("[ConnectWalletButton] Profiles loaded:", profiles.map((p) => ({ provider: p.provider, externalId: p.externalId })));
|
|
8134
8551
|
const hasEmail = profiles.some((p) => p.provider?.toLowerCase() === "email");
|
|
8135
8552
|
console.log("[ConnectWalletButton] Has email provider:", hasEmail);
|
|
8136
8553
|
}
|
|
8137
8554
|
}, [profiles, profilesLoading]);
|
|
8138
|
-
|
|
8555
|
+
React28.useEffect(() => {
|
|
8139
8556
|
console.log("[ConnectWalletButton] Theme state:", {
|
|
8140
8557
|
configTheme: config.ui.theme,
|
|
8141
8558
|
resolvedTheme,
|
|
@@ -8143,20 +8560,21 @@ var ConnectWalletButton = ({
|
|
|
8143
8560
|
bodyClasses: document.body.className
|
|
8144
8561
|
});
|
|
8145
8562
|
}, [config.ui.theme, resolvedTheme, isDark]);
|
|
8146
|
-
const [isAuthModalOpen, setIsAuthModalOpen] =
|
|
8147
|
-
const [recoveryUserId, setRecoveryUserId] =
|
|
8148
|
-
const tssManagerRef =
|
|
8149
|
-
const [isWalletMenuOpen, setIsWalletMenuOpen] =
|
|
8150
|
-
const [copied, setCopied] =
|
|
8151
|
-
const [isManageWalletOpen, setIsManageWalletOpen] =
|
|
8152
|
-
const [isSecurityOpen, setIsSecurityOpen] =
|
|
8153
|
-
const [
|
|
8154
|
-
const [
|
|
8155
|
-
const [
|
|
8156
|
-
const [
|
|
8157
|
-
const [
|
|
8158
|
-
const [
|
|
8159
|
-
|
|
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(() => {
|
|
8160
8578
|
try {
|
|
8161
8579
|
const shouldAutoOpen = authOpen ?? config?.ui?.authOpen;
|
|
8162
8580
|
if (!address && !session && shouldAutoOpen) {
|
|
@@ -8183,25 +8601,25 @@ var ConnectWalletButton = ({
|
|
|
8183
8601
|
refetchOnWindowFocus: true
|
|
8184
8602
|
}
|
|
8185
8603
|
});
|
|
8186
|
-
const formatAddress =
|
|
8604
|
+
const formatAddress = React28.useCallback((addr) => {
|
|
8187
8605
|
if (!addr) return "";
|
|
8188
8606
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
8189
8607
|
}, []);
|
|
8190
|
-
const avatar =
|
|
8191
|
-
const displayName =
|
|
8192
|
-
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(() => {
|
|
8193
8611
|
if (!balance || balanceLoading) return "0.0000";
|
|
8194
8612
|
return parseFloat(balance.formatted).toFixed(4);
|
|
8195
8613
|
}, [balance, balanceLoading]);
|
|
8196
|
-
const [hasServerVault, setHasServerVault] =
|
|
8197
|
-
const indicators =
|
|
8614
|
+
const [hasServerVault, setHasServerVault] = React28.useState(false);
|
|
8615
|
+
const indicators = React28.useMemo(() => {
|
|
8198
8616
|
const userId = jwtTokenManager2.getUserId();
|
|
8199
8617
|
if (!userId) return { server: false, local: false, backup: false };
|
|
8200
8618
|
const server = jwtTokenManager2.getHasKeyshare() ?? false;
|
|
8201
8619
|
const local = !!address;
|
|
8202
8620
|
return { server, local, backup: hasServerVault };
|
|
8203
8621
|
}, [session, address, hasServerVault]);
|
|
8204
|
-
const handleAuthModalSuccess =
|
|
8622
|
+
const handleAuthModalSuccess = React28.useCallback(async () => {
|
|
8205
8623
|
await new Promise((r) => setTimeout(r, 100));
|
|
8206
8624
|
const userId = jwtTokenManager2.getUserId();
|
|
8207
8625
|
const isAuthenticated = jwtTokenManager2.isAuthenticated();
|
|
@@ -8253,7 +8671,7 @@ var ConnectWalletButton = ({
|
|
|
8253
8671
|
}
|
|
8254
8672
|
}
|
|
8255
8673
|
}, [onConnected, setAddress, setError, setSession, setStatus]);
|
|
8256
|
-
const handleDisconnect =
|
|
8674
|
+
const handleDisconnect = React28.useCallback(async () => {
|
|
8257
8675
|
const prevAddress = address;
|
|
8258
8676
|
let userId = null;
|
|
8259
8677
|
try {
|
|
@@ -8273,7 +8691,7 @@ var ConnectWalletButton = ({
|
|
|
8273
8691
|
} catch {
|
|
8274
8692
|
}
|
|
8275
8693
|
}, [setAddress, setError, setSession, setStatus]);
|
|
8276
|
-
|
|
8694
|
+
React28.useEffect(() => {
|
|
8277
8695
|
if (address) {
|
|
8278
8696
|
(async () => {
|
|
8279
8697
|
try {
|
|
@@ -8290,7 +8708,7 @@ var ConnectWalletButton = ({
|
|
|
8290
8708
|
setHasServerVault(false);
|
|
8291
8709
|
}
|
|
8292
8710
|
}, [address]);
|
|
8293
|
-
|
|
8711
|
+
React28.useEffect(() => {
|
|
8294
8712
|
console.log("[UI-KIT][AutoConnect] useEffect mounted");
|
|
8295
8713
|
let cancelled = false;
|
|
8296
8714
|
const tryAutoConnect = async (attempt) => {
|
|
@@ -8395,13 +8813,13 @@ var ConnectWalletButton = ({
|
|
|
8395
8813
|
cancelled = true;
|
|
8396
8814
|
};
|
|
8397
8815
|
}, []);
|
|
8398
|
-
|
|
8816
|
+
React28.useEffect(() => {
|
|
8399
8817
|
if (address && refetchBalance) {
|
|
8400
8818
|
refetchBalance();
|
|
8401
8819
|
}
|
|
8402
8820
|
}, [address]);
|
|
8403
|
-
return /* @__PURE__ */
|
|
8404
|
-
/* @__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(
|
|
8405
8823
|
"button",
|
|
8406
8824
|
{
|
|
8407
8825
|
onClick: () => {
|
|
@@ -8438,56 +8856,56 @@ var ConnectWalletButton = ({
|
|
|
8438
8856
|
},
|
|
8439
8857
|
children: label || "Connect"
|
|
8440
8858
|
}
|
|
8441
|
-
) }) : /* @__PURE__ */
|
|
8859
|
+
) }) : /* @__PURE__ */ jsx33(
|
|
8442
8860
|
"div",
|
|
8443
8861
|
{
|
|
8444
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"}`,
|
|
8445
8863
|
onClick: () => setIsWalletMenuOpen(true),
|
|
8446
|
-
children: /* @__PURE__ */
|
|
8447
|
-
/* @__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 ? (
|
|
8448
8866
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8449
|
-
/* @__PURE__ */
|
|
8450
|
-
) : /* @__PURE__ */
|
|
8451
|
-
/* @__PURE__ */
|
|
8452
|
-
/* @__PURE__ */
|
|
8453
|
-
/* @__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: [
|
|
8454
8872
|
formatBalance(),
|
|
8455
8873
|
" LUMIA"
|
|
8456
8874
|
] })
|
|
8457
8875
|
] }),
|
|
8458
|
-
/* @__PURE__ */
|
|
8459
|
-
/* @__PURE__ */
|
|
8460
|
-
/* @__PURE__ */
|
|
8461
|
-
|
|
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,
|
|
8462
8880
|
{
|
|
8463
8881
|
className: `w-3 h-3 ${indicators.server ? "text-green-500" : "text-orange-400"}`
|
|
8464
8882
|
}
|
|
8465
8883
|
),
|
|
8466
|
-
/* @__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: [
|
|
8467
8885
|
"Server Keyshare: ",
|
|
8468
8886
|
indicators.server ? "Available" : "Missing"
|
|
8469
8887
|
] })
|
|
8470
8888
|
] }),
|
|
8471
|
-
/* @__PURE__ */
|
|
8472
|
-
/* @__PURE__ */
|
|
8889
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8890
|
+
/* @__PURE__ */ jsx33(
|
|
8473
8891
|
Laptop2,
|
|
8474
8892
|
{
|
|
8475
8893
|
className: `w-3 h-3 ${indicators.local ? "text-green-500" : "text-orange-400"}`
|
|
8476
8894
|
}
|
|
8477
8895
|
),
|
|
8478
|
-
/* @__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: [
|
|
8479
8897
|
"Local Keyshare: ",
|
|
8480
8898
|
indicators.local ? "Available" : "Missing"
|
|
8481
8899
|
] })
|
|
8482
8900
|
] }),
|
|
8483
|
-
/* @__PURE__ */
|
|
8484
|
-
/* @__PURE__ */
|
|
8485
|
-
|
|
8901
|
+
/* @__PURE__ */ jsxs24("div", { className: "group relative", children: [
|
|
8902
|
+
/* @__PURE__ */ jsx33(
|
|
8903
|
+
Shield5,
|
|
8486
8904
|
{
|
|
8487
8905
|
className: `w-3 h-3 ${indicators.backup ? "text-green-500" : "text-orange-400"}`
|
|
8488
8906
|
}
|
|
8489
8907
|
),
|
|
8490
|
-
/* @__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: [
|
|
8491
8909
|
"Vault Backup: ",
|
|
8492
8910
|
indicators.backup ? "Available" : "Not Found"
|
|
8493
8911
|
] })
|
|
@@ -8496,59 +8914,59 @@ var ConnectWalletButton = ({
|
|
|
8496
8914
|
] })
|
|
8497
8915
|
}
|
|
8498
8916
|
) }),
|
|
8499
|
-
isWalletMenuOpen && address && /* @__PURE__ */
|
|
8500
|
-
/* @__PURE__ */
|
|
8501
|
-
/* @__PURE__ */
|
|
8502
|
-
/* @__PURE__ */
|
|
8503
|
-
/* @__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 ? (
|
|
8504
8922
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8505
|
-
/* @__PURE__ */
|
|
8506
|
-
) : /* @__PURE__ */
|
|
8507
|
-
/* @__PURE__ */
|
|
8508
|
-
/* @__PURE__ */
|
|
8509
|
-
/* @__PURE__ */
|
|
8510
|
-
/* @__PURE__ */
|
|
8511
|
-
/* @__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 () => {
|
|
8512
8930
|
try {
|
|
8513
8931
|
await navigator.clipboard.writeText(address);
|
|
8514
8932
|
setCopied(true);
|
|
8515
8933
|
setTimeout(() => setCopied(false), 1500);
|
|
8516
8934
|
} catch {
|
|
8517
8935
|
}
|
|
8518
|
-
}, 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" }) })
|
|
8519
8937
|
] })
|
|
8520
8938
|
] })
|
|
8521
8939
|
] }) }) }),
|
|
8522
|
-
/* @__PURE__ */
|
|
8523
|
-
/* @__PURE__ */
|
|
8524
|
-
/* @__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: () => {
|
|
8525
8943
|
setIsWalletMenuOpen(false);
|
|
8526
8944
|
setIsSendOpen(true);
|
|
8527
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: [
|
|
8528
|
-
/* @__PURE__ */
|
|
8529
|
-
/* @__PURE__ */
|
|
8946
|
+
/* @__PURE__ */ jsx33(ArrowUp, { className: "w-5 h-5" }),
|
|
8947
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Send" })
|
|
8530
8948
|
] }),
|
|
8531
|
-
/* @__PURE__ */
|
|
8949
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8532
8950
|
setIsWalletMenuOpen(false);
|
|
8533
8951
|
setIsReceiveOpen(true);
|
|
8534
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: [
|
|
8535
|
-
/* @__PURE__ */
|
|
8536
|
-
/* @__PURE__ */
|
|
8953
|
+
/* @__PURE__ */ jsx33(ArrowDown, { className: "w-5 h-5" }),
|
|
8954
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Receive" })
|
|
8537
8955
|
] }),
|
|
8538
|
-
/* @__PURE__ */
|
|
8956
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8539
8957
|
setIsWalletMenuOpen(false);
|
|
8540
8958
|
setIsBuyOpen(true);
|
|
8541
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: [
|
|
8542
|
-
/* @__PURE__ */
|
|
8543
|
-
/* @__PURE__ */
|
|
8960
|
+
/* @__PURE__ */ jsx33(Plus2, { className: "w-5 h-5" }),
|
|
8961
|
+
/* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: "Buy" })
|
|
8544
8962
|
] })
|
|
8545
8963
|
] }),
|
|
8546
|
-
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */
|
|
8547
|
-
/* @__PURE__ */
|
|
8548
|
-
/* @__PURE__ */
|
|
8549
|
-
/* @__PURE__ */
|
|
8550
|
-
/* @__PURE__ */
|
|
8551
|
-
/* @__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(
|
|
8552
8970
|
"button",
|
|
8553
8971
|
{
|
|
8554
8972
|
onClick: () => {
|
|
@@ -8557,19 +8975,19 @@ var ConnectWalletButton = ({
|
|
|
8557
8975
|
},
|
|
8558
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"}`,
|
|
8559
8977
|
children: [
|
|
8560
|
-
/* @__PURE__ */
|
|
8978
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: "w-3 h-3 inline mr-1" }),
|
|
8561
8979
|
"Create Backup"
|
|
8562
8980
|
]
|
|
8563
8981
|
}
|
|
8564
8982
|
)
|
|
8565
8983
|
] })
|
|
8566
8984
|
] }) }),
|
|
8567
|
-
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */
|
|
8568
|
-
/* @__PURE__ */
|
|
8569
|
-
/* @__PURE__ */
|
|
8570
|
-
/* @__PURE__ */
|
|
8571
|
-
/* @__PURE__ */
|
|
8572
|
-
/* @__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(
|
|
8573
8991
|
"button",
|
|
8574
8992
|
{
|
|
8575
8993
|
onClick: () => {
|
|
@@ -8578,80 +8996,87 @@ var ConnectWalletButton = ({
|
|
|
8578
8996
|
},
|
|
8579
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"}`,
|
|
8580
8998
|
children: [
|
|
8581
|
-
/* @__PURE__ */
|
|
8999
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: "w-3 h-3 inline mr-1" }),
|
|
8582
9000
|
"Connect Email"
|
|
8583
9001
|
]
|
|
8584
9002
|
}
|
|
8585
9003
|
)
|
|
8586
9004
|
] })
|
|
8587
9005
|
] }) }),
|
|
8588
|
-
/* @__PURE__ */
|
|
9006
|
+
/* @__PURE__ */ jsx33(
|
|
8589
9007
|
"button",
|
|
8590
9008
|
{
|
|
8591
9009
|
onClick: () => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank"),
|
|
8592
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`,
|
|
8593
|
-
children: /* @__PURE__ */
|
|
8594
|
-
/* @__PURE__ */
|
|
8595
|
-
/* @__PURE__ */
|
|
8596
|
-
/* @__PURE__ */
|
|
8597
|
-
/* @__PURE__ */
|
|
8598
|
-
/* @__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: [
|
|
8599
9017
|
formatBalance(),
|
|
8600
9018
|
" LUMIA"
|
|
8601
9019
|
] })
|
|
8602
9020
|
] })
|
|
8603
9021
|
] }),
|
|
8604
|
-
/* @__PURE__ */
|
|
9022
|
+
/* @__PURE__ */ jsx33("div", { className: theme.iconColor, children: /* @__PURE__ */ jsx33(ArrowUpRight2, { className: "w-4 h-4" }) })
|
|
8605
9023
|
] })
|
|
8606
9024
|
}
|
|
8607
9025
|
),
|
|
8608
|
-
/* @__PURE__ */
|
|
8609
|
-
config.features?.kycNeeded && /* @__PURE__ */
|
|
9026
|
+
/* @__PURE__ */ jsxs24("div", { className: "space-y-1", children: [
|
|
9027
|
+
config.features?.kycNeeded && /* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8610
9028
|
setIsWalletMenuOpen(false);
|
|
8611
9029
|
setIsKycOpen(true);
|
|
8612
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: [
|
|
8613
|
-
/* @__PURE__ */
|
|
8614
|
-
/* @__PURE__ */
|
|
9031
|
+
/* @__PURE__ */ jsx33(ShieldCheck2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9032
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "KYC" })
|
|
8615
9033
|
] }),
|
|
8616
|
-
/* @__PURE__ */
|
|
9034
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8617
9035
|
setIsWalletMenuOpen(false);
|
|
8618
9036
|
setIsTransactionsOpen(true);
|
|
8619
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: [
|
|
8620
|
-
/* @__PURE__ */
|
|
8621
|
-
/* @__PURE__ */
|
|
9038
|
+
/* @__PURE__ */ jsx33(Activity2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9039
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Transactions" })
|
|
8622
9040
|
] }),
|
|
8623
|
-
/* @__PURE__ */
|
|
9041
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8624
9042
|
setIsWalletMenuOpen(false);
|
|
8625
9043
|
setIsViewAssetsOpen(true);
|
|
8626
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: [
|
|
8627
|
-
/* @__PURE__ */
|
|
8628
|
-
/* @__PURE__ */
|
|
9045
|
+
/* @__PURE__ */ jsx33(Gem2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9046
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "View Assets" })
|
|
8629
9047
|
] }),
|
|
8630
|
-
/* @__PURE__ */
|
|
9048
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8631
9049
|
setIsWalletMenuOpen(false);
|
|
8632
9050
|
setIsManageWalletOpen(true);
|
|
8633
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: [
|
|
8634
|
-
/* @__PURE__ */
|
|
8635
|
-
/* @__PURE__ */
|
|
9052
|
+
/* @__PURE__ */ jsx33(CreditCard2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9053
|
+
/* @__PURE__ */ jsx33("span", { className: theme.titleText, children: "Manage Wallet" })
|
|
8636
9054
|
] }),
|
|
8637
|
-
/* @__PURE__ */
|
|
9055
|
+
/* @__PURE__ */ jsxs24("button", { onClick: () => {
|
|
8638
9056
|
setIsWalletMenuOpen(false);
|
|
8639
9057
|
setIsSecurityOpen(true);
|
|
8640
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: [
|
|
8641
|
-
/* @__PURE__ */
|
|
8642
|
-
/* @__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" })
|
|
8643
9068
|
] }),
|
|
8644
|
-
/* @__PURE__ */
|
|
9069
|
+
/* @__PURE__ */ jsxs24("button", { onClick: async () => {
|
|
8645
9070
|
await handleDisconnect();
|
|
8646
9071
|
setIsWalletMenuOpen(false);
|
|
8647
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: [
|
|
8648
|
-
/* @__PURE__ */
|
|
8649
|
-
/* @__PURE__ */
|
|
9073
|
+
/* @__PURE__ */ jsx33(ArrowUpRight2, { className: "w-5 h-5 text-red-600" }),
|
|
9074
|
+
/* @__PURE__ */ jsx33("span", { className: "text-red-600", children: "Disconnect Wallet" })
|
|
8650
9075
|
] })
|
|
8651
9076
|
] })
|
|
8652
9077
|
] })
|
|
8653
9078
|
] }) }) }),
|
|
8654
|
-
/* @__PURE__ */
|
|
9079
|
+
/* @__PURE__ */ jsx33(
|
|
8655
9080
|
ManageWallet,
|
|
8656
9081
|
{
|
|
8657
9082
|
open: isManageWalletOpen,
|
|
@@ -8662,7 +9087,7 @@ var ConnectWalletButton = ({
|
|
|
8662
9087
|
}
|
|
8663
9088
|
}
|
|
8664
9089
|
),
|
|
8665
|
-
/* @__PURE__ */
|
|
9090
|
+
/* @__PURE__ */ jsx33(
|
|
8666
9091
|
SecurityModal,
|
|
8667
9092
|
{
|
|
8668
9093
|
open: isSecurityOpen,
|
|
@@ -8673,7 +9098,23 @@ var ConnectWalletButton = ({
|
|
|
8673
9098
|
}
|
|
8674
9099
|
}
|
|
8675
9100
|
),
|
|
8676
|
-
/* @__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(
|
|
8677
9118
|
TransactionsModal,
|
|
8678
9119
|
{
|
|
8679
9120
|
open: isTransactionsOpen,
|
|
@@ -8684,7 +9125,7 @@ var ConnectWalletButton = ({
|
|
|
8684
9125
|
}
|
|
8685
9126
|
}
|
|
8686
9127
|
),
|
|
8687
|
-
/* @__PURE__ */
|
|
9128
|
+
/* @__PURE__ */ jsx33(
|
|
8688
9129
|
ViewAssetsModal,
|
|
8689
9130
|
{
|
|
8690
9131
|
open: isViewAssetsOpen,
|
|
@@ -8695,7 +9136,7 @@ var ConnectWalletButton = ({
|
|
|
8695
9136
|
}
|
|
8696
9137
|
}
|
|
8697
9138
|
),
|
|
8698
|
-
/* @__PURE__ */
|
|
9139
|
+
/* @__PURE__ */ jsx33(
|
|
8699
9140
|
SendModal,
|
|
8700
9141
|
{
|
|
8701
9142
|
open: isSendOpen,
|
|
@@ -8706,7 +9147,7 @@ var ConnectWalletButton = ({
|
|
|
8706
9147
|
}
|
|
8707
9148
|
}
|
|
8708
9149
|
),
|
|
8709
|
-
/* @__PURE__ */
|
|
9150
|
+
/* @__PURE__ */ jsx33(
|
|
8710
9151
|
ReceiveModal,
|
|
8711
9152
|
{
|
|
8712
9153
|
open: isReceiveOpen,
|
|
@@ -8717,7 +9158,7 @@ var ConnectWalletButton = ({
|
|
|
8717
9158
|
}
|
|
8718
9159
|
}
|
|
8719
9160
|
),
|
|
8720
|
-
/* @__PURE__ */
|
|
9161
|
+
/* @__PURE__ */ jsx33(
|
|
8721
9162
|
BuyModal,
|
|
8722
9163
|
{
|
|
8723
9164
|
open: isBuyOpen,
|
|
@@ -8728,7 +9169,7 @@ var ConnectWalletButton = ({
|
|
|
8728
9169
|
}
|
|
8729
9170
|
}
|
|
8730
9171
|
),
|
|
8731
|
-
/* @__PURE__ */
|
|
9172
|
+
/* @__PURE__ */ jsx33(
|
|
8732
9173
|
KycModal,
|
|
8733
9174
|
{
|
|
8734
9175
|
open: isKycOpen,
|
|
@@ -8739,7 +9180,7 @@ var ConnectWalletButton = ({
|
|
|
8739
9180
|
}
|
|
8740
9181
|
}
|
|
8741
9182
|
),
|
|
8742
|
-
/* @__PURE__ */
|
|
9183
|
+
/* @__PURE__ */ jsx33(
|
|
8743
9184
|
AuthModal,
|
|
8744
9185
|
{
|
|
8745
9186
|
open: isAuthModalOpen,
|
|
@@ -8784,7 +9225,7 @@ var ConnectWalletButton = ({
|
|
|
8784
9225
|
}
|
|
8785
9226
|
}
|
|
8786
9227
|
),
|
|
8787
|
-
/* @__PURE__ */
|
|
9228
|
+
/* @__PURE__ */ jsx33(
|
|
8788
9229
|
TssManagerWithRef,
|
|
8789
9230
|
{
|
|
8790
9231
|
ref: tssManagerRef,
|
|
@@ -8802,7 +9243,7 @@ var ConnectWalletButton = ({
|
|
|
8802
9243
|
};
|
|
8803
9244
|
|
|
8804
9245
|
// src/components/ThemeToggle.tsx
|
|
8805
|
-
import { jsx as
|
|
9246
|
+
import { jsx as jsx34, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
8806
9247
|
var ThemeToggle = () => {
|
|
8807
9248
|
const { config, updateConfig } = useLumiaPassportConfig();
|
|
8808
9249
|
const currentTheme = config.ui.theme;
|
|
@@ -8847,7 +9288,7 @@ var ThemeToggle = () => {
|
|
|
8847
9288
|
return "auto";
|
|
8848
9289
|
}
|
|
8849
9290
|
};
|
|
8850
|
-
return /* @__PURE__ */
|
|
9291
|
+
return /* @__PURE__ */ jsx34("div", { className: "lumia-scope", children: /* @__PURE__ */ jsxs25(
|
|
8851
9292
|
"button",
|
|
8852
9293
|
{
|
|
8853
9294
|
onClick: cycleTheme,
|
|
@@ -8863,29 +9304,29 @@ var ThemeToggle = () => {
|
|
|
8863
9304
|
};
|
|
8864
9305
|
|
|
8865
9306
|
// src/components/LumiaLogo.tsx
|
|
8866
|
-
import { jsx as
|
|
9307
|
+
import { jsx as jsx35, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
8867
9308
|
var LumiaLogo2 = ({ size = 80, className = "" }) => {
|
|
8868
|
-
return /* @__PURE__ */
|
|
9309
|
+
return /* @__PURE__ */ jsx35(
|
|
8869
9310
|
"div",
|
|
8870
9311
|
{
|
|
8871
9312
|
className: `flex items-center justify-center ${className}`,
|
|
8872
9313
|
style: { width: size, height: size },
|
|
8873
|
-
children: /* @__PURE__ */
|
|
8874
|
-
/* @__PURE__ */
|
|
8875
|
-
/* @__PURE__ */
|
|
8876
|
-
/* @__PURE__ */
|
|
8877
|
-
/* @__PURE__ */
|
|
8878
|
-
/* @__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" })
|
|
8879
9320
|
] })
|
|
8880
9321
|
}
|
|
8881
9322
|
);
|
|
8882
9323
|
};
|
|
8883
9324
|
|
|
8884
9325
|
// src/hooks/useTheme.ts
|
|
8885
|
-
import { useMemo as
|
|
9326
|
+
import { useMemo as useMemo6, useState as useState16, useEffect as useEffect13 } from "react";
|
|
8886
9327
|
function useTheme2(configTheme) {
|
|
8887
|
-
const [systemTheme, setSystemTheme] =
|
|
8888
|
-
|
|
9328
|
+
const [systemTheme, setSystemTheme] = useState16("light");
|
|
9329
|
+
useEffect13(() => {
|
|
8889
9330
|
if (typeof window === "undefined" || !window.matchMedia) return;
|
|
8890
9331
|
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
8891
9332
|
const updateSystemTheme = () => {
|
|
@@ -8895,14 +9336,14 @@ function useTheme2(configTheme) {
|
|
|
8895
9336
|
mediaQuery.addEventListener("change", updateSystemTheme);
|
|
8896
9337
|
return () => mediaQuery.removeEventListener("change", updateSystemTheme);
|
|
8897
9338
|
}, []);
|
|
8898
|
-
const resolvedTheme =
|
|
9339
|
+
const resolvedTheme = useMemo6(() => {
|
|
8899
9340
|
if (configTheme === "auto") {
|
|
8900
9341
|
return systemTheme;
|
|
8901
9342
|
}
|
|
8902
9343
|
return configTheme;
|
|
8903
9344
|
}, [configTheme, systemTheme]);
|
|
8904
9345
|
const isDark = resolvedTheme === "dark";
|
|
8905
|
-
const themeClasses =
|
|
9346
|
+
const themeClasses = useMemo6(
|
|
8906
9347
|
() => ({
|
|
8907
9348
|
// Modal background
|
|
8908
9349
|
modalBg: isDark ? "bg-gray-900" : "bg-white",
|
|
@@ -8938,9 +9379,9 @@ function useTheme2(configTheme) {
|
|
|
8938
9379
|
}
|
|
8939
9380
|
|
|
8940
9381
|
// src/internal/components/Hash.tsx
|
|
8941
|
-
import * as
|
|
9382
|
+
import * as React29 from "react";
|
|
8942
9383
|
import { Copy as Copy6, ExternalLink as ExternalLink5 } from "lucide-react";
|
|
8943
|
-
import { jsx as
|
|
9384
|
+
import { jsx as jsx36, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
8944
9385
|
function toExplorerUrl(kind, value, chain) {
|
|
8945
9386
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
8946
9387
|
if (!base2) return null;
|
|
@@ -8963,12 +9404,12 @@ var Hash = ({
|
|
|
8963
9404
|
}) => {
|
|
8964
9405
|
const value = hash || "";
|
|
8965
9406
|
const explorer = toExplorerUrl(kind, value, chain || void 0);
|
|
8966
|
-
const [copied, setCopied] =
|
|
8967
|
-
if (!value) return /* @__PURE__ */
|
|
8968
|
-
return /* @__PURE__ */
|
|
8969
|
-
label && /* @__PURE__ */
|
|
8970
|
-
/* @__PURE__ */
|
|
8971
|
-
showCopy && /* @__PURE__ */
|
|
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(
|
|
8972
9413
|
Button,
|
|
8973
9414
|
{
|
|
8974
9415
|
variant: "ghost",
|
|
@@ -8982,10 +9423,10 @@ var Hash = ({
|
|
|
8982
9423
|
} catch {
|
|
8983
9424
|
}
|
|
8984
9425
|
},
|
|
8985
|
-
children: /* @__PURE__ */
|
|
9426
|
+
children: /* @__PURE__ */ jsx36(Copy6, { className: "h-4 w-4" })
|
|
8986
9427
|
}
|
|
8987
9428
|
),
|
|
8988
|
-
showExplorer && explorer && /* @__PURE__ */
|
|
9429
|
+
showExplorer && explorer && /* @__PURE__ */ jsx36(
|
|
8989
9430
|
"a",
|
|
8990
9431
|
{
|
|
8991
9432
|
href: explorer,
|
|
@@ -8993,7 +9434,7 @@ var Hash = ({
|
|
|
8993
9434
|
rel: "noreferrer noopener",
|
|
8994
9435
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
8995
9436
|
title: "Open in explorer",
|
|
8996
|
-
children: /* @__PURE__ */
|
|
9437
|
+
children: /* @__PURE__ */ jsx36(ExternalLink5, { className: "h-4 w-4" })
|
|
8997
9438
|
}
|
|
8998
9439
|
)
|
|
8999
9440
|
] });
|
|
@@ -9001,16 +9442,16 @@ var Hash = ({
|
|
|
9001
9442
|
|
|
9002
9443
|
// src/internal/components/TransactionsList.tsx
|
|
9003
9444
|
init_base();
|
|
9004
|
-
import { useState as
|
|
9005
|
-
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";
|
|
9006
9447
|
var TransactionsList = ({
|
|
9007
9448
|
address,
|
|
9008
9449
|
itemsCount = 10
|
|
9009
9450
|
}) => {
|
|
9010
|
-
const [transactions, setTransactions] =
|
|
9011
|
-
const [loading, setLoading] =
|
|
9012
|
-
const [error, setError] =
|
|
9013
|
-
|
|
9451
|
+
const [transactions, setTransactions] = useState18([]);
|
|
9452
|
+
const [loading, setLoading] = useState18(true);
|
|
9453
|
+
const [error, setError] = useState18(null);
|
|
9454
|
+
useEffect14(() => {
|
|
9014
9455
|
const fetchTransactions = async () => {
|
|
9015
9456
|
try {
|
|
9016
9457
|
setLoading(true);
|
|
@@ -9056,15 +9497,15 @@ var TransactionsList = ({
|
|
|
9056
9497
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
9057
9498
|
};
|
|
9058
9499
|
if (loading) {
|
|
9059
|
-
return /* @__PURE__ */
|
|
9060
|
-
/* @__PURE__ */
|
|
9061
|
-
/* @__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..." })
|
|
9062
9503
|
] });
|
|
9063
9504
|
}
|
|
9064
9505
|
if (error) {
|
|
9065
|
-
return /* @__PURE__ */
|
|
9066
|
-
/* @__PURE__ */
|
|
9067
|
-
/* @__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(
|
|
9068
9509
|
"button",
|
|
9069
9510
|
{
|
|
9070
9511
|
onClick: () => window.location.reload(),
|
|
@@ -9075,54 +9516,54 @@ var TransactionsList = ({
|
|
|
9075
9516
|
] });
|
|
9076
9517
|
}
|
|
9077
9518
|
if (transactions.length === 0) {
|
|
9078
|
-
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" }) });
|
|
9079
9520
|
}
|
|
9080
|
-
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(
|
|
9081
9522
|
"div",
|
|
9082
9523
|
{
|
|
9083
9524
|
className: "border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors",
|
|
9084
9525
|
onClick: () => openTransaction(tx.hash),
|
|
9085
9526
|
children: [
|
|
9086
|
-
/* @__PURE__ */
|
|
9087
|
-
/* @__PURE__ */
|
|
9088
|
-
/* @__PURE__ */
|
|
9089
|
-
/* @__PURE__ */
|
|
9090
|
-
/* @__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" })
|
|
9091
9532
|
] }),
|
|
9092
|
-
/* @__PURE__ */
|
|
9093
|
-
/* @__PURE__ */
|
|
9094
|
-
/* @__PURE__ */
|
|
9095
|
-
/* @__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: [
|
|
9096
9537
|
formatAddress(tx.from.hash),
|
|
9097
|
-
tx.from.is_contract && /* @__PURE__ */
|
|
9538
|
+
tx.from.is_contract && /* @__PURE__ */ jsx37("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9098
9539
|
] })
|
|
9099
9540
|
] }),
|
|
9100
|
-
/* @__PURE__ */
|
|
9101
|
-
/* @__PURE__ */
|
|
9102
|
-
/* @__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: [
|
|
9103
9544
|
formatAddress(tx.to.hash),
|
|
9104
|
-
tx.to.is_contract && /* @__PURE__ */
|
|
9545
|
+
tx.to.is_contract && /* @__PURE__ */ jsx37("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
9105
9546
|
] })
|
|
9106
9547
|
] }),
|
|
9107
|
-
/* @__PURE__ */
|
|
9108
|
-
/* @__PURE__ */
|
|
9109
|
-
/* @__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: [
|
|
9110
9551
|
formatValue(tx.value),
|
|
9111
9552
|
" LUMIA"
|
|
9112
9553
|
] })
|
|
9113
9554
|
] })
|
|
9114
9555
|
] })
|
|
9115
9556
|
] }),
|
|
9116
|
-
/* @__PURE__ */
|
|
9117
|
-
/* @__PURE__ */
|
|
9118
|
-
/* @__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: [
|
|
9119
9560
|
"Gas: ",
|
|
9120
9561
|
parseInt(tx.gas_used).toLocaleString()
|
|
9121
9562
|
] }),
|
|
9122
|
-
tx.method && /* @__PURE__ */
|
|
9563
|
+
tx.method && /* @__PURE__ */ jsx37("div", { className: "mt-1 text-blue-600", children: tx.method })
|
|
9123
9564
|
] })
|
|
9124
9565
|
] }),
|
|
9125
|
-
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(
|
|
9126
9567
|
"span",
|
|
9127
9568
|
{
|
|
9128
9569
|
className: "text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full",
|
|
@@ -9136,247 +9577,6 @@ var TransactionsList = ({
|
|
|
9136
9577
|
)) }) });
|
|
9137
9578
|
};
|
|
9138
9579
|
|
|
9139
|
-
// src/internal/components/KeyshareBackup.tsx
|
|
9140
|
-
import * as React30 from "react";
|
|
9141
|
-
import { Shield as Shield5, Server as Server4, CheckCircle2 as CheckCircle28, AlertCircle as AlertCircle5, Key as Key5, X as X3, Eye as Eye3, EyeOff as EyeOff3, Download as Download2, Cloud as Cloud4, Lock as Lock3 } from "lucide-react";
|
|
9142
|
-
init_vaultClient();
|
|
9143
|
-
import { Fragment as Fragment7, jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
9144
|
-
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
9145
|
-
const [backupStatus, setBackupStatus] = React30.useState(() => getBackupStatus(userId));
|
|
9146
|
-
const [loading, setLoading] = React30.useState({
|
|
9147
|
-
server: false,
|
|
9148
|
-
cloud: false,
|
|
9149
|
-
local: false
|
|
9150
|
-
});
|
|
9151
|
-
const [error, setError] = React30.useState(null);
|
|
9152
|
-
const [success, setSuccess] = React30.useState(null);
|
|
9153
|
-
const [showPassword, setShowPassword] = React30.useState(false);
|
|
9154
|
-
const [useCustomPassword, setUseCustomPassword] = React30.useState(false);
|
|
9155
|
-
const [customPassword, setCustomPassword] = React30.useState("");
|
|
9156
|
-
const [cloudProviders, setCloudProviders] = React30.useState([]);
|
|
9157
|
-
const [selectedCloudProvider, setSelectedCloudProvider] = React30.useState(null);
|
|
9158
|
-
const hasKeyshareData = React30.useMemo(() => {
|
|
9159
|
-
return !!getCurrentKeyshareBackupData(userId);
|
|
9160
|
-
}, [userId]);
|
|
9161
|
-
React30.useEffect(() => {
|
|
9162
|
-
getAvailableCloudProviders2().then((providers) => {
|
|
9163
|
-
setCloudProviders(providers);
|
|
9164
|
-
if (providers.length > 0 && !selectedCloudProvider) {
|
|
9165
|
-
setSelectedCloudProvider(providers[0].id);
|
|
9166
|
-
}
|
|
9167
|
-
});
|
|
9168
|
-
}, [selectedCloudProvider]);
|
|
9169
|
-
const refreshStatus = React30.useCallback(() => {
|
|
9170
|
-
setBackupStatus(getBackupStatus(userId));
|
|
9171
|
-
}, [userId]);
|
|
9172
|
-
React30.useEffect(() => {
|
|
9173
|
-
refreshStatus();
|
|
9174
|
-
}, [refreshStatus]);
|
|
9175
|
-
const handleBackup = async (method) => {
|
|
9176
|
-
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
9177
|
-
setError(null);
|
|
9178
|
-
setSuccess(null);
|
|
9179
|
-
try {
|
|
9180
|
-
const password = useCustomPassword ? customPassword : void 0;
|
|
9181
|
-
switch (method) {
|
|
9182
|
-
case "server":
|
|
9183
|
-
await backupToServer(userId, password);
|
|
9184
|
-
setSuccess("Successfully created server backup");
|
|
9185
|
-
break;
|
|
9186
|
-
case "cloud": {
|
|
9187
|
-
await backupToCloud(userId, password, selectedCloudProvider || void 0);
|
|
9188
|
-
setSuccess(`Successfully created cloud backup`);
|
|
9189
|
-
const updatedProviders = await getAvailableCloudProviders2();
|
|
9190
|
-
setCloudProviders(updatedProviders);
|
|
9191
|
-
break;
|
|
9192
|
-
}
|
|
9193
|
-
case "local":
|
|
9194
|
-
await backupToLocalFile(userId, password);
|
|
9195
|
-
setSuccess("Backup file downloaded successfully");
|
|
9196
|
-
break;
|
|
9197
|
-
}
|
|
9198
|
-
refreshStatus();
|
|
9199
|
-
setTimeout(() => {
|
|
9200
|
-
if (typeof window !== "undefined") {
|
|
9201
|
-
window.dispatchEvent(
|
|
9202
|
-
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
9203
|
-
detail: { method, success: true }
|
|
9204
|
-
})
|
|
9205
|
-
);
|
|
9206
|
-
}
|
|
9207
|
-
onBackupSuccess?.();
|
|
9208
|
-
}, 100);
|
|
9209
|
-
} catch (err) {
|
|
9210
|
-
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
9211
|
-
setError(errorMsg);
|
|
9212
|
-
updateBackupStatus(userId, method, { error: errorMsg });
|
|
9213
|
-
refreshStatus();
|
|
9214
|
-
} finally {
|
|
9215
|
-
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
9216
|
-
}
|
|
9217
|
-
};
|
|
9218
|
-
const formatLastBackup = (timestamp) => {
|
|
9219
|
-
if (!timestamp) return "Never";
|
|
9220
|
-
const date = new Date(timestamp);
|
|
9221
|
-
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
9222
|
-
};
|
|
9223
|
-
return /* @__PURE__ */ jsxs28(Card, { className: "border-green-200 bg-green-50", children: [
|
|
9224
|
-
/* @__PURE__ */ jsx37(CardHeader, { className: "pb-4", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between", children: [
|
|
9225
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3", children: [
|
|
9226
|
-
/* @__PURE__ */ jsx37(Shield5, { className: "h-6 w-6 text-green-600" }),
|
|
9227
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9228
|
-
/* @__PURE__ */ jsx37(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
9229
|
-
/* @__PURE__ */ jsx37(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
9230
|
-
] })
|
|
9231
|
-
] }),
|
|
9232
|
-
onClose && /* @__PURE__ */ jsx37("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ jsx37(X3, { className: "h-4 w-4" }) })
|
|
9233
|
-
] }) }),
|
|
9234
|
-
/* @__PURE__ */ jsxs28(CardContent, { className: "space-y-6", children: [
|
|
9235
|
-
error && /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
9236
|
-
/* @__PURE__ */ jsx37(AlertCircle5, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9237
|
-
/* @__PURE__ */ jsx37("span", { children: error })
|
|
9238
|
-
] }),
|
|
9239
|
-
success && /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
9240
|
-
/* @__PURE__ */ jsx37(CheckCircle28, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9241
|
-
/* @__PURE__ */ jsx37("span", { children: success })
|
|
9242
|
-
] }),
|
|
9243
|
-
/* @__PURE__ */ jsxs28("div", { className: "space-y-3", children: [
|
|
9244
|
-
/* @__PURE__ */ jsx37("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
9245
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
9246
|
-
/* @__PURE__ */ jsx37(
|
|
9247
|
-
"input",
|
|
9248
|
-
{
|
|
9249
|
-
type: "checkbox",
|
|
9250
|
-
id: "use-backup-password",
|
|
9251
|
-
checked: useCustomPassword,
|
|
9252
|
-
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
9253
|
-
className: "rounded"
|
|
9254
|
-
}
|
|
9255
|
-
),
|
|
9256
|
-
/* @__PURE__ */ jsx37("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
9257
|
-
] }),
|
|
9258
|
-
!useCustomPassword && /* @__PURE__ */ jsx37("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
|
|
9259
|
-
/* @__PURE__ */ jsx37(Key5, { className: "h-4 w-4" }),
|
|
9260
|
-
/* @__PURE__ */ jsx37("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
9261
|
-
] }) }),
|
|
9262
|
-
useCustomPassword && /* @__PURE__ */ jsxs28("div", { className: "relative", children: [
|
|
9263
|
-
/* @__PURE__ */ jsx37(
|
|
9264
|
-
Input,
|
|
9265
|
-
{
|
|
9266
|
-
type: showPassword ? "text" : "password",
|
|
9267
|
-
placeholder: "Enter backup encryption password",
|
|
9268
|
-
value: customPassword,
|
|
9269
|
-
onChange: (e) => setCustomPassword(e.target.value),
|
|
9270
|
-
className: "pr-10"
|
|
9271
|
-
}
|
|
9272
|
-
),
|
|
9273
|
-
/* @__PURE__ */ jsx37(
|
|
9274
|
-
"button",
|
|
9275
|
-
{
|
|
9276
|
-
type: "button",
|
|
9277
|
-
onClick: () => setShowPassword(!showPassword),
|
|
9278
|
-
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
9279
|
-
children: showPassword ? /* @__PURE__ */ jsx37(EyeOff3, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx37(Eye3, { className: "h-4 w-4" })
|
|
9280
|
-
}
|
|
9281
|
-
)
|
|
9282
|
-
] })
|
|
9283
|
-
] }),
|
|
9284
|
-
/* @__PURE__ */ jsxs28("div", { className: "space-y-4", children: [
|
|
9285
|
-
/* @__PURE__ */ jsx37("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
9286
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
9287
|
-
/* @__PURE__ */ jsx37("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3", children: [
|
|
9288
|
-
/* @__PURE__ */ jsx37(Server4, { className: "h-5 w-5 text-blue-600" }),
|
|
9289
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9290
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
9291
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
9292
|
-
] })
|
|
9293
|
-
] }) }),
|
|
9294
|
-
/* @__PURE__ */ jsx37(
|
|
9295
|
-
Button,
|
|
9296
|
-
{
|
|
9297
|
-
onClick: () => handleBackup("server"),
|
|
9298
|
-
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9299
|
-
className: "px-4 py-2",
|
|
9300
|
-
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9301
|
-
}
|
|
9302
|
-
),
|
|
9303
|
-
/* @__PURE__ */ jsxs28("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9304
|
-
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
9305
|
-
formatLastBackup(backupStatus.server.lastBackup)
|
|
9306
|
-
] })
|
|
9307
|
-
] }),
|
|
9308
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
9309
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9310
|
-
/* @__PURE__ */ jsx37(Cloud4, { className: "h-5 w-5 text-sky-600" }),
|
|
9311
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9312
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
9313
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
9314
|
-
] })
|
|
9315
|
-
] }),
|
|
9316
|
-
cloudProviders.length > 1 && /* @__PURE__ */ jsx37("div", { className: "mb-3", children: /* @__PURE__ */ jsx37(
|
|
9317
|
-
"select",
|
|
9318
|
-
{
|
|
9319
|
-
value: selectedCloudProvider || "",
|
|
9320
|
-
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
9321
|
-
className: "text-sm border rounded px-2 py-1 w-full",
|
|
9322
|
-
children: cloudProviders.map((provider) => /* @__PURE__ */ jsxs28("option", { value: provider.id, children: [
|
|
9323
|
-
provider.icon,
|
|
9324
|
-
" ",
|
|
9325
|
-
provider.name,
|
|
9326
|
-
" ",
|
|
9327
|
-
provider.isAuthenticated ? "\u2713" : ""
|
|
9328
|
-
] }, provider.id))
|
|
9329
|
-
}
|
|
9330
|
-
) }),
|
|
9331
|
-
/* @__PURE__ */ jsx37(
|
|
9332
|
-
Button,
|
|
9333
|
-
{
|
|
9334
|
-
onClick: () => handleBackup("cloud"),
|
|
9335
|
-
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
9336
|
-
className: "px-4 py-2",
|
|
9337
|
-
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9338
|
-
}
|
|
9339
|
-
),
|
|
9340
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
9341
|
-
] }),
|
|
9342
|
-
/* @__PURE__ */ jsxs28("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
9343
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9344
|
-
/* @__PURE__ */ jsx37(Download2, { className: "h-5 w-5 text-purple-600" }),
|
|
9345
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9346
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
9347
|
-
/* @__PURE__ */ jsx37("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
9348
|
-
] })
|
|
9349
|
-
] }),
|
|
9350
|
-
/* @__PURE__ */ jsx37(
|
|
9351
|
-
Button,
|
|
9352
|
-
{
|
|
9353
|
-
onClick: () => handleBackup("local"),
|
|
9354
|
-
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9355
|
-
className: "w-full",
|
|
9356
|
-
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
9357
|
-
}
|
|
9358
|
-
),
|
|
9359
|
-
/* @__PURE__ */ jsxs28("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9360
|
-
"Download encrypted backup file to your device \u2022 Last: ",
|
|
9361
|
-
formatLastBackup(backupStatus.local.lastBackup)
|
|
9362
|
-
] })
|
|
9363
|
-
] })
|
|
9364
|
-
] }),
|
|
9365
|
-
/* @__PURE__ */ jsxs28("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
9366
|
-
/* @__PURE__ */ jsx37(Lock3, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
9367
|
-
/* @__PURE__ */ jsxs28("div", { children: [
|
|
9368
|
-
/* @__PURE__ */ jsx37("div", { className: "font-medium", children: "Security Notice" }),
|
|
9369
|
-
/* @__PURE__ */ jsxs28("div", { className: "mt-1", children: [
|
|
9370
|
-
useCustomPassword ? /* @__PURE__ */ jsx37(Fragment7, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ jsx37(Fragment7, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
9371
|
-
" ",
|
|
9372
|
-
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
9373
|
-
] })
|
|
9374
|
-
] })
|
|
9375
|
-
] })
|
|
9376
|
-
] })
|
|
9377
|
-
] });
|
|
9378
|
-
}
|
|
9379
|
-
|
|
9380
9580
|
// src/hooks/useUserOpStatus.ts
|
|
9381
9581
|
init_base();
|
|
9382
9582
|
import * as React31 from "react";
|