@lumiapassport/ui-kit 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +456 -0
- package/dist/iframe/main.js +1251 -2
- package/dist/iframe/main.js.map +1 -1
- package/dist/index.cjs +1154 -750
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +1213 -810
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -2395,6 +2395,7 @@ var init_iframe_manager = __esm({
|
|
|
2395
2395
|
this.iframe.style.zIndex = "999999";
|
|
2396
2396
|
this.iframe.style.background = "rgba(0, 0, 0, 0.5)";
|
|
2397
2397
|
this.iframe.setAttribute("sandbox", "allow-scripts allow-same-origin");
|
|
2398
|
+
this.iframe.setAttribute("allow", "publickey-credentials-get *; publickey-credentials-create *");
|
|
2398
2399
|
this.messageListener = this.handleMessage.bind(this);
|
|
2399
2400
|
window.addEventListener("message", this.messageListener);
|
|
2400
2401
|
document.body.appendChild(this.iframe);
|
|
@@ -2751,6 +2752,92 @@ var init_iframe_manager = __esm({
|
|
|
2751
2752
|
}
|
|
2752
2753
|
return false;
|
|
2753
2754
|
}
|
|
2755
|
+
/**
|
|
2756
|
+
* Create backup of keyshare
|
|
2757
|
+
*/
|
|
2758
|
+
async createBackup(userId, backupRequest, accessToken) {
|
|
2759
|
+
this.log("[IframeManager] Creating backup...");
|
|
2760
|
+
const response = await this.sendMessage("CREATE_BACKUP", {
|
|
2761
|
+
userId,
|
|
2762
|
+
backupRequest,
|
|
2763
|
+
accessToken
|
|
2764
|
+
// Pass access token for TSS API authentication
|
|
2765
|
+
});
|
|
2766
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_CREATED") {
|
|
2767
|
+
return response.result;
|
|
2768
|
+
}
|
|
2769
|
+
throw new Error("Unexpected response type");
|
|
2770
|
+
}
|
|
2771
|
+
/**
|
|
2772
|
+
* Restore keyshare from server backup
|
|
2773
|
+
*/
|
|
2774
|
+
async restoreFromServer(userId, password, accessToken) {
|
|
2775
|
+
this.log("[IframeManager] Restoring backup from server...");
|
|
2776
|
+
const response = await this.sendMessage("RESTORE_BACKUP", {
|
|
2777
|
+
userId,
|
|
2778
|
+
password,
|
|
2779
|
+
accessToken
|
|
2780
|
+
// Pass access token for TSS API authentication
|
|
2781
|
+
});
|
|
2782
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_RESTORED") {
|
|
2783
|
+
return response.result;
|
|
2784
|
+
}
|
|
2785
|
+
throw new Error("Unexpected response type");
|
|
2786
|
+
}
|
|
2787
|
+
/**
|
|
2788
|
+
* Encrypt backup data without uploading (for cloud/local backups)
|
|
2789
|
+
* Returns encrypted data that parent can upload/download
|
|
2790
|
+
*/
|
|
2791
|
+
async encryptBackupData(userId, password) {
|
|
2792
|
+
this.log("[IframeManager] Encrypting backup data...");
|
|
2793
|
+
const response = await this.sendMessage("ENCRYPT_BACKUP_DATA", {
|
|
2794
|
+
userId,
|
|
2795
|
+
password
|
|
2796
|
+
});
|
|
2797
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_ENCRYPTED") {
|
|
2798
|
+
return response.encryptedData;
|
|
2799
|
+
}
|
|
2800
|
+
throw new Error("Unexpected response type");
|
|
2801
|
+
}
|
|
2802
|
+
/**
|
|
2803
|
+
* Restore keyshare from local file backup
|
|
2804
|
+
*/
|
|
2805
|
+
async restoreFromLocalFile(userId, fileContent, password) {
|
|
2806
|
+
this.log("[IframeManager] Restoring backup from local file...");
|
|
2807
|
+
const response = await this.sendMessage("RESTORE_FROM_FILE", {
|
|
2808
|
+
userId,
|
|
2809
|
+
fileContent,
|
|
2810
|
+
password
|
|
2811
|
+
});
|
|
2812
|
+
if (response.type === "LUMIA_PASSPORT_FILE_RESTORED") {
|
|
2813
|
+
return response.result;
|
|
2814
|
+
}
|
|
2815
|
+
throw new Error("Unexpected response type");
|
|
2816
|
+
}
|
|
2817
|
+
/**
|
|
2818
|
+
* Get backup status for user
|
|
2819
|
+
*/
|
|
2820
|
+
async getBackupStatus(userId) {
|
|
2821
|
+
this.log("[IframeManager] Getting backup status...");
|
|
2822
|
+
const response = await this.sendMessage("GET_BACKUP_STATUS", {
|
|
2823
|
+
userId
|
|
2824
|
+
});
|
|
2825
|
+
if (response.type === "LUMIA_PASSPORT_BACKUP_STATUS") {
|
|
2826
|
+
return response.status;
|
|
2827
|
+
}
|
|
2828
|
+
throw new Error("Unexpected response type");
|
|
2829
|
+
}
|
|
2830
|
+
/**
|
|
2831
|
+
* Get available cloud providers
|
|
2832
|
+
*/
|
|
2833
|
+
async getCloudProviders() {
|
|
2834
|
+
this.log("[IframeManager] Getting cloud providers...");
|
|
2835
|
+
const response = await this.sendMessage("GET_CLOUD_PROVIDERS", {});
|
|
2836
|
+
if (response.type === "LUMIA_PASSPORT_CLOUD_PROVIDERS") {
|
|
2837
|
+
return response.providers;
|
|
2838
|
+
}
|
|
2839
|
+
throw new Error("Unexpected response type");
|
|
2840
|
+
}
|
|
2754
2841
|
/**
|
|
2755
2842
|
* Cleanup and destroy iframe
|
|
2756
2843
|
*/
|
|
@@ -2807,6 +2894,7 @@ __export(index_exports, {
|
|
|
2807
2894
|
UserOpStatus: () => UserOpStatus,
|
|
2808
2895
|
getUserProfile: () => getUserProfile,
|
|
2809
2896
|
lumiaBeam: () => lumiaBeam,
|
|
2897
|
+
prepareUserOperation: () => prepareUserOperation,
|
|
2810
2898
|
queryClient: () => queryClient,
|
|
2811
2899
|
sendUserOperation: () => sendUserOperation,
|
|
2812
2900
|
updateUserProfile: () => updateUserProfile,
|
|
@@ -2826,7 +2914,7 @@ __export(index_exports, {
|
|
|
2826
2914
|
module.exports = __toCommonJS(index_exports);
|
|
2827
2915
|
|
|
2828
2916
|
// src/styles/built.css
|
|
2829
|
-
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2917
|
+
var built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[500px\\]{max-width:500px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900\\/40{border-color:rgba(124,45,18,.4)}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900\\/30{background-color:rgba(120,53,15,.3)}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/40{background-color:rgba(17,24,39,.4)}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900\\/20{background-color:rgba(124,45,18,.2)}.lumia-scope .bg-orange-900\\/30{background-color:rgba(124,45,18,.3)}.lumia-scope .bg-orange-900\\/40{background-color:rgba(124,45,18,.4)}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400\\/80{color:rgba(251,146,60,.8)}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .file\\:mr-4::file-selector-button{margin-right:1rem}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-gray-700::file-selector-button{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-purple-50::file-selector-button{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.lumia-scope .file\\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:font-semibold::file-selector-button{font-weight:600}.lumia-scope .file\\:text-gray-200::file-selector-button{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .file\\:text-purple-700::file-selector-button{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-orange-900\\/60:hover{background-color:rgba(124,45,18,.6)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-gray-600::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:file\\:bg-purple-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
2830
2918
|
|
|
2831
2919
|
// src/context/LumiaPassportContext.tsx
|
|
2832
2920
|
var import_react = require("react");
|
|
@@ -3622,6 +3710,7 @@ Input.displayName = "Input";
|
|
|
3622
3710
|
|
|
3623
3711
|
// src/internal/components/KeyshareRestore.tsx
|
|
3624
3712
|
init_vaultClient();
|
|
3713
|
+
init_iframe_manager();
|
|
3625
3714
|
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
3626
3715
|
function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
3627
3716
|
const { config } = useLumiaPassportConfig();
|
|
@@ -3635,6 +3724,14 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3635
3724
|
const [restorePassword, setRestorePassword] = React10.useState("");
|
|
3636
3725
|
const [hasServerBackup, setHasServerBackup] = React10.useState(null);
|
|
3637
3726
|
const [checkingBackup, setCheckingBackup] = React10.useState(true);
|
|
3727
|
+
const iframeManager = React10.useMemo(() => {
|
|
3728
|
+
try {
|
|
3729
|
+
return getIframeManager();
|
|
3730
|
+
} catch (e) {
|
|
3731
|
+
console.error("[KeyshareRestore] Failed to get iframe manager:", e);
|
|
3732
|
+
return null;
|
|
3733
|
+
}
|
|
3734
|
+
}, []);
|
|
3638
3735
|
React10.useEffect(() => {
|
|
3639
3736
|
const checkBackupAvailability = async () => {
|
|
3640
3737
|
try {
|
|
@@ -3657,20 +3754,31 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3657
3754
|
}, [userId]);
|
|
3658
3755
|
const handleRestoreFromServer = async () => {
|
|
3659
3756
|
console.log("[KeyshareRestore] Starting server restore for userId:", userId);
|
|
3757
|
+
if (!iframeManager) {
|
|
3758
|
+
setError("Iframe manager not initialized");
|
|
3759
|
+
return;
|
|
3760
|
+
}
|
|
3660
3761
|
setLoading((prev) => ({ ...prev, server: true }));
|
|
3661
3762
|
setError(null);
|
|
3662
3763
|
setSuccess(null);
|
|
3663
3764
|
try {
|
|
3664
|
-
const passwordToUse = useCustomPassword ? restorePassword :
|
|
3665
|
-
console.log("[KeyshareRestore] Calling restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3666
|
-
await
|
|
3667
|
-
|
|
3668
|
-
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3765
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3766
|
+
console.log("[KeyshareRestore] Calling iframeManager.restoreFromServer with method:", useCustomPassword ? "password" : "passkey");
|
|
3767
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
3768
|
+
const accessToken = jwt?.accessToken;
|
|
3769
|
+
const result = await iframeManager.restoreFromServer(userId, passwordToUse, accessToken);
|
|
3770
|
+
if (result.success) {
|
|
3771
|
+
console.log("[KeyshareRestore] Server restore successful");
|
|
3772
|
+
setSuccess("Successfully restored keyshare from server backup");
|
|
3773
|
+
setTimeout(() => {
|
|
3774
|
+
onRestoreSuccess?.();
|
|
3775
|
+
}, 100);
|
|
3776
|
+
} else {
|
|
3777
|
+
console.error("[KeyshareRestore] Server restore failed:", result.error);
|
|
3778
|
+
setError(result.error || "Server restore failed");
|
|
3779
|
+
}
|
|
3672
3780
|
} catch (err) {
|
|
3673
|
-
console.error("[KeyshareRestore] Server restore
|
|
3781
|
+
console.error("[KeyshareRestore] Server restore exception:", err);
|
|
3674
3782
|
const errorMsg = err instanceof Error ? err.message : "Server restore failed";
|
|
3675
3783
|
setError(errorMsg);
|
|
3676
3784
|
} finally {
|
|
@@ -3687,18 +3795,27 @@ function KeyshareRestore({ userId, onClose, onRestoreSuccess }) {
|
|
|
3687
3795
|
setError("Please enter the backup password");
|
|
3688
3796
|
return;
|
|
3689
3797
|
}
|
|
3798
|
+
if (!iframeManager) {
|
|
3799
|
+
setError("Iframe manager not initialized");
|
|
3800
|
+
return;
|
|
3801
|
+
}
|
|
3690
3802
|
setLoading((prev) => ({ ...prev, file: true }));
|
|
3691
3803
|
setError(null);
|
|
3692
3804
|
setSuccess(null);
|
|
3693
3805
|
try {
|
|
3694
|
-
const
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3806
|
+
const fileContent = await restoreFile.text();
|
|
3807
|
+
const passwordToUse = useCustomPassword ? restorePassword : void 0;
|
|
3808
|
+
const result = await iframeManager.restoreFromLocalFile(userId, fileContent, passwordToUse);
|
|
3809
|
+
if (result.success) {
|
|
3810
|
+
setSuccess("Successfully restored keyshare from backup file");
|
|
3811
|
+
setRestoreFile(null);
|
|
3812
|
+
setRestorePassword("");
|
|
3813
|
+
setTimeout(() => {
|
|
3814
|
+
onRestoreSuccess?.();
|
|
3815
|
+
}, 100);
|
|
3816
|
+
} else {
|
|
3817
|
+
setError(result.error || "File restore failed");
|
|
3818
|
+
}
|
|
3702
3819
|
} catch (err) {
|
|
3703
3820
|
const errorMsg = err instanceof Error ? err.message : "Restore failed";
|
|
3704
3821
|
setError(errorMsg);
|
|
@@ -5294,6 +5411,208 @@ async function sendUserOperation(session, callTarget, amountWei, innerData = "0x
|
|
|
5294
5411
|
}
|
|
5295
5412
|
return hash;
|
|
5296
5413
|
}
|
|
5414
|
+
async function prepareUserOperation(session, callTarget, amountWei, innerData = "0x", feeType = "standard", entryPointVersion = "v0.7") {
|
|
5415
|
+
const entryPointAddress = entryPointVersion === "v0.6" ? ENTRYPOINT_V06 : ENTRYPOINT_V07;
|
|
5416
|
+
const amountWeiBigInt = BigInt(amountWei);
|
|
5417
|
+
const isMinimalTest = callTarget === "0x0000000000000000000000000000000000000000" && amountWei === "0" && innerData === "0x";
|
|
5418
|
+
let callData;
|
|
5419
|
+
if (isMinimalTest) {
|
|
5420
|
+
callData = "0x";
|
|
5421
|
+
} else {
|
|
5422
|
+
callData = (0, import_viem3.encodeFunctionData)({ abi: executeAbi, functionName: "execute", args: [callTarget, amountWeiBigInt, innerData] });
|
|
5423
|
+
}
|
|
5424
|
+
let isDeployed = false;
|
|
5425
|
+
let deploymentMethod = "unknown";
|
|
5426
|
+
try {
|
|
5427
|
+
const code = await publicClient.getCode({ address: session.smartAccountAddress });
|
|
5428
|
+
if (code && code !== "0x" && code.length > 2) {
|
|
5429
|
+
isDeployed = true;
|
|
5430
|
+
deploymentMethod = "getCode";
|
|
5431
|
+
}
|
|
5432
|
+
} catch {
|
|
5433
|
+
}
|
|
5434
|
+
const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress);
|
|
5435
|
+
const nonceValue = BigInt(nonce);
|
|
5436
|
+
if (!isDeployed && nonceValue !== 0n) throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);
|
|
5437
|
+
const shouldIncludeFactory = !isDeployed;
|
|
5438
|
+
let userOp;
|
|
5439
|
+
if (shouldIncludeFactory) {
|
|
5440
|
+
const compatCreateAbi = [{ type: "function", name: "createAccount", stateMutability: "payable", inputs: [{ name: "owner", type: "address" }, { name: "salt", type: "bytes32" }], outputs: [{ name: "", type: "address" }] }];
|
|
5441
|
+
const saltZero = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
5442
|
+
const factoryData = (0, import_viem3.encodeFunctionData)({ abi: compatCreateAbi, functionName: "createAccount", args: [session.ownerAddress, saltZero] });
|
|
5443
|
+
userOp = await (0, import_bundler.createUserOperationWithDynamicFees)(
|
|
5444
|
+
session.smartAccountAddress,
|
|
5445
|
+
nonce,
|
|
5446
|
+
callData,
|
|
5447
|
+
true,
|
|
5448
|
+
session.factoryAddress,
|
|
5449
|
+
factoryData,
|
|
5450
|
+
feeType
|
|
5451
|
+
);
|
|
5452
|
+
} else {
|
|
5453
|
+
userOp = await (0, import_bundler.createUserOperationWithDynamicFees)(
|
|
5454
|
+
session.smartAccountAddress,
|
|
5455
|
+
nonce,
|
|
5456
|
+
callData,
|
|
5457
|
+
false,
|
|
5458
|
+
void 0,
|
|
5459
|
+
void 0,
|
|
5460
|
+
feeType
|
|
5461
|
+
);
|
|
5462
|
+
}
|
|
5463
|
+
const ensureGenerousDefaults = () => {
|
|
5464
|
+
const toHex2 = (v) => `0x${v.toString(16)}`;
|
|
5465
|
+
const minCallGas = 0x493e0n;
|
|
5466
|
+
const minVerificationGas = 0x989680n;
|
|
5467
|
+
const minPreVerificationGas = 0x30d40n;
|
|
5468
|
+
if (BigInt(userOp.callGasLimit || "0x0") < minCallGas) userOp.callGasLimit = toHex2(minCallGas);
|
|
5469
|
+
if (BigInt(userOp.verificationGasLimit || "0x0") < minVerificationGas) userOp.verificationGasLimit = toHex2(minVerificationGas);
|
|
5470
|
+
if (BigInt(userOp.preVerificationGas || "0x0") < minPreVerificationGas) userOp.preVerificationGas = toHex2(minPreVerificationGas);
|
|
5471
|
+
};
|
|
5472
|
+
const enforceCaps = (usePaymaster) => {
|
|
5473
|
+
try {
|
|
5474
|
+
const envCaps = typeof import_meta !== "undefined" && import_meta.env || {};
|
|
5475
|
+
const maxBundlerVerifGas = envCaps.VITE_MAX_VERIFICATION_GAS ? BigInt(envCaps.VITE_MAX_VERIFICATION_GAS) : MAX_BUNDLER_VERIFICATION_GAS;
|
|
5476
|
+
const maxCallGas = envCaps.VITE_MAX_CALL_GAS_LIMIT ? BigInt(envCaps.VITE_MAX_CALL_GAS_LIMIT) : 0x7a120n;
|
|
5477
|
+
const toHex2 = (v) => `0x${v.toString(16)}`;
|
|
5478
|
+
const maxAccountVerifGas = usePaymaster ? maxBundlerVerifGas - PAYMASTER_VERIFICATION_GAS : maxBundlerVerifGas;
|
|
5479
|
+
const verGas = BigInt(userOp.verificationGasLimit || "0x0");
|
|
5480
|
+
if (verGas > maxAccountVerifGas) userOp.verificationGasLimit = toHex2(maxAccountVerifGas);
|
|
5481
|
+
const callGas = BigInt(userOp.callGasLimit || "0x0");
|
|
5482
|
+
if (callGas > maxCallGas) userOp.callGasLimit = toHex2(maxCallGas);
|
|
5483
|
+
} catch {
|
|
5484
|
+
}
|
|
5485
|
+
};
|
|
5486
|
+
let estimated = false;
|
|
5487
|
+
try {
|
|
5488
|
+
const gasEst = await (0, import_bundler.estimateUserOperationGas)({ ...userOp, signature: `0x${"00".repeat(65)}` });
|
|
5489
|
+
userOp.callGasLimit = gasEst.callGasLimit;
|
|
5490
|
+
userOp.verificationGasLimit = gasEst.verificationGasLimit;
|
|
5491
|
+
userOp.preVerificationGas = gasEst.preVerificationGas;
|
|
5492
|
+
ensureGenerousDefaults();
|
|
5493
|
+
enforceCaps(session.usePaymaster);
|
|
5494
|
+
estimated = true;
|
|
5495
|
+
} catch {
|
|
5496
|
+
ensureGenerousDefaults();
|
|
5497
|
+
enforceCaps(session.usePaymaster);
|
|
5498
|
+
}
|
|
5499
|
+
try {
|
|
5500
|
+
const toHex2 = (v) => `0x${v.toString(16)}`;
|
|
5501
|
+
const isContractCall = !!userOp.callData && userOp.callData !== "0x";
|
|
5502
|
+
if (isContractCall) {
|
|
5503
|
+
const currentVer = BigInt(userOp.verificationGasLimit || "0x0");
|
|
5504
|
+
const call = BigInt(userOp.callGasLimit || "0x0");
|
|
5505
|
+
const postOp = 150000n;
|
|
5506
|
+
const safety10k = 10000n;
|
|
5507
|
+
let buffer = call + postOp + safety10k;
|
|
5508
|
+
buffer += buffer / 63n;
|
|
5509
|
+
const newVer = currentVer + buffer;
|
|
5510
|
+
userOp.verificationGasLimit = toHex2(newVer);
|
|
5511
|
+
enforceCaps(session.usePaymaster);
|
|
5512
|
+
}
|
|
5513
|
+
} catch {
|
|
5514
|
+
}
|
|
5515
|
+
if (session.usePaymaster && LUMIA_PAYMASTER_ADDRESS) {
|
|
5516
|
+
userOp.paymaster = LUMIA_PAYMASTER_ADDRESS;
|
|
5517
|
+
userOp.paymasterData = "0x";
|
|
5518
|
+
userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;
|
|
5519
|
+
userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;
|
|
5520
|
+
}
|
|
5521
|
+
userOp.nonce = nonce;
|
|
5522
|
+
let opHash;
|
|
5523
|
+
if (entryPointVersion === "v0.6") {
|
|
5524
|
+
const userOpV06 = convertUserOpV07ToV06(userOp);
|
|
5525
|
+
opHash = await publicClient.readContract({
|
|
5526
|
+
address: entryPointAddress,
|
|
5527
|
+
abi: [{ type: "function", name: "getUserOpHash", inputs: [{ name: "userOp", type: "tuple", components: [{ name: "sender", type: "address" }, { name: "nonce", type: "uint256" }, { name: "initCode", type: "bytes" }, { name: "callData", type: "bytes" }, { name: "callGasLimit", type: "uint256" }, { name: "verificationGasLimit", type: "uint256" }, { name: "preVerificationGas", type: "uint256" }, { name: "maxFeePerGas", type: "uint256" }, { name: "maxPriorityFeePerGas", type: "uint256" }, { name: "paymasterAndData", type: "bytes" }, { name: "signature", type: "bytes" }] }], outputs: [{ name: "", type: "bytes32" }] }],
|
|
5528
|
+
functionName: "getUserOpHash",
|
|
5529
|
+
args: [{
|
|
5530
|
+
sender: userOpV06.sender,
|
|
5531
|
+
nonce: BigInt(userOpV06.nonce),
|
|
5532
|
+
initCode: userOpV06.initCode,
|
|
5533
|
+
callData: userOpV06.callData,
|
|
5534
|
+
callGasLimit: BigInt(userOpV06.callGasLimit),
|
|
5535
|
+
verificationGasLimit: BigInt(userOpV06.verificationGasLimit),
|
|
5536
|
+
preVerificationGas: BigInt(userOpV06.preVerificationGas),
|
|
5537
|
+
maxFeePerGas: BigInt(userOpV06.maxFeePerGas),
|
|
5538
|
+
maxPriorityFeePerGas: BigInt(userOpV06.maxPriorityFeePerGas),
|
|
5539
|
+
paymasterAndData: userOpV06.paymasterAndData,
|
|
5540
|
+
signature: "0x"
|
|
5541
|
+
}]
|
|
5542
|
+
});
|
|
5543
|
+
} else {
|
|
5544
|
+
const hasFactoryData = !!(userOp.factory && userOp.factoryData);
|
|
5545
|
+
const initCode = hasFactoryData ? (() => {
|
|
5546
|
+
const factoryAddr = userOp.factory.startsWith("0x") ? userOp.factory.slice(2) : userOp.factory;
|
|
5547
|
+
const factoryDataClean = userOp.factoryData.startsWith("0x") ? userOp.factoryData.slice(2) : userOp.factoryData;
|
|
5548
|
+
return `0x${factoryAddr}${factoryDataClean}`;
|
|
5549
|
+
})() : "0x";
|
|
5550
|
+
const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit));
|
|
5551
|
+
const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas));
|
|
5552
|
+
let paymasterAndData = "0x";
|
|
5553
|
+
if (userOp.paymaster && userOp.paymaster !== "0x0000000000000000000000000000000000000000") {
|
|
5554
|
+
const verificationGasLimit = userOp.paymasterVerificationGasLimit || "0x186a0";
|
|
5555
|
+
const postOpGasLimit = userOp.paymasterPostOpGasLimit || "0x186a0";
|
|
5556
|
+
const paymasterDataField = userOp.paymasterData || "0x";
|
|
5557
|
+
const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit));
|
|
5558
|
+
const paymasterAddr = userOp.paymaster.startsWith("0x") ? userOp.paymaster.slice(2) : userOp.paymaster;
|
|
5559
|
+
const paymasterDataClean = paymasterDataField === "0x" ? "" : paymasterDataField.startsWith("0x") ? paymasterDataField.slice(2) : paymasterDataField;
|
|
5560
|
+
paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}`;
|
|
5561
|
+
}
|
|
5562
|
+
const packedForHash = {
|
|
5563
|
+
sender: session.smartAccountAddress,
|
|
5564
|
+
nonce: BigInt(nonce),
|
|
5565
|
+
initCode,
|
|
5566
|
+
callData,
|
|
5567
|
+
accountGasLimits,
|
|
5568
|
+
preVerificationGas: BigInt(userOp.preVerificationGas),
|
|
5569
|
+
gasFees,
|
|
5570
|
+
paymasterAndData,
|
|
5571
|
+
signature: "0x"
|
|
5572
|
+
};
|
|
5573
|
+
opHash = await publicClient.readContract({
|
|
5574
|
+
address: entryPointAddress,
|
|
5575
|
+
abi: import_account_abstraction2.entryPoint07Abi,
|
|
5576
|
+
functionName: "getUserOpHash",
|
|
5577
|
+
args: [packedForHash]
|
|
5578
|
+
});
|
|
5579
|
+
}
|
|
5580
|
+
let signature;
|
|
5581
|
+
if (session.mpcUserId) {
|
|
5582
|
+
const mpcSig = await signDigestWithMpc(session.mpcUserId, opHash, {
|
|
5583
|
+
sender: userOp.sender,
|
|
5584
|
+
nonce: userOp.nonce,
|
|
5585
|
+
callData: userOp.callData,
|
|
5586
|
+
callGasLimit: userOp.callGasLimit,
|
|
5587
|
+
verificationGasLimit: userOp.verificationGasLimit,
|
|
5588
|
+
preVerificationGas: userOp.preVerificationGas,
|
|
5589
|
+
maxFeePerGas: userOp.maxFeePerGas,
|
|
5590
|
+
maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,
|
|
5591
|
+
paymaster: userOp.paymaster,
|
|
5592
|
+
factory: userOp.factory,
|
|
5593
|
+
factoryData: userOp.factoryData
|
|
5594
|
+
});
|
|
5595
|
+
if (!mpcSig) throw new Error("MPC signing failed");
|
|
5596
|
+
signature = mpcSig;
|
|
5597
|
+
} else if (session.ownerPrivateKey) {
|
|
5598
|
+
const account = (0, import_accounts.privateKeyToAccount)(session.ownerPrivateKey);
|
|
5599
|
+
const rawSig = await account.sign({ hash: opHash });
|
|
5600
|
+
signature = normalizeSignature(rawSig);
|
|
5601
|
+
} else {
|
|
5602
|
+
throw new Error("No signing method available");
|
|
5603
|
+
}
|
|
5604
|
+
userOp.signature = signature;
|
|
5605
|
+
if (typeof userOp.sender !== "string") {
|
|
5606
|
+
userOp.sender = session.smartAccountAddress;
|
|
5607
|
+
}
|
|
5608
|
+
console.log("[Account] \u2705 Prepared signed UserOp (not sent):", JSON.stringify(userOp, (key, value) => typeof value === "bigint" ? `0x${value.toString(16)}` : value, 2));
|
|
5609
|
+
console.log("[Account] \u{1F511} UserOp Hash:", opHash);
|
|
5610
|
+
if (entryPointVersion === "v0.6") {
|
|
5611
|
+
const userOpV06 = convertUserOpV07ToV06(userOp);
|
|
5612
|
+
return { userOp: userOpV06, userOpHash: opHash };
|
|
5613
|
+
}
|
|
5614
|
+
return { userOp, userOpHash: opHash };
|
|
5615
|
+
}
|
|
5297
5616
|
async function getEntryPointDeposit(address, entryPointVersion = "v0.7") {
|
|
5298
5617
|
const entryPointAddress = entryPointVersion === "v0.6" ? ENTRYPOINT_V06 : ENTRYPOINT_V07;
|
|
5299
5618
|
const depositAbi = [{ type: "function", name: "balanceOf", stateMutability: "view", inputs: [{ name: "account", type: "address" }], outputs: [{ name: "", type: "uint256" }] }];
|
|
@@ -6513,152 +6832,453 @@ var SecurityModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6513
6832
|
] });
|
|
6514
6833
|
};
|
|
6515
6834
|
|
|
6516
|
-
// src/internal/components/
|
|
6517
|
-
var
|
|
6835
|
+
// src/internal/components/KeyshareBackup.tsx
|
|
6836
|
+
var React19 = __toESM(require("react"), 1);
|
|
6518
6837
|
var import_lucide_react9 = require("lucide-react");
|
|
6519
|
-
|
|
6838
|
+
init_iframe_manager();
|
|
6520
6839
|
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
6521
|
-
|
|
6522
|
-
const
|
|
6523
|
-
|
|
6524
|
-
|
|
6525
|
-
|
|
6526
|
-
|
|
6527
|
-
const
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6840
|
+
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
6841
|
+
const [backupStatus, setBackupStatus] = React19.useState({
|
|
6842
|
+
server: {},
|
|
6843
|
+
cloud: {},
|
|
6844
|
+
local: {}
|
|
6845
|
+
});
|
|
6846
|
+
const [loading, setLoading] = React19.useState({
|
|
6847
|
+
server: false,
|
|
6848
|
+
cloud: false,
|
|
6849
|
+
local: false
|
|
6850
|
+
});
|
|
6851
|
+
const [error, setError] = React19.useState(null);
|
|
6852
|
+
const [success, setSuccess] = React19.useState(null);
|
|
6853
|
+
const [showPassword, setShowPassword] = React19.useState(false);
|
|
6854
|
+
const [useCustomPassword, setUseCustomPassword] = React19.useState(false);
|
|
6855
|
+
const [customPassword, setCustomPassword] = React19.useState("");
|
|
6856
|
+
const [cloudProviders, setCloudProviders] = React19.useState([]);
|
|
6857
|
+
const [selectedCloudProvider, setSelectedCloudProvider] = React19.useState(null);
|
|
6858
|
+
const [hasKeyshareData, setHasKeyshareData] = React19.useState(true);
|
|
6859
|
+
const iframeManager = React19.useMemo(() => {
|
|
6532
6860
|
try {
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6861
|
+
return getIframeManager();
|
|
6862
|
+
} catch (e) {
|
|
6863
|
+
console.error("[KeyshareBackup] Failed to get iframe manager:", e);
|
|
6864
|
+
return null;
|
|
6865
|
+
}
|
|
6866
|
+
}, []);
|
|
6867
|
+
React19.useEffect(() => {
|
|
6868
|
+
const loadCloudProviders = async () => {
|
|
6869
|
+
try {
|
|
6870
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6871
|
+
const availableProviders = getAvailableCloudProviders3();
|
|
6872
|
+
const providers = availableProviders.map((p) => ({
|
|
6873
|
+
id: p.id,
|
|
6874
|
+
name: p.name,
|
|
6875
|
+
available: p.isAvailable()
|
|
6876
|
+
}));
|
|
6877
|
+
setCloudProviders(providers);
|
|
6878
|
+
if (providers.length > 0 && !selectedCloudProvider) {
|
|
6879
|
+
setSelectedCloudProvider(providers[0].id);
|
|
6880
|
+
}
|
|
6881
|
+
} catch (error2) {
|
|
6882
|
+
console.error("[KeyshareBackup] Failed to load cloud providers:", error2);
|
|
6539
6883
|
}
|
|
6540
|
-
|
|
6541
|
-
|
|
6884
|
+
};
|
|
6885
|
+
loadCloudProviders();
|
|
6886
|
+
}, [selectedCloudProvider]);
|
|
6887
|
+
const refreshStatus = React19.useCallback(async () => {
|
|
6888
|
+
if (!iframeManager) return;
|
|
6889
|
+
try {
|
|
6890
|
+
const status = await iframeManager.getBackupStatus(userId);
|
|
6891
|
+
setBackupStatus(status);
|
|
6542
6892
|
} catch (error2) {
|
|
6543
|
-
console.error("Failed to
|
|
6544
|
-
setError(error2 instanceof Error ? error2.message : "Failed to load transactions");
|
|
6545
|
-
} finally {
|
|
6546
|
-
setLoading(false);
|
|
6893
|
+
console.error("[KeyshareBackup] Failed to get backup status:", error2);
|
|
6547
6894
|
}
|
|
6548
|
-
}, [
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6895
|
+
}, [iframeManager, userId]);
|
|
6896
|
+
React19.useEffect(() => {
|
|
6897
|
+
refreshStatus();
|
|
6898
|
+
}, [refreshStatus]);
|
|
6899
|
+
const handleBackup = async (method) => {
|
|
6900
|
+
if (!iframeManager) {
|
|
6901
|
+
setError("Iframe manager not initialized");
|
|
6902
|
+
return;
|
|
6552
6903
|
}
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
};
|
|
6557
|
-
const formatTime = (timestamp) => {
|
|
6558
|
-
return new Date(timestamp).toLocaleString();
|
|
6559
|
-
};
|
|
6560
|
-
const formatValue = (value) => {
|
|
6904
|
+
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
6905
|
+
setError(null);
|
|
6906
|
+
setSuccess(null);
|
|
6561
6907
|
try {
|
|
6562
|
-
const
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
|
|
6576
|
-
|
|
6908
|
+
const password = useCustomPassword ? customPassword : void 0;
|
|
6909
|
+
if (method === "server") {
|
|
6910
|
+
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
6911
|
+
const accessToken = jwt?.accessToken;
|
|
6912
|
+
const result = await iframeManager.createBackup(userId, {
|
|
6913
|
+
method,
|
|
6914
|
+
password
|
|
6915
|
+
}, accessToken);
|
|
6916
|
+
if (result.success) {
|
|
6917
|
+
setSuccess("Successfully created server backup");
|
|
6918
|
+
await refreshStatus();
|
|
6919
|
+
onBackupSuccess?.();
|
|
6920
|
+
} else {
|
|
6921
|
+
throw new Error(result.error || "Server backup failed");
|
|
6922
|
+
}
|
|
6923
|
+
} else if (method === "cloud") {
|
|
6924
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6925
|
+
const { getAvailableCloudProviders: getAvailableCloudProviders3 } = await Promise.resolve().then(() => (init_cloudStorage(), cloudStorage_exports));
|
|
6926
|
+
const providers = getAvailableCloudProviders3();
|
|
6927
|
+
const provider = selectedCloudProvider ? providers.find((p) => p.id === selectedCloudProvider) : providers[0];
|
|
6928
|
+
if (!provider) {
|
|
6929
|
+
throw new Error("No cloud provider available");
|
|
6930
|
+
}
|
|
6931
|
+
if (!provider.isAuthenticated()) {
|
|
6932
|
+
const authenticated = await provider.authenticate();
|
|
6933
|
+
if (!authenticated) {
|
|
6934
|
+
throw new Error(`Failed to authenticate with ${provider.name}`);
|
|
6935
|
+
}
|
|
6936
|
+
}
|
|
6937
|
+
const timestamp = Date.now();
|
|
6938
|
+
const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;
|
|
6939
|
+
const fileContent = JSON.stringify(encryptedData, null, 2);
|
|
6940
|
+
await provider.upload(fileName, fileContent, true);
|
|
6941
|
+
setSuccess(`Successfully created cloud backup on ${provider.name}`);
|
|
6942
|
+
await refreshStatus();
|
|
6943
|
+
onBackupSuccess?.();
|
|
6944
|
+
} else if (method === "local") {
|
|
6945
|
+
const encryptedData = await iframeManager.encryptBackupData(userId, password);
|
|
6946
|
+
const blob = new Blob([JSON.stringify(encryptedData, null, 2)], {
|
|
6947
|
+
type: "application/json"
|
|
6948
|
+
});
|
|
6949
|
+
const url = URL.createObjectURL(blob);
|
|
6950
|
+
const a = document.createElement("a");
|
|
6951
|
+
a.href = url;
|
|
6952
|
+
a.download = `lumia-passport-backup-${userId}-${Date.now()}.json`;
|
|
6953
|
+
document.body.appendChild(a);
|
|
6954
|
+
a.click();
|
|
6955
|
+
document.body.removeChild(a);
|
|
6956
|
+
URL.revokeObjectURL(url);
|
|
6957
|
+
setSuccess("Backup file downloaded successfully");
|
|
6958
|
+
await refreshStatus();
|
|
6959
|
+
onBackupSuccess?.();
|
|
6960
|
+
}
|
|
6961
|
+
if (typeof window !== "undefined") {
|
|
6962
|
+
window.dispatchEvent(
|
|
6963
|
+
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
6964
|
+
detail: { method, success: true }
|
|
6965
|
+
})
|
|
6966
|
+
);
|
|
6967
|
+
}
|
|
6968
|
+
} catch (err) {
|
|
6969
|
+
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
6970
|
+
setError(errorMsg);
|
|
6971
|
+
await refreshStatus();
|
|
6972
|
+
} finally {
|
|
6973
|
+
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
6974
|
+
}
|
|
6975
|
+
};
|
|
6976
|
+
const formatLastBackup = (timestamp) => {
|
|
6977
|
+
if (!timestamp) return "Never";
|
|
6978
|
+
const date = new Date(timestamp);
|
|
6979
|
+
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
6980
|
+
};
|
|
6981
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(Card, { className: "border-green-200 bg-green-50", children: [
|
|
6982
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardHeader, { className: "pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
6983
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
6984
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Shield, { className: "h-6 w-6 text-green-600" }),
|
|
6985
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
6986
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
6987
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
6988
|
+
] })
|
|
6989
|
+
] }),
|
|
6990
|
+
onClose && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.X, { className: "h-4 w-4" }) })
|
|
6991
|
+
] }) }),
|
|
6992
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
6993
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
6994
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.AlertCircle, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6995
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: error })
|
|
6996
|
+
] }),
|
|
6997
|
+
success && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
6998
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.CheckCircle2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
6999
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: success })
|
|
7000
|
+
] }),
|
|
7001
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-3", children: [
|
|
7002
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
7003
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7004
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7005
|
+
"input",
|
|
7006
|
+
{
|
|
7007
|
+
type: "checkbox",
|
|
7008
|
+
id: "use-backup-password",
|
|
7009
|
+
checked: useCustomPassword,
|
|
7010
|
+
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
7011
|
+
className: "rounded"
|
|
7012
|
+
}
|
|
7013
|
+
),
|
|
7014
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
7015
|
+
] }),
|
|
7016
|
+
!useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7017
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Key, { className: "h-4 w-4" }),
|
|
7018
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
7019
|
+
] }) }),
|
|
7020
|
+
useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "relative", children: [
|
|
7021
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7022
|
+
Input,
|
|
7023
|
+
{
|
|
7024
|
+
type: showPassword ? "text" : "password",
|
|
7025
|
+
placeholder: "Enter backup encryption password",
|
|
7026
|
+
value: customPassword,
|
|
7027
|
+
onChange: (e) => setCustomPassword(e.target.value),
|
|
7028
|
+
className: "pr-10"
|
|
7029
|
+
}
|
|
7030
|
+
),
|
|
7031
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7032
|
+
"button",
|
|
7033
|
+
{
|
|
7034
|
+
type: "button",
|
|
7035
|
+
onClick: () => setShowPassword(!showPassword),
|
|
7036
|
+
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
7037
|
+
children: showPassword ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Eye, { className: "h-4 w-4" })
|
|
7038
|
+
}
|
|
7039
|
+
)
|
|
7040
|
+
] })
|
|
7041
|
+
] }),
|
|
7042
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-4", children: [
|
|
7043
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
7044
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
7045
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7046
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Server, { className: "h-5 w-5 text-blue-600" }),
|
|
7047
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7048
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
7049
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
7050
|
+
] })
|
|
7051
|
+
] }) }),
|
|
7052
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7053
|
+
Button,
|
|
7054
|
+
{
|
|
7055
|
+
onClick: () => handleBackup("server"),
|
|
7056
|
+
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7057
|
+
className: "px-4 py-2",
|
|
7058
|
+
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7059
|
+
}
|
|
7060
|
+
),
|
|
7061
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7062
|
+
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
7063
|
+
formatLastBackup(backupStatus.server.lastBackup)
|
|
7064
|
+
] })
|
|
7065
|
+
] }),
|
|
7066
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
7067
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7068
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Cloud, { className: "h-5 w-5 text-sky-600" }),
|
|
7069
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7070
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
7071
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
7072
|
+
] })
|
|
7073
|
+
] }),
|
|
7074
|
+
cloudProviders.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7075
|
+
"select",
|
|
7076
|
+
{
|
|
7077
|
+
value: selectedCloudProvider || "",
|
|
7078
|
+
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
7079
|
+
className: "text-sm border rounded px-2 py-1 w-full",
|
|
7080
|
+
children: cloudProviders.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("option", { value: provider.id, disabled: !provider.available, children: [
|
|
7081
|
+
provider.name,
|
|
7082
|
+
" ",
|
|
7083
|
+
provider.available ? "" : "(Not Available)"
|
|
7084
|
+
] }, provider.id))
|
|
7085
|
+
}
|
|
7086
|
+
) }),
|
|
7087
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7088
|
+
Button,
|
|
7089
|
+
{
|
|
7090
|
+
onClick: () => handleBackup("cloud"),
|
|
7091
|
+
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
7092
|
+
className: "px-4 py-2",
|
|
7093
|
+
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
7094
|
+
}
|
|
7095
|
+
),
|
|
7096
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
7097
|
+
] }),
|
|
7098
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
7099
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
7100
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Download, { className: "h-5 w-5 text-purple-600" }),
|
|
7101
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7102
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
7103
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
7104
|
+
] })
|
|
7105
|
+
] }),
|
|
7106
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
7107
|
+
Button,
|
|
7108
|
+
{
|
|
7109
|
+
onClick: () => handleBackup("local"),
|
|
7110
|
+
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
7111
|
+
className: "w-full",
|
|
7112
|
+
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
7113
|
+
}
|
|
7114
|
+
),
|
|
7115
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
7116
|
+
"Download encrypted backup file to your device \u2022 Last: ",
|
|
7117
|
+
formatLastBackup(backupStatus.local.lastBackup)
|
|
7118
|
+
] })
|
|
7119
|
+
] })
|
|
7120
|
+
] }),
|
|
7121
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
7122
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.Lock, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
7123
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
7124
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "font-medium", children: "Security Notice" }),
|
|
7125
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "mt-1", children: [
|
|
7126
|
+
useCustomPassword ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
7127
|
+
" ",
|
|
7128
|
+
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
7129
|
+
] })
|
|
7130
|
+
] })
|
|
7131
|
+
] })
|
|
7132
|
+
] })
|
|
7133
|
+
] });
|
|
7134
|
+
}
|
|
7135
|
+
|
|
7136
|
+
// src/internal/components/TransactionsModal.tsx
|
|
7137
|
+
var import_react13 = __toESM(require("react"), 1);
|
|
7138
|
+
var import_lucide_react10 = require("lucide-react");
|
|
7139
|
+
init_base();
|
|
7140
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
7141
|
+
var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
7142
|
+
const { address } = useLumiaSession();
|
|
7143
|
+
const [transactions, setTransactions] = import_react13.default.useState([]);
|
|
7144
|
+
const [loading, setLoading] = import_react13.default.useState(false);
|
|
7145
|
+
const [error, setError] = import_react13.default.useState(null);
|
|
7146
|
+
const { config } = useLumiaPassportConfig();
|
|
7147
|
+
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7148
|
+
const loadTransactions = import_react13.default.useCallback(async () => {
|
|
7149
|
+
if (!address) return;
|
|
7150
|
+
setLoading(true);
|
|
7151
|
+
setError(null);
|
|
7152
|
+
try {
|
|
7153
|
+
const explorerUrl = getExplorerUrl();
|
|
7154
|
+
const baseUrl = explorerUrl.replace(/\/$/, "");
|
|
7155
|
+
const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=20`;
|
|
7156
|
+
const response = await fetch(apiUrl);
|
|
7157
|
+
if (!response.ok) {
|
|
7158
|
+
throw new Error(`Failed to fetch transactions: ${response.status}`);
|
|
7159
|
+
}
|
|
7160
|
+
const data = await response.json();
|
|
7161
|
+
setTransactions(data.items || []);
|
|
7162
|
+
} catch (error2) {
|
|
7163
|
+
console.error("Failed to load transactions:", error2);
|
|
7164
|
+
setError(error2 instanceof Error ? error2.message : "Failed to load transactions");
|
|
7165
|
+
} finally {
|
|
7166
|
+
setLoading(false);
|
|
7167
|
+
}
|
|
7168
|
+
}, [address]);
|
|
7169
|
+
import_react13.default.useEffect(() => {
|
|
7170
|
+
if (open && address && !loading && transactions.length === 0) {
|
|
7171
|
+
loadTransactions();
|
|
7172
|
+
}
|
|
7173
|
+
}, [open]);
|
|
7174
|
+
const formatAddress = (addr) => {
|
|
7175
|
+
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7176
|
+
};
|
|
7177
|
+
const formatTime = (timestamp) => {
|
|
7178
|
+
return new Date(timestamp).toLocaleString();
|
|
7179
|
+
};
|
|
7180
|
+
const formatValue = (value) => {
|
|
7181
|
+
try {
|
|
7182
|
+
const wei = BigInt(value);
|
|
7183
|
+
const eth = Number(wei) / 1e18;
|
|
7184
|
+
return eth.toFixed(4);
|
|
7185
|
+
} catch {
|
|
7186
|
+
return "0.0000";
|
|
7187
|
+
}
|
|
7188
|
+
};
|
|
7189
|
+
const getStatusIcon = (status) => {
|
|
7190
|
+
return status === "ok" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.CheckCircle2, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.XCircle, { className: "w-4 h-4 text-red-500" });
|
|
7191
|
+
};
|
|
7192
|
+
const getTransactionIcon = (from, to) => {
|
|
7193
|
+
const isIncoming = to.toLowerCase() === address?.toLowerCase();
|
|
7194
|
+
return isIncoming ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowDownRight, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowUpRight, { className: "w-4 h-4 text-blue-500" });
|
|
7195
|
+
};
|
|
7196
|
+
const openInExplorer = (txHash) => {
|
|
6577
7197
|
const explorerUrl = getExplorerUrl();
|
|
6578
7198
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
6579
7199
|
};
|
|
6580
|
-
return /* @__PURE__ */ (0,
|
|
6581
|
-
/* @__PURE__ */ (0,
|
|
6582
|
-
/* @__PURE__ */ (0,
|
|
6583
|
-
/* @__PURE__ */ (0,
|
|
6584
|
-
onBack && /* @__PURE__ */ (0,
|
|
7200
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7201
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DialogTitle, { children: "Transaction History" }) }),
|
|
7202
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DialogDescription, { className: "sr-only", children: "View your transaction history" }),
|
|
7203
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7204
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6585
7205
|
"button",
|
|
6586
7206
|
{
|
|
6587
7207
|
onClick: onBack,
|
|
6588
7208
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6589
7209
|
title: "Back",
|
|
6590
|
-
children: /* @__PURE__ */ (0,
|
|
7210
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.ArrowLeft, { className: "h-4 w-4" })
|
|
6591
7211
|
}
|
|
6592
7212
|
),
|
|
6593
|
-
/* @__PURE__ */ (0,
|
|
6594
|
-
/* @__PURE__ */ (0,
|
|
6595
|
-
/* @__PURE__ */ (0,
|
|
6596
|
-
/* @__PURE__ */ (0,
|
|
7213
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7214
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Activity, { className: "h-5 w-5" }),
|
|
7215
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: "Transaction History" }),
|
|
7216
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6597
7217
|
"button",
|
|
6598
7218
|
{
|
|
6599
7219
|
onClick: loadTransactions,
|
|
6600
7220
|
disabled: loading,
|
|
6601
7221
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6602
7222
|
title: "Refresh transactions",
|
|
6603
|
-
children: /* @__PURE__ */ (0,
|
|
7223
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.RefreshCw, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` })
|
|
6604
7224
|
}
|
|
6605
7225
|
)
|
|
6606
7226
|
] })
|
|
6607
7227
|
] }) }),
|
|
6608
|
-
/* @__PURE__ */ (0,
|
|
6609
|
-
/* @__PURE__ */ (0,
|
|
6610
|
-
/* @__PURE__ */ (0,
|
|
6611
|
-
] }) : transactions.length === 0 ? /* @__PURE__ */ (0,
|
|
6612
|
-
/* @__PURE__ */ (0,
|
|
6613
|
-
/* @__PURE__ */ (0,
|
|
7228
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: loading ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `${theme.mutedText}`, children: "Loading transactions..." }) }) : error ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${isDark ? "text-red-400" : "text-red-500"}`, children: [
|
|
7229
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.XCircle, { className: "w-12 h-12 mb-2" }),
|
|
7230
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-center text-sm", children: error })
|
|
7231
|
+
] }) : transactions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7232
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Activity, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7233
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("p", { className: "text-center", children: [
|
|
6614
7234
|
"No transactions found",
|
|
6615
|
-
/* @__PURE__ */ (0,
|
|
6616
|
-
/* @__PURE__ */ (0,
|
|
7235
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("br", {}),
|
|
7236
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "text-xs mt-2", children: "Smart account transactions will appear here" })
|
|
6617
7237
|
] })
|
|
6618
|
-
] }) : /* @__PURE__ */ (0,
|
|
7238
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "space-y-3", children: transactions.map((tx) => {
|
|
6619
7239
|
const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();
|
|
6620
7240
|
const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;
|
|
6621
|
-
return /* @__PURE__ */ (0,
|
|
7241
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
|
|
6622
7242
|
"div",
|
|
6623
7243
|
{
|
|
6624
7244
|
className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors cursor-pointer`,
|
|
6625
7245
|
onClick: () => openInExplorer(tx.hash),
|
|
6626
7246
|
children: [
|
|
6627
|
-
/* @__PURE__ */ (0,
|
|
6628
|
-
/* @__PURE__ */ (0,
|
|
7247
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7248
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
6629
7249
|
getTransactionIcon(tx.from.hash, tx.to.hash),
|
|
6630
|
-
/* @__PURE__ */ (0,
|
|
7250
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `font-medium ${theme.titleText}`, children: isIncoming ? "Received" : "Sent" }),
|
|
6631
7251
|
getStatusIcon(tx.status)
|
|
6632
7252
|
] }),
|
|
6633
|
-
/* @__PURE__ */ (0,
|
|
7253
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `text-xs ${theme.mutedText}`, children: formatTime(tx.timestamp) })
|
|
6634
7254
|
] }),
|
|
6635
|
-
/* @__PURE__ */ (0,
|
|
6636
|
-
/* @__PURE__ */ (0,
|
|
6637
|
-
/* @__PURE__ */ (0,
|
|
6638
|
-
/* @__PURE__ */ (0,
|
|
7255
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1 text-sm", children: [
|
|
7256
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7257
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: isIncoming ? "From:" : "To:" }),
|
|
7258
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6639
7259
|
formatAddress(displayAddress),
|
|
6640
|
-
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ (0,
|
|
7260
|
+
(isIncoming ? tx.from.is_contract : tx.to.is_contract) && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} ml-1`, children: "(Contract)" })
|
|
6641
7261
|
] })
|
|
6642
7262
|
] }),
|
|
6643
|
-
/* @__PURE__ */ (0,
|
|
6644
|
-
/* @__PURE__ */ (0,
|
|
6645
|
-
/* @__PURE__ */ (0,
|
|
7263
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7264
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Value:" }),
|
|
7265
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
6646
7266
|
formatValue(tx.value),
|
|
6647
7267
|
" LUMIA"
|
|
6648
7268
|
] })
|
|
6649
7269
|
] }),
|
|
6650
|
-
/* @__PURE__ */ (0,
|
|
6651
|
-
/* @__PURE__ */ (0,
|
|
6652
|
-
/* @__PURE__ */ (0,
|
|
7270
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7271
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Block:" }),
|
|
7272
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
6653
7273
|
"#",
|
|
6654
7274
|
tx.block_number
|
|
6655
7275
|
] })
|
|
6656
7276
|
] }),
|
|
6657
|
-
tx.method && /* @__PURE__ */ (0,
|
|
6658
|
-
/* @__PURE__ */ (0,
|
|
6659
|
-
/* @__PURE__ */ (0,
|
|
7277
|
+
tx.method && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between", children: [
|
|
7278
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${theme.bodyText}`, children: "Method:" }),
|
|
7279
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `${isDark ? "text-blue-400" : "text-blue-600"} text-xs`, children: tx.method })
|
|
6660
7280
|
] }),
|
|
6661
|
-
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ (0,
|
|
7281
|
+
tx.transaction_types && tx.transaction_types.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
6662
7282
|
"span",
|
|
6663
7283
|
{
|
|
6664
7284
|
className: `text-xs ${isDark ? "bg-blue-900/30 text-blue-300" : "bg-blue-100 text-blue-800"} px-2 py-0.5 rounded-full`,
|
|
@@ -6672,7 +7292,7 @@ var TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6672
7292
|
tx.hash
|
|
6673
7293
|
);
|
|
6674
7294
|
}) }) }),
|
|
6675
|
-
transactions.length > 0 && /* @__PURE__ */ (0,
|
|
7295
|
+
transactions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
6676
7296
|
"Total: ",
|
|
6677
7297
|
transactions.length,
|
|
6678
7298
|
" transaction",
|
|
@@ -6846,9 +7466,9 @@ function useTokenBalance(tokenAddress, userAddress) {
|
|
|
6846
7466
|
}
|
|
6847
7467
|
|
|
6848
7468
|
// src/internal/components/ViewAssetsModal.tsx
|
|
6849
|
-
var
|
|
7469
|
+
var import_lucide_react11 = require("lucide-react");
|
|
6850
7470
|
init_base();
|
|
6851
|
-
var
|
|
7471
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
6852
7472
|
var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
6853
7473
|
const { address } = useLumiaSession();
|
|
6854
7474
|
const { assets, refreshBalances, isLoading } = useAssets(address);
|
|
@@ -6867,107 +7487,107 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6867
7487
|
const openInExplorer = (address2) => {
|
|
6868
7488
|
window.open(`${LUMIA_EXPLORER_URL}/address/${address2}`, "_blank");
|
|
6869
7489
|
};
|
|
6870
|
-
return /* @__PURE__ */ (0,
|
|
6871
|
-
/* @__PURE__ */ (0,
|
|
6872
|
-
/* @__PURE__ */ (0,
|
|
6873
|
-
/* @__PURE__ */ (0,
|
|
6874
|
-
onBack && /* @__PURE__ */ (0,
|
|
7490
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7491
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DialogTitle, { children: "View Assets" }) }),
|
|
7492
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DialogDescription, { className: "sr-only", children: "View your token balances and assets" }),
|
|
7493
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7494
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
6875
7495
|
"button",
|
|
6876
7496
|
{
|
|
6877
7497
|
onClick: onBack,
|
|
6878
7498
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
6879
7499
|
title: "Back",
|
|
6880
|
-
children: /* @__PURE__ */ (0,
|
|
7500
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ArrowLeft, { className: "h-4 w-4" })
|
|
6881
7501
|
}
|
|
6882
7502
|
),
|
|
6883
|
-
/* @__PURE__ */ (0,
|
|
6884
|
-
/* @__PURE__ */ (0,
|
|
6885
|
-
/* @__PURE__ */ (0,
|
|
6886
|
-
/* @__PURE__ */ (0,
|
|
7503
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
7504
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Gem, { className: "h-5 w-5" }),
|
|
7505
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { children: "Your Assets" }),
|
|
7506
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
6887
7507
|
"button",
|
|
6888
7508
|
{
|
|
6889
7509
|
onClick: refreshBalances,
|
|
6890
7510
|
disabled: isLoading,
|
|
6891
7511
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1`,
|
|
6892
7512
|
title: "Refresh balances",
|
|
6893
|
-
children: /* @__PURE__ */ (0,
|
|
7513
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.RefreshCw, { className: `h-4 w-4 ${isLoading ? "animate-spin" : ""}` })
|
|
6894
7514
|
}
|
|
6895
7515
|
)
|
|
6896
7516
|
] })
|
|
6897
7517
|
] }) }),
|
|
6898
|
-
/* @__PURE__ */ (0,
|
|
6899
|
-
/* @__PURE__ */ (0,
|
|
6900
|
-
/* @__PURE__ */ (0,
|
|
6901
|
-
] }) : /* @__PURE__ */ (0,
|
|
6902
|
-
/* @__PURE__ */ (0,
|
|
6903
|
-
/* @__PURE__ */ (0,
|
|
6904
|
-
/* @__PURE__ */ (0,
|
|
6905
|
-
/* @__PURE__ */ (0,
|
|
6906
|
-
/* @__PURE__ */ (0,
|
|
6907
|
-
/* @__PURE__ */ (0,
|
|
7518
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `${theme.mutedText}`, children: "Loading assets..." }) }) : assets.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7519
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Gem, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7520
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { children: "No assets found" })
|
|
7521
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "space-y-3", children: assets.map((asset, index) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors`, children: [
|
|
7522
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7523
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7524
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "w-10 h-10 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-white font-bold text-sm", children: asset.symbol.charAt(0) }) }),
|
|
7525
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { children: [
|
|
7526
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `font-medium ${theme.titleText}`, children: asset.name }),
|
|
7527
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
6908
7528
|
] })
|
|
6909
7529
|
] }),
|
|
6910
|
-
/* @__PURE__ */ (0,
|
|
6911
|
-
/* @__PURE__ */ (0,
|
|
6912
|
-
/* @__PURE__ */ (0,
|
|
7530
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "text-right", children: [
|
|
7531
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `font-mono ${theme.titleText}`, children: asset.formattedBalance }),
|
|
7532
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: asset.symbol })
|
|
6913
7533
|
] })
|
|
6914
7534
|
] }),
|
|
6915
|
-
asset.address && /* @__PURE__ */ (0,
|
|
6916
|
-
/* @__PURE__ */ (0,
|
|
6917
|
-
/* @__PURE__ */ (0,
|
|
6918
|
-
/* @__PURE__ */ (0,
|
|
6919
|
-
/* @__PURE__ */ (0,
|
|
6920
|
-
/* @__PURE__ */ (0,
|
|
7535
|
+
asset.address && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `space-y-2 mt-3 pt-3 border-t ${theme.divider}`, children: [
|
|
7536
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7537
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Contract Address:" }),
|
|
7538
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7539
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` }),
|
|
7540
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
6921
7541
|
"button",
|
|
6922
7542
|
{
|
|
6923
7543
|
onClick: () => handleCopy(asset.address, "address"),
|
|
6924
7544
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6925
7545
|
title: "Copy address",
|
|
6926
|
-
children: copied === "address" ? /* @__PURE__ */ (0,
|
|
7546
|
+
children: copied === "address" ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Copy, { className: "w-3 h-3" })
|
|
6927
7547
|
}
|
|
6928
7548
|
),
|
|
6929
|
-
/* @__PURE__ */ (0,
|
|
7549
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
6930
7550
|
"button",
|
|
6931
7551
|
{
|
|
6932
7552
|
onClick: () => openInExplorer(asset.address),
|
|
6933
7553
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6934
7554
|
title: "View in explorer",
|
|
6935
|
-
children: /* @__PURE__ */ (0,
|
|
7555
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ExternalLink, { className: "w-3 h-3" })
|
|
6936
7556
|
}
|
|
6937
7557
|
)
|
|
6938
7558
|
] })
|
|
6939
7559
|
] }),
|
|
6940
|
-
asset.decimals && /* @__PURE__ */ (0,
|
|
6941
|
-
/* @__PURE__ */ (0,
|
|
6942
|
-
/* @__PURE__ */ (0,
|
|
7560
|
+
asset.decimals && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7561
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Decimals:" }),
|
|
7562
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.titleText}`, children: asset.decimals })
|
|
6943
7563
|
] })
|
|
6944
7564
|
] }),
|
|
6945
|
-
asset.type === "native" && address && /* @__PURE__ */ (0,
|
|
6946
|
-
/* @__PURE__ */ (0,
|
|
6947
|
-
/* @__PURE__ */ (0,
|
|
6948
|
-
/* @__PURE__ */ (0,
|
|
6949
|
-
/* @__PURE__ */ (0,
|
|
7565
|
+
asset.type === "native" && address && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "mt-3 pt-3 border-t border-gray-200", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
7566
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${theme.bodyText}`, children: "Your Address:" }),
|
|
7567
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7568
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `font-mono ${theme.titleText} text-xs`, children: `${address.slice(0, 6)}...${address.slice(-4)}` }),
|
|
7569
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
6950
7570
|
"button",
|
|
6951
7571
|
{
|
|
6952
7572
|
onClick: () => handleCopy(address, "wallet"),
|
|
6953
7573
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6954
7574
|
title: "Copy wallet address",
|
|
6955
|
-
children: copied === "wallet" ? /* @__PURE__ */ (0,
|
|
7575
|
+
children: copied === "wallet" ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${isDark ? "text-green-400" : "text-green-500"} text-xs`, children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Copy, { className: "w-3 h-3" })
|
|
6956
7576
|
}
|
|
6957
7577
|
),
|
|
6958
|
-
/* @__PURE__ */ (0,
|
|
7578
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
6959
7579
|
"button",
|
|
6960
7580
|
{
|
|
6961
7581
|
onClick: () => openInExplorer(address),
|
|
6962
7582
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
6963
7583
|
title: "View in explorer",
|
|
6964
|
-
children: /* @__PURE__ */ (0,
|
|
7584
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ExternalLink, { className: "w-3 h-3" })
|
|
6965
7585
|
}
|
|
6966
7586
|
)
|
|
6967
7587
|
] })
|
|
6968
7588
|
] }) })
|
|
6969
7589
|
] }, `${asset.type}-${asset.address || "native"}-${index}`)) }) }),
|
|
6970
|
-
assets.length > 0 && /* @__PURE__ */ (0,
|
|
7590
|
+
assets.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
6971
7591
|
"Total: ",
|
|
6972
7592
|
assets.length,
|
|
6973
7593
|
" asset",
|
|
@@ -6978,7 +7598,7 @@ var ViewAssetsModal = ({ open, onOpenChange, onBack }) => {
|
|
|
6978
7598
|
|
|
6979
7599
|
// src/internal/components/SendModal.tsx
|
|
6980
7600
|
var import_react17 = require("react");
|
|
6981
|
-
var
|
|
7601
|
+
var import_lucide_react14 = require("lucide-react");
|
|
6982
7602
|
|
|
6983
7603
|
// src/hooks/useSendTransaction.ts
|
|
6984
7604
|
var import_react16 = require("react");
|
|
@@ -7044,8 +7664,8 @@ var import_viem6 = require("viem");
|
|
|
7044
7664
|
var import_wagmi7 = require("wagmi");
|
|
7045
7665
|
|
|
7046
7666
|
// src/internal/components/UserOpStatus.tsx
|
|
7047
|
-
var
|
|
7048
|
-
var
|
|
7667
|
+
var React24 = __toESM(require("react"), 1);
|
|
7668
|
+
var import_lucide_react13 = require("lucide-react");
|
|
7049
7669
|
|
|
7050
7670
|
// src/internal/components/ui/badge.tsx
|
|
7051
7671
|
var import_class_variance_authority2 = require("class-variance-authority");
|
|
@@ -7058,7 +7678,7 @@ function cn2(...inputs) {
|
|
|
7058
7678
|
}
|
|
7059
7679
|
|
|
7060
7680
|
// src/internal/components/ui/badge.tsx
|
|
7061
|
-
var
|
|
7681
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
7062
7682
|
var badgeVariants = (0, import_class_variance_authority2.cva)(
|
|
7063
7683
|
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
7064
7684
|
{
|
|
@@ -7078,13 +7698,13 @@ var badgeVariants = (0, import_class_variance_authority2.cva)(
|
|
|
7078
7698
|
}
|
|
7079
7699
|
);
|
|
7080
7700
|
function Badge({ className, variant, ...props }) {
|
|
7081
|
-
return /* @__PURE__ */ (0,
|
|
7701
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
7082
7702
|
}
|
|
7083
7703
|
|
|
7084
7704
|
// src/internal/components/Address.tsx
|
|
7085
|
-
var
|
|
7086
|
-
var
|
|
7087
|
-
var
|
|
7705
|
+
var React23 = __toESM(require("react"), 1);
|
|
7706
|
+
var import_lucide_react12 = require("lucide-react");
|
|
7707
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
7088
7708
|
function toExplorerAddressUrl(address, chain) {
|
|
7089
7709
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
7090
7710
|
if (!base2) return null;
|
|
@@ -7105,12 +7725,12 @@ var Address = ({
|
|
|
7105
7725
|
}) => {
|
|
7106
7726
|
const addr = address || "";
|
|
7107
7727
|
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
7108
|
-
const [copied, setCopied] =
|
|
7109
|
-
if (!addr) return /* @__PURE__ */ (0,
|
|
7110
|
-
return /* @__PURE__ */ (0,
|
|
7111
|
-
label && /* @__PURE__ */ (0,
|
|
7112
|
-
/* @__PURE__ */ (0,
|
|
7113
|
-
showCopy && /* @__PURE__ */ (0,
|
|
7728
|
+
const [copied, setCopied] = React23.useState(false);
|
|
7729
|
+
if (!addr) return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
7730
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: cn2("flex items-center gap-2", className), style: { listStyle: "none" }, children: [
|
|
7731
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "text-sm font-medium", children: label }),
|
|
7732
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("code", { className: "text-xs bg-background px-2 py-1 rounded select-all", children: truncate ? short(addr) : addr }),
|
|
7733
|
+
showCopy && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
7114
7734
|
Button,
|
|
7115
7735
|
{
|
|
7116
7736
|
variant: "ghost",
|
|
@@ -7124,10 +7744,10 @@ var Address = ({
|
|
|
7124
7744
|
} catch {
|
|
7125
7745
|
}
|
|
7126
7746
|
},
|
|
7127
|
-
children: /* @__PURE__ */ (0,
|
|
7747
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react12.Copy, { className: "h-4 w-4" })
|
|
7128
7748
|
}
|
|
7129
7749
|
),
|
|
7130
|
-
showExplorer && explorer && /* @__PURE__ */ (0,
|
|
7750
|
+
showExplorer && explorer && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
7131
7751
|
"a",
|
|
7132
7752
|
{
|
|
7133
7753
|
href: explorer,
|
|
@@ -7135,7 +7755,7 @@ var Address = ({
|
|
|
7135
7755
|
rel: "noreferrer noopener",
|
|
7136
7756
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
7137
7757
|
title: "Open in explorer",
|
|
7138
|
-
children: /* @__PURE__ */ (0,
|
|
7758
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react12.ExternalLink, { className: "h-4 w-4" })
|
|
7139
7759
|
}
|
|
7140
7760
|
)
|
|
7141
7761
|
] });
|
|
@@ -7143,7 +7763,7 @@ var Address = ({
|
|
|
7143
7763
|
|
|
7144
7764
|
// src/internal/components/UserOpStatus.tsx
|
|
7145
7765
|
init_base();
|
|
7146
|
-
var
|
|
7766
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
7147
7767
|
var UserOpStatus = ({
|
|
7148
7768
|
userOpHash,
|
|
7149
7769
|
chain,
|
|
@@ -7154,20 +7774,20 @@ var UserOpStatus = ({
|
|
|
7154
7774
|
externalState
|
|
7155
7775
|
}) => {
|
|
7156
7776
|
const useExternalState = !!externalState;
|
|
7157
|
-
const [internalReceipt, setInternalReceipt] =
|
|
7158
|
-
const [internalMempool, setInternalMempool] =
|
|
7159
|
-
const [internalError, setInternalError] =
|
|
7160
|
-
const [attempt, setAttempt] =
|
|
7161
|
-
const [internalRefreshing, setInternalRefreshing] =
|
|
7162
|
-
const [timedOut, setTimedOut] =
|
|
7163
|
-
const [rejected, setRejected] =
|
|
7164
|
-
const intervalRef =
|
|
7165
|
-
const startTimeRef =
|
|
7777
|
+
const [internalReceipt, setInternalReceipt] = React24.useState(null);
|
|
7778
|
+
const [internalMempool, setInternalMempool] = React24.useState(null);
|
|
7779
|
+
const [internalError, setInternalError] = React24.useState(null);
|
|
7780
|
+
const [attempt, setAttempt] = React24.useState(0);
|
|
7781
|
+
const [internalRefreshing, setInternalRefreshing] = React24.useState(false);
|
|
7782
|
+
const [timedOut, setTimedOut] = React24.useState(false);
|
|
7783
|
+
const [rejected, setRejected] = React24.useState(false);
|
|
7784
|
+
const intervalRef = React24.useRef(null);
|
|
7785
|
+
const startTimeRef = React24.useRef(Date.now());
|
|
7166
7786
|
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
7167
7787
|
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
7168
7788
|
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
7169
7789
|
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
7170
|
-
const rpc =
|
|
7790
|
+
const rpc = React24.useCallback(async (method, params) => {
|
|
7171
7791
|
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
7172
7792
|
const res = await fetch(getBundlerUrl(), {
|
|
7173
7793
|
method: "POST",
|
|
@@ -7178,14 +7798,14 @@ var UserOpStatus = ({
|
|
|
7178
7798
|
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
7179
7799
|
return json.result;
|
|
7180
7800
|
}, []);
|
|
7181
|
-
const extractMempoolInfo =
|
|
7801
|
+
const extractMempoolInfo = React24.useCallback((m) => {
|
|
7182
7802
|
if (!m) return null;
|
|
7183
7803
|
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
7184
7804
|
const sender = m.sender || m?.userOperation?.sender || null;
|
|
7185
7805
|
if (!entryPoint && !sender) return null;
|
|
7186
7806
|
return { entryPoint, sender };
|
|
7187
7807
|
}, []);
|
|
7188
|
-
const tick =
|
|
7808
|
+
const tick = React24.useCallback(async () => {
|
|
7189
7809
|
if (useExternalState) return;
|
|
7190
7810
|
const elapsed = Date.now() - startTimeRef.current;
|
|
7191
7811
|
if (elapsed > maxPollTimeMs) {
|
|
@@ -7229,7 +7849,7 @@ var UserOpStatus = ({
|
|
|
7229
7849
|
setAttempt((x) => x + 1);
|
|
7230
7850
|
}
|
|
7231
7851
|
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
7232
|
-
|
|
7852
|
+
React24.useEffect(() => {
|
|
7233
7853
|
if (useExternalState) return;
|
|
7234
7854
|
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
7235
7855
|
startTimeRef.current = Date.now();
|
|
@@ -7241,7 +7861,7 @@ var UserOpStatus = ({
|
|
|
7241
7861
|
setAttempt(0);
|
|
7242
7862
|
setInternalRefreshing(false);
|
|
7243
7863
|
}, [userOpHash, useExternalState]);
|
|
7244
|
-
|
|
7864
|
+
React24.useEffect(() => {
|
|
7245
7865
|
if (useExternalState) {
|
|
7246
7866
|
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
7247
7867
|
return;
|
|
@@ -7276,54 +7896,54 @@ var UserOpStatus = ({
|
|
|
7276
7896
|
const stateBadge = () => {
|
|
7277
7897
|
if (receipt) {
|
|
7278
7898
|
const ok = !!receipt.success;
|
|
7279
|
-
return /* @__PURE__ */ (0,
|
|
7280
|
-
ok ? /* @__PURE__ */ (0,
|
|
7899
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
7900
|
+
ok ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.CheckCircle2, { className: "h-3 w-3" }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7281
7901
|
ok ? "Included" : "Failed"
|
|
7282
7902
|
] });
|
|
7283
7903
|
}
|
|
7284
7904
|
if (rejected) {
|
|
7285
|
-
return /* @__PURE__ */ (0,
|
|
7286
|
-
/* @__PURE__ */ (0,
|
|
7905
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
7906
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7287
7907
|
" Rejected by bundler"
|
|
7288
7908
|
] });
|
|
7289
7909
|
}
|
|
7290
7910
|
if (timedOut) {
|
|
7291
|
-
return /* @__PURE__ */ (0,
|
|
7292
|
-
/* @__PURE__ */ (0,
|
|
7911
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "warning", className: "gap-1", children: [
|
|
7912
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-3 w-3" }),
|
|
7293
7913
|
" Timeout - may be rejected"
|
|
7294
7914
|
] });
|
|
7295
7915
|
}
|
|
7296
7916
|
if (mempool) {
|
|
7297
|
-
return /* @__PURE__ */ (0,
|
|
7298
|
-
/* @__PURE__ */ (0,
|
|
7917
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "outline", className: "gap-1", children: [
|
|
7918
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Clock, { className: "h-3 w-3" }),
|
|
7299
7919
|
" Pending in bundler"
|
|
7300
7920
|
] });
|
|
7301
7921
|
}
|
|
7302
|
-
return /* @__PURE__ */ (0,
|
|
7303
|
-
/* @__PURE__ */ (0,
|
|
7922
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
7923
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Clock, { className: "h-3 w-3" }),
|
|
7304
7924
|
" Waiting"
|
|
7305
7925
|
] });
|
|
7306
7926
|
};
|
|
7307
|
-
return /* @__PURE__ */ (0,
|
|
7927
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
7308
7928
|
"div",
|
|
7309
7929
|
{
|
|
7310
7930
|
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
7311
7931
|
style: { textAlign: "left", listStyle: "none" },
|
|
7312
7932
|
children: [
|
|
7313
|
-
/* @__PURE__ */ (0,
|
|
7314
|
-
/* @__PURE__ */ (0,
|
|
7933
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [
|
|
7934
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7315
7935
|
stateBadge(),
|
|
7316
|
-
/* @__PURE__ */ (0,
|
|
7936
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
7317
7937
|
] }),
|
|
7318
|
-
/* @__PURE__ */ (0,
|
|
7319
|
-
/* @__PURE__ */ (0,
|
|
7320
|
-
/* @__PURE__ */ (0,
|
|
7938
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Button, { variant: "ghost", size: "sm", onClick: () => tick(), disabled: refreshing, className: "h-8", children: [
|
|
7939
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.RefreshCw, { className: cn2("h-3.5 w-3.5 mr-1", refreshing && "animate-spin") }),
|
|
7940
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-xs", children: "Refresh" })
|
|
7321
7941
|
] })
|
|
7322
7942
|
] }),
|
|
7323
|
-
/* @__PURE__ */ (0,
|
|
7324
|
-
/* @__PURE__ */ (0,
|
|
7325
|
-
/* @__PURE__ */ (0,
|
|
7326
|
-
/* @__PURE__ */ (0,
|
|
7943
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
7944
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "UO Hash" }),
|
|
7945
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("code", { className: "text-xs font-mono flex-1 select-all", children: userOpHash }),
|
|
7946
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7327
7947
|
Button,
|
|
7328
7948
|
{
|
|
7329
7949
|
variant: "ghost",
|
|
@@ -7335,14 +7955,14 @@ var UserOpStatus = ({
|
|
|
7335
7955
|
} catch {
|
|
7336
7956
|
}
|
|
7337
7957
|
},
|
|
7338
|
-
children: /* @__PURE__ */ (0,
|
|
7958
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Copy, { className: "h-3.5 w-3.5" })
|
|
7339
7959
|
}
|
|
7340
7960
|
)
|
|
7341
7961
|
] }),
|
|
7342
|
-
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ (0,
|
|
7343
|
-
/* @__PURE__ */ (0,
|
|
7344
|
-
/* @__PURE__ */ (0,
|
|
7345
|
-
/* @__PURE__ */ (0,
|
|
7962
|
+
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
7963
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "Tx Hash" }),
|
|
7964
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("code", { className: "text-xs font-mono flex-1 select-all", children: receipt.receipt.transactionHash }),
|
|
7965
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7346
7966
|
Button,
|
|
7347
7967
|
{
|
|
7348
7968
|
variant: "ghost",
|
|
@@ -7354,10 +7974,10 @@ var UserOpStatus = ({
|
|
|
7354
7974
|
} catch {
|
|
7355
7975
|
}
|
|
7356
7976
|
},
|
|
7357
|
-
children: /* @__PURE__ */ (0,
|
|
7977
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Copy, { className: "h-3.5 w-3.5" })
|
|
7358
7978
|
}
|
|
7359
7979
|
),
|
|
7360
|
-
chain?.blockExplorers?.default?.url && /* @__PURE__ */ (0,
|
|
7980
|
+
chain?.blockExplorers?.default?.url && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
7361
7981
|
"a",
|
|
7362
7982
|
{
|
|
7363
7983
|
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
@@ -7365,11 +7985,11 @@ var UserOpStatus = ({
|
|
|
7365
7985
|
rel: "noreferrer noopener",
|
|
7366
7986
|
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
7367
7987
|
title: "Open in explorer",
|
|
7368
|
-
children: /* @__PURE__ */ (0,
|
|
7988
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.ExternalLink, { className: "h-3.5 w-3.5" })
|
|
7369
7989
|
}
|
|
7370
7990
|
)
|
|
7371
7991
|
] }),
|
|
7372
|
-
receipt && /* @__PURE__ */ (0,
|
|
7992
|
+
receipt && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
7373
7993
|
"Block ",
|
|
7374
7994
|
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
7375
7995
|
" \u2022 Gas Used",
|
|
@@ -7378,32 +7998,32 @@ var UserOpStatus = ({
|
|
|
7378
7998
|
" \u2022 Success ",
|
|
7379
7999
|
String(!!receipt.success)
|
|
7380
8000
|
] }),
|
|
7381
|
-
/* @__PURE__ */ (0,
|
|
8001
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { className: "ml-2", children: [
|
|
7382
8002
|
"\u2022 Polling for ",
|
|
7383
8003
|
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
7384
8004
|
"s"
|
|
7385
8005
|
] }) }),
|
|
7386
|
-
mempool && /* @__PURE__ */ (0,
|
|
7387
|
-
/* @__PURE__ */ (0,
|
|
8006
|
+
mempool && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
8007
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { children: [
|
|
7388
8008
|
"Seen by bundler at ",
|
|
7389
|
-
/* @__PURE__ */ (0,
|
|
8009
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
7390
8010
|
] }),
|
|
7391
|
-
/* @__PURE__ */ (0,
|
|
8011
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { children: [
|
|
7392
8012
|
"sender ",
|
|
7393
|
-
/* @__PURE__ */ (0,
|
|
8013
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Address, { address: mempool.sender, chain, truncate: false })
|
|
7394
8014
|
] })
|
|
7395
8015
|
] }),
|
|
7396
|
-
error && /* @__PURE__ */ (0,
|
|
7397
|
-
/* @__PURE__ */ (0,
|
|
8016
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8017
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7398
8018
|
" ",
|
|
7399
8019
|
error
|
|
7400
8020
|
] }),
|
|
7401
|
-
rejected && /* @__PURE__ */ (0,
|
|
7402
|
-
/* @__PURE__ */ (0,
|
|
8021
|
+
rejected && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8022
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7403
8023
|
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
7404
8024
|
] }),
|
|
7405
|
-
timedOut && /* @__PURE__ */ (0,
|
|
7406
|
-
/* @__PURE__ */ (0,
|
|
8025
|
+
timedOut && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8026
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.AlertCircle, { className: "h-4 w-4" }),
|
|
7407
8027
|
"Stopped polling after ",
|
|
7408
8028
|
Math.round(maxPollTimeMs / 1e3),
|
|
7409
8029
|
"s. UserOperation may have been rejected by the bundler."
|
|
@@ -7415,7 +8035,7 @@ var UserOpStatus = ({
|
|
|
7415
8035
|
|
|
7416
8036
|
// src/internal/components/SendModal.tsx
|
|
7417
8037
|
init_base();
|
|
7418
|
-
var
|
|
8038
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
7419
8039
|
var SendModal = ({
|
|
7420
8040
|
open,
|
|
7421
8041
|
onOpenChange,
|
|
@@ -7498,7 +8118,7 @@ var SendModal = ({
|
|
|
7498
8118
|
const maxAmount = Math.max(0, balance - 1e-3);
|
|
7499
8119
|
setAmount(maxAmount.toFixed(6));
|
|
7500
8120
|
};
|
|
7501
|
-
return /* @__PURE__ */ (0,
|
|
8121
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
7502
8122
|
DialogContent,
|
|
7503
8123
|
{
|
|
7504
8124
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7510,28 +8130,28 @@ var SendModal = ({
|
|
|
7510
8130
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7511
8131
|
},
|
|
7512
8132
|
children: [
|
|
7513
|
-
/* @__PURE__ */ (0,
|
|
7514
|
-
/* @__PURE__ */ (0,
|
|
7515
|
-
/* @__PURE__ */ (0,
|
|
7516
|
-
onBack && txStep === "input" && /* @__PURE__ */ (0,
|
|
8133
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogTitle, { children: "Send Transaction" }) }),
|
|
8134
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogDescription, { className: "sr-only", children: "Send LUMIA tokens to another address" }),
|
|
8135
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8136
|
+
onBack && txStep === "input" && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7517
8137
|
"button",
|
|
7518
8138
|
{
|
|
7519
8139
|
onClick: onBack,
|
|
7520
8140
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7521
8141
|
title: "Back",
|
|
7522
|
-
children: /* @__PURE__ */ (0,
|
|
8142
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.ArrowLeft, { className: "h-4 w-4" })
|
|
7523
8143
|
}
|
|
7524
8144
|
),
|
|
7525
|
-
/* @__PURE__ */ (0,
|
|
7526
|
-
/* @__PURE__ */ (0,
|
|
7527
|
-
/* @__PURE__ */ (0,
|
|
8145
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8146
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Send, { className: "h-5 w-5" }),
|
|
8147
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { children: "Send LUMIA" })
|
|
7528
8148
|
] })
|
|
7529
8149
|
] }) }),
|
|
7530
|
-
/* @__PURE__ */ (0,
|
|
7531
|
-
txStep === "input" && /* @__PURE__ */ (0,
|
|
7532
|
-
/* @__PURE__ */ (0,
|
|
7533
|
-
/* @__PURE__ */ (0,
|
|
7534
|
-
/* @__PURE__ */ (0,
|
|
8150
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "p-5", children: [
|
|
8151
|
+
txStep === "input" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8152
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8153
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Recipient Address" }),
|
|
8154
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7535
8155
|
"input",
|
|
7536
8156
|
{
|
|
7537
8157
|
type: "text",
|
|
@@ -7542,17 +8162,17 @@ var SendModal = ({
|
|
|
7542
8162
|
}
|
|
7543
8163
|
)
|
|
7544
8164
|
] }),
|
|
7545
|
-
/* @__PURE__ */ (0,
|
|
7546
|
-
/* @__PURE__ */ (0,
|
|
7547
|
-
/* @__PURE__ */ (0,
|
|
7548
|
-
/* @__PURE__ */ (0,
|
|
8165
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8166
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between items-center mb-2", children: [
|
|
8167
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { className: `text-sm font-medium ${theme.bodyText}`, children: "Amount" }),
|
|
8168
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
7549
8169
|
"Balance: ",
|
|
7550
8170
|
balance.toFixed(4),
|
|
7551
8171
|
" LUMIA"
|
|
7552
8172
|
] })
|
|
7553
8173
|
] }),
|
|
7554
|
-
/* @__PURE__ */ (0,
|
|
7555
|
-
/* @__PURE__ */ (0,
|
|
8174
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "relative", children: [
|
|
8175
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7556
8176
|
"input",
|
|
7557
8177
|
{
|
|
7558
8178
|
type: "number",
|
|
@@ -7563,7 +8183,7 @@ var SendModal = ({
|
|
|
7563
8183
|
className: `w-full px-3 py-2 pr-16 border ${isDark ? "bg-gray-800 border-gray-600 text-white placeholder:text-gray-400" : "bg-white border-gray-300 text-gray-900 placeholder:text-gray-400"} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`
|
|
7564
8184
|
}
|
|
7565
8185
|
),
|
|
7566
|
-
/* @__PURE__ */ (0,
|
|
8186
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7567
8187
|
"button",
|
|
7568
8188
|
{
|
|
7569
8189
|
onClick: handleMaxAmount,
|
|
@@ -7573,11 +8193,11 @@ var SendModal = ({
|
|
|
7573
8193
|
)
|
|
7574
8194
|
] })
|
|
7575
8195
|
] }),
|
|
7576
|
-
(validationError || error) && /* @__PURE__ */ (0,
|
|
7577
|
-
/* @__PURE__ */ (0,
|
|
7578
|
-
/* @__PURE__ */ (0,
|
|
8196
|
+
(validationError || error) && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `flex items-center gap-2 p-3 ${isDark ? "bg-red-900/30 text-red-400" : "bg-red-50 text-red-700"} rounded-lg`, children: [
|
|
8197
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.AlertCircle, { className: "h-4 w-4" }),
|
|
8198
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "text-sm", children: validationError || error })
|
|
7579
8199
|
] }),
|
|
7580
|
-
/* @__PURE__ */ (0,
|
|
8200
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7581
8201
|
Button,
|
|
7582
8202
|
{
|
|
7583
8203
|
onClick: handleSend,
|
|
@@ -7588,29 +8208,29 @@ var SendModal = ({
|
|
|
7588
8208
|
}
|
|
7589
8209
|
)
|
|
7590
8210
|
] }),
|
|
7591
|
-
txStep === "confirm" && /* @__PURE__ */ (0,
|
|
7592
|
-
/* @__PURE__ */ (0,
|
|
7593
|
-
/* @__PURE__ */ (0,
|
|
7594
|
-
/* @__PURE__ */ (0,
|
|
7595
|
-
/* @__PURE__ */ (0,
|
|
7596
|
-
/* @__PURE__ */ (0,
|
|
7597
|
-
/* @__PURE__ */ (0,
|
|
8211
|
+
txStep === "confirm" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8212
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8213
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("h3", { className: `font-medium ${theme.titleText} mb-3`, children: "Transaction Details" }),
|
|
8214
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-2 text-sm", children: [
|
|
8215
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8216
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "To:" }),
|
|
8217
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `font-mono ${theme.titleText}`, children: `${recipient.slice(0, 6)}...${recipient.slice(-4)}` })
|
|
7598
8218
|
] }),
|
|
7599
|
-
/* @__PURE__ */ (0,
|
|
7600
|
-
/* @__PURE__ */ (0,
|
|
7601
|
-
/* @__PURE__ */ (0,
|
|
8219
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8220
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "Amount:" }),
|
|
8221
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
7602
8222
|
amount,
|
|
7603
8223
|
" LUMIA"
|
|
7604
8224
|
] })
|
|
7605
8225
|
] }),
|
|
7606
|
-
/* @__PURE__ */ (0,
|
|
7607
|
-
/* @__PURE__ */ (0,
|
|
7608
|
-
/* @__PURE__ */ (0,
|
|
8226
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between", children: [
|
|
8227
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.bodyText}`, children: "Network:" }),
|
|
8228
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: `${theme.titleText}`, children: "Lumia Beam" })
|
|
7609
8229
|
] })
|
|
7610
8230
|
] })
|
|
7611
8231
|
] }),
|
|
7612
|
-
/* @__PURE__ */ (0,
|
|
7613
|
-
/* @__PURE__ */ (0,
|
|
8232
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex gap-2", children: [
|
|
8233
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7614
8234
|
Button,
|
|
7615
8235
|
{
|
|
7616
8236
|
onClick: () => setTxStep("input"),
|
|
@@ -7620,7 +8240,7 @@ var SendModal = ({
|
|
|
7620
8240
|
children: "Back"
|
|
7621
8241
|
}
|
|
7622
8242
|
),
|
|
7623
|
-
/* @__PURE__ */ (0,
|
|
8243
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
7624
8244
|
Button,
|
|
7625
8245
|
{
|
|
7626
8246
|
onClick: handleConfirm,
|
|
@@ -7628,28 +8248,28 @@ var SendModal = ({
|
|
|
7628
8248
|
className: "flex-1",
|
|
7629
8249
|
size: "lg",
|
|
7630
8250
|
children: [
|
|
7631
|
-
isLoading && /* @__PURE__ */ (0,
|
|
8251
|
+
isLoading && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
7632
8252
|
"Confirm"
|
|
7633
8253
|
]
|
|
7634
8254
|
}
|
|
7635
8255
|
)
|
|
7636
8256
|
] })
|
|
7637
8257
|
] }),
|
|
7638
|
-
txStep === "pending" && /* @__PURE__ */ (0,
|
|
7639
|
-
/* @__PURE__ */ (0,
|
|
7640
|
-
/* @__PURE__ */ (0,
|
|
7641
|
-
/* @__PURE__ */ (0,
|
|
7642
|
-
/* @__PURE__ */ (0,
|
|
8258
|
+
txStep === "pending" && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "py-8 text-center space-y-4", children: [
|
|
8259
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.Loader2, { className: `h-12 w-12 animate-spin ${isDark ? "text-blue-400" : "text-blue-600"} mx-auto` }),
|
|
8260
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
8261
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Pending" }),
|
|
8262
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Please wait while we process your transaction" })
|
|
7643
8263
|
] })
|
|
7644
8264
|
] }),
|
|
7645
|
-
txStep === "success" && userOpHash && /* @__PURE__ */ (0,
|
|
7646
|
-
/* @__PURE__ */ (0,
|
|
7647
|
-
/* @__PURE__ */ (0,
|
|
7648
|
-
/* @__PURE__ */ (0,
|
|
7649
|
-
/* @__PURE__ */ (0,
|
|
8265
|
+
txStep === "success" && userOpHash && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-4", children: [
|
|
8266
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "text-center py-4", children: [
|
|
8267
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react14.CheckCircle2, { className: `h-12 w-12 ${isDark ? "text-green-400" : "text-green-500"} mx-auto mb-3` }),
|
|
8268
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Sent!" }),
|
|
8269
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Your transaction is being processed" })
|
|
7650
8270
|
] }),
|
|
7651
|
-
/* @__PURE__ */ (0,
|
|
7652
|
-
/* @__PURE__ */ (0,
|
|
8271
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(UserOpStatus, { userOpHash, chain: lumiaBeam }) }),
|
|
8272
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
7653
8273
|
Button,
|
|
7654
8274
|
{
|
|
7655
8275
|
onClick: handleClose,
|
|
@@ -7667,9 +8287,9 @@ var SendModal = ({
|
|
|
7667
8287
|
|
|
7668
8288
|
// src/internal/components/ReceiveModal.tsx
|
|
7669
8289
|
var import_react18 = require("react");
|
|
7670
|
-
var
|
|
8290
|
+
var import_lucide_react15 = require("lucide-react");
|
|
7671
8291
|
var import_qrcode = __toESM(require("qrcode"), 1);
|
|
7672
|
-
var
|
|
8292
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
7673
8293
|
var ReceiveModal = ({
|
|
7674
8294
|
open,
|
|
7675
8295
|
onOpenChange,
|
|
@@ -7710,7 +8330,7 @@ var ReceiveModal = ({
|
|
|
7710
8330
|
if (!addr) return "";
|
|
7711
8331
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7712
8332
|
};
|
|
7713
|
-
return /* @__PURE__ */ (0,
|
|
8333
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
7714
8334
|
DialogContent,
|
|
7715
8335
|
{
|
|
7716
8336
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7722,51 +8342,51 @@ var ReceiveModal = ({
|
|
|
7722
8342
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7723
8343
|
},
|
|
7724
8344
|
children: [
|
|
7725
|
-
/* @__PURE__ */ (0,
|
|
7726
|
-
/* @__PURE__ */ (0,
|
|
7727
|
-
/* @__PURE__ */ (0,
|
|
7728
|
-
onBack && /* @__PURE__ */ (0,
|
|
8345
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DialogTitle, { children: "Receive LUMIA" }) }),
|
|
8346
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DialogDescription, { className: "sr-only", children: "Your wallet address and QR code for receiving LUMIA" }),
|
|
8347
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8348
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
7729
8349
|
"button",
|
|
7730
8350
|
{
|
|
7731
8351
|
onClick: onBack,
|
|
7732
8352
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7733
8353
|
title: "Back",
|
|
7734
|
-
children: /* @__PURE__ */ (0,
|
|
8354
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.ArrowLeft, { className: "h-4 w-4" })
|
|
7735
8355
|
}
|
|
7736
8356
|
),
|
|
7737
|
-
/* @__PURE__ */ (0,
|
|
7738
|
-
/* @__PURE__ */ (0,
|
|
7739
|
-
/* @__PURE__ */ (0,
|
|
8357
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8358
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.QrCode, { className: "h-5 w-5" }),
|
|
8359
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Receive LUMIA" })
|
|
7740
8360
|
] })
|
|
7741
8361
|
] }) }),
|
|
7742
|
-
/* @__PURE__ */ (0,
|
|
7743
|
-
qrCodeUrl && /* @__PURE__ */ (0,
|
|
7744
|
-
/* @__PURE__ */ (0,
|
|
7745
|
-
/* @__PURE__ */ (0,
|
|
7746
|
-
/* @__PURE__ */ (0,
|
|
8362
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "p-5 space-y-4", children: [
|
|
8363
|
+
qrCodeUrl && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `${isDark ? "bg-white" : "bg-white"} p-4 rounded-xl border ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("img", { src: qrCodeUrl, alt: "Wallet QR Code", className: "w-48 h-48" }) }) }),
|
|
8364
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `${isDark ? "bg-blue-900/30 border-blue-600" : "bg-blue-50 border-blue-200"} rounded-lg p-3`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `flex items-center gap-2 ${isDark ? "text-blue-300" : "text-blue-700"} text-sm`, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex-1", children: [
|
|
8365
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "font-medium", children: "Network: Lumia Beam" }),
|
|
8366
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} mt-0.5`, children: "Ensure sender is on the same network" })
|
|
7747
8367
|
] }) }) }),
|
|
7748
|
-
/* @__PURE__ */ (0,
|
|
7749
|
-
/* @__PURE__ */ (0,
|
|
7750
|
-
/* @__PURE__ */ (0,
|
|
7751
|
-
/* @__PURE__ */ (0,
|
|
8368
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
8369
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Your Wallet Address" }),
|
|
8370
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: `flex-1 font-mono text-sm ${isDark ? "text-white bg-gray-700 border-gray-600" : "text-gray-900 bg-white border-gray-300"} rounded-lg px-3 py-2 break-all`, children: address }) }),
|
|
8371
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
7752
8372
|
Button,
|
|
7753
8373
|
{
|
|
7754
8374
|
onClick: handleCopy,
|
|
7755
8375
|
className: "w-full mt-3",
|
|
7756
8376
|
size: "lg",
|
|
7757
|
-
children: copied ? /* @__PURE__ */ (0,
|
|
7758
|
-
/* @__PURE__ */ (0,
|
|
7759
|
-
/* @__PURE__ */ (0,
|
|
7760
|
-
] }) : /* @__PURE__ */ (0,
|
|
7761
|
-
/* @__PURE__ */ (0,
|
|
7762
|
-
/* @__PURE__ */ (0,
|
|
8377
|
+
children: copied ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
|
|
8378
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.CheckCircle2, { className: "h-4 w-4" }),
|
|
8379
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Copied!" })
|
|
8380
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
|
|
8381
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react15.Copy, { className: "h-4 w-4" }),
|
|
8382
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: "Copy Address" })
|
|
7763
8383
|
] })
|
|
7764
8384
|
}
|
|
7765
8385
|
)
|
|
7766
8386
|
] }),
|
|
7767
|
-
/* @__PURE__ */ (0,
|
|
7768
|
-
/* @__PURE__ */ (0,
|
|
7769
|
-
/* @__PURE__ */ (0,
|
|
8387
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
8388
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { children: "Share this address to receive LUMIA tokens." }),
|
|
8389
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "mt-1", children: "Only send LUMIA tokens to this address on Lumia Beam network." })
|
|
7770
8390
|
] })
|
|
7771
8391
|
] })
|
|
7772
8392
|
]
|
|
@@ -7775,12 +8395,12 @@ var ReceiveModal = ({
|
|
|
7775
8395
|
};
|
|
7776
8396
|
|
|
7777
8397
|
// src/internal/components/BuyModal.tsx
|
|
7778
|
-
var
|
|
7779
|
-
var
|
|
8398
|
+
var import_lucide_react16 = require("lucide-react");
|
|
8399
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
7780
8400
|
var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
7781
8401
|
const { config } = useLumiaPassportConfig();
|
|
7782
8402
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7783
|
-
return /* @__PURE__ */ (0,
|
|
8403
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
|
|
7784
8404
|
DialogContent,
|
|
7785
8405
|
{
|
|
7786
8406
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7792,26 +8412,26 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7792
8412
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7793
8413
|
},
|
|
7794
8414
|
children: [
|
|
7795
|
-
/* @__PURE__ */ (0,
|
|
7796
|
-
/* @__PURE__ */ (0,
|
|
7797
|
-
/* @__PURE__ */ (0,
|
|
7798
|
-
onBack && /* @__PURE__ */ (0,
|
|
8415
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DialogTitle, { children: "Buy Crypto" }) }),
|
|
8416
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DialogDescription, { className: "sr-only", children: "On-ramp placeholder" }),
|
|
8417
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8418
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
7799
8419
|
"button",
|
|
7800
8420
|
{
|
|
7801
8421
|
onClick: onBack,
|
|
7802
8422
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7803
8423
|
title: "Back",
|
|
7804
|
-
children: /* @__PURE__ */ (0,
|
|
8424
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_lucide_react16.ArrowLeft, { className: "h-4 w-4" })
|
|
7805
8425
|
}
|
|
7806
8426
|
),
|
|
7807
|
-
/* @__PURE__ */ (0,
|
|
7808
|
-
/* @__PURE__ */ (0,
|
|
7809
|
-
/* @__PURE__ */ (0,
|
|
8427
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8428
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_lucide_react16.CreditCard, { className: "h-5 w-5" }),
|
|
8429
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: "Buy" })
|
|
7810
8430
|
] })
|
|
7811
8431
|
] }) }),
|
|
7812
|
-
/* @__PURE__ */ (0,
|
|
7813
|
-
/* @__PURE__ */ (0,
|
|
7814
|
-
/* @__PURE__ */ (0,
|
|
8432
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "p-5", children: [
|
|
8433
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "On-ramp coming soon\u2026" }) }),
|
|
8434
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "pt-4", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
7815
8435
|
] })
|
|
7816
8436
|
]
|
|
7817
8437
|
}
|
|
@@ -7819,14 +8439,14 @@ var BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7819
8439
|
};
|
|
7820
8440
|
|
|
7821
8441
|
// src/internal/components/KycModal.tsx
|
|
7822
|
-
var
|
|
7823
|
-
var
|
|
8442
|
+
var import_lucide_react17 = require("lucide-react");
|
|
8443
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
7824
8444
|
var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
7825
8445
|
const { config } = useLumiaPassportConfig();
|
|
7826
8446
|
const { isDark, classes: theme } = useTheme(config.ui.theme);
|
|
7827
8447
|
const provider = config.kyc?.provider;
|
|
7828
8448
|
const options = config.kyc?.options || {};
|
|
7829
|
-
return /* @__PURE__ */ (0,
|
|
8449
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
|
|
7830
8450
|
DialogContent,
|
|
7831
8451
|
{
|
|
7832
8452
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -7838,32 +8458,32 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7838
8458
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
7839
8459
|
},
|
|
7840
8460
|
children: [
|
|
7841
|
-
/* @__PURE__ */ (0,
|
|
7842
|
-
/* @__PURE__ */ (0,
|
|
7843
|
-
/* @__PURE__ */ (0,
|
|
7844
|
-
onBack && /* @__PURE__ */ (0,
|
|
8461
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(DialogTitle, { children: "KYC" }) }),
|
|
8462
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(DialogDescription, { className: "sr-only", children: "KYC placeholder" }),
|
|
8463
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8464
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
|
|
7845
8465
|
"button",
|
|
7846
8466
|
{
|
|
7847
8467
|
onClick: onBack,
|
|
7848
8468
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
7849
8469
|
title: "Back",
|
|
7850
|
-
children: /* @__PURE__ */ (0,
|
|
8470
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react17.ArrowLeft, { className: "h-4 w-4" })
|
|
7851
8471
|
}
|
|
7852
8472
|
),
|
|
7853
|
-
/* @__PURE__ */ (0,
|
|
7854
|
-
/* @__PURE__ */ (0,
|
|
7855
|
-
/* @__PURE__ */ (0,
|
|
8473
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
8474
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react17.ShieldCheck, { className: "h-5 w-5" }),
|
|
8475
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: "KYC" })
|
|
7856
8476
|
] })
|
|
7857
8477
|
] }) }),
|
|
7858
|
-
/* @__PURE__ */ (0,
|
|
7859
|
-
provider ? /* @__PURE__ */ (0,
|
|
7860
|
-
/* @__PURE__ */ (0,
|
|
8478
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "p-5", children: [
|
|
8479
|
+
provider ? /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `rounded-xl p-4 ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: [
|
|
8480
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: `text-sm ${theme.titleText} mb-2`, children: [
|
|
7861
8481
|
"KYC provider: ",
|
|
7862
|
-
/* @__PURE__ */ (0,
|
|
8482
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "font-medium", children: provider })
|
|
7863
8483
|
] }),
|
|
7864
|
-
Object.keys(options).length > 0 ? /* @__PURE__ */ (0,
|
|
7865
|
-
] }) : /* @__PURE__ */ (0,
|
|
7866
|
-
/* @__PURE__ */ (0,
|
|
8484
|
+
Object.keys(options).length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-xs ${theme.mutedText} break-words whitespace-pre-wrap`, children: JSON.stringify(options, null, 2) }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "No provider options configured." })
|
|
8485
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: "KYC verification coming soon\u2026" }) }),
|
|
8486
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pt-4", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
7867
8487
|
] })
|
|
7868
8488
|
]
|
|
7869
8489
|
}
|
|
@@ -7872,20 +8492,20 @@ var KycModal = ({ open, onOpenChange, onBack }) => {
|
|
|
7872
8492
|
|
|
7873
8493
|
// src/components/ConnectWalletButton.tsx
|
|
7874
8494
|
init_auth();
|
|
7875
|
-
var
|
|
8495
|
+
var import_lucide_react18 = require("lucide-react");
|
|
7876
8496
|
init_base();
|
|
7877
8497
|
|
|
7878
8498
|
// src/modules/linkedProfiles.ts
|
|
7879
|
-
var
|
|
8499
|
+
var React27 = __toESM(require("react"), 1);
|
|
7880
8500
|
init_common();
|
|
7881
8501
|
init_types();
|
|
7882
8502
|
init_auth();
|
|
7883
8503
|
function useLumiaPassportLinkedProfiles() {
|
|
7884
|
-
const [profiles, setProfiles] =
|
|
7885
|
-
const [avatar, setAvatar] =
|
|
7886
|
-
const [isLoading, setIsLoading] =
|
|
7887
|
-
const [error, setError] =
|
|
7888
|
-
const load =
|
|
8504
|
+
const [profiles, setProfiles] = React27.useState([]);
|
|
8505
|
+
const [avatar, setAvatar] = React27.useState(null);
|
|
8506
|
+
const [isLoading, setIsLoading] = React27.useState(false);
|
|
8507
|
+
const [error, setError] = React27.useState(null);
|
|
8508
|
+
const load = React27.useCallback(async () => {
|
|
7889
8509
|
setIsLoading(true);
|
|
7890
8510
|
setError(null);
|
|
7891
8511
|
try {
|
|
@@ -7911,14 +8531,14 @@ function useLumiaPassportLinkedProfiles() {
|
|
|
7911
8531
|
setIsLoading(false);
|
|
7912
8532
|
}
|
|
7913
8533
|
}, []);
|
|
7914
|
-
|
|
8534
|
+
React27.useEffect(() => {
|
|
7915
8535
|
load();
|
|
7916
8536
|
}, [load]);
|
|
7917
8537
|
return { profiles, avatar, isLoading, error, refresh: load };
|
|
7918
8538
|
}
|
|
7919
8539
|
|
|
7920
8540
|
// src/components/ConnectWalletButton.tsx
|
|
7921
|
-
var
|
|
8541
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
7922
8542
|
var ConnectWalletButton = ({
|
|
7923
8543
|
className,
|
|
7924
8544
|
label = "Connect Wallet",
|
|
@@ -7970,6 +8590,7 @@ var ConnectWalletButton = ({
|
|
|
7970
8590
|
const [copied, setCopied] = import_react19.default.useState(false);
|
|
7971
8591
|
const [isManageWalletOpen, setIsManageWalletOpen] = import_react19.default.useState(false);
|
|
7972
8592
|
const [isSecurityOpen, setIsSecurityOpen] = import_react19.default.useState(false);
|
|
8593
|
+
const [isBackupOpen, setIsBackupOpen] = import_react19.default.useState(false);
|
|
7973
8594
|
const [isTransactionsOpen, setIsTransactionsOpen] = import_react19.default.useState(false);
|
|
7974
8595
|
const [isViewAssetsOpen, setIsViewAssetsOpen] = import_react19.default.useState(false);
|
|
7975
8596
|
const [isSendOpen, setIsSendOpen] = import_react19.default.useState(false);
|
|
@@ -8220,8 +8841,8 @@ var ConnectWalletButton = ({
|
|
|
8220
8841
|
refetchBalance();
|
|
8221
8842
|
}
|
|
8222
8843
|
}, [address]);
|
|
8223
|
-
return /* @__PURE__ */ (0,
|
|
8224
|
-
/* @__PURE__ */ (0,
|
|
8844
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: [className, "lumia-scope"].filter(Boolean).join(" "), children: [
|
|
8845
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "inline-flex items-center gap-2", children: !address ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8225
8846
|
"button",
|
|
8226
8847
|
{
|
|
8227
8848
|
onClick: () => {
|
|
@@ -8258,56 +8879,56 @@ var ConnectWalletButton = ({
|
|
|
8258
8879
|
},
|
|
8259
8880
|
children: label || "Connect"
|
|
8260
8881
|
}
|
|
8261
|
-
) }) : /* @__PURE__ */ (0,
|
|
8882
|
+
) }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8262
8883
|
"div",
|
|
8263
8884
|
{
|
|
8264
8885
|
className: `relative rounded-2xl p-4 shadow-lg cursor-pointer transition-all duration-200 hover:scale-105 hover:shadow-xl max-w-sm min-w-[280px] ${isDark ? "bg-gray-900/40 backdrop-blur border border-gray-700" : "bg-white backdrop-blur border border-gray-200"}`,
|
|
8265
8886
|
onClick: () => setIsWalletMenuOpen(true),
|
|
8266
|
-
children: /* @__PURE__ */ (0,
|
|
8267
|
-
/* @__PURE__ */ (0,
|
|
8887
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-3", children: [
|
|
8888
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 overflow-hidden bg-gradient-to-br from-purple-500 to-blue-600", children: avatar ? (
|
|
8268
8889
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8269
|
-
/* @__PURE__ */ (0,
|
|
8270
|
-
) : /* @__PURE__ */ (0,
|
|
8271
|
-
/* @__PURE__ */ (0,
|
|
8272
|
-
/* @__PURE__ */ (0,
|
|
8273
|
-
/* @__PURE__ */ (0,
|
|
8890
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8891
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white font-bold text-sm", children: "LP" }) }),
|
|
8892
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "text-left flex-1 min-w-0", children: [
|
|
8893
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `font-semibold text-base truncate ${theme.titleText}`, children: mode === "compact" && displayName ? displayName : formatAddress(address) }),
|
|
8894
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
8274
8895
|
formatBalance(),
|
|
8275
8896
|
" LUMIA"
|
|
8276
8897
|
] })
|
|
8277
8898
|
] }),
|
|
8278
|
-
/* @__PURE__ */ (0,
|
|
8279
|
-
/* @__PURE__ */ (0,
|
|
8280
|
-
/* @__PURE__ */ (0,
|
|
8281
|
-
|
|
8899
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
8900
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8901
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8902
|
+
import_lucide_react18.Cloud,
|
|
8282
8903
|
{
|
|
8283
8904
|
className: `w-3 h-3 ${indicators.server ? "text-green-500" : "text-orange-400"}`
|
|
8284
8905
|
}
|
|
8285
8906
|
),
|
|
8286
|
-
/* @__PURE__ */ (0,
|
|
8907
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8287
8908
|
"Server Keyshare: ",
|
|
8288
8909
|
indicators.server ? "Available" : "Missing"
|
|
8289
8910
|
] })
|
|
8290
8911
|
] }),
|
|
8291
|
-
/* @__PURE__ */ (0,
|
|
8292
|
-
/* @__PURE__ */ (0,
|
|
8293
|
-
|
|
8912
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8913
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8914
|
+
import_lucide_react18.Laptop,
|
|
8294
8915
|
{
|
|
8295
8916
|
className: `w-3 h-3 ${indicators.local ? "text-green-500" : "text-orange-400"}`
|
|
8296
8917
|
}
|
|
8297
8918
|
),
|
|
8298
|
-
/* @__PURE__ */ (0,
|
|
8919
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8299
8920
|
"Local Keyshare: ",
|
|
8300
8921
|
indicators.local ? "Available" : "Missing"
|
|
8301
8922
|
] })
|
|
8302
8923
|
] }),
|
|
8303
|
-
/* @__PURE__ */ (0,
|
|
8304
|
-
/* @__PURE__ */ (0,
|
|
8305
|
-
|
|
8924
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "group relative", children: [
|
|
8925
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8926
|
+
import_lucide_react18.Shield,
|
|
8306
8927
|
{
|
|
8307
8928
|
className: `w-3 h-3 ${indicators.backup ? "text-green-500" : "text-orange-400"}`
|
|
8308
8929
|
}
|
|
8309
8930
|
),
|
|
8310
|
-
/* @__PURE__ */ (0,
|
|
8931
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
8311
8932
|
"Vault Backup: ",
|
|
8312
8933
|
indicators.backup ? "Available" : "Not Found"
|
|
8313
8934
|
] })
|
|
@@ -8316,59 +8937,59 @@ var ConnectWalletButton = ({
|
|
|
8316
8937
|
] })
|
|
8317
8938
|
}
|
|
8318
8939
|
) }),
|
|
8319
|
-
isWalletMenuOpen && address && /* @__PURE__ */ (0,
|
|
8320
|
-
/* @__PURE__ */ (0,
|
|
8321
|
-
/* @__PURE__ */ (0,
|
|
8322
|
-
/* @__PURE__ */ (0,
|
|
8323
|
-
/* @__PURE__ */ (0,
|
|
8940
|
+
isWalletMenuOpen && address && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "fixed inset-0 z-[60]", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Dialog, { open: isWalletMenuOpen, onOpenChange: setIsWalletMenuOpen, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
8941
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogTitle, { children: "Wallet Menu" }) }),
|
|
8942
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogDescription, { className: "sr-only", children: "Smart Account wallet actions and status" }),
|
|
8943
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `p-4 border-b ${theme.divider}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-4", children: [
|
|
8944
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center relative overflow-hidden", children: avatar ? (
|
|
8324
8945
|
// eslint-disable-next-line @next/next/no-img-element
|
|
8325
|
-
/* @__PURE__ */ (0,
|
|
8326
|
-
) : /* @__PURE__ */ (0,
|
|
8327
|
-
/* @__PURE__ */ (0,
|
|
8328
|
-
/* @__PURE__ */ (0,
|
|
8329
|
-
/* @__PURE__ */ (0,
|
|
8330
|
-
/* @__PURE__ */ (0,
|
|
8331
|
-
/* @__PURE__ */ (0,
|
|
8946
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
8947
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white font-bold text-lg", children: "L" }) }),
|
|
8948
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
8949
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `font-medium text-lg ${theme.titleText}`, children: displayName || "Smart Account" }),
|
|
8950
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
8951
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm ${theme.mutedText}`, children: formatAddress(address) }),
|
|
8952
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("button", { onClick: async () => {
|
|
8332
8953
|
try {
|
|
8333
8954
|
await navigator.clipboard.writeText(address);
|
|
8334
8955
|
setCopied(true);
|
|
8335
8956
|
setTimeout(() => setCopied(false), 1500);
|
|
8336
8957
|
} catch {
|
|
8337
8958
|
}
|
|
8338
|
-
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ (0,
|
|
8959
|
+
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-green-500 text-sm", children: "\u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Copy, { className: "w-4 h-4" }) })
|
|
8339
8960
|
] })
|
|
8340
8961
|
] })
|
|
8341
8962
|
] }) }) }),
|
|
8342
|
-
/* @__PURE__ */ (0,
|
|
8343
|
-
/* @__PURE__ */ (0,
|
|
8344
|
-
/* @__PURE__ */ (0,
|
|
8963
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "p-4", children: [
|
|
8964
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "grid grid-cols-3 gap-2 mb-4", children: [
|
|
8965
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8345
8966
|
setIsWalletMenuOpen(false);
|
|
8346
8967
|
setIsSendOpen(true);
|
|
8347
8968
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-blue-400" : "bg-blue-50 hover:bg-blue-100 text-blue-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8348
|
-
/* @__PURE__ */ (0,
|
|
8349
|
-
/* @__PURE__ */ (0,
|
|
8969
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUp, { className: "w-5 h-5" }),
|
|
8970
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Send" })
|
|
8350
8971
|
] }),
|
|
8351
|
-
/* @__PURE__ */ (0,
|
|
8972
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8352
8973
|
setIsWalletMenuOpen(false);
|
|
8353
8974
|
setIsReceiveOpen(true);
|
|
8354
8975
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-green-400" : "bg-green-50 hover:bg-green-100 text-green-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8355
|
-
/* @__PURE__ */ (0,
|
|
8356
|
-
/* @__PURE__ */ (0,
|
|
8976
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowDown, { className: "w-5 h-5" }),
|
|
8977
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Receive" })
|
|
8357
8978
|
] }),
|
|
8358
|
-
/* @__PURE__ */ (0,
|
|
8979
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8359
8980
|
setIsWalletMenuOpen(false);
|
|
8360
8981
|
setIsBuyOpen(true);
|
|
8361
8982
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-purple-400" : "bg-purple-50 hover:bg-purple-100 text-purple-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
8362
|
-
/* @__PURE__ */ (0,
|
|
8363
|
-
/* @__PURE__ */ (0,
|
|
8983
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Plus, { className: "w-5 h-5" }),
|
|
8984
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-sm font-medium", children: "Buy" })
|
|
8364
8985
|
] })
|
|
8365
8986
|
] }),
|
|
8366
|
-
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ (0,
|
|
8367
|
-
/* @__PURE__ */ (0,
|
|
8368
|
-
/* @__PURE__ */ (0,
|
|
8369
|
-
/* @__PURE__ */ (0,
|
|
8370
|
-
/* @__PURE__ */ (0,
|
|
8371
|
-
/* @__PURE__ */ (0,
|
|
8987
|
+
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-orange-900/20 border border-orange-900/40" : "bg-orange-50 border border-orange-200"}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-start space-x-3", children: [
|
|
8988
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.AlertTriangle, { className: `w-5 h-5 ${isDark ? "text-orange-400" : "text-orange-500"} mt-0.5 flex-shrink-0` }),
|
|
8989
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
8990
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm font-medium ${isDark ? "text-orange-300" : "text-orange-700"}`, children: "Backup Not Created" }),
|
|
8991
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-xs mt-1 ${isDark ? "text-orange-400/80" : "text-orange-600"}`, children: "Secure your wallet with an encrypted vault backup to protect against device loss." }),
|
|
8992
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
8372
8993
|
"button",
|
|
8373
8994
|
{
|
|
8374
8995
|
onClick: () => {
|
|
@@ -8377,19 +8998,19 @@ var ConnectWalletButton = ({
|
|
|
8377
8998
|
},
|
|
8378
8999
|
className: `mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${isDark ? "bg-orange-900/40 hover:bg-orange-900/60 text-orange-300" : "bg-orange-100 hover:bg-orange-200 text-orange-700"}`,
|
|
8379
9000
|
children: [
|
|
8380
|
-
/* @__PURE__ */ (0,
|
|
9001
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: "w-3 h-3 inline mr-1" }),
|
|
8381
9002
|
"Create Backup"
|
|
8382
9003
|
]
|
|
8383
9004
|
}
|
|
8384
9005
|
)
|
|
8385
9006
|
] })
|
|
8386
9007
|
] }) }),
|
|
8387
|
-
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ (0,
|
|
8388
|
-
/* @__PURE__ */ (0,
|
|
8389
|
-
/* @__PURE__ */ (0,
|
|
8390
|
-
/* @__PURE__ */ (0,
|
|
8391
|
-
/* @__PURE__ */ (0,
|
|
8392
|
-
/* @__PURE__ */ (0,
|
|
9008
|
+
config.warnings?.emailNotConnectedWarning && !profilesLoading && !profiles.some((p) => p.provider?.toLowerCase() === "email") && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-blue-900/20 border border-blue-900/40" : "bg-blue-50 border border-blue-200"}`, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-start space-x-3", children: [
|
|
9009
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.AlertTriangle, { className: `w-5 h-5 ${isDark ? "text-blue-400" : "text-blue-500"} mt-0.5 flex-shrink-0` }),
|
|
9010
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
9011
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-sm font-medium ${isDark ? "text-blue-300" : "text-blue-700"}`, children: "Email Not Connected" }),
|
|
9012
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `text-xs mt-1 ${isDark ? "text-blue-400/80" : "text-blue-600"}`, children: "Connect your email for easier account recovery and additional security." }),
|
|
9013
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
8393
9014
|
"button",
|
|
8394
9015
|
{
|
|
8395
9016
|
onClick: () => {
|
|
@@ -8398,80 +9019,87 @@ var ConnectWalletButton = ({
|
|
|
8398
9019
|
},
|
|
8399
9020
|
className: `mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${isDark ? "bg-blue-900/40 hover:bg-blue-900/60 text-blue-300" : "bg-blue-100 hover:bg-blue-200 text-blue-700"}`,
|
|
8400
9021
|
children: [
|
|
8401
|
-
/* @__PURE__ */ (0,
|
|
9022
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: "w-3 h-3 inline mr-1" }),
|
|
8402
9023
|
"Connect Email"
|
|
8403
9024
|
]
|
|
8404
9025
|
}
|
|
8405
9026
|
)
|
|
8406
9027
|
] })
|
|
8407
9028
|
] }) }),
|
|
8408
|
-
/* @__PURE__ */ (0,
|
|
9029
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8409
9030
|
"button",
|
|
8410
9031
|
{
|
|
8411
9032
|
onClick: () => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank"),
|
|
8412
9033
|
className: `w-full ${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-3 mb-3 transition-colors cursor-pointer text-left`,
|
|
8413
|
-
children: /* @__PURE__ */ (0,
|
|
8414
|
-
/* @__PURE__ */ (0,
|
|
8415
|
-
/* @__PURE__ */ (0,
|
|
8416
|
-
/* @__PURE__ */ (0,
|
|
8417
|
-
/* @__PURE__ */ (0,
|
|
8418
|
-
/* @__PURE__ */ (0,
|
|
9034
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9035
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center space-x-3", children: [
|
|
9036
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden", children: lumiaBeam.logoDataUri ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: lumiaBeam.logoDataUri, alt: "Chain logo", className: "w-full h-full object-cover" }) : lumiaBeam.logo === "lumia" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(LumiaLogo, { size: 32 }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-white text-xs font-bold", children: (lumiaBeam.name || "L").charAt(0) }) }),
|
|
9037
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
|
|
9038
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: `${theme.titleText} font-medium`, children: lumiaBeam.name }),
|
|
9039
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: theme.mutedText + " text-sm", children: [
|
|
8419
9040
|
formatBalance(),
|
|
8420
9041
|
" LUMIA"
|
|
8421
9042
|
] })
|
|
8422
9043
|
] })
|
|
8423
9044
|
] }),
|
|
8424
|
-
/* @__PURE__ */ (0,
|
|
9045
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: theme.iconColor, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUpRight, { className: "w-4 h-4" }) })
|
|
8425
9046
|
] })
|
|
8426
9047
|
}
|
|
8427
9048
|
),
|
|
8428
|
-
/* @__PURE__ */ (0,
|
|
8429
|
-
config.features?.kycNeeded && /* @__PURE__ */ (0,
|
|
9049
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "space-y-1", children: [
|
|
9050
|
+
config.features?.kycNeeded && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8430
9051
|
setIsWalletMenuOpen(false);
|
|
8431
9052
|
setIsKycOpen(true);
|
|
8432
9053
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8433
|
-
/* @__PURE__ */ (0,
|
|
8434
|
-
/* @__PURE__ */ (0,
|
|
9054
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ShieldCheck, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9055
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "KYC" })
|
|
8435
9056
|
] }),
|
|
8436
|
-
/* @__PURE__ */ (0,
|
|
9057
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8437
9058
|
setIsWalletMenuOpen(false);
|
|
8438
9059
|
setIsTransactionsOpen(true);
|
|
8439
9060
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8440
|
-
/* @__PURE__ */ (0,
|
|
8441
|
-
/* @__PURE__ */ (0,
|
|
9061
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Activity, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9062
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Transactions" })
|
|
8442
9063
|
] }),
|
|
8443
|
-
/* @__PURE__ */ (0,
|
|
9064
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8444
9065
|
setIsWalletMenuOpen(false);
|
|
8445
9066
|
setIsViewAssetsOpen(true);
|
|
8446
9067
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8447
|
-
/* @__PURE__ */ (0,
|
|
8448
|
-
/* @__PURE__ */ (0,
|
|
9068
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Gem, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9069
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "View Assets" })
|
|
8449
9070
|
] }),
|
|
8450
|
-
/* @__PURE__ */ (0,
|
|
9071
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8451
9072
|
setIsWalletMenuOpen(false);
|
|
8452
9073
|
setIsManageWalletOpen(true);
|
|
8453
9074
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8454
|
-
/* @__PURE__ */ (0,
|
|
8455
|
-
/* @__PURE__ */ (0,
|
|
9075
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.CreditCard, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9076
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Manage Wallet" })
|
|
8456
9077
|
] }),
|
|
8457
|
-
/* @__PURE__ */ (0,
|
|
9078
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
8458
9079
|
setIsWalletMenuOpen(false);
|
|
8459
9080
|
setIsSecurityOpen(true);
|
|
8460
9081
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
8461
|
-
/* @__PURE__ */ (0,
|
|
8462
|
-
/* @__PURE__ */ (0,
|
|
9082
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Lock, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9083
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Security" })
|
|
9084
|
+
] }),
|
|
9085
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: () => {
|
|
9086
|
+
setIsWalletMenuOpen(false);
|
|
9087
|
+
setIsBackupOpen(true);
|
|
9088
|
+
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-gray-800" : "hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9089
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.Shield, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
9090
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: theme.titleText, children: "Keyshare Backup" })
|
|
8463
9091
|
] }),
|
|
8464
|
-
/* @__PURE__ */ (0,
|
|
9092
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { onClick: async () => {
|
|
8465
9093
|
await handleDisconnect();
|
|
8466
9094
|
setIsWalletMenuOpen(false);
|
|
8467
9095
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "hover:bg-red-900/20" : "hover:bg-red-50"} transition-colors flex items-center space-x-3`, children: [
|
|
8468
|
-
/* @__PURE__ */ (0,
|
|
8469
|
-
/* @__PURE__ */ (0,
|
|
9096
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.ArrowUpRight, { className: "w-5 h-5 text-red-600" }),
|
|
9097
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-red-600", children: "Disconnect Wallet" })
|
|
8470
9098
|
] })
|
|
8471
9099
|
] })
|
|
8472
9100
|
] })
|
|
8473
9101
|
] }) }) }),
|
|
8474
|
-
/* @__PURE__ */ (0,
|
|
9102
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8475
9103
|
ManageWallet,
|
|
8476
9104
|
{
|
|
8477
9105
|
open: isManageWalletOpen,
|
|
@@ -8482,7 +9110,7 @@ var ConnectWalletButton = ({
|
|
|
8482
9110
|
}
|
|
8483
9111
|
}
|
|
8484
9112
|
),
|
|
8485
|
-
/* @__PURE__ */ (0,
|
|
9113
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8486
9114
|
SecurityModal,
|
|
8487
9115
|
{
|
|
8488
9116
|
open: isSecurityOpen,
|
|
@@ -8493,7 +9121,23 @@ var ConnectWalletButton = ({
|
|
|
8493
9121
|
}
|
|
8494
9122
|
}
|
|
8495
9123
|
),
|
|
8496
|
-
/* @__PURE__ */ (0,
|
|
9124
|
+
isBackupOpen && session?.mpcUserId && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Dialog, { open: isBackupOpen, onOpenChange: setIsBackupOpen, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
9125
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(VisuallyHidden, { children: [
|
|
9126
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogTitle, { children: "Keyshare Backup" }),
|
|
9127
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(DialogDescription, { children: "Create and manage encrypted backups of your keyshare" })
|
|
9128
|
+
] }),
|
|
9129
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
9130
|
+
KeyshareBackup,
|
|
9131
|
+
{
|
|
9132
|
+
userId: session.mpcUserId,
|
|
9133
|
+
onClose: () => setIsBackupOpen(false),
|
|
9134
|
+
onBackupSuccess: () => {
|
|
9135
|
+
console.log("[ConnectWalletButton] Backup created successfully");
|
|
9136
|
+
}
|
|
9137
|
+
}
|
|
9138
|
+
)
|
|
9139
|
+
] }) }),
|
|
9140
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8497
9141
|
TransactionsModal,
|
|
8498
9142
|
{
|
|
8499
9143
|
open: isTransactionsOpen,
|
|
@@ -8504,7 +9148,7 @@ var ConnectWalletButton = ({
|
|
|
8504
9148
|
}
|
|
8505
9149
|
}
|
|
8506
9150
|
),
|
|
8507
|
-
/* @__PURE__ */ (0,
|
|
9151
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8508
9152
|
ViewAssetsModal,
|
|
8509
9153
|
{
|
|
8510
9154
|
open: isViewAssetsOpen,
|
|
@@ -8515,7 +9159,7 @@ var ConnectWalletButton = ({
|
|
|
8515
9159
|
}
|
|
8516
9160
|
}
|
|
8517
9161
|
),
|
|
8518
|
-
/* @__PURE__ */ (0,
|
|
9162
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8519
9163
|
SendModal,
|
|
8520
9164
|
{
|
|
8521
9165
|
open: isSendOpen,
|
|
@@ -8526,7 +9170,7 @@ var ConnectWalletButton = ({
|
|
|
8526
9170
|
}
|
|
8527
9171
|
}
|
|
8528
9172
|
),
|
|
8529
|
-
/* @__PURE__ */ (0,
|
|
9173
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8530
9174
|
ReceiveModal,
|
|
8531
9175
|
{
|
|
8532
9176
|
open: isReceiveOpen,
|
|
@@ -8537,7 +9181,7 @@ var ConnectWalletButton = ({
|
|
|
8537
9181
|
}
|
|
8538
9182
|
}
|
|
8539
9183
|
),
|
|
8540
|
-
/* @__PURE__ */ (0,
|
|
9184
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8541
9185
|
BuyModal,
|
|
8542
9186
|
{
|
|
8543
9187
|
open: isBuyOpen,
|
|
@@ -8548,7 +9192,7 @@ var ConnectWalletButton = ({
|
|
|
8548
9192
|
}
|
|
8549
9193
|
}
|
|
8550
9194
|
),
|
|
8551
|
-
/* @__PURE__ */ (0,
|
|
9195
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8552
9196
|
KycModal,
|
|
8553
9197
|
{
|
|
8554
9198
|
open: isKycOpen,
|
|
@@ -8559,7 +9203,7 @@ var ConnectWalletButton = ({
|
|
|
8559
9203
|
}
|
|
8560
9204
|
}
|
|
8561
9205
|
),
|
|
8562
|
-
/* @__PURE__ */ (0,
|
|
9206
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8563
9207
|
AuthModal,
|
|
8564
9208
|
{
|
|
8565
9209
|
open: isAuthModalOpen,
|
|
@@ -8604,7 +9248,7 @@ var ConnectWalletButton = ({
|
|
|
8604
9248
|
}
|
|
8605
9249
|
}
|
|
8606
9250
|
),
|
|
8607
|
-
/* @__PURE__ */ (0,
|
|
9251
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
8608
9252
|
TssManagerWithRef,
|
|
8609
9253
|
{
|
|
8610
9254
|
ref: tssManagerRef,
|
|
@@ -8622,7 +9266,7 @@ var ConnectWalletButton = ({
|
|
|
8622
9266
|
};
|
|
8623
9267
|
|
|
8624
9268
|
// src/components/ThemeToggle.tsx
|
|
8625
|
-
var
|
|
9269
|
+
var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
8626
9270
|
var ThemeToggle = () => {
|
|
8627
9271
|
const { config, updateConfig } = useLumiaPassportConfig();
|
|
8628
9272
|
const currentTheme = config.ui.theme;
|
|
@@ -8667,7 +9311,7 @@ var ThemeToggle = () => {
|
|
|
8667
9311
|
return "auto";
|
|
8668
9312
|
}
|
|
8669
9313
|
};
|
|
8670
|
-
return /* @__PURE__ */ (0,
|
|
9314
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "lumia-scope", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
|
|
8671
9315
|
"button",
|
|
8672
9316
|
{
|
|
8673
9317
|
onClick: cycleTheme,
|
|
@@ -8683,19 +9327,19 @@ var ThemeToggle = () => {
|
|
|
8683
9327
|
};
|
|
8684
9328
|
|
|
8685
9329
|
// src/components/LumiaLogo.tsx
|
|
8686
|
-
var
|
|
9330
|
+
var import_jsx_runtime35 = require("react/jsx-runtime");
|
|
8687
9331
|
var LumiaLogo2 = ({ size = 80, className = "" }) => {
|
|
8688
|
-
return /* @__PURE__ */ (0,
|
|
9332
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
8689
9333
|
"div",
|
|
8690
9334
|
{
|
|
8691
9335
|
className: `flex items-center justify-center ${className}`,
|
|
8692
9336
|
style: { width: size, height: size },
|
|
8693
|
-
children: /* @__PURE__ */ (0,
|
|
8694
|
-
/* @__PURE__ */ (0,
|
|
8695
|
-
/* @__PURE__ */ (0,
|
|
8696
|
-
/* @__PURE__ */ (0,
|
|
8697
|
-
/* @__PURE__ */ (0,
|
|
8698
|
-
/* @__PURE__ */ (0,
|
|
9337
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("svg", { viewBox: "0 0 512 512", width: size, height: size, children: [
|
|
9338
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("circle", { cx: "256", cy: "256", r: "256", fill: "#060117", strokeWidth: "0" }),
|
|
9339
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9340
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9341
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
9342
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("path", { d: "M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z", fill: "#fefdff", strokeWidth: "0" })
|
|
8699
9343
|
] })
|
|
8700
9344
|
}
|
|
8701
9345
|
);
|
|
@@ -8758,9 +9402,9 @@ function useTheme2(configTheme) {
|
|
|
8758
9402
|
}
|
|
8759
9403
|
|
|
8760
9404
|
// src/internal/components/Hash.tsx
|
|
8761
|
-
var
|
|
8762
|
-
var
|
|
8763
|
-
var
|
|
9405
|
+
var React29 = __toESM(require("react"), 1);
|
|
9406
|
+
var import_lucide_react19 = require("lucide-react");
|
|
9407
|
+
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
8764
9408
|
function toExplorerUrl(kind, value, chain) {
|
|
8765
9409
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
8766
9410
|
if (!base2) return null;
|
|
@@ -8783,12 +9427,12 @@ var Hash = ({
|
|
|
8783
9427
|
}) => {
|
|
8784
9428
|
const value = hash || "";
|
|
8785
9429
|
const explorer = toExplorerUrl(kind, value, chain || void 0);
|
|
8786
|
-
const [copied, setCopied] =
|
|
8787
|
-
if (!value) return /* @__PURE__ */ (0,
|
|
8788
|
-
return /* @__PURE__ */ (0,
|
|
8789
|
-
label && /* @__PURE__ */ (0,
|
|
8790
|
-
/* @__PURE__ */ (0,
|
|
8791
|
-
showCopy && /* @__PURE__ */ (0,
|
|
9430
|
+
const [copied, setCopied] = React29.useState(false);
|
|
9431
|
+
if (!value) return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
9432
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cn2("flex items-center gap-2", className), children: [
|
|
9433
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "text-sm font-medium", children: label }),
|
|
9434
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("code", { className: "text-xs bg-background px-2 py-1 rounded break-all", children: truncate ? short2(value) : value }),
|
|
9435
|
+
showCopy && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8792
9436
|
Button,
|
|
8793
9437
|
{
|
|
8794
9438
|
variant: "ghost",
|
|
@@ -8802,10 +9446,10 @@ var Hash = ({
|
|
|
8802
9446
|
} catch {
|
|
8803
9447
|
}
|
|
8804
9448
|
},
|
|
8805
|
-
children: /* @__PURE__ */ (0,
|
|
9449
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react19.Copy, { className: "h-4 w-4" })
|
|
8806
9450
|
}
|
|
8807
9451
|
),
|
|
8808
|
-
showExplorer && explorer && /* @__PURE__ */ (0,
|
|
9452
|
+
showExplorer && explorer && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8809
9453
|
"a",
|
|
8810
9454
|
{
|
|
8811
9455
|
href: explorer,
|
|
@@ -8813,7 +9457,7 @@ var Hash = ({
|
|
|
8813
9457
|
rel: "noreferrer noopener",
|
|
8814
9458
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
8815
9459
|
title: "Open in explorer",
|
|
8816
|
-
children: /* @__PURE__ */ (0,
|
|
9460
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react19.ExternalLink, { className: "h-4 w-4" })
|
|
8817
9461
|
}
|
|
8818
9462
|
)
|
|
8819
9463
|
] });
|
|
@@ -8822,7 +9466,7 @@ var Hash = ({
|
|
|
8822
9466
|
// src/internal/components/TransactionsList.tsx
|
|
8823
9467
|
var import_react21 = require("react");
|
|
8824
9468
|
init_base();
|
|
8825
|
-
var
|
|
9469
|
+
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
8826
9470
|
var TransactionsList = ({
|
|
8827
9471
|
address,
|
|
8828
9472
|
itemsCount = 10
|
|
@@ -8876,15 +9520,15 @@ var TransactionsList = ({
|
|
|
8876
9520
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
8877
9521
|
};
|
|
8878
9522
|
if (loading) {
|
|
8879
|
-
return /* @__PURE__ */ (0,
|
|
8880
|
-
/* @__PURE__ */ (0,
|
|
8881
|
-
/* @__PURE__ */ (0,
|
|
9523
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 text-center", children: [
|
|
9524
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full" }),
|
|
9525
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "mt-2 text-sm text-gray-600", children: "Loading transactions..." })
|
|
8882
9526
|
] });
|
|
8883
9527
|
}
|
|
8884
9528
|
if (error) {
|
|
8885
|
-
return /* @__PURE__ */ (0,
|
|
8886
|
-
/* @__PURE__ */ (0,
|
|
8887
|
-
/* @__PURE__ */ (0,
|
|
9529
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 text-center", children: [
|
|
9530
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "text-red-600 text-sm", children: error }),
|
|
9531
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8888
9532
|
"button",
|
|
8889
9533
|
{
|
|
8890
9534
|
onClick: () => window.location.reload(),
|
|
@@ -8895,54 +9539,54 @@ var TransactionsList = ({
|
|
|
8895
9539
|
] });
|
|
8896
9540
|
}
|
|
8897
9541
|
if (transactions.length === 0) {
|
|
8898
|
-
return /* @__PURE__ */ (0,
|
|
9542
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "p-4 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", { className: "text-gray-600 text-sm", children: "No transactions found" }) });
|
|
8899
9543
|
}
|
|
8900
|
-
return /* @__PURE__ */ (0,
|
|
9544
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "max-h-96 overflow-y-auto", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "space-y-2 p-2", children: transactions.map((tx) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
|
|
8901
9545
|
"div",
|
|
8902
9546
|
{
|
|
8903
9547
|
className: "border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors",
|
|
8904
9548
|
onClick: () => openTransaction(tx.hash),
|
|
8905
9549
|
children: [
|
|
8906
|
-
/* @__PURE__ */ (0,
|
|
8907
|
-
/* @__PURE__ */ (0,
|
|
8908
|
-
/* @__PURE__ */ (0,
|
|
8909
|
-
/* @__PURE__ */ (0,
|
|
8910
|
-
/* @__PURE__ */ (0,
|
|
9550
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex justify-between items-start mb-2", children: [
|
|
9551
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex-1", children: [
|
|
9552
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center space-x-2 mb-1", children: [
|
|
9553
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs font-mono bg-gray-100 px-2 py-1 rounded", children: formatAddress(tx.hash) }),
|
|
9554
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: `text-xs px-2 py-1 rounded ${tx.status === "ok" ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800"}`, children: tx.status === "ok" ? "Success" : "Failed" })
|
|
8911
9555
|
] }),
|
|
8912
|
-
/* @__PURE__ */ (0,
|
|
8913
|
-
/* @__PURE__ */ (0,
|
|
8914
|
-
/* @__PURE__ */ (0,
|
|
8915
|
-
/* @__PURE__ */ (0,
|
|
9556
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-sm space-y-1", children: [
|
|
9557
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9558
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "From:" }),
|
|
9559
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-mono ml-1", children: [
|
|
8916
9560
|
formatAddress(tx.from.hash),
|
|
8917
|
-
tx.from.is_contract && /* @__PURE__ */ (0,
|
|
9561
|
+
tx.from.is_contract && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
8918
9562
|
] })
|
|
8919
9563
|
] }),
|
|
8920
|
-
/* @__PURE__ */ (0,
|
|
8921
|
-
/* @__PURE__ */ (0,
|
|
8922
|
-
/* @__PURE__ */ (0,
|
|
9564
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9565
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "To:" }),
|
|
9566
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-mono ml-1", children: [
|
|
8923
9567
|
formatAddress(tx.to.hash),
|
|
8924
|
-
tx.to.is_contract && /* @__PURE__ */ (0,
|
|
9568
|
+
tx.to.is_contract && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-xs text-blue-600 ml-1", children: "(Contract)" })
|
|
8925
9569
|
] })
|
|
8926
9570
|
] }),
|
|
8927
|
-
/* @__PURE__ */ (0,
|
|
8928
|
-
/* @__PURE__ */ (0,
|
|
8929
|
-
/* @__PURE__ */ (0,
|
|
9571
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9572
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "text-gray-600", children: "Value:" }),
|
|
9573
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "font-semibold ml-1", children: [
|
|
8930
9574
|
formatValue(tx.value),
|
|
8931
9575
|
" LUMIA"
|
|
8932
9576
|
] })
|
|
8933
9577
|
] })
|
|
8934
9578
|
] })
|
|
8935
9579
|
] }),
|
|
8936
|
-
/* @__PURE__ */ (0,
|
|
8937
|
-
/* @__PURE__ */ (0,
|
|
8938
|
-
/* @__PURE__ */ (0,
|
|
9580
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-right text-xs text-gray-500", children: [
|
|
9581
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { children: formatDate2(tx.timestamp) }),
|
|
9582
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "mt-1", children: [
|
|
8939
9583
|
"Gas: ",
|
|
8940
9584
|
parseInt(tx.gas_used).toLocaleString()
|
|
8941
9585
|
] }),
|
|
8942
|
-
tx.method && /* @__PURE__ */ (0,
|
|
9586
|
+
tx.method && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "mt-1 text-blue-600", children: tx.method })
|
|
8943
9587
|
] })
|
|
8944
9588
|
] }),
|
|
8945
|
-
tx.transaction_types.length > 0 && /* @__PURE__ */ (0,
|
|
9589
|
+
tx.transaction_types.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex flex-wrap gap-1 mt-2", children: tx.transaction_types.map((type, idx) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8946
9590
|
"span",
|
|
8947
9591
|
{
|
|
8948
9592
|
className: "text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full",
|
|
@@ -8956,247 +9600,6 @@ var TransactionsList = ({
|
|
|
8956
9600
|
)) }) });
|
|
8957
9601
|
};
|
|
8958
9602
|
|
|
8959
|
-
// src/internal/components/KeyshareBackup.tsx
|
|
8960
|
-
var React30 = __toESM(require("react"), 1);
|
|
8961
|
-
var import_lucide_react19 = require("lucide-react");
|
|
8962
|
-
init_vaultClient();
|
|
8963
|
-
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
8964
|
-
function KeyshareBackup({ userId, onClose, onBackupSuccess }) {
|
|
8965
|
-
const [backupStatus, setBackupStatus] = React30.useState(() => getBackupStatus(userId));
|
|
8966
|
-
const [loading, setLoading] = React30.useState({
|
|
8967
|
-
server: false,
|
|
8968
|
-
cloud: false,
|
|
8969
|
-
local: false
|
|
8970
|
-
});
|
|
8971
|
-
const [error, setError] = React30.useState(null);
|
|
8972
|
-
const [success, setSuccess] = React30.useState(null);
|
|
8973
|
-
const [showPassword, setShowPassword] = React30.useState(false);
|
|
8974
|
-
const [useCustomPassword, setUseCustomPassword] = React30.useState(false);
|
|
8975
|
-
const [customPassword, setCustomPassword] = React30.useState("");
|
|
8976
|
-
const [cloudProviders, setCloudProviders] = React30.useState([]);
|
|
8977
|
-
const [selectedCloudProvider, setSelectedCloudProvider] = React30.useState(null);
|
|
8978
|
-
const hasKeyshareData = React30.useMemo(() => {
|
|
8979
|
-
return !!getCurrentKeyshareBackupData(userId);
|
|
8980
|
-
}, [userId]);
|
|
8981
|
-
React30.useEffect(() => {
|
|
8982
|
-
getAvailableCloudProviders2().then((providers) => {
|
|
8983
|
-
setCloudProviders(providers);
|
|
8984
|
-
if (providers.length > 0 && !selectedCloudProvider) {
|
|
8985
|
-
setSelectedCloudProvider(providers[0].id);
|
|
8986
|
-
}
|
|
8987
|
-
});
|
|
8988
|
-
}, [selectedCloudProvider]);
|
|
8989
|
-
const refreshStatus = React30.useCallback(() => {
|
|
8990
|
-
setBackupStatus(getBackupStatus(userId));
|
|
8991
|
-
}, [userId]);
|
|
8992
|
-
React30.useEffect(() => {
|
|
8993
|
-
refreshStatus();
|
|
8994
|
-
}, [refreshStatus]);
|
|
8995
|
-
const handleBackup = async (method) => {
|
|
8996
|
-
setLoading((prev) => ({ ...prev, [method]: true }));
|
|
8997
|
-
setError(null);
|
|
8998
|
-
setSuccess(null);
|
|
8999
|
-
try {
|
|
9000
|
-
const password = useCustomPassword ? customPassword : void 0;
|
|
9001
|
-
switch (method) {
|
|
9002
|
-
case "server":
|
|
9003
|
-
await backupToServer(userId, password);
|
|
9004
|
-
setSuccess("Successfully created server backup");
|
|
9005
|
-
break;
|
|
9006
|
-
case "cloud": {
|
|
9007
|
-
await backupToCloud(userId, password, selectedCloudProvider || void 0);
|
|
9008
|
-
setSuccess(`Successfully created cloud backup`);
|
|
9009
|
-
const updatedProviders = await getAvailableCloudProviders2();
|
|
9010
|
-
setCloudProviders(updatedProviders);
|
|
9011
|
-
break;
|
|
9012
|
-
}
|
|
9013
|
-
case "local":
|
|
9014
|
-
await backupToLocalFile(userId, password);
|
|
9015
|
-
setSuccess("Backup file downloaded successfully");
|
|
9016
|
-
break;
|
|
9017
|
-
}
|
|
9018
|
-
refreshStatus();
|
|
9019
|
-
setTimeout(() => {
|
|
9020
|
-
if (typeof window !== "undefined") {
|
|
9021
|
-
window.dispatchEvent(
|
|
9022
|
-
new CustomEvent("lumia-passport-backup-status-changed", {
|
|
9023
|
-
detail: { method, success: true }
|
|
9024
|
-
})
|
|
9025
|
-
);
|
|
9026
|
-
}
|
|
9027
|
-
onBackupSuccess?.();
|
|
9028
|
-
}, 100);
|
|
9029
|
-
} catch (err) {
|
|
9030
|
-
const errorMsg = err instanceof Error ? err.message : "Backup creation failed";
|
|
9031
|
-
setError(errorMsg);
|
|
9032
|
-
updateBackupStatus(userId, method, { error: errorMsg });
|
|
9033
|
-
refreshStatus();
|
|
9034
|
-
} finally {
|
|
9035
|
-
setLoading((prev) => ({ ...prev, [method]: false }));
|
|
9036
|
-
}
|
|
9037
|
-
};
|
|
9038
|
-
const formatLastBackup = (timestamp) => {
|
|
9039
|
-
if (!timestamp) return "Never";
|
|
9040
|
-
const date = new Date(timestamp);
|
|
9041
|
-
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
9042
|
-
};
|
|
9043
|
-
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(Card, { className: "border-green-200 bg-green-50", children: [
|
|
9044
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardHeader, { className: "pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9045
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
9046
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Shield, { className: "h-6 w-6 text-green-600" }),
|
|
9047
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9048
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardTitle, { className: "text-lg", children: "Create Backup" }),
|
|
9049
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CardDescription, { className: "text-sm", children: "Secure your keyshare with encrypted backups" })
|
|
9050
|
-
] })
|
|
9051
|
-
] }),
|
|
9052
|
-
onClose && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("button", { onClick: onClose, className: "p-1 rounded bg-red-100 text-red-600 hover:bg-red-200 transition-colors", title: "Close", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.X, { className: "h-4 w-4" }) })
|
|
9053
|
-
] }) }),
|
|
9054
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
9055
|
-
error && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-red-50 border border-red-200 text-red-700 text-sm", children: [
|
|
9056
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.AlertCircle, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9057
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: error })
|
|
9058
|
-
] }),
|
|
9059
|
-
success && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2 p-3 rounded bg-green-50 border border-green-200 text-green-700 text-sm", children: [
|
|
9060
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.CheckCircle2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
9061
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: success })
|
|
9062
|
-
] }),
|
|
9063
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "space-y-3", children: [
|
|
9064
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Encryption Method:" }),
|
|
9065
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9066
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9067
|
-
"input",
|
|
9068
|
-
{
|
|
9069
|
-
type: "checkbox",
|
|
9070
|
-
id: "use-backup-password",
|
|
9071
|
-
checked: useCustomPassword,
|
|
9072
|
-
onChange: (e) => setUseCustomPassword(e.target.checked),
|
|
9073
|
-
className: "rounded"
|
|
9074
|
-
}
|
|
9075
|
-
),
|
|
9076
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("label", { htmlFor: "use-backup-password", className: "text-sm font-medium", children: "Use custom password instead of passkey" })
|
|
9077
|
-
] }),
|
|
9078
|
-
!useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "p-3 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9079
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Key, { className: "h-4 w-4" }),
|
|
9080
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { children: "Your passkey will be used to encrypt the backup securely" })
|
|
9081
|
-
] }) }),
|
|
9082
|
-
useCustomPassword && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "relative", children: [
|
|
9083
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9084
|
-
Input,
|
|
9085
|
-
{
|
|
9086
|
-
type: showPassword ? "text" : "password",
|
|
9087
|
-
placeholder: "Enter backup encryption password",
|
|
9088
|
-
value: customPassword,
|
|
9089
|
-
onChange: (e) => setCustomPassword(e.target.value),
|
|
9090
|
-
className: "pr-10"
|
|
9091
|
-
}
|
|
9092
|
-
),
|
|
9093
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9094
|
-
"button",
|
|
9095
|
-
{
|
|
9096
|
-
type: "button",
|
|
9097
|
-
onClick: () => setShowPassword(!showPassword),
|
|
9098
|
-
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700",
|
|
9099
|
-
children: showPassword ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Eye, { className: "h-4 w-4" })
|
|
9100
|
-
}
|
|
9101
|
-
)
|
|
9102
|
-
] })
|
|
9103
|
-
] }),
|
|
9104
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "space-y-4", children: [
|
|
9105
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-sm font-medium text-gray-700", children: "Choose Backup Method:" }),
|
|
9106
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-blue-200 bg-blue-50/50", children: [
|
|
9107
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
9108
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Server, { className: "h-5 w-5 text-blue-600" }),
|
|
9109
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9110
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "Server Backup" }),
|
|
9111
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup on secure server" })
|
|
9112
|
-
] })
|
|
9113
|
-
] }) }),
|
|
9114
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9115
|
-
Button,
|
|
9116
|
-
{
|
|
9117
|
-
onClick: () => handleBackup("server"),
|
|
9118
|
-
disabled: loading.server || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9119
|
-
className: "px-4 py-2",
|
|
9120
|
-
children: loading.server ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9121
|
-
}
|
|
9122
|
-
),
|
|
9123
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9124
|
-
"Encrypted backup stored on secure server \u2022 Last: ",
|
|
9125
|
-
formatLastBackup(backupStatus.server.lastBackup)
|
|
9126
|
-
] })
|
|
9127
|
-
] }),
|
|
9128
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-sky-200 bg-sky-50/50", children: [
|
|
9129
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9130
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Cloud, { className: "h-5 w-5 text-sky-600" }),
|
|
9131
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9132
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "Cloud Backup" }),
|
|
9133
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Store encrypted backup in cloud storage" })
|
|
9134
|
-
] })
|
|
9135
|
-
] }),
|
|
9136
|
-
cloudProviders.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9137
|
-
"select",
|
|
9138
|
-
{
|
|
9139
|
-
value: selectedCloudProvider || "",
|
|
9140
|
-
onChange: (e) => setSelectedCloudProvider(e.target.value),
|
|
9141
|
-
className: "text-sm border rounded px-2 py-1 w-full",
|
|
9142
|
-
children: cloudProviders.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("option", { value: provider.id, children: [
|
|
9143
|
-
provider.icon,
|
|
9144
|
-
" ",
|
|
9145
|
-
provider.name,
|
|
9146
|
-
" ",
|
|
9147
|
-
provider.isAuthenticated ? "\u2713" : ""
|
|
9148
|
-
] }, provider.id))
|
|
9149
|
-
}
|
|
9150
|
-
) }),
|
|
9151
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9152
|
-
Button,
|
|
9153
|
-
{
|
|
9154
|
-
onClick: () => handleBackup("cloud"),
|
|
9155
|
-
disabled: loading.cloud || useCustomPassword && !customPassword || !hasKeyshareData || cloudProviders.length === 0,
|
|
9156
|
-
className: "px-4 py-2",
|
|
9157
|
-
children: loading.cloud ? "Creating..." : useCustomPassword ? "Create with Password" : "Create with Passkey"
|
|
9158
|
-
}
|
|
9159
|
-
),
|
|
9160
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600 mt-2", children: cloudProviders.length > 0 ? `Direct backup to ${cloudProviders.find((p) => p.id === selectedCloudProvider)?.name || "cloud storage"} \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` : `No cloud providers configured \u2022 Last: ${formatLastBackup(backupStatus.cloud.lastBackup)}` })
|
|
9161
|
-
] }),
|
|
9162
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "p-4 rounded-lg border border-purple-200 bg-purple-50/50", children: [
|
|
9163
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-center gap-3 mb-3", children: [
|
|
9164
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Download, { className: "h-5 w-5 text-purple-600" }),
|
|
9165
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9166
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium text-sm", children: "File Backup" }),
|
|
9167
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "text-xs text-gray-600", children: "Download encrypted backup file to your device" })
|
|
9168
|
-
] })
|
|
9169
|
-
] }),
|
|
9170
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
9171
|
-
Button,
|
|
9172
|
-
{
|
|
9173
|
-
onClick: () => handleBackup("local"),
|
|
9174
|
-
disabled: loading.local || useCustomPassword && !customPassword || !hasKeyshareData,
|
|
9175
|
-
className: "w-full",
|
|
9176
|
-
children: loading.local ? "Creating..." : useCustomPassword ? "Create & Download" : "Create & Download with Passkey"
|
|
9177
|
-
}
|
|
9178
|
-
),
|
|
9179
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "text-xs text-gray-600 mt-2", children: [
|
|
9180
|
-
"Download encrypted backup file to your device \u2022 Last: ",
|
|
9181
|
-
formatLastBackup(backupStatus.local.lastBackup)
|
|
9182
|
-
] })
|
|
9183
|
-
] })
|
|
9184
|
-
] }),
|
|
9185
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-start gap-2 p-3 bg-amber-50 border border-amber-200 rounded text-amber-800 text-xs", children: [
|
|
9186
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react19.Lock, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }),
|
|
9187
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { children: [
|
|
9188
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "font-medium", children: "Security Notice" }),
|
|
9189
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "mt-1", children: [
|
|
9190
|
-
useCustomPassword ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children: "All backups are encrypted with AES-256 using your custom password. Store your password securely - without it, backups cannot be restored." }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children: "All backups are encrypted with AES-256 using your passkey. Your passkey authenticator (device/biometrics) is required to restore backups." }),
|
|
9191
|
-
" ",
|
|
9192
|
-
"Without backup access, you cannot recover your smart account if you lose this device."
|
|
9193
|
-
] })
|
|
9194
|
-
] })
|
|
9195
|
-
] })
|
|
9196
|
-
] })
|
|
9197
|
-
] });
|
|
9198
|
-
}
|
|
9199
|
-
|
|
9200
9603
|
// src/hooks/useUserOpStatus.ts
|
|
9201
9604
|
var React31 = __toESM(require("react"), 1);
|
|
9202
9605
|
init_base();
|
|
@@ -9524,6 +9927,7 @@ function useSmartAccountTransactions() {
|
|
|
9524
9927
|
UserOpStatus,
|
|
9525
9928
|
getUserProfile,
|
|
9526
9929
|
lumiaBeam,
|
|
9930
|
+
prepareUserOperation,
|
|
9527
9931
|
queryClient,
|
|
9528
9932
|
sendUserOperation,
|
|
9529
9933
|
updateUserProfile,
|