@lumiapassport/ui-kit 1.14.4 → 1.14.6
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/dist/iframe/index.html +1 -1
- package/dist/iframe/main.js +1 -1
- package/dist/index.cjs +1383 -989
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +56 -1
- package/dist/index.d.ts +56 -1
- package/dist/index.js +1198 -802
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -71,6 +71,7 @@ var init_assets = __esm({
|
|
|
71
71
|
var lumiaPassport_exports = {};
|
|
72
72
|
__export(lumiaPassport_exports, {
|
|
73
73
|
DEFAULT_LUMIA_PASSPORT_CONFIG: () => DEFAULT_LUMIA_PASSPORT_CONFIG,
|
|
74
|
+
getBlockscoutApiUrl: () => getBlockscoutApiUrl,
|
|
74
75
|
getIframeUrl: () => getIframeUrl,
|
|
75
76
|
getServiceUrls: () => getServiceUrls
|
|
76
77
|
});
|
|
@@ -104,6 +105,15 @@ function getIframeUrl() {
|
|
|
104
105
|
const iframeUrl = buildIframeUrl || config.services.iframeUrl || "https://auth.lumiapassport.com";
|
|
105
106
|
return iframeUrl;
|
|
106
107
|
}
|
|
108
|
+
function getBlockscoutApiUrl() {
|
|
109
|
+
const config = DEFAULT_LUMIA_PASSPORT_CONFIG;
|
|
110
|
+
const buildBlockscoutUrl = "https://beam-explorer.lumia.org/api/v2";
|
|
111
|
+
if (buildBlockscoutUrl) {
|
|
112
|
+
return buildBlockscoutUrl;
|
|
113
|
+
}
|
|
114
|
+
const explorerUrl = config.network.explorerUrl || "https://beam-explorer.lumia.org";
|
|
115
|
+
return `${explorerUrl.replace(/\/$/, "")}/api/v2`;
|
|
116
|
+
}
|
|
107
117
|
var DEFAULT_LUMIA_PASSPORT_CONFIG;
|
|
108
118
|
var init_lumiaPassport = __esm({
|
|
109
119
|
"src/config/lumiaPassport.tsx"() {
|
|
@@ -4319,7 +4329,7 @@ var init_profile = __esm({
|
|
|
4319
4329
|
});
|
|
4320
4330
|
|
|
4321
4331
|
// src/styles/built.css
|
|
4322
|
-
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 .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 .invisible{visibility:hidden}.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 .-right-2{right:-.5rem}.lumia-scope .-top-2{top:-.5rem}.lumia-scope .-top-3{top:-.75rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-0{left:0}.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 .right-0{right:0}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .right-\\[var\\(--l-pass-pd\\)\\]{right:var(--l-pass-pd)}.lumia-scope .right-full{right:100%}.lumia-scope .top-0{top:0}.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-\\[var\\(--l-pass-pd\\)\\]{top:var(--l-pass-pd)}.lumia-scope .top-full{top:100%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[9998\\]{z-index:9998}.lumia-scope .z-\\[9999\\]{z-index:9999}.lumia-scope .-m-px{margin:-1px}.lumia-scope .m-0{margin:0}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-1{margin-left:.25rem;margin-right:.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 .my-auto{margin-top:auto;margin-bottom:auto}.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-3{margin-left:.75rem}.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 .mr-4{margin-right:1rem}.lumia-scope .mt-0{margin-top:0}.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 .mt-\\[var\\(--l-pass-gap\\)\\]{margin-top:var(--l-pass-gap)}.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 .aspect-square{aspect-ratio:1/1}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .size-5{width:1.25rem;height:1.25rem}.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-20{height:5rem}.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-\\[100dvh\\]{height:100dvh}.lumia-scope .h-fit{height:-moz-fit-content;height:fit-content}.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-\\[95dvh\\]{max-height:95dvh}.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-20{width:5rem}.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-\\[100dvw\\]{width:100dvw}.lumia-scope .w-\\[var\\(--l-pass-maw\\)\\]{width:var(--l-pass-maw)}.lumia-scope .w-fit{width:-moz-fit-content;width:fit-content}.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-\\[256px\\]{min-width:256px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[144px\\]{max-width:144px}.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-none{flex:none}.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-x-\\[var\\(--l-pass-gap\\)\\]{--tw-translate-x:calc(var(--l-pass-gap)*-1)}.lumia-scope .-translate-x-\\[var\\(--l-pass-gap\\)\\],.lumia-scope .-translate-y-1{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{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .-translate-y-1\\/2,.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 glow-warning{0%,to{transform:scale(1);box-shadow:0 0 16px var(--l-pass-bg-warning)}50%{transform:scale(.97);box-shadow:0 0 4px var(--l-pass-bg-warning)}}.lumia-scope .animate-glow-warning{animation:glow-warning 2s ease infinite}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.6}}.lumia-scope .animate-pulse-warning{animation:pulse-warning 2s ease infinite}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-default{cursor:default}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .cursor-text{cursor:text}.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 .appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.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 .place-content-center{place-content:center}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-end{align-items:flex-end}.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 .justify-evenly{justify-content:space-evenly}.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 .gap-\\[10px\\]{gap:10px}.lumia-scope .gap-\\[var\\(--l-pass-gap\\)\\]{gap:var(--l-pass-gap)}.lumia-scope .gap-\\[var\\(--l-pass-pd\\)\\]{gap:var(--l-pass-pd)}.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 .overflow-y-hidden{overflow-y:hidden}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lumia-scope .text-ellipsis{text-overflow:ellipsis}.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-normal{overflow-wrap:normal;word-break:normal}.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-\\[10px\\]{border-radius:10px}.lumia-scope .rounded-\\[5px\\]{border-radius:5px}.lumia-scope .rounded-\\[var\\(--l-pass-bdrs\\)\\]{border-radius:var(--l-pass-bdrs)}.lumia-scope .rounded-\\[var\\(--l-pass-el-bdrs\\)\\]{border-radius:var(--l-pass-el-bdrs)}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:.5rem}.lumia-scope .rounded-md{border-radius:.375rem}.lumia-scope .rounded-sm{border-radius:.125rem}.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-dashed{border-style:dashed}.lumia-scope .border-\\[var\\(--l-pass-bd\\)\\]{border-color:var(--l-pass-bd)}.lumia-scope .border-\\[var\\(--l-pass-error\\)\\]{border-color:var(--l-pass-error)}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.lumia-scope .border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1))}.lumia-scope .border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/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-500{--tw-border-opacity:1;border-color:rgb(59 130 246/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-800{--tw-border-opacity:1;border-color:rgb(30 64 175/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-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-500{--tw-border-opacity:1;border-color:rgb(34 197 94/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-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/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-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity,1))}.lumia-scope .border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/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-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.lumia-scope .border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.lumia-scope .border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/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-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity,1))}.lumia-scope .border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/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-\\[\\#002c15\\]{--tw-bg-opacity:1;background-color:rgb(0 44 21/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#081f2c\\]{--tw-bg-opacity:1;background-color:rgb(8 31 44/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#f3ba2f\\]{--tw-bg-opacity:1;background-color:rgb(243 186 47/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[var\\(--l-pass-bg\\)\\]{background-color:var(--l-pass-bg)}.lumia-scope .bg-\\[var\\(--l-pass-bg-error\\)\\]{background-color:var(--l-pass-bg-error)}.lumia-scope .bg-\\[var\\(--l-pass-bg-info\\)\\]{background-color:var(--l-pass-bg-info)}.lumia-scope .bg-\\[var\\(--l-pass-bg-success\\)\\]{background-color:var(--l-pass-bg-success)}.lumia-scope .bg-\\[var\\(--l-pass-bg-warning\\)\\]{background-color:var(--l-pass-bg-warning)}.lumia-scope .bg-\\[var\\(--l-pass-fg\\)\\]{background-color:var(--l-pass-fg)}.lumia-scope .bg-\\[var\\(--l-pass-overlay\\)\\]{background-color:var(--l-pass-overlay)}.lumia-scope .bg-\\[var\\(--l-pass-primary\\)\\]{background-color:var(--l-pass-primary)}.lumia-scope .bg-\\[var\\(--l-pass-secondary\\)\\]{background-color:var(--l-pass-secondary)}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/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-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity,1))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.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-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.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-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.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-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.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-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.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-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/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-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity,1))}.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-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-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/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-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/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-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/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-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity,1))}.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-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 .p-\\[var\\(--l-pass-pd\\)\\]{padding:var(--l-pass-pd)}.lumia-scope .px-0{padding-left:0;padding-right:0}.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-5{padding-left:1.25rem;padding-right:1.25rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .px-\\[var\\(--l-pass-pd\\)\\]{padding-left:var(--l-pass-pd);padding-right:var(--l-pass-pd)}.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-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 .py-\\[10px\\]{padding-top:10px;padding-bottom:10px}.lumia-scope .py-\\[var\\(--l-pass-gap\\)\\]{padding-top:var(--l-pass-gap);padding-bottom:var(--l-pass-gap)}.lumia-scope .py-\\[var\\(--l-pass-pd\\)\\]{padding-top:var(--l-pass-pd);padding-bottom:var(--l-pass-pd)}.lumia-scope .pb-2{padding-bottom:.5rem}.lumia-scope .pb-3{padding-bottom:.75rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pb-5{padding-bottom:1.25rem}.lumia-scope .pb-6{padding-bottom:1.5rem}.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 .pt-5{padding-top:1.25rem}.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-3xl{font-size:1.875rem;line-height:2.25rem}.lumia-scope .text-4xl{font-size:2.25rem;line-height:2.5rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.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 .uppercase{text-transform:uppercase}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-4{line-height:1rem}.lumia-scope .leading-5{line-height:1.25rem}.lumia-scope .leading-6{line-height:1.5rem}.lumia-scope .leading-8{line-height:2rem}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-relaxed{line-height:1.625}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .tracking-wide{letter-spacing:.025em}.lumia-scope .text-\\[\\#c3f53c\\]{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .text-\\[var\\(--l-pass-bg-error\\)\\]{color:var(--l-pass-bg-error)}.lumia-scope .text-\\[var\\(--l-pass-bg-success\\)\\]{color:var(--l-pass-bg-success)}.lumia-scope .text-\\[var\\(--l-pass-bg-warning\\)\\]{color:var(--l-pass-bg-warning)}.lumia-scope .text-\\[var\\(--l-pass-error\\)\\]{color:var(--l-pass-error)}.lumia-scope .text-\\[var\\(--l-pass-fg\\)\\]{color:var(--l-pass-fg)}.lumia-scope .text-\\[var\\(--l-pass-fg-inverted\\)\\]{color:var(--l-pass-fg-inverted)}.lumia-scope .text-\\[var\\(--l-pass-fg-muted\\)\\]{color:var(--l-pass-fg-muted)}.lumia-scope .text-\\[var\\(--l-pass-info\\)\\]{color:var(--l-pass-info)}.lumia-scope .text-\\[var\\(--l-pass-muted\\)\\]{color:var(--l-pass-muted)}.lumia-scope .text-\\[var\\(--l-pass-success\\)\\]{color:var(--l-pass-success)}.lumia-scope .text-\\[var\\(--l-pass-text-secondary\\)\\]{color:var(--l-pass-text-secondary)}.lumia-scope .text-\\[var\\(--l-pass-warning\\)\\]{color:var(--l-pass-warning)}.lumia-scope .text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity,1))}.lumia-scope .text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}.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-500{--tw-text-opacity:1;color:rgb(245 158 11/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-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity,1))}.lumia-scope .text-black{--tw-text-opacity:1;color:rgb(0 0 0/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-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-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-200{--tw-text-opacity:1;color:rgb(187 247 208/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-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity,1))}.lumia-scope .text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity,1))}.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-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-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity,1))}.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-500{--tw-text-opacity:1;color:rgb(168 85 247/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-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity,1))}.lumia-scope .text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/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-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 .antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .opacity-50{opacity:.5}.lumia-scope .opacity-60{opacity:.6}.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-none{outline:2px solid transparent;outline-offset:2px}.lumia-scope .outline{outline-style:solid}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .grayscale{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 .grayscale{--tw-grayscale:grayscale(100%)}.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-none{transition-property:none}.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 .ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.lumia-scope .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lumia-scope{--l-pass-ff:var(--lumia-passport-ff,-apple-system,BlinkMacSystemFont,"Inter",system-ui,sans-serif);--l-pass-maw:var(--lumia-passport-maw,384px);--l-pass-pd:var(--lumia-passport-pd,12px);--l-pass-gap:var(--lumia-passport-gap,10px);--l-pass-bdrs:var(--lumia-passport-bdrs,20px);--l-pass-el-bdrs:var(--lumia-passport-element-bdrs,10px);--l-pass-backdrop-blur:var(--lumia-passport-backdrop-blur,10px)}.lumia-scope[data-lumia-passport-mode=light]{--l-pass-overlay:var(--lumia-passport-overlay,hsla(0,0%,100%,.8));--l-pass-bg:var(--lumia-passport-bg,#fff);--l-pass-fg:var(--lumia-passport-fg,#000);--l-pass-fg-h:var(--lumia-passport-fg-h,rgba(0,0,0,.6));--l-pass-fg-a:var(--lumia-passport-fg-a,rgba(0,0,0,.4));--l-pass-fg-inverted:var(--lumia-passport-fg-inverted,#fff);--l-pass-fg-muted:var(--lumia-passport-fg-muted,rgba(0,0,0,.6));--l-pass-primary:var(--lumia-passport-primary,#000);--l-pass-primary-h:var(--lumia-passport-primary-h,rgba(0,0,0,.8));--l-pass-primary-a:var(--lumia-passport-primary-a,rgba(0,0,0,.6));--l-pass-secondary:var(--lumia-passport-secondary,#e4e4e4);--l-pass-secondary-h:var(--lumia-passport-secondary-h,hsla(0,0%,89%,.8));--l-pass-secondary-a:var(--lumia-passport-secondary-a,hsla(0,0%,89%,.6));--l-pass-bd:var(--lumia-passport-bd,#c9c9c9);--l-pass-bd-intense:var(--lumia-passport-bd-intense,#a9a9a9);--l-pass-shadow-c:var(--lumia-passport-shadow-c,rgba(0,0,0,.1));--l-pass-info:var(--lumia-passport-info,var(--l-pass-fg));--l-pass-bg-info:var(--lumia-passport-bg-info,#e4e4e4);--l-pass-success:var(--lumia-passport-success,var(--l-pass-fg));--l-pass-bg-success:var(--lumia-passport-bg-success,#21ff51);--l-pass-warning:var(--lumia-passport-warning,var(--l-pass-fg));--l-pass-bg-warning:var(--lumia-passport-bg-warning,#e9fa00);--l-pass-error:var(--lumia-passport-error,#fff);--l-pass-bg-error:var(--lumia-passport-bg-error,#d6204e)}.lumia-scope[data-lumia-passport-mode=dark]{--l-pass-overlay:var(--lumia-passport-overlay,rgba(0,0,0,.8));--l-pass-bg:var(--lumia-passport-bg,#1a1a1a);--l-pass-fg:var(--lumia-passport-fg,#fff);--l-pass-fg-h:var(--lumia-passport-fg-h,hsla(0,0%,100%,.6));--l-pass-fg-a:var(--lumia-passport-fg-a,hsla(0,0%,100%,.4));--l-pass-fg-inverted:var(--lumia-passport-fg-inverted,#000);--l-pass-fg-muted:var(--lumia-passport-fg-muted,hsla(0,0%,100%,.6));--l-pass-primary:var(--lumia-passport-primary,#fff);--l-pass-primary-h:var(--lumia-passport-primary-h,hsla(0,0%,100%,.9));--l-pass-primary-a:var(--lumia-passport-primary-a,hsla(0,0%,100%,.7));--l-pass-secondary:var(--lumia-passport-secondary,#2a2a2a);--l-pass-secondary-h:var(--lumia-passport-secondary-h,rgba(42,42,42,.9));--l-pass-secondary-a:var(--lumia-passport-secondary-a,rgba(42,42,42,.7));--l-pass-bd:var(--lumia-passport-bd,#3a3a3a);--l-pass-bd-intense:var(--lumia-passport-bd-intense,#4a4a4a);--l-pass-shadow-c:var(--lumia-passport-shadow-c,rgba(0,0,0,.5));--l-pass-info:var(--lumia-passport-info,var(--l-pass-fg));--l-pass-bg-info:var(--lumia-passport-bg-info,#2a2a2a);--l-pass-success:var(--lumia-passport-success,var(--l-pass-fg-inverted));--l-pass-bg-success:var(--lumia-passport-bg-success,#21ff51);--l-pass-warning:var(--lumia-passport-warning,var(--l-pass-fg-inverted));--l-pass-bg-warning:var(--lumia-passport-bg-warning,#e9fa00);--l-pass-error:var(--lumia-passport-error,#fff);--l-pass-bg-error:var(--lumia-passport-bg-error,#d6204e)}.lumia-scope,.lumia-scope *{margin:0;box-sizing:border-box;font-family:var(--l-pass-ff);font-optical-sizing:auto;-webkit-tap-highlight-color:transparent;-moz-tap-highlight-color:transparent;-ms-tap-highlight-color:transparent;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lumia-scope button,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6,.lumia-scope input,.lumia-scope p,.lumia-scope select,.lumia-scope textarea{font-family:var(--l-pass-ff)!important;margin:0}.lumia-scope button,.lumia-scope input,.lumia-scope select,.lumia-scope textarea{border-style:solid;outline:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.lumia-scope .lumia-passport-button{box-shadow:0 4px 10px var(--l-pass-shadow-c),inset 0 0 0 1px var(--l-pass-bd);transition:transform .25s ease}.lumia-scope .lumia-passport-button:hover{transform:scale(1.02)}.lumia-scope .lumia-passport-button:active{transform:scale(1)}@keyframes lumia-mobile-dialog-fade-in{0%{opacity:0;transform:translateY(64px)}to{opacity:1;transform:translateY(0)}}@keyframes lumia-mobile-dialog-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(64px)}}.lumia-scope .animate-mobile-dialog-in{animation:lumia-mobile-dialog-fade-in 375ms ease}.lumia-scope .animate-mobile-dialog-out{animation:lumia-mobile-dialog-fade-out 375ms ease}@keyframes lumia-dialog-fade-in{0%{opacity:0}to{opacity:1}}@keyframes lumia-dialog-fade-out{0%{opacity:1}to{opacity:0}}.lumia-scope .animate-dialog-in{animation:lumia-dialog-fade-in 375ms ease}.lumia-scope .animate-dialog-out{animation:lumia-dialog-fade-out 375ms ease}.lumia-scope .list-scrollbar-y{width:100%;padding-right:var(--l-pass-list-scrollbar-pd-r,0);overflow-y:auto;max-height:var(--l-pass-scrollbar-mah,300px)}.lumia-scope .list-scrollbar-y::-webkit-scrollbar{width:4px;height:4px}.lumia-scope .list-scrollbar-y::-webkit-scrollbar-thumb{cursor:pointer;width:4px;border-radius:2px;background-color:var(--l-pass-bd)}.lumia-scope .list-scrollbar-y::-webkit-scrollbar-track{margin-top:10px;margin-bottom:10px;background-color:transparent}.lumia-scope .noScrollbars::-webkit-scrollbar{display:none}.lumia-scope .file\\:mr-\\[var\\(--l-pass-pd\\)\\]::file-selector-button{margin-right:var(--l-pass-pd)}.lumia-scope .file\\:h-8::file-selector-button{height:2rem}.lumia-scope .file\\:cursor-pointer::file-selector-button{cursor:pointer}.lumia-scope .file\\:rounded-\\[var\\(--l-pass-el-bdrs\\)\\]::file-selector-button{border-radius:var(--l-pass-el-bdrs)}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-\\[var\\(--l-pass-primary\\)\\]::file-selector-button{background-color:var(--l-pass-primary)}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-\\[var\\(--l-pass-pd\\)\\]::file-selector-button{padding-left:var(--l-pass-pd);padding-right:var(--l-pass-pd)}.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\\:text-\\[var\\(--l-pass-fg-inverted\\)\\]::file-selector-button{color:var(--l-pass-fg-inverted)}.lumia-scope .placeholder\\:text-\\[var\\(--l-pass-fg-muted\\)\\]::-moz-placeholder{color:var(--l-pass-fg-muted)}.lumia-scope .placeholder\\:text-\\[var\\(--l-pass-fg-muted\\)\\]::placeholder{color:var(--l-pass-fg-muted)}.lumia-scope .focus-within\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:focus-within{background-color:var(--l-pass-secondary-a)}.lumia-scope .focus-within\\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-bg\\)\\]:hover{background-color:var(--l-pass-bg)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-primary-h\\)\\]:hover{background-color:var(--l-pass-primary-h)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-secondary-h\\)\\]:hover{background-color:var(--l-pass-secondary-h)}.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-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/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-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:text-\\[\\#c3f53c\\]:hover{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-\\[var\\(--l-pass-fg\\)\\]:hover{color:var(--l-pass-fg)}.lumia-scope .hover\\:text-\\[var\\(--l-pass-fg-h\\)\\]:hover{color:var(--l-pass-fg-h)}.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\\:underline:hover{text-decoration-line:underline}.lumia-scope .file\\:hover\\:opacity-90:hover::file-selector-button{opacity:.9}.lumia-scope .focus\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:focus{background-color:var(--l-pass-secondary-a)}.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-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-0: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(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-\\[2px\\]: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-transparent:focus-visible{--tw-ring-color:transparent}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .active\\:bg-\\[var\\(--l-pass-bg\\)\\]:active{background-color:var(--l-pass-bg)}.lumia-scope .active\\:bg-\\[var\\(--l-pass-primary-a\\)\\]:active{background-color:var(--l-pass-primary-a)}.lumia-scope .active\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:active{background-color:var(--l-pass-secondary-a)}.lumia-scope .active\\:text-\\[\\#c3f53c\\]:active{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .active\\:text-\\[var\\(--l-pass-fg-a\\)\\]:active{color:var(--l-pass-fg-a)}.lumia-scope .file\\:active\\:opacity-80:active::file-selector-button{opacity:.8}.lumia-scope .disabled\\:cursor-default:disabled{cursor:default}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope .disabled\\:hover\\:bg-\\[var\\(--l-pass-bg\\)\\]:hover:disabled{background-color:var(--l-pass-bg)}.lumia-scope .disabled\\:hover\\:bg-\\[var\\(--l-pass-primary\\)\\]:hover:disabled{background-color:var(--l-pass-primary)}.lumia-scope .disabled\\:hover\\:text-\\[var\\(--l-pass-fg\\)\\]:hover:disabled{color:var(--l-pass-fg)}.lumia-scope .disabled\\:active\\:bg-\\[var\\(--l-pass-bg\\)\\]:active:disabled{background-color:var(--l-pass-bg)}.lumia-scope .disabled\\:active\\:bg-\\[var\\(--l-pass-primary\\)\\]:active:disabled{background-color:var(--l-pass-primary)}.lumia-scope .disabled\\:active\\:text-\\[var\\(--l-pass-fg\\)\\]:active:disabled{color:var(--l-pass-fg)}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}.lumia-scope :is(.group:hover .group-hover\\:opacity-60){opacity:.6}.lumia-scope .data-\\[state\\=checked\\]\\:border-\\[var\\(--l-pass-bd-intense\\)\\][data-state=checked]{border-color:var(--l-pass-bd-intense)}.lumia-scope .data-\\[state\\=checked\\]\\:bg-\\[var\\(--l-pass-secondary\\)\\][data-state=checked]{background-color:var(--l-pass-secondary)}.lumia-scope .data-\\[state\\=checked\\]\\:text-\\[var\\(--l-pass-fg\\)\\][data-state=checked]{color:var(--l-pass-fg)}@media (min-width:640px){.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\\:text-left{text-align:left}}@media (min-width:768px){.lumia-scope .md\\:h-8{height:2rem}.lumia-scope .md\\:w-8{width:2rem}.lumia-scope .md\\:gap-\\[var\\(--l-pass-gap\\)\\]{gap:var(--l-pass-gap)}.lumia-scope .md\\:py-1{padding-top:.25rem;padding-bottom:.25rem}}@media (prefers-color-scheme:dark){.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\\: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 :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
4332
|
+
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 .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 .invisible{visibility:hidden}.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 .-right-2{right:-.5rem}.lumia-scope .-top-1{top:-.25rem}.lumia-scope .-top-2{top:-.5rem}.lumia-scope .-top-3{top:-.75rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-0{left:0}.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 .right-0{right:0}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .right-\\[var\\(--l-pass-pd\\)\\]{right:var(--l-pass-pd)}.lumia-scope .right-full{right:100%}.lumia-scope .top-0{top:0}.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-\\[var\\(--l-pass-pd\\)\\]{top:var(--l-pass-pd)}.lumia-scope .top-full{top:100%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[9998\\]{z-index:9998}.lumia-scope .z-\\[9999\\]{z-index:9999}.lumia-scope .-m-px{margin:-1px}.lumia-scope .m-0{margin:0}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-1{margin-left:.25rem;margin-right:.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 .my-auto{margin-top:auto;margin-bottom:auto}.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-3{margin-left:.75rem}.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 .mr-4{margin-right:1rem}.lumia-scope .mt-0{margin-top:0}.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 .mt-\\[var\\(--l-pass-gap\\)\\]{margin-top:var(--l-pass-gap)}.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 .aspect-square{aspect-ratio:1/1}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .size-5{width:1.25rem;height:1.25rem}.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-20{height:5rem}.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-\\[100dvh\\]{height:100dvh}.lumia-scope .h-fit{height:-moz-fit-content;height:fit-content}.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-\\[95dvh\\]{max-height:95dvh}.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-20{width:5rem}.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-\\[100dvw\\]{width:100dvw}.lumia-scope .w-\\[var\\(--l-pass-maw\\)\\]{width:var(--l-pass-maw)}.lumia-scope .w-fit{width:-moz-fit-content;width:fit-content}.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-\\[256px\\]{min-width:256px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[144px\\]{max-width:144px}.lumia-scope .max-w-\\[150px\\]{max-width:150px}.lumia-scope .max-w-\\[160px\\]{max-width:160px}.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-none{flex:none}.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-x-\\[var\\(--l-pass-gap\\)\\]{--tw-translate-x:calc(var(--l-pass-gap)*-1)}.lumia-scope .-translate-x-\\[var\\(--l-pass-gap\\)\\],.lumia-scope .-translate-y-1{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{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .-translate-y-1\\/2,.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 glow-warning{0%,to{transform:scale(1);box-shadow:0 0 16px var(--l-pass-bg-warning)}50%{transform:scale(.97);box-shadow:0 0 4px var(--l-pass-bg-warning)}}.lumia-scope .animate-glow-warning{animation:glow-warning 2s ease infinite}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.6}}.lumia-scope .animate-pulse-warning{animation:pulse-warning 2s ease infinite}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-default{cursor:default}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .cursor-text{cursor:text}.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 .appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.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 .place-content-center{place-content:center}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-end{align-items:flex-end}.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 .justify-evenly{justify-content:space-evenly}.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 .gap-\\[10px\\]{gap:10px}.lumia-scope .gap-\\[var\\(--l-pass-gap\\)\\]{gap:var(--l-pass-gap)}.lumia-scope .gap-\\[var\\(--l-pass-pd\\)\\]{gap:var(--l-pass-pd)}.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 .overflow-y-hidden{overflow-y:hidden}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lumia-scope .text-ellipsis{text-overflow:ellipsis}.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-normal{overflow-wrap:normal;word-break:normal}.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-\\[10px\\]{border-radius:10px}.lumia-scope .rounded-\\[5px\\]{border-radius:5px}.lumia-scope .rounded-\\[var\\(--l-pass-bdrs\\)\\]{border-radius:var(--l-pass-bdrs)}.lumia-scope .rounded-\\[var\\(--l-pass-el-bdrs\\)\\]{border-radius:var(--l-pass-el-bdrs)}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:.5rem}.lumia-scope .rounded-md{border-radius:.375rem}.lumia-scope .rounded-sm{border-radius:.125rem}.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-dashed{border-style:dashed}.lumia-scope .border-\\[var\\(--l-pass-bd\\)\\]{border-color:var(--l-pass-bd)}.lumia-scope .border-\\[var\\(--l-pass-error\\)\\]{border-color:var(--l-pass-error)}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.lumia-scope .border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1))}.lumia-scope .border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/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-500{--tw-border-opacity:1;border-color:rgb(59 130 246/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-800{--tw-border-opacity:1;border-color:rgb(30 64 175/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-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-500{--tw-border-opacity:1;border-color:rgb(34 197 94/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-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/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-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity,1))}.lumia-scope .border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/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-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.lumia-scope .border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.lumia-scope .border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/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-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity,1))}.lumia-scope .border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/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-\\[\\#002c15\\]{--tw-bg-opacity:1;background-color:rgb(0 44 21/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#081f2c\\]{--tw-bg-opacity:1;background-color:rgb(8 31 44/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#f3ba2f\\]{--tw-bg-opacity:1;background-color:rgb(243 186 47/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[var\\(--l-pass-accent\\)\\]{background-color:var(--l-pass-accent)}.lumia-scope .bg-\\[var\\(--l-pass-bg\\)\\]{background-color:var(--l-pass-bg)}.lumia-scope .bg-\\[var\\(--l-pass-bg-error\\)\\]{background-color:var(--l-pass-bg-error)}.lumia-scope .bg-\\[var\\(--l-pass-bg-info\\)\\]{background-color:var(--l-pass-bg-info)}.lumia-scope .bg-\\[var\\(--l-pass-bg-success\\)\\]{background-color:var(--l-pass-bg-success)}.lumia-scope .bg-\\[var\\(--l-pass-bg-warning\\)\\]{background-color:var(--l-pass-bg-warning)}.lumia-scope .bg-\\[var\\(--l-pass-fg\\)\\]{background-color:var(--l-pass-fg)}.lumia-scope .bg-\\[var\\(--l-pass-overlay\\)\\]{background-color:var(--l-pass-overlay)}.lumia-scope .bg-\\[var\\(--l-pass-primary\\)\\]{background-color:var(--l-pass-primary)}.lumia-scope .bg-\\[var\\(--l-pass-secondary\\)\\]{background-color:var(--l-pass-secondary)}.lumia-scope .bg-\\[var\\(--l-pass-warning-bg\\)\\]{background-color:var(--l-pass-warning-bg)}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/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-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity,1))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.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-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.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-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.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-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.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-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.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-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/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-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity,1))}.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-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-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/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-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/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-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/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-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity,1))}.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-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 .p-\\[var\\(--l-pass-pd\\)\\]{padding:var(--l-pass-pd)}.lumia-scope .px-0{padding-left:0;padding-right:0}.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-5{padding-left:1.25rem;padding-right:1.25rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .px-\\[var\\(--l-pass-pd\\)\\]{padding-left:var(--l-pass-pd);padding-right:var(--l-pass-pd)}.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-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 .py-\\[10px\\]{padding-top:10px;padding-bottom:10px}.lumia-scope .py-\\[var\\(--l-pass-gap\\)\\]{padding-top:var(--l-pass-gap);padding-bottom:var(--l-pass-gap)}.lumia-scope .py-\\[var\\(--l-pass-pd\\)\\]{padding-top:var(--l-pass-pd);padding-bottom:var(--l-pass-pd)}.lumia-scope .pb-2{padding-bottom:.5rem}.lumia-scope .pb-3{padding-bottom:.75rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pb-5{padding-bottom:1.25rem}.lumia-scope .pb-6{padding-bottom:1.5rem}.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 .pt-5{padding-top:1.25rem}.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-3xl{font-size:1.875rem;line-height:2.25rem}.lumia-scope .text-4xl{font-size:2.25rem;line-height:2.5rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.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-normal{font-weight:400}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .uppercase{text-transform:uppercase}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-4{line-height:1rem}.lumia-scope .leading-5{line-height:1.25rem}.lumia-scope .leading-6{line-height:1.5rem}.lumia-scope .leading-8{line-height:2rem}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-relaxed{line-height:1.625}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .tracking-wide{letter-spacing:.025em}.lumia-scope .text-\\[\\#c3f53c\\]{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .text-\\[var\\(--l-pass-bg-error\\)\\]{color:var(--l-pass-bg-error)}.lumia-scope .text-\\[var\\(--l-pass-bg-success\\)\\]{color:var(--l-pass-bg-success)}.lumia-scope .text-\\[var\\(--l-pass-bg-warning\\)\\]{color:var(--l-pass-bg-warning)}.lumia-scope .text-\\[var\\(--l-pass-error\\)\\]{color:var(--l-pass-error)}.lumia-scope .text-\\[var\\(--l-pass-fg\\)\\]{color:var(--l-pass-fg)}.lumia-scope .text-\\[var\\(--l-pass-fg-inverted\\)\\]{color:var(--l-pass-fg-inverted)}.lumia-scope .text-\\[var\\(--l-pass-fg-muted\\)\\]{color:var(--l-pass-fg-muted)}.lumia-scope .text-\\[var\\(--l-pass-info\\)\\]{color:var(--l-pass-info)}.lumia-scope .text-\\[var\\(--l-pass-muted\\)\\]{color:var(--l-pass-muted)}.lumia-scope .text-\\[var\\(--l-pass-success\\)\\]{color:var(--l-pass-success)}.lumia-scope .text-\\[var\\(--l-pass-text-secondary\\)\\]{color:var(--l-pass-text-secondary)}.lumia-scope .text-\\[var\\(--l-pass-warning\\)\\]{color:var(--l-pass-warning)}.lumia-scope .text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity,1))}.lumia-scope .text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}.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-500{--tw-text-opacity:1;color:rgb(245 158 11/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-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity,1))}.lumia-scope .text-black{--tw-text-opacity:1;color:rgb(0 0 0/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-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-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-200{--tw-text-opacity:1;color:rgb(187 247 208/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-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity,1))}.lumia-scope .text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity,1))}.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-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-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity,1))}.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-500{--tw-text-opacity:1;color:rgb(168 85 247/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-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity,1))}.lumia-scope .text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/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-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 .antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .opacity-50{opacity:.5}.lumia-scope .opacity-60{opacity:.6}.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-none{outline:2px solid transparent;outline-offset:2px}.lumia-scope .outline{outline-style:solid}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .grayscale{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 .grayscale{--tw-grayscale:grayscale(100%)}.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-none{transition-property:none}.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 .ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.lumia-scope .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lumia-scope{--l-pass-ff:var(--lumia-passport-ff,-apple-system,BlinkMacSystemFont,"Inter",system-ui,sans-serif);--l-pass-maw:var(--lumia-passport-maw,384px);--l-pass-pd:var(--lumia-passport-pd,12px);--l-pass-gap:var(--lumia-passport-gap,10px);--l-pass-bdrs:var(--lumia-passport-bdrs,20px);--l-pass-el-bdrs:var(--lumia-passport-element-bdrs,10px);--l-pass-backdrop-blur:var(--lumia-passport-backdrop-blur,10px)}.lumia-scope[data-lumia-passport-mode=light]{--l-pass-overlay:var(--lumia-passport-overlay,hsla(0,0%,100%,.8));--l-pass-bg:var(--lumia-passport-bg,#fff);--l-pass-fg:var(--lumia-passport-fg,#000);--l-pass-fg-h:var(--lumia-passport-fg-h,rgba(0,0,0,.6));--l-pass-fg-a:var(--lumia-passport-fg-a,rgba(0,0,0,.4));--l-pass-fg-inverted:var(--lumia-passport-fg-inverted,#fff);--l-pass-fg-muted:var(--lumia-passport-fg-muted,rgba(0,0,0,.6));--l-pass-primary:var(--lumia-passport-primary,#000);--l-pass-primary-h:var(--lumia-passport-primary-h,rgba(0,0,0,.8));--l-pass-primary-a:var(--lumia-passport-primary-a,rgba(0,0,0,.6));--l-pass-secondary:var(--lumia-passport-secondary,#e4e4e4);--l-pass-secondary-h:var(--lumia-passport-secondary-h,hsla(0,0%,89%,.8));--l-pass-secondary-a:var(--lumia-passport-secondary-a,hsla(0,0%,89%,.6));--l-pass-bd:var(--lumia-passport-bd,#c9c9c9);--l-pass-bd-intense:var(--lumia-passport-bd-intense,#a9a9a9);--l-pass-shadow-c:var(--lumia-passport-shadow-c,rgba(0,0,0,.1));--l-pass-info:var(--lumia-passport-info,var(--l-pass-fg));--l-pass-bg-info:var(--lumia-passport-bg-info,#e4e4e4);--l-pass-success:var(--lumia-passport-success,var(--l-pass-fg));--l-pass-bg-success:var(--lumia-passport-bg-success,#21ff51);--l-pass-warning:var(--lumia-passport-warning,var(--l-pass-fg));--l-pass-bg-warning:var(--lumia-passport-bg-warning,#e9fa00);--l-pass-error:var(--lumia-passport-error,#fff);--l-pass-bg-error:var(--lumia-passport-bg-error,#d6204e)}.lumia-scope[data-lumia-passport-mode=dark]{--l-pass-overlay:var(--lumia-passport-overlay,rgba(0,0,0,.8));--l-pass-bg:var(--lumia-passport-bg,#1a1a1a);--l-pass-fg:var(--lumia-passport-fg,#fff);--l-pass-fg-h:var(--lumia-passport-fg-h,hsla(0,0%,100%,.6));--l-pass-fg-a:var(--lumia-passport-fg-a,hsla(0,0%,100%,.4));--l-pass-fg-inverted:var(--lumia-passport-fg-inverted,#000);--l-pass-fg-muted:var(--lumia-passport-fg-muted,hsla(0,0%,100%,.6));--l-pass-primary:var(--lumia-passport-primary,#fff);--l-pass-primary-h:var(--lumia-passport-primary-h,hsla(0,0%,100%,.9));--l-pass-primary-a:var(--lumia-passport-primary-a,hsla(0,0%,100%,.7));--l-pass-secondary:var(--lumia-passport-secondary,#2a2a2a);--l-pass-secondary-h:var(--lumia-passport-secondary-h,rgba(42,42,42,.9));--l-pass-secondary-a:var(--lumia-passport-secondary-a,rgba(42,42,42,.7));--l-pass-bd:var(--lumia-passport-bd,#3a3a3a);--l-pass-bd-intense:var(--lumia-passport-bd-intense,#4a4a4a);--l-pass-shadow-c:var(--lumia-passport-shadow-c,rgba(0,0,0,.5));--l-pass-info:var(--lumia-passport-info,var(--l-pass-fg));--l-pass-bg-info:var(--lumia-passport-bg-info,#2a2a2a);--l-pass-success:var(--lumia-passport-success,var(--l-pass-fg-inverted));--l-pass-bg-success:var(--lumia-passport-bg-success,#21ff51);--l-pass-warning:var(--lumia-passport-warning,var(--l-pass-fg-inverted));--l-pass-bg-warning:var(--lumia-passport-bg-warning,#e9fa00);--l-pass-error:var(--lumia-passport-error,#fff);--l-pass-bg-error:var(--lumia-passport-bg-error,#d6204e)}.lumia-scope,.lumia-scope *{margin:0;box-sizing:border-box;font-family:var(--l-pass-ff);font-optical-sizing:auto;-webkit-tap-highlight-color:transparent;-moz-tap-highlight-color:transparent;-ms-tap-highlight-color:transparent;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lumia-scope button,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6,.lumia-scope input,.lumia-scope p,.lumia-scope select,.lumia-scope textarea{font-family:var(--l-pass-ff)!important;margin:0}.lumia-scope button,.lumia-scope input,.lumia-scope select,.lumia-scope textarea{border-style:solid;outline:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.lumia-scope .lumia-passport-button{box-shadow:0 4px 10px var(--l-pass-shadow-c),inset 0 0 0 1px var(--l-pass-bd);transition:transform .25s ease}.lumia-scope .lumia-passport-button:hover{transform:scale(1.02)}.lumia-scope .lumia-passport-button:active{transform:scale(1)}@keyframes lumia-mobile-dialog-fade-in{0%{opacity:0;transform:translateY(64px)}to{opacity:1;transform:translateY(0)}}@keyframes lumia-mobile-dialog-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(64px)}}.lumia-scope .animate-mobile-dialog-in{animation:lumia-mobile-dialog-fade-in 375ms ease}.lumia-scope .animate-mobile-dialog-out{animation:lumia-mobile-dialog-fade-out 375ms ease}@keyframes lumia-dialog-fade-in{0%{opacity:0}to{opacity:1}}@keyframes lumia-dialog-fade-out{0%{opacity:1}to{opacity:0}}.lumia-scope .animate-dialog-in{animation:lumia-dialog-fade-in 375ms ease}.lumia-scope .animate-dialog-out{animation:lumia-dialog-fade-out 375ms ease}.lumia-scope .list-scrollbar-y{width:100%;padding-right:var(--l-pass-list-scrollbar-pd-r,0);overflow-y:auto;max-height:var(--l-pass-scrollbar-mah,300px)}.lumia-scope .list-scrollbar-y::-webkit-scrollbar{width:4px;height:4px}.lumia-scope .list-scrollbar-y::-webkit-scrollbar-thumb{cursor:pointer;width:4px;border-radius:2px;background-color:var(--l-pass-bd)}.lumia-scope .list-scrollbar-y::-webkit-scrollbar-track{margin-top:10px;margin-bottom:10px;background-color:transparent}.lumia-scope .noScrollbars::-webkit-scrollbar{display:none}.lumia-scope .file\\:mr-\\[var\\(--l-pass-pd\\)\\]::file-selector-button{margin-right:var(--l-pass-pd)}.lumia-scope .file\\:h-8::file-selector-button{height:2rem}.lumia-scope .file\\:cursor-pointer::file-selector-button{cursor:pointer}.lumia-scope .file\\:rounded-\\[var\\(--l-pass-el-bdrs\\)\\]::file-selector-button{border-radius:var(--l-pass-el-bdrs)}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-\\[var\\(--l-pass-primary\\)\\]::file-selector-button{background-color:var(--l-pass-primary)}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-\\[var\\(--l-pass-pd\\)\\]::file-selector-button{padding-left:var(--l-pass-pd);padding-right:var(--l-pass-pd)}.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\\:text-\\[var\\(--l-pass-fg-inverted\\)\\]::file-selector-button{color:var(--l-pass-fg-inverted)}.lumia-scope .placeholder\\:text-\\[var\\(--l-pass-fg-muted\\)\\]::-moz-placeholder{color:var(--l-pass-fg-muted)}.lumia-scope .placeholder\\:text-\\[var\\(--l-pass-fg-muted\\)\\]::placeholder{color:var(--l-pass-fg-muted)}.lumia-scope .focus-within\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:focus-within{background-color:var(--l-pass-secondary-a)}.lumia-scope .focus-within\\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-bg\\)\\]:hover{background-color:var(--l-pass-bg)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-primary-h\\)\\]:hover{background-color:var(--l-pass-primary-h)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-secondary-h\\)\\]:hover{background-color:var(--l-pass-secondary-h)}.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-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/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-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:text-\\[\\#c3f53c\\]:hover{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-\\[var\\(--l-pass-fg\\)\\]:hover{color:var(--l-pass-fg)}.lumia-scope .hover\\:text-\\[var\\(--l-pass-fg-h\\)\\]:hover{color:var(--l-pass-fg-h)}.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\\:underline:hover{text-decoration-line:underline}.lumia-scope .file\\:hover\\:opacity-90:hover::file-selector-button{opacity:.9}.lumia-scope .focus\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:focus{background-color:var(--l-pass-secondary-a)}.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-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-0: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(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-\\[2px\\]: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-transparent:focus-visible{--tw-ring-color:transparent}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .active\\:bg-\\[var\\(--l-pass-bg\\)\\]:active{background-color:var(--l-pass-bg)}.lumia-scope .active\\:bg-\\[var\\(--l-pass-primary-a\\)\\]:active{background-color:var(--l-pass-primary-a)}.lumia-scope .active\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:active{background-color:var(--l-pass-secondary-a)}.lumia-scope .active\\:text-\\[\\#c3f53c\\]:active{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .active\\:text-\\[var\\(--l-pass-fg-a\\)\\]:active{color:var(--l-pass-fg-a)}.lumia-scope .file\\:active\\:opacity-80:active::file-selector-button{opacity:.8}.lumia-scope .disabled\\:cursor-default:disabled{cursor:default}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope .disabled\\:hover\\:bg-\\[var\\(--l-pass-bg\\)\\]:hover:disabled{background-color:var(--l-pass-bg)}.lumia-scope .disabled\\:hover\\:bg-\\[var\\(--l-pass-primary\\)\\]:hover:disabled{background-color:var(--l-pass-primary)}.lumia-scope .disabled\\:hover\\:text-\\[var\\(--l-pass-fg\\)\\]:hover:disabled{color:var(--l-pass-fg)}.lumia-scope .disabled\\:active\\:bg-\\[var\\(--l-pass-bg\\)\\]:active:disabled{background-color:var(--l-pass-bg)}.lumia-scope .disabled\\:active\\:bg-\\[var\\(--l-pass-primary\\)\\]:active:disabled{background-color:var(--l-pass-primary)}.lumia-scope .disabled\\:active\\:text-\\[var\\(--l-pass-fg\\)\\]:active:disabled{color:var(--l-pass-fg)}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}.lumia-scope :is(.group:hover .group-hover\\:opacity-60){opacity:.6}.lumia-scope .data-\\[state\\=checked\\]\\:border-\\[var\\(--l-pass-bd-intense\\)\\][data-state=checked]{border-color:var(--l-pass-bd-intense)}.lumia-scope .data-\\[state\\=checked\\]\\:bg-\\[var\\(--l-pass-secondary\\)\\][data-state=checked]{background-color:var(--l-pass-secondary)}.lumia-scope .data-\\[state\\=checked\\]\\:text-\\[var\\(--l-pass-fg\\)\\][data-state=checked]{color:var(--l-pass-fg)}@media (min-width:640px){.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\\:text-left{text-align:left}}@media (min-width:768px){.lumia-scope .md\\:h-8{height:2rem}.lumia-scope .md\\:w-8{width:2rem}.lumia-scope .md\\:gap-\\[var\\(--l-pass-gap\\)\\]{gap:var(--l-pass-gap)}.lumia-scope .md\\:py-1{padding-top:.25rem;padding-bottom:.25rem}}@media (prefers-color-scheme:dark){.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\\: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 :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
4323
4333
|
|
|
4324
4334
|
// src/context/LumiaPassportContext.tsx
|
|
4325
4335
|
init_lumiaPassport();
|
|
@@ -4328,15 +4338,15 @@ import { initSdkErrorTracking } from "@lumiapassport/core/internal/error-trackin
|
|
|
4328
4338
|
import { merge as merge2 } from "lodash-es";
|
|
4329
4339
|
import {
|
|
4330
4340
|
createContext,
|
|
4331
|
-
useCallback as
|
|
4341
|
+
useCallback as useCallback20,
|
|
4332
4342
|
useContext,
|
|
4333
4343
|
useEffect as useEffect33,
|
|
4334
|
-
useMemo as
|
|
4335
|
-
useRef as
|
|
4344
|
+
useMemo as useMemo5,
|
|
4345
|
+
useRef as useRef13
|
|
4336
4346
|
} from "react";
|
|
4337
4347
|
|
|
4338
4348
|
// src/context/LumiaPassportSessionContext.tsx
|
|
4339
|
-
import { Fragment as
|
|
4349
|
+
import { Fragment as Fragment19 } from "react";
|
|
4340
4350
|
import { create as create6 } from "zustand";
|
|
4341
4351
|
|
|
4342
4352
|
// src/internal/components/BalanceFeedProvider/BalanceFeedProvider.tsx
|
|
@@ -4352,12 +4362,16 @@ import { create } from "zustand";
|
|
|
4352
4362
|
init_assets();
|
|
4353
4363
|
import { Key as Key2, Mail as Mail2, Wallet2 as Wallet22 } from "lucide-react";
|
|
4354
4364
|
var LOCAL_COLOR_MODE_KEY = "lumia-passport-theme";
|
|
4355
|
-
var DEFAULT_AUTH_MENU_HEIGHT =
|
|
4365
|
+
var DEFAULT_AUTH_MENU_HEIGHT = 337;
|
|
4356
4366
|
var DEFAULT_MAIN_MENU_HEIGHT = 90;
|
|
4357
4367
|
var DEFAULT_SETTINGS_MENU_HEIGHT = 346;
|
|
4358
4368
|
var MAX_CONTENT_HEIGHT = 640;
|
|
4359
4369
|
var MAIN_DIALOG_ANIMATION_SPEED = 375;
|
|
4360
4370
|
var Y_ANIMATION_SETUP = { duration: 0.15, ease: "easeInOut", height: { duration: 0.375 } };
|
|
4371
|
+
var BLOCKSCOUT_QUERY_STALE_TIME = 30 * 1e3;
|
|
4372
|
+
var BLOCKSCOUT_QUERY_GC_TIME = 5 * 60 * 1e3;
|
|
4373
|
+
var BLOCKSCOUT_REFRESH_DEBOUNCE = 2e3;
|
|
4374
|
+
var IPFS_GATEWAY = "https://ipfs.io/ipfs/";
|
|
4361
4375
|
var PROVIDERS_META2 = {
|
|
4362
4376
|
passkey: { name: "Passkey", icon: Key2, description: "Biometric authentication" },
|
|
4363
4377
|
email: { name: "Email", icon: Mail2, description: "Email verification" },
|
|
@@ -4369,23 +4383,23 @@ var PROVIDERS_META2 = {
|
|
|
4369
4383
|
};
|
|
4370
4384
|
|
|
4371
4385
|
// src/internal/hooks/useLayoutDataStore.ts
|
|
4372
|
-
var PageKey = /* @__PURE__ */ ((
|
|
4373
|
-
|
|
4374
|
-
|
|
4375
|
-
|
|
4376
|
-
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
return
|
|
4386
|
+
var PageKey = /* @__PURE__ */ ((PageKey4) => {
|
|
4387
|
+
PageKey4["AUTH"] = "auth";
|
|
4388
|
+
PageKey4["TERMS_OF_SERVICE"] = "terms-of-service";
|
|
4389
|
+
PageKey4["MAIN_MENU"] = "main-menu";
|
|
4390
|
+
PageKey4["SETTINGS"] = "settings";
|
|
4391
|
+
PageKey4["SEND"] = "send";
|
|
4392
|
+
PageKey4["RECEIVE"] = "receive";
|
|
4393
|
+
PageKey4["BUY"] = "buy";
|
|
4394
|
+
PageKey4["KYC"] = "kyc";
|
|
4395
|
+
PageKey4["TRANSACTIONS"] = "transactions";
|
|
4396
|
+
PageKey4["ASSETS"] = "assets";
|
|
4397
|
+
PageKey4["MANAGE_WALLET"] = "manage-wallet";
|
|
4398
|
+
PageKey4["UNLINK_PROVIDER"] = "unlink-provider";
|
|
4399
|
+
PageKey4["SECURITY"] = "security";
|
|
4400
|
+
PageKey4["KEYSARE_BACKUP"] = "keysare-backup";
|
|
4401
|
+
PageKey4["KEYSHARE_RESTORE"] = "keyshare-restore";
|
|
4402
|
+
return PageKey4;
|
|
4389
4403
|
})(PageKey || {});
|
|
4390
4404
|
var useLayoutDataStore = create((set) => ({
|
|
4391
4405
|
page: null,
|
|
@@ -4397,6 +4411,7 @@ var useLayoutDataStore = create((set) => ({
|
|
|
4397
4411
|
balance: { decimals: 18, formatted: "0.0", symbol: "LUMIA", value: BigInt(0) },
|
|
4398
4412
|
mainPageHeight: DEFAULT_MAIN_MENU_HEIGHT,
|
|
4399
4413
|
settingsNotifications: [],
|
|
4414
|
+
isWalletLinking: false,
|
|
4400
4415
|
setPage: (page) => set({ page }),
|
|
4401
4416
|
setPageParams: (pageOptions) => set({ pageParams: pageOptions }),
|
|
4402
4417
|
setCryptoRate: (lumiaRate) => set({ cryptoRate: lumiaRate }),
|
|
@@ -4414,7 +4429,8 @@ var useLayoutDataStore = create((set) => ({
|
|
|
4414
4429
|
}
|
|
4415
4430
|
const filtered = prev.settingsNotifications.filter((n) => n.id !== notification.id);
|
|
4416
4431
|
return { settingsNotifications: filtered };
|
|
4417
|
-
})
|
|
4432
|
+
}),
|
|
4433
|
+
setIsWalletLinking: (isWalletLinking) => set({ isWalletLinking })
|
|
4418
4434
|
}));
|
|
4419
4435
|
|
|
4420
4436
|
// src/internal/components/BalanceFeedProvider/BalanceFeedProvider.tsx
|
|
@@ -4510,7 +4526,7 @@ import { useEffect as useEffect31 } from "react";
|
|
|
4510
4526
|
// package.json
|
|
4511
4527
|
var package_default = {
|
|
4512
4528
|
name: "@lumiapassport/ui-kit",
|
|
4513
|
-
version: "1.14.
|
|
4529
|
+
version: "1.14.6",
|
|
4514
4530
|
description: "React UI components and hooks for Lumia Passport authentication and Account Abstraction",
|
|
4515
4531
|
type: "module",
|
|
4516
4532
|
main: "./dist/index.cjs",
|
|
@@ -4743,6 +4759,15 @@ Button.displayName = "Button";
|
|
|
4743
4759
|
|
|
4744
4760
|
// src/internal/components/Footer/Footer.tsx
|
|
4745
4761
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
4762
|
+
function Version({ className }) {
|
|
4763
|
+
return /* @__PURE__ */ jsx4(
|
|
4764
|
+
"span",
|
|
4765
|
+
{
|
|
4766
|
+
className: cn("font-mono text-[10px] text-[var(--l-pass-fg-muted)]", className),
|
|
4767
|
+
children: `v${package_default.version}`
|
|
4768
|
+
}
|
|
4769
|
+
);
|
|
4770
|
+
}
|
|
4746
4771
|
function Footer() {
|
|
4747
4772
|
const qc = useQueryClient();
|
|
4748
4773
|
const { callbacks } = useLumiaPassportConfig();
|
|
@@ -4781,7 +4806,7 @@ function Footer() {
|
|
|
4781
4806
|
"div",
|
|
4782
4807
|
{
|
|
4783
4808
|
style: { borderTop: "1px solid var(--l-pass-bd)" },
|
|
4784
|
-
className:
|
|
4809
|
+
className: "w-full flex flex-col items-center p-[var(--l-pass-pd)] pb-5",
|
|
4785
4810
|
children: [
|
|
4786
4811
|
/* @__PURE__ */ jsxs3("div", { className: "w-full flex items-center justify-between", children: [
|
|
4787
4812
|
/* @__PURE__ */ jsxs3(
|
|
@@ -4823,9 +4848,9 @@ function Footer() {
|
|
|
4823
4848
|
isDisconnecting ? /* @__PURE__ */ jsx4(Loader, { className: "w-4 h-4 animate-spin" }) : /* @__PURE__ */ jsx4(LogOut, { className: "w-4 h-4" })
|
|
4824
4849
|
]
|
|
4825
4850
|
}
|
|
4826
|
-
) : /* @__PURE__ */ jsx4(
|
|
4851
|
+
) : /* @__PURE__ */ jsx4(Version, {})
|
|
4827
4852
|
] }),
|
|
4828
|
-
!!address && /* @__PURE__ */ jsx4(
|
|
4853
|
+
!!address && /* @__PURE__ */ jsx4(Version, { className: "block w-fit mt-1" })
|
|
4829
4854
|
]
|
|
4830
4855
|
}
|
|
4831
4856
|
);
|
|
@@ -5478,8 +5503,34 @@ DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
|
5478
5503
|
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
5479
5504
|
var VisuallyHidden = ({ children }) => /* @__PURE__ */ jsx13("span", { className: "sr-only absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0", children });
|
|
5480
5505
|
|
|
5506
|
+
// src/internal/hooks/useListenIframeAuthEvents.ts
|
|
5507
|
+
import { useCallback, useEffect as useEffect3 } from "react";
|
|
5508
|
+
function useListenIframeAuthEvents() {
|
|
5509
|
+
const setPage = useLayoutDataStore((state) => state.setPage);
|
|
5510
|
+
const setIsIframeReady = useLumiaPassportSession((state) => state.setIsIframeReady);
|
|
5511
|
+
const handleIframeMessage = useCallback(
|
|
5512
|
+
(event) => {
|
|
5513
|
+
if (event.data?.type === "LUMIA_PASSPORT_IFRAME_READY") {
|
|
5514
|
+
console.log("[ IFRAME MESSAGE CACTHED ] Iframe is ready");
|
|
5515
|
+
setIsIframeReady(true);
|
|
5516
|
+
} else if (event.data?.type === "LUMIA_PASSPORT_SHOW_IFRAME") {
|
|
5517
|
+
console.log("[ IFRAME MESSAGE CACTHED ] Consent screen shown - hiding auth modal");
|
|
5518
|
+
} else if (event.data?.type === "LUMIA_PASSPORT_HIDE_IFRAME") {
|
|
5519
|
+
console.log("[ IFRAME MESSAGE CACTHED ] Consent screen hidden");
|
|
5520
|
+
} else if (event.data?.type === "KEYSHARE_RECOVERY_NEEDED") {
|
|
5521
|
+
console.log("[ IFRAME MESSAGE CACTHED] recovery neede");
|
|
5522
|
+
}
|
|
5523
|
+
},
|
|
5524
|
+
[setPage, setIsIframeReady]
|
|
5525
|
+
);
|
|
5526
|
+
useEffect3(() => {
|
|
5527
|
+
window.addEventListener("message", handleIframeMessage);
|
|
5528
|
+
return () => window.removeEventListener("message", handleIframeMessage);
|
|
5529
|
+
}, [handleIframeMessage]);
|
|
5530
|
+
}
|
|
5531
|
+
|
|
5481
5532
|
// src/internal/hooks/useAutoConnect.ts
|
|
5482
|
-
import { useCallback, useEffect as
|
|
5533
|
+
import { useCallback as useCallback2, useEffect as useEffect4, useRef as useRef2 } from "react";
|
|
5483
5534
|
function useAutoConnect() {
|
|
5484
5535
|
const {
|
|
5485
5536
|
config: { current: config },
|
|
@@ -5499,7 +5550,7 @@ function useAutoConnect() {
|
|
|
5499
5550
|
setIsIframeReady,
|
|
5500
5551
|
setIsLoading
|
|
5501
5552
|
} = useLumiaPassportSession();
|
|
5502
|
-
const createSessionWithKeyshare =
|
|
5553
|
+
const createSessionWithKeyshare = useCallback2(
|
|
5503
5554
|
async (userId, hasServerKeyshare, isNewUser) => {
|
|
5504
5555
|
try {
|
|
5505
5556
|
try {
|
|
@@ -5534,7 +5585,7 @@ function useAutoConnect() {
|
|
|
5534
5585
|
[usePaymaster, setStatus, callbacks]
|
|
5535
5586
|
);
|
|
5536
5587
|
const autoConnectAttemptedRef = useRef2(false);
|
|
5537
|
-
|
|
5588
|
+
useEffect4(() => {
|
|
5538
5589
|
if (autoConnectAttemptedRef.current) return;
|
|
5539
5590
|
setIsLoading(true);
|
|
5540
5591
|
const tryAutoConnect = async (attempt) => {
|
|
@@ -5656,14 +5707,13 @@ function useAutoConnect() {
|
|
|
5656
5707
|
|
|
5657
5708
|
// src/internal/hooks/useBackupStatusChanges.ts
|
|
5658
5709
|
import { useMutation as useMutation2 } from "@tanstack/react-query";
|
|
5659
|
-
import { useEffect as
|
|
5710
|
+
import { useEffect as useEffect5 } from "react";
|
|
5660
5711
|
init_vaultClient();
|
|
5661
5712
|
function useBackupStatusChanges() {
|
|
5662
5713
|
const setHasServerVault = useLumiaPassportSession((st) => st.setHasServerVault);
|
|
5663
5714
|
const { mutate: handleBackupStatusChanged } = useMutation2({
|
|
5664
5715
|
mutationFn: async (event) => {
|
|
5665
5716
|
const customEvent = event;
|
|
5666
|
-
console.log("[BACKUP STATUS] changed:", customEvent.detail);
|
|
5667
5717
|
return await getShareRecoveryStats();
|
|
5668
5718
|
},
|
|
5669
5719
|
onSuccess: (stats) => {
|
|
@@ -5680,7 +5730,7 @@ function useBackupStatusChanges() {
|
|
|
5680
5730
|
console.warn("[BACKUP STATUS] Failed to fetch initial vault status:", error);
|
|
5681
5731
|
}
|
|
5682
5732
|
});
|
|
5683
|
-
|
|
5733
|
+
useEffect5(() => {
|
|
5684
5734
|
window.addEventListener("lumia-passport-backup-status-changed", handleBackupStatusChanged);
|
|
5685
5735
|
return () => {
|
|
5686
5736
|
window.removeEventListener("lumia-passport-backup-status-changed", handleBackupStatusChanged);
|
|
@@ -5689,7 +5739,7 @@ function useBackupStatusChanges() {
|
|
|
5689
5739
|
}
|
|
5690
5740
|
|
|
5691
5741
|
// src/internal/hooks/useBackupWarning.ts
|
|
5692
|
-
import { useEffect as
|
|
5742
|
+
import { useEffect as useEffect6, useRef as useRef3 } from "react";
|
|
5693
5743
|
var WARNING_TIMEOUT_MS = 24e3;
|
|
5694
5744
|
function useBackupWarning() {
|
|
5695
5745
|
const config = useLumiaPassportConfig().config;
|
|
@@ -5698,7 +5748,7 @@ function useBackupWarning() {
|
|
|
5698
5748
|
const page = useLayoutDataStore((st) => st.page);
|
|
5699
5749
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
5700
5750
|
const timeoutRef = useRef3(null);
|
|
5701
|
-
|
|
5751
|
+
useEffect6(() => {
|
|
5702
5752
|
if (timeoutRef.current) {
|
|
5703
5753
|
clearTimeout(timeoutRef.current);
|
|
5704
5754
|
timeoutRef.current = null;
|
|
@@ -5720,7 +5770,7 @@ function useBackupWarning() {
|
|
|
5720
5770
|
|
|
5721
5771
|
// src/internal/hooks/useCheckVaultStatus.ts
|
|
5722
5772
|
import { useMutation as useMutation3 } from "@tanstack/react-query";
|
|
5723
|
-
import { useEffect as
|
|
5773
|
+
import { useEffect as useEffect7 } from "react";
|
|
5724
5774
|
init_vaultClient();
|
|
5725
5775
|
function useCheckVaultStatus() {
|
|
5726
5776
|
const address = useLumiaPassportSession((st) => st.address);
|
|
@@ -5739,7 +5789,7 @@ function useCheckVaultStatus() {
|
|
|
5739
5789
|
setHasServerVault(false);
|
|
5740
5790
|
}
|
|
5741
5791
|
});
|
|
5742
|
-
|
|
5792
|
+
useEffect7(() => {
|
|
5743
5793
|
if (!address) return setHasServerVault(false);
|
|
5744
5794
|
checkVaultStatus();
|
|
5745
5795
|
}, [address, checkVaultStatus]);
|
|
@@ -5747,12 +5797,12 @@ function useCheckVaultStatus() {
|
|
|
5747
5797
|
|
|
5748
5798
|
// src/internal/hooks/useDetectMaxScrollHeight.ts
|
|
5749
5799
|
import { debounce } from "lodash-es";
|
|
5750
|
-
import { useCallback as
|
|
5800
|
+
import { useCallback as useCallback3, useEffect as useEffect8 } from "react";
|
|
5751
5801
|
var DEBOUNCE_DELAY = 50;
|
|
5752
5802
|
function useDetectMaxScrollHeight() {
|
|
5753
5803
|
const setIsMobileView = useLayoutStore((state) => state.setIsMobileView);
|
|
5754
5804
|
const setMaxScrollHeight = useLayoutStore((state) => state.setMaxScrollHeight);
|
|
5755
|
-
const onResize =
|
|
5805
|
+
const onResize = useCallback3(
|
|
5756
5806
|
debounce(({ width, height }) => {
|
|
5757
5807
|
const limContentHeight = height * 0.92 - 116 - 72;
|
|
5758
5808
|
setIsMobileView(width < height && (width < 475 || limContentHeight <= MAX_CONTENT_HEIGHT));
|
|
@@ -5760,7 +5810,7 @@ function useDetectMaxScrollHeight() {
|
|
|
5760
5810
|
}, DEBOUNCE_DELAY),
|
|
5761
5811
|
[setMaxScrollHeight, setIsMobileView]
|
|
5762
5812
|
);
|
|
5763
|
-
|
|
5813
|
+
useEffect8(() => {
|
|
5764
5814
|
const obs = new ResizeObserver(([entry]) => onResize(entry.contentRect));
|
|
5765
5815
|
const doc = window.document.getElementsByTagName("html")[0];
|
|
5766
5816
|
if (doc) obs.observe(doc);
|
|
@@ -5769,13 +5819,38 @@ function useDetectMaxScrollHeight() {
|
|
|
5769
5819
|
}
|
|
5770
5820
|
|
|
5771
5821
|
// src/internal/hooks/usePageMapper.tsx
|
|
5772
|
-
import { useCallback as
|
|
5822
|
+
import { useCallback as useCallback17, useEffect as useEffect28 } from "react";
|
|
5773
5823
|
|
|
5774
5824
|
// src/internal/components/AuthMenu/AuthMenu.tsx
|
|
5775
5825
|
import { AnimatePresence, motion } from "framer-motion";
|
|
5776
|
-
import { Loader as Loader5 } from "lucide-react";
|
|
5826
|
+
import { AlertTriangle as AlertTriangle2, Loader as Loader5 } from "lucide-react";
|
|
5777
5827
|
import { useEffect as useEffect11, useMemo } from "react";
|
|
5778
5828
|
|
|
5829
|
+
// src/internal/components/ui/highlight.tsx
|
|
5830
|
+
import { jsx as jsx14 } from "react/jsx-runtime";
|
|
5831
|
+
var CARD_STYLES = {
|
|
5832
|
+
info: "text-[var(--l-pass-info)] bg-[var(--l-pass-bg-info)]",
|
|
5833
|
+
success: "text-[var(--l-pass-success)] bg-[var(--l-pass-bg-success)]",
|
|
5834
|
+
warning: "text-[var(--l-pass-warning)] bg-[var(--l-pass-bg-warning)]",
|
|
5835
|
+
error: "text-[var(--l-pass-error)] bg-[var(--l-pass-bg-error)]"
|
|
5836
|
+
};
|
|
5837
|
+
function Highlight(props) {
|
|
5838
|
+
const { type = "info", children, className } = props;
|
|
5839
|
+
return /* @__PURE__ */ jsx14(
|
|
5840
|
+
"div",
|
|
5841
|
+
{
|
|
5842
|
+
className: cn(
|
|
5843
|
+
"w-full text-xs rounded-[var(--l-pass-el-bdrs)] p-[var(--l-pass-pd)]",
|
|
5844
|
+
"whitespace-pre-line",
|
|
5845
|
+
type === "error" ? "break-all" : "break-normal",
|
|
5846
|
+
CARD_STYLES[type],
|
|
5847
|
+
className
|
|
5848
|
+
),
|
|
5849
|
+
children
|
|
5850
|
+
}
|
|
5851
|
+
);
|
|
5852
|
+
}
|
|
5853
|
+
|
|
5779
5854
|
// src/internal/components/AuthMenu/AuthFailedStep.tsx
|
|
5780
5855
|
import { AlertTriangle, Cross } from "lucide-react";
|
|
5781
5856
|
|
|
@@ -5788,68 +5863,58 @@ var useAuthStore = create3((set) => ({
|
|
|
5788
5863
|
expiresIn: null,
|
|
5789
5864
|
codeSendError: null,
|
|
5790
5865
|
passkeyStatus: "idle",
|
|
5791
|
-
passkeyError: null,
|
|
5792
|
-
failedMessage: null,
|
|
5793
5866
|
failedType: "general",
|
|
5794
|
-
verificationError: null,
|
|
5795
5867
|
setStep: (step) => set({ step }),
|
|
5796
|
-
setAlert: (alert2) => set({ alert: alert2 }),
|
|
5797
5868
|
setEmail: (email) => set({ email }),
|
|
5798
5869
|
setExpiresIn: (expiresIn) => set({ expiresIn }),
|
|
5799
|
-
setCodeSendError: (error) => set({ codeSendError: error }),
|
|
5800
5870
|
setPasskeyStatus: (status) => set({ passkeyStatus: status }),
|
|
5801
|
-
|
|
5802
|
-
|
|
5803
|
-
setFailedType: (type) => set({ failedType: type }),
|
|
5804
|
-
setVerificationError: (error) => set({ verificationError: error })
|
|
5871
|
+
setAlert: (alert2) => set({ alert: alert2 }),
|
|
5872
|
+
setFailedType: (type) => set({ failedType: type })
|
|
5805
5873
|
}));
|
|
5806
5874
|
|
|
5807
5875
|
// src/internal/components/AuthMenu/AuthFailedStep.tsx
|
|
5808
|
-
import { jsx as
|
|
5876
|
+
import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
5809
5877
|
function AuthFailedStep() {
|
|
5810
5878
|
const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading);
|
|
5811
|
-
const {
|
|
5879
|
+
const { failedType, setStep, setFailedType, setAlert } = useAuthStore();
|
|
5812
5880
|
const isCritical = failedType === "critical" || failedType === "config";
|
|
5813
5881
|
return /* @__PURE__ */ jsxs12("div", { className: "w-full flex flex-col text-center gap-4 p-4", children: [
|
|
5814
|
-
/* @__PURE__ */
|
|
5882
|
+
/* @__PURE__ */ jsx15(
|
|
5815
5883
|
"div",
|
|
5816
5884
|
{
|
|
5817
5885
|
className: cn(
|
|
5818
5886
|
"w-full flex flex-col p-2 gap-2 rounded-[var(--l-pass-el-bdrs)]",
|
|
5819
5887
|
isCritical ? "text-[var(--l-pass-error)] bg-[var(--l-pass-bg-error)]" : "text-[var(--l-pass-warning)] bg-[var(--l-pass-bg-warning)]"
|
|
5820
5888
|
),
|
|
5821
|
-
children: [
|
|
5822
|
-
/* @__PURE__ */
|
|
5823
|
-
|
|
5824
|
-
|
|
5825
|
-
] }),
|
|
5826
|
-
failedMessage && /* @__PURE__ */ jsx14("span", { className: "text-center block text-sm whitespace-pre-line leading-relaxed", children: failedMessage })
|
|
5827
|
-
]
|
|
5889
|
+
children: /* @__PURE__ */ jsxs12("div", { className: "w-full flex items-center justify-center gap-2", children: [
|
|
5890
|
+
isCritical ? /* @__PURE__ */ jsx15(AlertTriangle, { className: "w-5 h-5 text-[var(--l-pass-error)]" }) : /* @__PURE__ */ jsx15(Cross, { className: "w-5 h-5 text-[var(--l-pass-warning)]" }),
|
|
5891
|
+
/* @__PURE__ */ jsx15("span", { className: "text-center block text-xl font-bold", children: failedType === "config" ? "Configuration Error" : failedType === "critical" ? "Critical Error" : "Failed" })
|
|
5892
|
+
] })
|
|
5828
5893
|
}
|
|
5829
5894
|
),
|
|
5830
5895
|
failedType === "config" && /* @__PURE__ */ jsxs12("div", { className: "p-2 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-info)]", children: [
|
|
5831
|
-
/* @__PURE__ */
|
|
5896
|
+
/* @__PURE__ */ jsx15("div", { className: "text-sm font-medium text-[var(--l-pass-info)] mb-2", children: "To fix this issue:" }),
|
|
5832
5897
|
/* @__PURE__ */ jsxs12("ul", { className: "text-xs text-[var(--l-pass-info)] text-left space-y-1 list-disc list-inside", children: [
|
|
5833
|
-
/* @__PURE__ */
|
|
5834
|
-
/* @__PURE__ */
|
|
5835
|
-
/* @__PURE__ */
|
|
5898
|
+
/* @__PURE__ */ jsx15("li", { children: "Contact your project administrator" }),
|
|
5899
|
+
/* @__PURE__ */ jsx15("li", { children: "Verify projectId is correctly configured" }),
|
|
5900
|
+
/* @__PURE__ */ jsx15("li", { children: "Check project metadata on the server" })
|
|
5836
5901
|
] })
|
|
5837
5902
|
] }),
|
|
5838
5903
|
failedType === "critical" && /* @__PURE__ */ jsxs12("div", { className: "p-2 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-error)] border", children: [
|
|
5839
|
-
/* @__PURE__ */
|
|
5904
|
+
/* @__PURE__ */ jsx15("div", { className: "text-sm font-semibold text-[var(--l-pass-error)] mb-2", children: "What to do next:" }),
|
|
5840
5905
|
/* @__PURE__ */ jsxs12("ul", { className: "text-xs text-[var(--l-pass-error)] text-left space-y-1 list-disc list-inside", children: [
|
|
5841
|
-
/* @__PURE__ */
|
|
5842
|
-
/* @__PURE__ */
|
|
5843
|
-
/* @__PURE__ */
|
|
5906
|
+
/* @__PURE__ */ jsx15("li", { children: "Contact support immediately" }),
|
|
5907
|
+
/* @__PURE__ */ jsx15("li", { children: "Provide your projectId and error details" }),
|
|
5908
|
+
/* @__PURE__ */ jsx15("li", { children: "You may need to create a new account" })
|
|
5844
5909
|
] })
|
|
5845
5910
|
] }),
|
|
5846
|
-
/* @__PURE__ */
|
|
5911
|
+
/* @__PURE__ */ jsx15("div", { className: "flex flex-col gap-2", children: /* @__PURE__ */ jsx15(
|
|
5847
5912
|
Button,
|
|
5848
5913
|
{
|
|
5849
5914
|
size: "large",
|
|
5850
5915
|
onClick: () => {
|
|
5851
5916
|
setStep("signin");
|
|
5852
|
-
|
|
5917
|
+
setAlert(null);
|
|
5853
5918
|
setFailedType("general");
|
|
5854
5919
|
setIsLoading(false);
|
|
5855
5920
|
},
|
|
@@ -5868,7 +5933,7 @@ init_profile();
|
|
|
5868
5933
|
|
|
5869
5934
|
// src/internal/components/ui/input.tsx
|
|
5870
5935
|
import React2, { useImperativeHandle, useRef as useRef4 } from "react";
|
|
5871
|
-
import { jsx as
|
|
5936
|
+
import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
5872
5937
|
var Input = React2.forwardRef((props, ref) => {
|
|
5873
5938
|
const { className, disabled, error, Icon, element, ...inputProps } = props;
|
|
5874
5939
|
const internalRef = useRef4(null);
|
|
@@ -5890,8 +5955,8 @@ var Input = React2.forwardRef((props, ref) => {
|
|
|
5890
5955
|
internalRef.current?.focus();
|
|
5891
5956
|
},
|
|
5892
5957
|
children: [
|
|
5893
|
-
Icon && /* @__PURE__ */
|
|
5894
|
-
/* @__PURE__ */
|
|
5958
|
+
Icon && /* @__PURE__ */ jsx16("div", { className: "flex flex-none items-center justify-center w-6 h-6 p-1", children: /* @__PURE__ */ jsx16(Icon, { width: 16, height: 16, className: "text-[var(--l-pass-fg)]" }) }),
|
|
5959
|
+
/* @__PURE__ */ jsx16(
|
|
5895
5960
|
"input",
|
|
5896
5961
|
{
|
|
5897
5962
|
ref: internalRef,
|
|
@@ -5910,13 +5975,13 @@ var Input = React2.forwardRef((props, ref) => {
|
|
|
5910
5975
|
]
|
|
5911
5976
|
}
|
|
5912
5977
|
),
|
|
5913
|
-
!!error?.length && /* @__PURE__ */
|
|
5978
|
+
!!error?.length && /* @__PURE__ */ jsx16("span", { className: "block text-[var(--l-pass-error)]", children: error })
|
|
5914
5979
|
] });
|
|
5915
5980
|
});
|
|
5916
5981
|
Input.displayName = "Input";
|
|
5917
5982
|
|
|
5918
5983
|
// src/internal/components/AuthMenu/DisaplayNameStep/DisplayNameInput.tsx
|
|
5919
|
-
import { jsx as
|
|
5984
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
5920
5985
|
var DisplayNameInput = ({ onComplete, onSkip }) => {
|
|
5921
5986
|
const [displayName, setDisplayName] = useState4("");
|
|
5922
5987
|
const [isLoading, setIsLoading] = useState4(false);
|
|
@@ -5946,12 +6011,12 @@ var DisplayNameInput = ({ onComplete, onSkip }) => {
|
|
|
5946
6011
|
};
|
|
5947
6012
|
return /* @__PURE__ */ jsxs14("div", { className: "w-full p-[var(--l-pass-pd)] flex flex-col gap-[var(--l-pass-gap)]", children: [
|
|
5948
6013
|
/* @__PURE__ */ jsxs14("div", { className: "flex items-center justify-center gap-2 px-5 pt-3 pb-6", children: [
|
|
5949
|
-
/* @__PURE__ */
|
|
5950
|
-
/* @__PURE__ */
|
|
6014
|
+
/* @__PURE__ */ jsx17(LumiaLogo, { size: 24, className: "w-6 h-6" }),
|
|
6015
|
+
/* @__PURE__ */ jsx17("span", { className: "font-bold text-xl leading-6", children: "What's your name?" })
|
|
5951
6016
|
] }),
|
|
5952
|
-
/* @__PURE__ */
|
|
6017
|
+
/* @__PURE__ */ jsx17("span", { className: "block w-full text-xs text-center", children: "This helps personalize your experience" }),
|
|
5953
6018
|
/* @__PURE__ */ jsxs14("form", { onSubmit: handleSubmit, className: "w-full flex flex-col gap-[var(--l-pass-pd)]", children: [
|
|
5954
|
-
/* @__PURE__ */
|
|
6019
|
+
/* @__PURE__ */ jsx17(
|
|
5955
6020
|
Input,
|
|
5956
6021
|
{
|
|
5957
6022
|
Icon: User,
|
|
@@ -5969,7 +6034,7 @@ var DisplayNameInput = ({ onComplete, onSkip }) => {
|
|
|
5969
6034
|
}
|
|
5970
6035
|
),
|
|
5971
6036
|
/* @__PURE__ */ jsxs14("div", { className: "w-full flex gap-[var(--l-pass-gap)]", children: [
|
|
5972
|
-
/* @__PURE__ */
|
|
6037
|
+
/* @__PURE__ */ jsx17(
|
|
5973
6038
|
Button,
|
|
5974
6039
|
{
|
|
5975
6040
|
type: "submit",
|
|
@@ -5979,7 +6044,7 @@ var DisplayNameInput = ({ onComplete, onSkip }) => {
|
|
|
5979
6044
|
children: isLoading ? "Saving..." : "Continue"
|
|
5980
6045
|
}
|
|
5981
6046
|
),
|
|
5982
|
-
/* @__PURE__ */
|
|
6047
|
+
/* @__PURE__ */ jsx17(
|
|
5983
6048
|
Button,
|
|
5984
6049
|
{
|
|
5985
6050
|
className: "flex-1 text-[var(--l-pass-fg-muted)]",
|
|
@@ -5997,17 +6062,16 @@ var DisplayNameInput = ({ onComplete, onSkip }) => {
|
|
|
5997
6062
|
};
|
|
5998
6063
|
|
|
5999
6064
|
// src/internal/components/AuthMenu/DisaplayNameStep/DisplayNameStep.tsx
|
|
6000
|
-
import { jsx as
|
|
6065
|
+
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
6001
6066
|
function DisplayNameStep(props) {
|
|
6002
6067
|
const { onAuthSuccess } = props;
|
|
6003
6068
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
6004
|
-
const {
|
|
6069
|
+
const { setStep, setEmail, setPasskeyStatus, setAlert } = useAuthStore();
|
|
6005
6070
|
const onSkip = async () => {
|
|
6006
6071
|
setPage(null);
|
|
6007
6072
|
setStep("signin");
|
|
6008
6073
|
setEmail("");
|
|
6009
|
-
|
|
6010
|
-
setPasskeyError("");
|
|
6074
|
+
setAlert(null);
|
|
6011
6075
|
setPasskeyStatus("idle");
|
|
6012
6076
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
6013
6077
|
if (onAuthSuccess) await onAuthSuccess();
|
|
@@ -6016,21 +6080,20 @@ function DisplayNameStep(props) {
|
|
|
6016
6080
|
setPage(null);
|
|
6017
6081
|
setStep("signin");
|
|
6018
6082
|
setEmail("");
|
|
6019
|
-
|
|
6020
|
-
setPasskeyError("");
|
|
6083
|
+
setAlert(null);
|
|
6021
6084
|
setPasskeyStatus("idle");
|
|
6022
6085
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
6023
6086
|
if (onAuthSuccess) await onAuthSuccess();
|
|
6024
6087
|
};
|
|
6025
|
-
return /* @__PURE__ */
|
|
6088
|
+
return /* @__PURE__ */ jsx18(DisplayNameInput, { onComplete, onSkip });
|
|
6026
6089
|
}
|
|
6027
6090
|
|
|
6028
6091
|
// src/internal/components/AuthMenu/PassKeyStep.tsx
|
|
6029
6092
|
import { ArrowLeft as ArrowLeft3, Key as Key3 } from "lucide-react";
|
|
6030
|
-
import { useCallback as
|
|
6093
|
+
import { useCallback as useCallback5 } from "react";
|
|
6031
6094
|
|
|
6032
6095
|
// src/internal/assets/PasskeyAddIcon.tsx
|
|
6033
|
-
import { jsx as
|
|
6096
|
+
import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
6034
6097
|
function PasskeyAddIcon(props) {
|
|
6035
6098
|
const { width = "24", height = "24", className = "w-6 h-6", ...rest } = props;
|
|
6036
6099
|
return /* @__PURE__ */ jsxs15(
|
|
@@ -6046,11 +6109,11 @@ function PasskeyAddIcon(props) {
|
|
|
6046
6109
|
strokeLinejoin: "round",
|
|
6047
6110
|
xmlns: "http://www.w3.org/2000/svg",
|
|
6048
6111
|
children: [
|
|
6049
|
-
/* @__PURE__ */
|
|
6050
|
-
/* @__PURE__ */
|
|
6051
|
-
/* @__PURE__ */
|
|
6052
|
-
/* @__PURE__ */
|
|
6053
|
-
/* @__PURE__ */
|
|
6112
|
+
/* @__PURE__ */ jsx19("path", { d: "m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" }),
|
|
6113
|
+
/* @__PURE__ */ jsx19("path", { d: "m21 2-9.6 9.6" }),
|
|
6114
|
+
/* @__PURE__ */ jsx19("circle", { cx: "7.5", cy: "15.5", r: "5.5" }),
|
|
6115
|
+
/* @__PURE__ */ jsx19("path", { d: "M18 15v6" }),
|
|
6116
|
+
/* @__PURE__ */ jsx19("path", { d: "M21 18h-6" })
|
|
6054
6117
|
]
|
|
6055
6118
|
}
|
|
6056
6119
|
);
|
|
@@ -6060,16 +6123,16 @@ function PasskeyAddIcon(props) {
|
|
|
6060
6123
|
init_auth();
|
|
6061
6124
|
|
|
6062
6125
|
// src/internal/components/Expandable/hooks/useExpandable.ts
|
|
6063
|
-
import { useCallback as
|
|
6126
|
+
import { useCallback as useCallback4, useEffect as useEffect9, useRef as useRef5 } from "react";
|
|
6064
6127
|
var useExpandable = (props) => {
|
|
6065
6128
|
const { isExpanded = false, children, initHeight = 0, minHeight = 0 } = props;
|
|
6066
6129
|
const expandableRef = useRef5(null);
|
|
6067
6130
|
const contentRef = useRef5(null);
|
|
6068
|
-
|
|
6131
|
+
useEffect9(() => {
|
|
6069
6132
|
if (!expandableRef.current) return;
|
|
6070
6133
|
expandableRef.current.style.setProperty("--ifo-basic-expandable-h", `${initHeight}px )`);
|
|
6071
6134
|
}, []);
|
|
6072
|
-
const setExpandableHeight =
|
|
6135
|
+
const setExpandableHeight = useCallback4(
|
|
6073
6136
|
(isExpnd) => {
|
|
6074
6137
|
if (!contentRef.current || !expandableRef.current) return;
|
|
6075
6138
|
expandableRef.current.style.setProperty(
|
|
@@ -6080,7 +6143,7 @@ var useExpandable = (props) => {
|
|
|
6080
6143
|
// ON_RESIZE_DELEAY),
|
|
6081
6144
|
[minHeight]
|
|
6082
6145
|
);
|
|
6083
|
-
|
|
6146
|
+
useEffect9(() => {
|
|
6084
6147
|
if (!contentRef.current || !expandableRef.current) return;
|
|
6085
6148
|
const obs = new ResizeObserver(() => setExpandableHeight(isExpanded));
|
|
6086
6149
|
obs.observe(expandableRef.current);
|
|
@@ -6093,24 +6156,24 @@ var useExpandable = (props) => {
|
|
|
6093
6156
|
};
|
|
6094
6157
|
|
|
6095
6158
|
// src/internal/components/Expandable/Expandable.tsx
|
|
6096
|
-
import { jsx as
|
|
6159
|
+
import { jsx as jsx20 } from "react/jsx-runtime";
|
|
6097
6160
|
function Expandable(props) {
|
|
6098
6161
|
const { children, className, contentClassName, minHeight, divProps } = props;
|
|
6099
6162
|
const { expandableRef, contentRef } = useExpandable(props);
|
|
6100
|
-
return /* @__PURE__ */
|
|
6163
|
+
return /* @__PURE__ */ jsx20(
|
|
6101
6164
|
"div",
|
|
6102
6165
|
{
|
|
6103
6166
|
...divProps,
|
|
6104
6167
|
ref: expandableRef,
|
|
6105
6168
|
className: cn("w-full overflow-y-hidden", className),
|
|
6106
6169
|
style: { height: "var(--ifo-basic-expandable-h)", transition: "height 375ms ease" },
|
|
6107
|
-
children: /* @__PURE__ */
|
|
6170
|
+
children: /* @__PURE__ */ jsx20("div", { className: cn("w-full", contentClassName), ref: contentRef, style: minHeight ? { minHeight } : void 0, children })
|
|
6108
6171
|
}
|
|
6109
6172
|
);
|
|
6110
6173
|
}
|
|
6111
6174
|
|
|
6112
6175
|
// src/internal/components/AuthMenu/PassKeyStep.tsx
|
|
6113
|
-
import { Fragment as Fragment2, jsx as
|
|
6176
|
+
import { Fragment as Fragment2, jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
6114
6177
|
function normalizeWebAuthnError(err) {
|
|
6115
6178
|
const raw = err?.message || String(err || "");
|
|
6116
6179
|
const lower = raw.toLowerCase();
|
|
@@ -6132,20 +6195,9 @@ function PassKeyStep(props) {
|
|
|
6132
6195
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
6133
6196
|
const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading);
|
|
6134
6197
|
const autoCloseOnSuccess = !recoveryUserId;
|
|
6135
|
-
const {
|
|
6136
|
-
|
|
6137
|
-
|
|
6138
|
-
setStep,
|
|
6139
|
-
setPasskeyError,
|
|
6140
|
-
setPasskeyStatus,
|
|
6141
|
-
setAlert,
|
|
6142
|
-
setEmail,
|
|
6143
|
-
setVerificationError,
|
|
6144
|
-
setFailedMessage,
|
|
6145
|
-
setFailedType
|
|
6146
|
-
} = useAuthStore();
|
|
6147
|
-
const onPasskeyRegister = useCallback4(async () => {
|
|
6148
|
-
setPasskeyError("");
|
|
6198
|
+
const { passkeyStatus, setStep, setPasskeyStatus, setAlert, setEmail, setFailedType } = useAuthStore();
|
|
6199
|
+
const onPasskeyRegister = useCallback5(async () => {
|
|
6200
|
+
setAlert(null);
|
|
6149
6201
|
setPasskeyStatus("registering passkey...");
|
|
6150
6202
|
setIsLoading(true);
|
|
6151
6203
|
try {
|
|
@@ -6172,8 +6224,7 @@ function PassKeyStep(props) {
|
|
|
6172
6224
|
if (onAuthSuccess) await onAuthSuccess();
|
|
6173
6225
|
setStep("signin");
|
|
6174
6226
|
setEmail("");
|
|
6175
|
-
|
|
6176
|
-
setPasskeyError("");
|
|
6227
|
+
setAlert(null);
|
|
6177
6228
|
setPasskeyStatus("idle");
|
|
6178
6229
|
} else {
|
|
6179
6230
|
setPasskeyStatus("Passkey registered successfully!");
|
|
@@ -6195,7 +6246,10 @@ function PassKeyStep(props) {
|
|
|
6195
6246
|
message: "This passkey is already registered for your account. No need to register again!"
|
|
6196
6247
|
});
|
|
6197
6248
|
} else if (!normalized.benignCancel) {
|
|
6198
|
-
|
|
6249
|
+
setAlert({
|
|
6250
|
+
title: "Passkey Error",
|
|
6251
|
+
message: errorMessage
|
|
6252
|
+
});
|
|
6199
6253
|
}
|
|
6200
6254
|
if (!normalized.benignCancel) {
|
|
6201
6255
|
try {
|
|
@@ -6211,8 +6265,8 @@ function PassKeyStep(props) {
|
|
|
6211
6265
|
setIsLoading(false);
|
|
6212
6266
|
}
|
|
6213
6267
|
}, [onAuthSuccess, setPage, callbacks]);
|
|
6214
|
-
const onPasskeyAuth =
|
|
6215
|
-
|
|
6268
|
+
const onPasskeyAuth = useCallback5(async () => {
|
|
6269
|
+
setAlert(null);
|
|
6216
6270
|
setPasskeyStatus("checking available passkeys...");
|
|
6217
6271
|
setIsLoading(true);
|
|
6218
6272
|
try {
|
|
@@ -6228,9 +6282,10 @@ function PassKeyStep(props) {
|
|
|
6228
6282
|
pendingLoginResponseRef.current = result.loginResponse;
|
|
6229
6283
|
const hasKeyshare = result.loginResponse.hasKeyshare ?? false;
|
|
6230
6284
|
if (!hasKeyshare && result.loginResponse.isNewUser === void 0) {
|
|
6231
|
-
|
|
6232
|
-
"
|
|
6233
|
-
|
|
6285
|
+
setAlert({
|
|
6286
|
+
title: "Configuration Error",
|
|
6287
|
+
message: "The backend could not determine user status. This indicates you probably already have used the passkey and did not create required backups.\n Unfortunately, your wallet cannot be recovered. You need to create account using a different passkey."
|
|
6288
|
+
});
|
|
6234
6289
|
setFailedType("config");
|
|
6235
6290
|
setStep("failed");
|
|
6236
6291
|
setPasskeyStatus("idle");
|
|
@@ -6238,9 +6293,10 @@ function PassKeyStep(props) {
|
|
|
6238
6293
|
return;
|
|
6239
6294
|
}
|
|
6240
6295
|
if (!hasKeyshare && result.loginResponse.isNewUser === false) {
|
|
6241
|
-
|
|
6242
|
-
"
|
|
6243
|
-
|
|
6296
|
+
setAlert({
|
|
6297
|
+
title: "Data has been lost",
|
|
6298
|
+
message: "Your account data has been lost on the server.\nThis should never happen and indicates a serious system failure.\n\nUnfortunately, your wallet cannot be recovered.\nYou will need to create a new account.\n\nPlease contact support immediately with this error."
|
|
6299
|
+
});
|
|
6244
6300
|
setFailedType("critical");
|
|
6245
6301
|
setStep("failed");
|
|
6246
6302
|
setPasskeyStatus("idle");
|
|
@@ -6261,7 +6317,10 @@ function PassKeyStep(props) {
|
|
|
6261
6317
|
if (onAuthSuccess) await onAuthSuccess();
|
|
6262
6318
|
} catch (authError) {
|
|
6263
6319
|
if (authError?.message?.includes("User denied authorization")) {
|
|
6264
|
-
|
|
6320
|
+
setAlert({
|
|
6321
|
+
title: "Authorization Cancelled",
|
|
6322
|
+
message: authError?.message || "You have cancelled the authorization process."
|
|
6323
|
+
});
|
|
6265
6324
|
setStep("failed");
|
|
6266
6325
|
setPasskeyStatus("idle");
|
|
6267
6326
|
return;
|
|
@@ -6271,8 +6330,7 @@ function PassKeyStep(props) {
|
|
|
6271
6330
|
if (autoCloseOnSuccess) {
|
|
6272
6331
|
setStep("signin");
|
|
6273
6332
|
setEmail("");
|
|
6274
|
-
|
|
6275
|
-
setPasskeyError("");
|
|
6333
|
+
setAlert(null);
|
|
6276
6334
|
setPasskeyStatus("idle");
|
|
6277
6335
|
setPage(null);
|
|
6278
6336
|
}
|
|
@@ -6280,7 +6338,10 @@ function PassKeyStep(props) {
|
|
|
6280
6338
|
const normalized = normalizeWebAuthnError(e);
|
|
6281
6339
|
const errorMessage = normalized.message || "Authentication failed";
|
|
6282
6340
|
if (!normalized.benignCancel) {
|
|
6283
|
-
|
|
6341
|
+
setAlert({
|
|
6342
|
+
title: "Passkey Error",
|
|
6343
|
+
message: errorMessage
|
|
6344
|
+
});
|
|
6284
6345
|
try {
|
|
6285
6346
|
callbacks?.onLumiaPassportError?.({
|
|
6286
6347
|
error: e instanceof Error ? e : new Error(errorMessage),
|
|
@@ -6297,8 +6358,8 @@ function PassKeyStep(props) {
|
|
|
6297
6358
|
}, [onAuthSuccess, setPage, callbacks]);
|
|
6298
6359
|
return /* @__PURE__ */ jsxs16(Expandable, { isExpanded: true, contentClassName: "w-full p-[var(--l-pass-pd)] flex flex-col gap-[var(--l-pass-gap)]", children: [
|
|
6299
6360
|
/* @__PURE__ */ jsxs16("div", { className: "relative flex items-center justify-center gap-2 px-5 pt-3 pb-6", children: [
|
|
6300
|
-
/* @__PURE__ */
|
|
6301
|
-
/* @__PURE__ */
|
|
6361
|
+
/* @__PURE__ */ jsx21(Key3, { className: "w-6 h-6" }),
|
|
6362
|
+
/* @__PURE__ */ jsx21("span", { className: "font-bold text-xl leading-6", children: "Passkey" }),
|
|
6302
6363
|
/* @__PURE__ */ jsxs16(
|
|
6303
6364
|
Button,
|
|
6304
6365
|
{
|
|
@@ -6309,25 +6370,24 @@ function PassKeyStep(props) {
|
|
|
6309
6370
|
className: "absolute left-0 top-0 w-5 h-5",
|
|
6310
6371
|
onClick: () => setStep("signin"),
|
|
6311
6372
|
children: [
|
|
6312
|
-
/* @__PURE__ */
|
|
6313
|
-
/* @__PURE__ */
|
|
6373
|
+
/* @__PURE__ */ jsx21(ArrowLeft3, { className: "h-4 w-4" }),
|
|
6374
|
+
/* @__PURE__ */ jsx21("span", { className: "sr-only", children: "Back to SignIn" })
|
|
6314
6375
|
]
|
|
6315
6376
|
}
|
|
6316
6377
|
)
|
|
6317
6378
|
] }),
|
|
6318
6379
|
/* @__PURE__ */ jsxs16(Button, { variant: "default", size: "large", className: "w-full", onClick: onPasskeyAuth, disabled: isLoading, children: [
|
|
6319
|
-
/* @__PURE__ */
|
|
6380
|
+
/* @__PURE__ */ jsx21(Key3, { className: "w-4 h-4" }),
|
|
6320
6381
|
"Sign in with existing Passkey"
|
|
6321
6382
|
] }),
|
|
6322
6383
|
config.passkey.showCreateButton && /* @__PURE__ */ jsxs16(Fragment2, { children: [
|
|
6323
|
-
/* @__PURE__ */
|
|
6384
|
+
/* @__PURE__ */ jsx21("span", { className: "block w-full text-center text-sm text-[var(--l-pass-fg-muted)]", children: "Don't have a passkey?" }),
|
|
6324
6385
|
/* @__PURE__ */ jsxs16(Button, { variant: "outline", size: "large", className: "w-full", onClick: onPasskeyRegister, disabled: isLoading, children: [
|
|
6325
|
-
/* @__PURE__ */
|
|
6386
|
+
/* @__PURE__ */ jsx21(PasskeyAddIcon, { className: "w-4 h-4" }),
|
|
6326
6387
|
"Create Passkey"
|
|
6327
6388
|
] })
|
|
6328
6389
|
] }),
|
|
6329
|
-
|
|
6330
|
-
!passkeyError && passkeyStatus !== "idle" && /* @__PURE__ */ jsx20("div", { className: "w-full p-[var(--l-pass-pd)] rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-success)]", children: /* @__PURE__ */ jsx20("span", { className: "w-full block text-sm text-[var(--l-pass-success)] break-words whitespace-pre-wrap text-center", children: passkeyStatus }) })
|
|
6390
|
+
passkeyStatus !== "idle" && /* @__PURE__ */ jsx21("div", { className: "w-full p-[var(--l-pass-pd)] rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-success)]", children: /* @__PURE__ */ jsx21("span", { className: "w-full block text-sm text-[var(--l-pass-success)] break-words whitespace-pre-wrap text-center", children: passkeyStatus }) })
|
|
6331
6391
|
] });
|
|
6332
6392
|
}
|
|
6333
6393
|
|
|
@@ -6341,40 +6401,13 @@ init_projectId();
|
|
|
6341
6401
|
import { useMutation as useMutation4 } from "@tanstack/react-query";
|
|
6342
6402
|
import { ChevronRight, Loader as Loader3, Mail as Mail3 } from "lucide-react";
|
|
6343
6403
|
import { useRef as useRef6 } from "react";
|
|
6344
|
-
|
|
6345
|
-
// src/internal/components/ui/highlight.tsx
|
|
6346
|
-
import { jsx as jsx21 } from "react/jsx-runtime";
|
|
6347
|
-
var CARD_STYLES = {
|
|
6348
|
-
info: "text-[var(--l-pass-info)] bg-[var(--l-pass-bg-info)]",
|
|
6349
|
-
success: "text-[var(--l-pass-success)] bg-[var(--l-pass-bg-success)]",
|
|
6350
|
-
warning: "text-[var(--l-pass-warning)] bg-[var(--l-pass-bg-warning)]",
|
|
6351
|
-
error: "text-[var(--l-pass-error)] bg-[var(--l-pass-bg-error)]"
|
|
6352
|
-
};
|
|
6353
|
-
function Highlight(props) {
|
|
6354
|
-
const { type = "info", children, className } = props;
|
|
6355
|
-
return /* @__PURE__ */ jsx21(
|
|
6356
|
-
"div",
|
|
6357
|
-
{
|
|
6358
|
-
className: cn(
|
|
6359
|
-
"w-full text-xs rounded-[var(--l-pass-el-bdrs)] p-[var(--l-pass-pd)]",
|
|
6360
|
-
"whitespace-pre-line",
|
|
6361
|
-
type === "error" ? "break-all" : "break-normal",
|
|
6362
|
-
CARD_STYLES[type],
|
|
6363
|
-
className
|
|
6364
|
-
),
|
|
6365
|
-
children
|
|
6366
|
-
}
|
|
6367
|
-
);
|
|
6368
|
-
}
|
|
6369
|
-
|
|
6370
|
-
// src/internal/components/AuthMenu/SignInStep/Email.tsx
|
|
6371
6404
|
import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
6372
6405
|
function Email() {
|
|
6373
6406
|
const { config, callbacks } = useLumiaPassportConfig();
|
|
6374
6407
|
const buttonRef = useRef6(null);
|
|
6375
6408
|
const isLoading = useLumiaPassportSession((st) => st.isLoading);
|
|
6376
6409
|
const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading);
|
|
6377
|
-
const { email,
|
|
6410
|
+
const { email, alert: alert2, setEmail, setExpiresIn, setStep, setAlert } = useAuthStore();
|
|
6378
6411
|
const { mutate: onSendVerificationCode } = useMutation4({
|
|
6379
6412
|
mutationFn: async (mail) => {
|
|
6380
6413
|
const isEmailValid = mail.length !== 0 && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail);
|
|
@@ -6382,7 +6415,7 @@ function Email() {
|
|
|
6382
6415
|
throw new Error("Invalid email format, please correct and try again.");
|
|
6383
6416
|
}
|
|
6384
6417
|
setIsLoading(true);
|
|
6385
|
-
|
|
6418
|
+
setAlert(null);
|
|
6386
6419
|
const apiUrl = addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`);
|
|
6387
6420
|
return await fetch(apiUrl, {
|
|
6388
6421
|
method: "POST",
|
|
@@ -6399,83 +6432,75 @@ function Email() {
|
|
|
6399
6432
|
} else {
|
|
6400
6433
|
if (response.status === 429) {
|
|
6401
6434
|
const retryAfter = data.retryAfter || 60;
|
|
6402
|
-
|
|
6435
|
+
setAlert({
|
|
6436
|
+
title: "Code already sent recently (Too Many Requests)",
|
|
6437
|
+
message: `Please wait ${retryAfter} seconds before requesting another.`
|
|
6438
|
+
});
|
|
6403
6439
|
} else if (response.status === 400) {
|
|
6404
|
-
|
|
6440
|
+
setAlert({
|
|
6441
|
+
title: "Failed to send verification code",
|
|
6442
|
+
message: data.message || "Unknown error occurred"
|
|
6443
|
+
});
|
|
6405
6444
|
} else {
|
|
6406
|
-
|
|
6445
|
+
setAlert({
|
|
6446
|
+
title: "Failed to send verification code",
|
|
6447
|
+
message: data.message || "Unknown error occurred"
|
|
6448
|
+
});
|
|
6407
6449
|
}
|
|
6408
6450
|
}
|
|
6409
6451
|
setIsLoading(false);
|
|
6410
6452
|
},
|
|
6411
6453
|
onError: (error) => {
|
|
6412
6454
|
callbacks?.onLumiaPassportError?.({ error, message: error?.message || "" });
|
|
6413
|
-
|
|
6455
|
+
setAlert({
|
|
6456
|
+
title: "Failed to send verification code",
|
|
6457
|
+
message: error?.message || "Unknown error occurred"
|
|
6458
|
+
});
|
|
6414
6459
|
setIsLoading(false);
|
|
6415
6460
|
}
|
|
6416
6461
|
});
|
|
6417
|
-
return /* @__PURE__ */
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
setEmail(e.target.value);
|
|
6442
|
-
}
|
|
6443
|
-
}
|
|
6444
|
-
),
|
|
6445
|
-
/* @__PURE__ */ jsx22(
|
|
6446
|
-
Button,
|
|
6447
|
-
{
|
|
6448
|
-
ref: buttonRef,
|
|
6449
|
-
className: "w-12 h-12 flex-none",
|
|
6450
|
-
variant: "default",
|
|
6451
|
-
size: "large",
|
|
6452
|
-
disabled: !email || isLoading,
|
|
6453
|
-
onClick: () => onSendVerificationCode(email),
|
|
6454
|
-
children: isLoading ? /* @__PURE__ */ jsx22(Loader3, { className: "w-4 h-4 animate-spin" }) : /* @__PURE__ */ jsx22(ChevronRight, { className: "w-4 h-4" })
|
|
6462
|
+
return /* @__PURE__ */ jsx22("div", { className: "w-full flex flex-col gap-[var(--l-pass-gap)]", children: /* @__PURE__ */ jsxs17(
|
|
6463
|
+
"div",
|
|
6464
|
+
{
|
|
6465
|
+
className: "w-full flex gap-[10px] items-center",
|
|
6466
|
+
onKeyDown: (e) => {
|
|
6467
|
+
if (e.key === "Enter" && !isLoading && email) {
|
|
6468
|
+
buttonRef.current?.click();
|
|
6469
|
+
}
|
|
6470
|
+
},
|
|
6471
|
+
children: [
|
|
6472
|
+
/* @__PURE__ */ jsx22(
|
|
6473
|
+
Input,
|
|
6474
|
+
{
|
|
6475
|
+
name: "signin-email",
|
|
6476
|
+
Icon: Mail3,
|
|
6477
|
+
type: "email",
|
|
6478
|
+
autoComplete: "off",
|
|
6479
|
+
placeholder: config.current?.email?.placeholder || "Enter your email",
|
|
6480
|
+
value: email,
|
|
6481
|
+
disabled: isLoading,
|
|
6482
|
+
className: "flex-1 w-full",
|
|
6483
|
+
onChange: (e) => {
|
|
6484
|
+
if (alert2) setAlert(null);
|
|
6485
|
+
setEmail(e.target.value);
|
|
6455
6486
|
}
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6465
|
-
|
|
6466
|
-
|
|
6467
|
-
|
|
6468
|
-
|
|
6469
|
-
|
|
6470
|
-
|
|
6471
|
-
|
|
6472
|
-
|
|
6473
|
-
/* @__PURE__ */ jsx23(AlertTriangle2, { className: "w-5 h-5 text-[var(--l-pass-error)]" }),
|
|
6474
|
-
/* @__PURE__ */ jsxs18("div", { className: "w-full flex-1", children: [
|
|
6475
|
-
/* @__PURE__ */ jsx23("span", { className: "block w-full font-bold", children: title }),
|
|
6476
|
-
/* @__PURE__ */ jsx23("span", { className: "block w-full whitespace-pre-line", children: message })
|
|
6477
|
-
] })
|
|
6478
|
-
] });
|
|
6487
|
+
}
|
|
6488
|
+
),
|
|
6489
|
+
/* @__PURE__ */ jsx22(
|
|
6490
|
+
Button,
|
|
6491
|
+
{
|
|
6492
|
+
ref: buttonRef,
|
|
6493
|
+
className: "w-12 h-12 flex-none",
|
|
6494
|
+
variant: "default",
|
|
6495
|
+
size: "large",
|
|
6496
|
+
disabled: !email || isLoading,
|
|
6497
|
+
onClick: () => onSendVerificationCode(email),
|
|
6498
|
+
children: isLoading ? /* @__PURE__ */ jsx22(Loader3, { className: "w-4 h-4 animate-spin" }) : /* @__PURE__ */ jsx22(ChevronRight, { className: "w-4 h-4" })
|
|
6499
|
+
}
|
|
6500
|
+
)
|
|
6501
|
+
]
|
|
6502
|
+
}
|
|
6503
|
+
) });
|
|
6479
6504
|
}
|
|
6480
6505
|
|
|
6481
6506
|
// src/internal/components/AuthMenu/SignInStep/Social.tsx
|
|
@@ -6484,28 +6509,26 @@ init_lumiaPassport();
|
|
|
6484
6509
|
init_auth();
|
|
6485
6510
|
init_projectId();
|
|
6486
6511
|
import { Key as Key4 } from "lucide-react";
|
|
6487
|
-
import { useCallback as
|
|
6512
|
+
import { useCallback as useCallback6 } from "react";
|
|
6488
6513
|
|
|
6489
6514
|
// src/internal/components/AuthMenu/SignInStep/utils.ts
|
|
6490
|
-
var POSSIBLE_SIGNIN_METHODS = [
|
|
6491
|
-
"email",
|
|
6492
|
-
"passkey",
|
|
6493
|
-
"social"
|
|
6494
|
-
// 'wallet'
|
|
6495
|
-
];
|
|
6515
|
+
var POSSIBLE_SIGNIN_METHODS = ["email", "passkey", "social", "wallet"];
|
|
6496
6516
|
function getSignInEnabledMethods(params) {
|
|
6497
6517
|
const { order, config, exclude } = params;
|
|
6498
6518
|
const enabled = new Array(POSSIBLE_SIGNIN_METHODS.length).fill(null);
|
|
6519
|
+
const unordered = new Array(POSSIBLE_SIGNIN_METHODS.length).fill(null);
|
|
6499
6520
|
POSSIBLE_SIGNIN_METHODS.forEach((sign) => {
|
|
6500
6521
|
const orderedIdx = order.indexOf(sign);
|
|
6501
6522
|
if (orderedIdx < 0) {
|
|
6502
|
-
|
|
6503
|
-
enabled.push(unordered);
|
|
6523
|
+
unordered.push(config[sign]?.enabled ? sign : null);
|
|
6504
6524
|
} else {
|
|
6505
6525
|
enabled[orderedIdx] = config[sign]?.enabled ? sign : null;
|
|
6506
6526
|
}
|
|
6507
6527
|
});
|
|
6508
|
-
return
|
|
6528
|
+
return [
|
|
6529
|
+
...enabled.filter(Boolean).filter((s) => !exclude.includes(s)),
|
|
6530
|
+
...unordered.filter(Boolean).filter((s) => !exclude.includes(s))
|
|
6531
|
+
];
|
|
6509
6532
|
}
|
|
6510
6533
|
async function normalizeSocialLoginResponse(rawLoginResponse, providerKey, userData) {
|
|
6511
6534
|
if (!rawLoginResponse) {
|
|
@@ -6545,7 +6568,7 @@ async function normalizeSocialLoginResponse(rawLoginResponse, providerKey, userD
|
|
|
6545
6568
|
}
|
|
6546
6569
|
|
|
6547
6570
|
// src/internal/components/AuthMenu/SignInStep/Social.tsx
|
|
6548
|
-
import { jsx as
|
|
6571
|
+
import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
6549
6572
|
var SUPPORTED_PROVIDERS = ["telegram", "x", "twitter"];
|
|
6550
6573
|
var SOCIAL_ICONS = {
|
|
6551
6574
|
google: GoogleIcon,
|
|
@@ -6653,18 +6676,8 @@ function Social(props) {
|
|
|
6653
6676
|
const { config, callbacks } = useLumiaPassportConfig();
|
|
6654
6677
|
const isLoading = useLumiaPassportSession((st) => st.isLoading);
|
|
6655
6678
|
const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading);
|
|
6656
|
-
const {
|
|
6657
|
-
|
|
6658
|
-
setStep,
|
|
6659
|
-
setEmail,
|
|
6660
|
-
setVerificationError,
|
|
6661
|
-
setFailedType,
|
|
6662
|
-
setAlert,
|
|
6663
|
-
setFailedMessage,
|
|
6664
|
-
setPasskeyError,
|
|
6665
|
-
setPasskeyStatus
|
|
6666
|
-
} = useAuthStore();
|
|
6667
|
-
const onSocialAuth = useCallback5(
|
|
6679
|
+
const { alert: alert2, setStep, setEmail, setFailedType, setAlert, setPasskeyStatus } = useAuthStore();
|
|
6680
|
+
const onSocialAuth = useCallback6(
|
|
6668
6681
|
async (providerId) => {
|
|
6669
6682
|
const normalizedProviderId = providerId.toLowerCase();
|
|
6670
6683
|
const provider = config.current?.social?.providers?.find(
|
|
@@ -6718,9 +6731,10 @@ function Social(props) {
|
|
|
6718
6731
|
loginResponse2.hasKeyshare = false;
|
|
6719
6732
|
loginResponse2.isNewUser = false;
|
|
6720
6733
|
} else {
|
|
6721
|
-
|
|
6722
|
-
"
|
|
6723
|
-
|
|
6734
|
+
setAlert({
|
|
6735
|
+
title: "Configuration Error",
|
|
6736
|
+
message: "The backend could not determine user status. This indicates that your projectId is not properly configured or the project metadata is missing.\n\nPlease contact support with your projectId to resolve this issue."
|
|
6737
|
+
});
|
|
6724
6738
|
setFailedType("config");
|
|
6725
6739
|
setStep("failed");
|
|
6726
6740
|
setIsLoading(false);
|
|
@@ -6729,9 +6743,10 @@ function Social(props) {
|
|
|
6729
6743
|
}
|
|
6730
6744
|
}
|
|
6731
6745
|
if (loginResponse2.hasKeyshare === false && loginResponse2.isNewUser === false && providerKey !== "x") {
|
|
6732
|
-
|
|
6733
|
-
"
|
|
6734
|
-
|
|
6746
|
+
setAlert({
|
|
6747
|
+
title: "Account Data Lost",
|
|
6748
|
+
message: "Your account data has been lost on the server. This should never happen and indicates a serious system failure.\n\nUnfortunately, your wallet cannot be recovered. You will need to create a new account.\n\nPlease contact support immediately with this error."
|
|
6749
|
+
});
|
|
6735
6750
|
setFailedType("critical");
|
|
6736
6751
|
setStep("failed");
|
|
6737
6752
|
setIsLoading(false);
|
|
@@ -6781,16 +6796,14 @@ function Social(props) {
|
|
|
6781
6796
|
onAuthSuccess?.();
|
|
6782
6797
|
setStep("signin");
|
|
6783
6798
|
setEmail("");
|
|
6784
|
-
|
|
6785
|
-
setPasskeyError("");
|
|
6799
|
+
setAlert(null);
|
|
6786
6800
|
setPasskeyStatus("idle");
|
|
6787
6801
|
setIsLoading(false);
|
|
6788
6802
|
} else {
|
|
6789
6803
|
onAuthSuccess?.();
|
|
6790
6804
|
setStep("signin");
|
|
6791
6805
|
setEmail("");
|
|
6792
|
-
|
|
6793
|
-
setPasskeyError("");
|
|
6806
|
+
setAlert(null);
|
|
6794
6807
|
setPasskeyStatus("idle");
|
|
6795
6808
|
setIsLoading(false);
|
|
6796
6809
|
}
|
|
@@ -6880,13 +6893,13 @@ function Social(props) {
|
|
|
6880
6893
|
);
|
|
6881
6894
|
const isPasskey = config.current?.passkey?.enabled;
|
|
6882
6895
|
const gridCols = (config.current?.social?.gridColumns || 1) + (isPasskey ? 1 : 0);
|
|
6883
|
-
return /* @__PURE__ */
|
|
6896
|
+
return /* @__PURE__ */ jsxs18(
|
|
6884
6897
|
"div",
|
|
6885
6898
|
{
|
|
6886
6899
|
className: "grid gap-[var(--l-pass-gap)]",
|
|
6887
6900
|
style: { gridTemplateColumns: `repeat(${gridCols}, minmax(0, 1fr))` },
|
|
6888
6901
|
children: [
|
|
6889
|
-
isPasskey && /* @__PURE__ */
|
|
6902
|
+
isPasskey && /* @__PURE__ */ jsx23(
|
|
6890
6903
|
Button,
|
|
6891
6904
|
{
|
|
6892
6905
|
variant: "outline",
|
|
@@ -6898,7 +6911,7 @@ function Social(props) {
|
|
|
6898
6911
|
},
|
|
6899
6912
|
disabled: isLoading,
|
|
6900
6913
|
title: "Passkey",
|
|
6901
|
-
children: /* @__PURE__ */
|
|
6914
|
+
children: /* @__PURE__ */ jsx23(Key4, { className: "w-5 h-5" })
|
|
6902
6915
|
}
|
|
6903
6916
|
),
|
|
6904
6917
|
config.current?.social?.providers.filter((provider) => provider.enabled).map((provider) => {
|
|
@@ -6906,7 +6919,7 @@ function Social(props) {
|
|
|
6906
6919
|
const isSupported = SUPPORTED_PROVIDERS.includes(providerId);
|
|
6907
6920
|
const IconComponent = config.current?.ui?.useExternalIcons ? provider.icon : SOCIAL_ICONS[providerId];
|
|
6908
6921
|
const handleClick = isSupported ? () => onSocialAuth(providerId) : () => setAlert({ title: "Coming Soon", message: `${provider.name} authentication is coming soon!` });
|
|
6909
|
-
return /* @__PURE__ */
|
|
6922
|
+
return /* @__PURE__ */ jsx23(
|
|
6910
6923
|
Button,
|
|
6911
6924
|
{
|
|
6912
6925
|
variant: "outline",
|
|
@@ -6918,7 +6931,7 @@ function Social(props) {
|
|
|
6918
6931
|
},
|
|
6919
6932
|
disabled: isLoading,
|
|
6920
6933
|
title: provider.comingSoon ? `${provider.name} (Coming Soon)` : provider.name,
|
|
6921
|
-
children: IconComponent ? /* @__PURE__ */
|
|
6934
|
+
children: IconComponent ? /* @__PURE__ */ jsx23(IconComponent, { className: "w-5 h-5" }) : /* @__PURE__ */ jsx23("span", { className: "text-lg font-bold", children: provider.name.slice(0, 1).toUpperCase() })
|
|
6922
6935
|
},
|
|
6923
6936
|
provider.id
|
|
6924
6937
|
);
|
|
@@ -6928,12 +6941,35 @@ function Social(props) {
|
|
|
6928
6941
|
);
|
|
6929
6942
|
}
|
|
6930
6943
|
|
|
6944
|
+
// src/internal/components/AuthMenu/SignInStep/Wallet.tsx
|
|
6945
|
+
import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
6946
|
+
function Wallet() {
|
|
6947
|
+
const setAlert = useAuthStore((st) => st.setAlert);
|
|
6948
|
+
const setIsWalletLinking = useLayoutDataStore((st) => st.setIsWalletLinking);
|
|
6949
|
+
const Icon = PROVIDERS_META2.wallet.icon;
|
|
6950
|
+
return /* @__PURE__ */ jsxs19(
|
|
6951
|
+
Button,
|
|
6952
|
+
{
|
|
6953
|
+
size: "large",
|
|
6954
|
+
variant: "outline",
|
|
6955
|
+
className: "w-full",
|
|
6956
|
+
onClick: () => {
|
|
6957
|
+
setAlert(null);
|
|
6958
|
+
setIsWalletLinking(true);
|
|
6959
|
+
},
|
|
6960
|
+
children: [
|
|
6961
|
+
/* @__PURE__ */ jsx24(Icon, { className: "w-5 h-5" }),
|
|
6962
|
+
"Wallet"
|
|
6963
|
+
]
|
|
6964
|
+
}
|
|
6965
|
+
);
|
|
6966
|
+
}
|
|
6967
|
+
|
|
6931
6968
|
// src/internal/components/AuthMenu/SignInStep/SignInStep.tsx
|
|
6932
6969
|
import { jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
6933
6970
|
function SignInStep(props) {
|
|
6934
6971
|
const { pendingLoginResponseRef, onAuthSuccess, checkDisplayNameRequired } = props;
|
|
6935
6972
|
const { config } = useLumiaPassportConfig();
|
|
6936
|
-
const alert2 = useAuthStore((st) => st.alert);
|
|
6937
6973
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
6938
6974
|
const enabledWoPasskey = getSignInEnabledMethods({
|
|
6939
6975
|
config: config.current,
|
|
@@ -6949,24 +6985,22 @@ function SignInStep(props) {
|
|
|
6949
6985
|
onAuthSuccess,
|
|
6950
6986
|
checkDisplayNameRequired
|
|
6951
6987
|
}
|
|
6952
|
-
)
|
|
6988
|
+
),
|
|
6989
|
+
wallet: /* @__PURE__ */ jsx25(Wallet, {})
|
|
6953
6990
|
};
|
|
6954
6991
|
return /* @__PURE__ */ jsxs20("div", { className: "w-full p-[var(--l-pass-pd)] flex flex-col gap-[var(--l-pass-gap)]", children: [
|
|
6955
6992
|
/* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-center gap-2 px-5 pt-3 pb-6", children: [
|
|
6956
6993
|
/* @__PURE__ */ jsx25(UserCircle, { className: "w-6 h-6" }),
|
|
6957
6994
|
/* @__PURE__ */ jsx25("span", { className: "font-bold text-xl leading-6", children: "Sign In" })
|
|
6958
6995
|
] }),
|
|
6959
|
-
/* @__PURE__ */
|
|
6960
|
-
|
|
6961
|
-
|
|
6962
|
-
|
|
6963
|
-
|
|
6964
|
-
|
|
6965
|
-
|
|
6966
|
-
|
|
6967
|
-
] }, `fragment-${idx}`)),
|
|
6968
|
-
!!alert2 && /* @__PURE__ */ jsx25(ErrorAlert, { title: alert2.title, message: alert2.message })
|
|
6969
|
-
] }),
|
|
6996
|
+
/* @__PURE__ */ jsx25("div", { className: "w-full flex flex-col gap-[var(--l-pass-gap)]", children: enabledWoPasskey.map((kind, idx) => /* @__PURE__ */ jsxs20(Fragment3, { children: [
|
|
6997
|
+
idx > 0 && /* @__PURE__ */ jsxs20("div", { className: "flex items-center", children: [
|
|
6998
|
+
/* @__PURE__ */ jsx25("div", { style: { borderTop: "1px solid var(--l-pass-bd)" }, className: "flex-1" }),
|
|
6999
|
+
/* @__PURE__ */ jsx25("div", { className: "flex-none px-2 text-xs leading-4", children: "Or" }),
|
|
7000
|
+
/* @__PURE__ */ jsx25("div", { style: { borderTop: "1px solid var(--l-pass-bd)" }, className: "flex-1" })
|
|
7001
|
+
] }, `auth-method-${kind}-${idx}`),
|
|
7002
|
+
signInMethods[kind]
|
|
7003
|
+
] }, `fragment-${idx}`)) }),
|
|
6970
7004
|
/* @__PURE__ */ jsxs20("div", { className: "w-full flex items-center gap-2 justify-center", children: [
|
|
6971
7005
|
/* @__PURE__ */ jsx25("span", { className: "text-[10px] font-medium", children: "By signing in, you agree to the" }),
|
|
6972
7006
|
/* @__PURE__ */ jsx25(
|
|
@@ -6986,7 +7020,7 @@ function SignInStep(props) {
|
|
|
6986
7020
|
// src/internal/components/AuthMenu/useAuthMenuHanders.ts
|
|
6987
7021
|
init_auth();
|
|
6988
7022
|
import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
|
|
6989
|
-
import { useCallback as
|
|
7023
|
+
import { useCallback as useCallback7, useRef as useRef7, useState as useState5 } from "react";
|
|
6990
7024
|
function useAuthMenuHandlers() {
|
|
6991
7025
|
const { config, callbacks } = useLumiaPassportConfig();
|
|
6992
7026
|
const qc = useQueryClient2();
|
|
@@ -6994,8 +7028,9 @@ function useAuthMenuHandlers() {
|
|
|
6994
7028
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
6995
7029
|
const [telegramCleanup, setTelegramCleanup] = useState5(null);
|
|
6996
7030
|
const { usePaymaster, setError, setStatus, setSession, setAddress, setRecoveryUserId, setHasServerVault } = useLumiaPassportSession();
|
|
6997
|
-
const
|
|
6998
|
-
const
|
|
7031
|
+
const setStep = useAuthStore((st) => st.setStep);
|
|
7032
|
+
const setAlert = useAuthStore((st) => st.setAlert);
|
|
7033
|
+
const createSessionWithKeyshare = useCallback7(
|
|
6999
7034
|
async (userId, hasServerKeyshare, isNewUser) => {
|
|
7000
7035
|
try {
|
|
7001
7036
|
try {
|
|
@@ -7029,7 +7064,7 @@ function useAuthMenuHandlers() {
|
|
|
7029
7064
|
},
|
|
7030
7065
|
[setStatus, callbacks, usePaymaster]
|
|
7031
7066
|
);
|
|
7032
|
-
const onAuthSuccess =
|
|
7067
|
+
const onAuthSuccess = useCallback7(async () => {
|
|
7033
7068
|
const loginResponse = pendingLoginResponseRef.current;
|
|
7034
7069
|
if (!loginResponse || !loginResponse.userId) {
|
|
7035
7070
|
setError("Authentication failed - no login data available");
|
|
@@ -7057,7 +7092,7 @@ function useAuthMenuHandlers() {
|
|
|
7057
7092
|
jwt?.isNewUser
|
|
7058
7093
|
);
|
|
7059
7094
|
setError(null);
|
|
7060
|
-
|
|
7095
|
+
setAlert(null);
|
|
7061
7096
|
setSession(sess);
|
|
7062
7097
|
setAddress(addr);
|
|
7063
7098
|
setStatus("ready");
|
|
@@ -7095,7 +7130,10 @@ function useAuthMenuHandlers() {
|
|
|
7095
7130
|
await jwtTokenManager2.clearTokens();
|
|
7096
7131
|
setStatus("error");
|
|
7097
7132
|
setError(error?.message || String(error));
|
|
7098
|
-
|
|
7133
|
+
setAlert({
|
|
7134
|
+
title: "Authorization cancelled",
|
|
7135
|
+
message: error?.message || String(error) || "An unknown error occurred during authentication."
|
|
7136
|
+
});
|
|
7099
7137
|
setStep("failed");
|
|
7100
7138
|
}
|
|
7101
7139
|
}
|
|
@@ -7107,12 +7145,13 @@ function useAuthMenuHandlers() {
|
|
|
7107
7145
|
setError,
|
|
7108
7146
|
setStatus,
|
|
7109
7147
|
setSession,
|
|
7148
|
+
setAlert,
|
|
7110
7149
|
setAddress,
|
|
7111
7150
|
setRecoveryUserId,
|
|
7112
7151
|
setHasServerVault,
|
|
7113
7152
|
createSessionWithKeyshare
|
|
7114
7153
|
]);
|
|
7115
|
-
const checkDisplayNameRequired =
|
|
7154
|
+
const checkDisplayNameRequired = useCallback7(async (loginResponse) => {
|
|
7116
7155
|
if (!config.current?.features?.displayNameNeeded) {
|
|
7117
7156
|
return false;
|
|
7118
7157
|
}
|
|
@@ -7136,15 +7175,14 @@ function useAuthMenuHandlers() {
|
|
|
7136
7175
|
return false;
|
|
7137
7176
|
}
|
|
7138
7177
|
}, []);
|
|
7139
|
-
const goBackToSignIn =
|
|
7178
|
+
const goBackToSignIn = useCallback7(() => {
|
|
7140
7179
|
setStep("signin");
|
|
7141
|
-
|
|
7142
|
-
setCodeSendError("");
|
|
7180
|
+
setAlert(null);
|
|
7143
7181
|
if (telegramCleanup) {
|
|
7144
7182
|
telegramCleanup();
|
|
7145
7183
|
setTelegramCleanup(null);
|
|
7146
7184
|
}
|
|
7147
|
-
}, [setStep,
|
|
7185
|
+
}, [setStep, setAlert, telegramCleanup]);
|
|
7148
7186
|
return {
|
|
7149
7187
|
pendingLoginResponseRef,
|
|
7150
7188
|
onAuthSuccess,
|
|
@@ -7153,35 +7191,6 @@ function useAuthMenuHandlers() {
|
|
|
7153
7191
|
};
|
|
7154
7192
|
}
|
|
7155
7193
|
|
|
7156
|
-
// src/internal/components/AuthMenu/useListenIframeAuthEvents.ts
|
|
7157
|
-
import { useCallback as useCallback7, useEffect as useEffect9 } from "react";
|
|
7158
|
-
function useListenIframeAuthEvents() {
|
|
7159
|
-
const setPage = useLayoutDataStore((state) => state.setPage);
|
|
7160
|
-
const setIsIframeReady = useLumiaPassportSession((state) => state.setIsIframeReady);
|
|
7161
|
-
const handleIframeMessage = useCallback7(
|
|
7162
|
-
(event) => {
|
|
7163
|
-
console.log("[AuthMenu] Received iframe message:", event.data);
|
|
7164
|
-
if (event.data?.type === "LUMIA_PASSPORT_IFRAME_READY") {
|
|
7165
|
-
console.log("[AuthMenu] Iframe is ready");
|
|
7166
|
-
setIsIframeReady(true);
|
|
7167
|
-
} else if (event.data?.type === "LUMIA_PASSPORT_SHOW_IFRAME") {
|
|
7168
|
-
console.log("[AuthMenu] Consent screen shown - hiding auth modal");
|
|
7169
|
-
setPage(null);
|
|
7170
|
-
} else if (event.data?.type === "LUMIA_PASSPORT_HIDE_IFRAME") {
|
|
7171
|
-
console.log("[AuthMenu] Consent screen hidden");
|
|
7172
|
-
} else if (event.data?.type === "KEYSHARE_RECOVERY_NEEDED") {
|
|
7173
|
-
console.log("[AuthMenu] recovery neede");
|
|
7174
|
-
setPage("keyshare-restore" /* KEYSHARE_RESTORE */);
|
|
7175
|
-
}
|
|
7176
|
-
},
|
|
7177
|
-
[setPage, setIsIframeReady]
|
|
7178
|
-
);
|
|
7179
|
-
useEffect9(() => {
|
|
7180
|
-
window.addEventListener("message", handleIframeMessage);
|
|
7181
|
-
return () => window.removeEventListener("message", handleIframeMessage);
|
|
7182
|
-
}, [handleIframeMessage]);
|
|
7183
|
-
}
|
|
7184
|
-
|
|
7185
7194
|
// src/internal/components/AuthMenu/VerifyStep/VerifyStep.tsx
|
|
7186
7195
|
init_lumiaPassport();
|
|
7187
7196
|
import { useMutation as useMutation5 } from "@tanstack/react-query";
|
|
@@ -7208,8 +7217,8 @@ init_projectId();
|
|
|
7208
7217
|
import { useEffect as useEffect10, useRef as useRef8, useState as useState6 } from "react";
|
|
7209
7218
|
import { jsx as jsx27, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
7210
7219
|
var VerificationCodeInput = (props) => {
|
|
7211
|
-
const { onVerifyCode, onResendCode, isLoading, expiresIn
|
|
7212
|
-
const
|
|
7220
|
+
const { onVerifyCode, onResendCode, isLoading, expiresIn } = props;
|
|
7221
|
+
const setAlert = useAuthStore((st) => st.setAlert);
|
|
7213
7222
|
const [timeLeft, setTimeLeft] = useState6(expiresIn);
|
|
7214
7223
|
useEffect10(() => setTimeLeft(expiresIn), [expiresIn]);
|
|
7215
7224
|
useEffect10(() => {
|
|
@@ -7305,7 +7314,6 @@ var VerificationCodeInput = (props) => {
|
|
|
7305
7314
|
},
|
|
7306
7315
|
i
|
|
7307
7316
|
)) }),
|
|
7308
|
-
error && /* @__PURE__ */ jsx27("div", { className: "w-full bg-[var(--l-pass-bg-error)] p-[var(--l-pass-pd)] rounded-[var(--l-pass-el-bdrs)]", children: /* @__PURE__ */ jsx27("span", { className: "w-full block text-sm text-[var(--l-pass-error)] break-words whitespace-pre-wrap text-center", children: error }) }),
|
|
7309
7317
|
/* @__PURE__ */ jsxs21("div", { className: "text-xs", children: [
|
|
7310
7318
|
"Code expires in ",
|
|
7311
7319
|
mm,
|
|
@@ -7323,8 +7331,8 @@ var VerificationCodeInput = (props) => {
|
|
|
7323
7331
|
className: "text-xs h-fit px-0 leading-4 text-[var(--l-pass-fg-muted)] underline underline-offset-4",
|
|
7324
7332
|
onClick: () => {
|
|
7325
7333
|
if (!timeLeft) return onResendCode();
|
|
7326
|
-
|
|
7327
|
-
setTimeout(() =>
|
|
7334
|
+
setAlert({ title: "Please wait", message: "Please wait until the current code expires to resend." });
|
|
7335
|
+
setTimeout(() => setAlert(null), 3e3);
|
|
7328
7336
|
},
|
|
7329
7337
|
children: "Resend"
|
|
7330
7338
|
}
|
|
@@ -7345,18 +7353,16 @@ function VerifyStep(props) {
|
|
|
7345
7353
|
const {
|
|
7346
7354
|
email,
|
|
7347
7355
|
expiresIn,
|
|
7348
|
-
verificationError,
|
|
7349
|
-
setVerificationError,
|
|
7350
|
-
setFailedMessage,
|
|
7351
7356
|
setFailedType,
|
|
7352
7357
|
setStep,
|
|
7353
7358
|
setEmail,
|
|
7354
|
-
setExpiresIn
|
|
7359
|
+
setExpiresIn,
|
|
7360
|
+
setAlert
|
|
7355
7361
|
} = useAuthStore();
|
|
7356
7362
|
const { mutate: onVerifyCode, isPending: isCodeVerifying } = useMutation5({
|
|
7357
7363
|
mutationFn: async (code) => {
|
|
7358
7364
|
setIsLoading(true);
|
|
7359
|
-
|
|
7365
|
+
setAlert(null);
|
|
7360
7366
|
const { loginWithEmail: loginWithEmail2 } = await Promise.resolve().then(() => (init_auth(), auth_exports));
|
|
7361
7367
|
const loginResponse = await loginWithEmail2(email, code, { skipTokenSave: true });
|
|
7362
7368
|
pendingLoginResponseRef.current = loginResponse;
|
|
@@ -7364,9 +7370,10 @@ function VerifyStep(props) {
|
|
|
7364
7370
|
},
|
|
7365
7371
|
onSuccess: async (loginResponse) => {
|
|
7366
7372
|
if (!loginResponse.hasKeyshare && loginResponse.isNewUser === void 0) {
|
|
7367
|
-
|
|
7368
|
-
"
|
|
7369
|
-
|
|
7373
|
+
setAlert({
|
|
7374
|
+
title: "Configuration Error",
|
|
7375
|
+
message: "The backend could not determine user status. This indicates that your projectId is not properly configured or the project metadata is missing.\n\nPlease contact support with your projectId to resolve this issue."
|
|
7376
|
+
});
|
|
7370
7377
|
setFailedType("config");
|
|
7371
7378
|
setStep("failed");
|
|
7372
7379
|
pendingLoginResponseRef.current = null;
|
|
@@ -7374,9 +7381,10 @@ function VerifyStep(props) {
|
|
|
7374
7381
|
return;
|
|
7375
7382
|
}
|
|
7376
7383
|
if (!loginResponse.hasKeyshare && loginResponse.isNewUser === false) {
|
|
7377
|
-
|
|
7378
|
-
"
|
|
7379
|
-
|
|
7384
|
+
setAlert({
|
|
7385
|
+
title: "Account Data Lost",
|
|
7386
|
+
message: "Your account data has been lost on the server. This should never happen and indicates a serious system failure.\n\nUnfortunately, your wallet cannot be recovered. You will need to create a new account.\n\nPlease contact support immediately with this error."
|
|
7387
|
+
});
|
|
7380
7388
|
setFailedType("critical");
|
|
7381
7389
|
setStep("failed");
|
|
7382
7390
|
pendingLoginResponseRef.current = null;
|
|
@@ -7402,7 +7410,7 @@ function VerifyStep(props) {
|
|
|
7402
7410
|
if (!recoveryUserId && !needsRecovery) {
|
|
7403
7411
|
setStep("signin");
|
|
7404
7412
|
setEmail("");
|
|
7405
|
-
|
|
7413
|
+
setAlert(null);
|
|
7406
7414
|
setPage(null);
|
|
7407
7415
|
}
|
|
7408
7416
|
setIsLoading(false);
|
|
@@ -7418,7 +7426,10 @@ function VerifyStep(props) {
|
|
|
7418
7426
|
} else {
|
|
7419
7427
|
errorMessage = error.message || "Verification failed. Please try again.";
|
|
7420
7428
|
}
|
|
7421
|
-
|
|
7429
|
+
setAlert({
|
|
7430
|
+
title: "Verification failed",
|
|
7431
|
+
message: errorMessage
|
|
7432
|
+
});
|
|
7422
7433
|
callbacks?.onLumiaPassportError?.({
|
|
7423
7434
|
error: error instanceof Error ? error : new Error(errorMessage),
|
|
7424
7435
|
message: errorMessage
|
|
@@ -7428,7 +7439,7 @@ function VerifyStep(props) {
|
|
|
7428
7439
|
});
|
|
7429
7440
|
const { mutate: onResendCode, isPending: isCodeResending } = useMutation5({
|
|
7430
7441
|
mutationFn: async () => {
|
|
7431
|
-
|
|
7442
|
+
setAlert(null);
|
|
7432
7443
|
setIsLoading(true);
|
|
7433
7444
|
const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {
|
|
7434
7445
|
method: "POST",
|
|
@@ -7444,17 +7455,24 @@ function VerifyStep(props) {
|
|
|
7444
7455
|
setExpiresIn(data.expiresIn || 300);
|
|
7445
7456
|
}
|
|
7446
7457
|
if (!response.ok && response.status === 429) {
|
|
7447
|
-
|
|
7448
|
-
|
|
7449
|
-
|
|
7458
|
+
setAlert({
|
|
7459
|
+
title: "Code already sent recently (Too Many Requests)",
|
|
7460
|
+
message: `Please wait ${data.retryAfter || 60} seconds before requesting another.`
|
|
7461
|
+
});
|
|
7450
7462
|
}
|
|
7451
7463
|
if (!response.ok && response.status !== 429) {
|
|
7452
|
-
|
|
7464
|
+
setAlert({
|
|
7465
|
+
title: "Failed to resend verification code",
|
|
7466
|
+
message: data.message || "Unknown error occurred"
|
|
7467
|
+
});
|
|
7453
7468
|
}
|
|
7454
7469
|
setIsLoading(false);
|
|
7455
7470
|
},
|
|
7456
7471
|
onError: (err) => {
|
|
7457
|
-
|
|
7472
|
+
setAlert({
|
|
7473
|
+
title: "Failed to resend verification code",
|
|
7474
|
+
message: err.message || "Unknown error occurred"
|
|
7475
|
+
});
|
|
7458
7476
|
setIsLoading(false);
|
|
7459
7477
|
}
|
|
7460
7478
|
});
|
|
@@ -7491,8 +7509,7 @@ function VerifyStep(props) {
|
|
|
7491
7509
|
onVerifyCode,
|
|
7492
7510
|
onResendCode,
|
|
7493
7511
|
isLoading,
|
|
7494
|
-
expiresIn
|
|
7495
|
-
error: verificationError
|
|
7512
|
+
expiresIn
|
|
7496
7513
|
}
|
|
7497
7514
|
)
|
|
7498
7515
|
] });
|
|
@@ -7502,31 +7519,17 @@ function VerifyStep(props) {
|
|
|
7502
7519
|
import { jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
7503
7520
|
var AuthMenu = () => {
|
|
7504
7521
|
const isIframeReady = useLumiaPassportSession((st) => st.isIframeReady);
|
|
7505
|
-
const page = useLayoutDataStore((st) => st.page);
|
|
7506
7522
|
const setMainPageHeight = useLayoutDataStore((st) => st.setMainPageHeight);
|
|
7507
|
-
|
|
7508
|
-
|
|
7509
|
-
step,
|
|
7510
|
-
setStep,
|
|
7511
|
-
setPasskeyError,
|
|
7512
|
-
setPasskeyStatus,
|
|
7513
|
-
setEmail,
|
|
7514
|
-
setVerificationError,
|
|
7515
|
-
setFailedMessage,
|
|
7516
|
-
setCodeSendError
|
|
7517
|
-
} = useAuthStore();
|
|
7523
|
+
const { step, alert: alert2, setStep, setPasskeyStatus, setEmail, setAlert } = useAuthStore();
|
|
7524
|
+
useEffect11(() => setMainPageHeight(DEFAULT_AUTH_MENU_HEIGHT), []);
|
|
7518
7525
|
useEffect11(() => {
|
|
7519
|
-
|
|
7526
|
+
return () => {
|
|
7520
7527
|
setStep("signin");
|
|
7521
7528
|
setEmail("");
|
|
7522
|
-
setVerificationError("");
|
|
7523
|
-
setCodeSendError("");
|
|
7524
|
-
setPasskeyError("");
|
|
7525
7529
|
setPasskeyStatus("idle");
|
|
7526
|
-
|
|
7527
|
-
}
|
|
7528
|
-
}, [
|
|
7529
|
-
useListenIframeAuthEvents();
|
|
7530
|
+
setAlert(null);
|
|
7531
|
+
};
|
|
7532
|
+
}, []);
|
|
7530
7533
|
const { pendingLoginResponseRef, onAuthSuccess, goBackToSignIn, checkDisplayNameRequired } = useAuthMenuHandlers();
|
|
7531
7534
|
if (!isIframeReady) {
|
|
7532
7535
|
return /* @__PURE__ */ jsxs23("div", { className: "w-full p-8 flex flex-col justify-center items-center gap-[var(--l-pass-gap)]", children: [
|
|
@@ -7566,28 +7569,35 @@ var AuthMenu = () => {
|
|
|
7566
7569
|
}),
|
|
7567
7570
|
[onAuthSuccess, goBackToSignIn, checkDisplayNameRequired]
|
|
7568
7571
|
);
|
|
7569
|
-
return (
|
|
7570
|
-
|
|
7571
|
-
|
|
7572
|
-
|
|
7573
|
-
{
|
|
7574
|
-
|
|
7575
|
-
|
|
7576
|
-
|
|
7577
|
-
|
|
7578
|
-
|
|
7579
|
-
|
|
7580
|
-
|
|
7581
|
-
|
|
7582
|
-
|
|
7583
|
-
|
|
7584
|
-
}
|
|
7585
|
-
|
|
7586
|
-
|
|
7587
|
-
|
|
7588
|
-
|
|
7589
|
-
|
|
7590
|
-
|
|
7572
|
+
return /* @__PURE__ */ jsx29("div", { className: "w-full", children: /* @__PURE__ */ jsx29(AnimatePresence, { mode: "wait", initial: false, children: /* @__PURE__ */ jsxs23(
|
|
7573
|
+
motion.div,
|
|
7574
|
+
{
|
|
7575
|
+
initial: { opacity: 0, height: DEFAULT_AUTH_MENU_HEIGHT },
|
|
7576
|
+
animate: { opacity: 1, height: "auto" },
|
|
7577
|
+
exit: { opacity: 0, height: DEFAULT_AUTH_MENU_HEIGHT },
|
|
7578
|
+
style: { overflow: "hidden" },
|
|
7579
|
+
transition: Y_ANIMATION_SETUP,
|
|
7580
|
+
children: [
|
|
7581
|
+
stepContent[step],
|
|
7582
|
+
!!alert2 && // <Expandable isExpanded contentClassName="px-[var(--l-pass-pd)]">
|
|
7583
|
+
/* @__PURE__ */ jsxs23(Highlight, { type: "error", className: "w-full flex gap-[var(--l-pass-gap)]", children: [
|
|
7584
|
+
/* @__PURE__ */ jsx29(AlertTriangle2, { className: "w-5 h-5 text-[var(--l-pass-error)]" }),
|
|
7585
|
+
/* @__PURE__ */ jsxs23("span", { className: "block w-full flex flex-col gap-1 flex-1", children: [
|
|
7586
|
+
/* @__PURE__ */ jsx29("span", { className: "block font-bold leading-5", children: alert2.title }),
|
|
7587
|
+
/* @__PURE__ */ jsx29("span", { className: "block whitespace-pre-line", children: alert2.message })
|
|
7588
|
+
] })
|
|
7589
|
+
] })
|
|
7590
|
+
]
|
|
7591
|
+
},
|
|
7592
|
+
step
|
|
7593
|
+
) }) });
|
|
7594
|
+
};
|
|
7595
|
+
|
|
7596
|
+
// src/internal/components/BuyMenu/ByuMenu.tsx
|
|
7597
|
+
import { ArrowLeft as ArrowLeft5 } from "lucide-react";
|
|
7598
|
+
|
|
7599
|
+
// src/internal/components/BuyMenu/assets/BinanceIcon.tsx
|
|
7600
|
+
import { jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
7591
7601
|
function BinanceIcon() {
|
|
7592
7602
|
return /* @__PURE__ */ jsxs24("svg", { width: "107", height: "23", viewBox: "0 0 107 23", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
7593
7603
|
/* @__PURE__ */ jsx30(
|
|
@@ -9431,29 +9441,21 @@ import { ChevronRight as ChevronRight3, Loader as Loader12, Mail as Mail4 } from
|
|
|
9431
9441
|
// src/internal/components/ManageWalletMenu/hooks/useStore.ts
|
|
9432
9442
|
import { create as create5 } from "zustand";
|
|
9433
9443
|
var useManageWalletStore = create5((set) => ({
|
|
9444
|
+
alert: null,
|
|
9434
9445
|
emailStep: "input",
|
|
9435
9446
|
email: "",
|
|
9436
9447
|
emailCode: "",
|
|
9437
|
-
emailCodeSentError: "",
|
|
9438
9448
|
emailCodeExpiresIn: 0,
|
|
9439
|
-
isWalletLinking: false,
|
|
9440
9449
|
linkIsLoading: false,
|
|
9441
|
-
linkError: "",
|
|
9442
|
-
verificationError: "",
|
|
9443
9450
|
providerType: null,
|
|
9444
9451
|
confirmUnlink: null,
|
|
9452
|
+
setAlert: (alert2) => set({ alert: alert2 }),
|
|
9445
9453
|
setEmailStep: (emailStep) => set({ emailStep }),
|
|
9446
9454
|
setEmail: (email) => set({ email }),
|
|
9447
9455
|
setEmailCode: (emailCode) => set({ emailCode }),
|
|
9448
|
-
setEmailCodeSentError: (emailCodeSentError) => set({ emailCodeSentError }),
|
|
9449
9456
|
setEmailCodeExpiresIn: (emailCodeExpiresIn) => set({ emailCodeExpiresIn }),
|
|
9450
|
-
setIsWalletLinking: (isWalletLinking) => set({ isWalletLinking }),
|
|
9451
9457
|
setLinkIsLoading: (linkIsLoading) => set({ linkIsLoading }),
|
|
9452
|
-
|
|
9453
|
-
setVerificationError: (verificationError) => set({ verificationError }),
|
|
9454
|
-
setProviderType: (providerType) => {
|
|
9455
|
-
set({ providerType });
|
|
9456
|
-
},
|
|
9458
|
+
setProviderType: (providerType) => set({ providerType }),
|
|
9457
9459
|
setConfirmUnlink: (confirmUnlink) => set({ confirmUnlink })
|
|
9458
9460
|
}));
|
|
9459
9461
|
|
|
@@ -9466,12 +9468,12 @@ function EmailForm() {
|
|
|
9466
9468
|
} = useLumiaPassportConfig();
|
|
9467
9469
|
const isLoading = useLumiaPassportSession((st) => st.isLoading);
|
|
9468
9470
|
const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading);
|
|
9469
|
-
const { email, setEmail,
|
|
9471
|
+
const { email, setEmail, setAlert, setEmailCodeExpiresIn, setEmailStep } = useManageWalletStore();
|
|
9470
9472
|
const { mutate: onSendVerificationCode } = useMutation11({
|
|
9471
9473
|
mutationFn: async () => {
|
|
9472
9474
|
if (!email) return;
|
|
9473
9475
|
setIsLoading(true);
|
|
9474
|
-
|
|
9476
|
+
setAlert(null);
|
|
9475
9477
|
try {
|
|
9476
9478
|
const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {
|
|
9477
9479
|
method: "POST",
|
|
@@ -9491,18 +9493,28 @@ function EmailForm() {
|
|
|
9491
9493
|
} else {
|
|
9492
9494
|
if (response.status === 429) {
|
|
9493
9495
|
const retryAfter = data.retryAfter || 60;
|
|
9494
|
-
|
|
9495
|
-
|
|
9496
|
-
|
|
9496
|
+
setAlert({
|
|
9497
|
+
title: "Too Many Requests",
|
|
9498
|
+
message: `Code already sent recently. Please wait ${retryAfter} seconds before requesting another.`
|
|
9499
|
+
});
|
|
9497
9500
|
} else if (response.status === 400) {
|
|
9498
|
-
|
|
9501
|
+
setAlert({
|
|
9502
|
+
title: "Invalid Email",
|
|
9503
|
+
message: data.message || "Invalid email address"
|
|
9504
|
+
});
|
|
9499
9505
|
} else {
|
|
9500
|
-
|
|
9506
|
+
setAlert({
|
|
9507
|
+
title: "Error",
|
|
9508
|
+
message: data.message || "Failed to send verification code"
|
|
9509
|
+
});
|
|
9501
9510
|
}
|
|
9502
9511
|
}
|
|
9503
9512
|
} catch (error) {
|
|
9504
9513
|
const errorMessage = "Network error. Please check your connection.";
|
|
9505
|
-
|
|
9514
|
+
setAlert({
|
|
9515
|
+
title: "Network Error",
|
|
9516
|
+
message: errorMessage
|
|
9517
|
+
});
|
|
9506
9518
|
try {
|
|
9507
9519
|
callbacks?.onLumiaPassportError?.({
|
|
9508
9520
|
error: error instanceof Error ? error : new Error(errorMessage),
|
|
@@ -9547,19 +9559,21 @@ function EmailForm() {
|
|
|
9547
9559
|
init_email();
|
|
9548
9560
|
import { useMutation as useMutation12 } from "@tanstack/react-query";
|
|
9549
9561
|
function useSendVerificationCode() {
|
|
9550
|
-
const
|
|
9562
|
+
const setAlert = useManageWalletStore((st) => st.setAlert);
|
|
9563
|
+
const setLinkIsLoading = useManageWalletStore((st) => st.setLinkIsLoading);
|
|
9564
|
+
const setEmailCodeExpiresIn = useManageWalletStore((st) => st.setEmailCodeExpiresIn);
|
|
9551
9565
|
return useMutation12({
|
|
9552
9566
|
mutationFn: async (email) => {
|
|
9553
9567
|
if (!email) {
|
|
9554
9568
|
throw new Error("Email is required");
|
|
9555
9569
|
}
|
|
9556
|
-
|
|
9570
|
+
setAlert(null);
|
|
9557
9571
|
setLinkIsLoading(true);
|
|
9558
9572
|
await sendEmailLinkCode(email);
|
|
9559
9573
|
},
|
|
9560
9574
|
onError: (error) => {
|
|
9561
9575
|
console.error("Failed to send verification code", error.message);
|
|
9562
|
-
|
|
9576
|
+
setAlert({ title: "Error", message: error?.message || "Failed to send verification code" });
|
|
9563
9577
|
setLinkIsLoading(false);
|
|
9564
9578
|
},
|
|
9565
9579
|
onSuccess: () => {
|
|
@@ -9578,28 +9592,17 @@ function useVerifyCode() {
|
|
|
9578
9592
|
const qc = useQueryClient10();
|
|
9579
9593
|
const address = useLumiaPassportSession((st) => st.address);
|
|
9580
9594
|
const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading);
|
|
9581
|
-
const {
|
|
9582
|
-
email,
|
|
9583
|
-
emailCode,
|
|
9584
|
-
setEmail,
|
|
9585
|
-
setEmailStep,
|
|
9586
|
-
setEmailCode,
|
|
9587
|
-
setProviderType,
|
|
9588
|
-
setLinkIsLoading,
|
|
9589
|
-
setVerificationError,
|
|
9590
|
-
setEmailCodeSentError
|
|
9591
|
-
} = useManageWalletStore();
|
|
9595
|
+
const { email, emailCode, setEmail, setEmailStep, setEmailCode, setProviderType, setLinkIsLoading, setAlert } = useManageWalletStore();
|
|
9592
9596
|
return useMutation13({
|
|
9593
9597
|
mutationFn: async (codeToVerify) => {
|
|
9594
9598
|
const code = codeToVerify ?? emailCode;
|
|
9595
9599
|
if (!code) {
|
|
9596
|
-
|
|
9600
|
+
setAlert({ title: "Error", message: "Please enter the verification code" });
|
|
9597
9601
|
return;
|
|
9598
9602
|
}
|
|
9599
9603
|
setIsLoading(true);
|
|
9600
9604
|
setLinkIsLoading(true);
|
|
9601
|
-
|
|
9602
|
-
setEmailCodeSentError("");
|
|
9605
|
+
setAlert(null);
|
|
9603
9606
|
return await verifyEmailLinkCode(email, code);
|
|
9604
9607
|
},
|
|
9605
9608
|
onSuccess: async () => {
|
|
@@ -9608,8 +9611,7 @@ function useVerifyCode() {
|
|
|
9608
9611
|
setProviderType(null);
|
|
9609
9612
|
setEmail("");
|
|
9610
9613
|
setEmailCode("");
|
|
9611
|
-
|
|
9612
|
-
setEmailCodeSentError("");
|
|
9614
|
+
setAlert(null);
|
|
9613
9615
|
setEmailStep("input");
|
|
9614
9616
|
try {
|
|
9615
9617
|
callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, address]) });
|
|
@@ -9619,7 +9621,7 @@ function useVerifyCode() {
|
|
|
9619
9621
|
setLinkIsLoading(false);
|
|
9620
9622
|
},
|
|
9621
9623
|
onError: (error) => {
|
|
9622
|
-
|
|
9624
|
+
setAlert({ title: "Error", message: error?.message || "Failed to verify and link email" });
|
|
9623
9625
|
setIsLoading(false);
|
|
9624
9626
|
setLinkIsLoading(false);
|
|
9625
9627
|
}
|
|
@@ -9640,7 +9642,7 @@ function normalizePasskeyLinkError(msg) {
|
|
|
9640
9642
|
}
|
|
9641
9643
|
function AddProvider() {
|
|
9642
9644
|
const qc = useQueryClient11();
|
|
9643
|
-
const
|
|
9645
|
+
const callbacks = useLumiaPassportConfig().callbacks;
|
|
9644
9646
|
const address = useLumiaPassportSession((st) => st.address);
|
|
9645
9647
|
const {
|
|
9646
9648
|
linkIsLoading,
|
|
@@ -9648,8 +9650,8 @@ function AddProvider() {
|
|
|
9648
9650
|
email,
|
|
9649
9651
|
emailStep,
|
|
9650
9652
|
emailCodeExpiresIn,
|
|
9653
|
+
setAlert,
|
|
9651
9654
|
setProviderType,
|
|
9652
|
-
setLinkError,
|
|
9653
9655
|
setLinkIsLoading
|
|
9654
9656
|
} = useManageWalletStore();
|
|
9655
9657
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
@@ -9689,7 +9691,7 @@ function AddProvider() {
|
|
|
9689
9691
|
size: "medium",
|
|
9690
9692
|
disabled: isLoading,
|
|
9691
9693
|
onClick: async () => {
|
|
9692
|
-
|
|
9694
|
+
setAlert(null);
|
|
9693
9695
|
setLinkIsLoading(true);
|
|
9694
9696
|
try {
|
|
9695
9697
|
await linkPasskeyWithWebAuthn({
|
|
@@ -9711,7 +9713,7 @@ function AddProvider() {
|
|
|
9711
9713
|
setProviderType(null);
|
|
9712
9714
|
} catch (e) {
|
|
9713
9715
|
const msg = e?.message || "Failed to link passkey";
|
|
9714
|
-
|
|
9716
|
+
setAlert({ title: "Error", message: normalizePasskeyLinkError(msg) });
|
|
9715
9717
|
} finally {
|
|
9716
9718
|
setLinkIsLoading(false);
|
|
9717
9719
|
}
|
|
@@ -9730,7 +9732,7 @@ function AddProvider() {
|
|
|
9730
9732
|
size: "medium",
|
|
9731
9733
|
disabled: isLoading,
|
|
9732
9734
|
onClick: async () => {
|
|
9733
|
-
|
|
9735
|
+
setAlert(null);
|
|
9734
9736
|
setLinkIsLoading(true);
|
|
9735
9737
|
try {
|
|
9736
9738
|
await linkPasskeyWithWebAuthn({
|
|
@@ -9752,7 +9754,7 @@ function AddProvider() {
|
|
|
9752
9754
|
setProviderType(null);
|
|
9753
9755
|
} catch (e) {
|
|
9754
9756
|
const msg = e?.message || "Failed to link passkey";
|
|
9755
|
-
|
|
9757
|
+
setAlert({ title: "Error", message: normalizePasskeyLinkError(msg) });
|
|
9756
9758
|
} finally {
|
|
9757
9759
|
setLinkIsLoading(false);
|
|
9758
9760
|
}
|
|
@@ -9810,14 +9812,15 @@ function useLinkSocial() {
|
|
|
9810
9812
|
callbacks
|
|
9811
9813
|
} = useLumiaPassportConfig();
|
|
9812
9814
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
9813
|
-
const
|
|
9815
|
+
const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking);
|
|
9816
|
+
const { providerType, linkIsLoading, setProviderType, setAlert, setLinkIsLoading } = useManageWalletStore();
|
|
9814
9817
|
const handleLinkSocialProvider = React7.useCallback(
|
|
9815
9818
|
async (providerIdRaw) => {
|
|
9816
9819
|
const providerKey = providerIdRaw.toLowerCase();
|
|
9817
9820
|
const normalizedKey = providerKey === "twitter" ? "x" : providerKey;
|
|
9818
9821
|
try {
|
|
9819
9822
|
setLinkIsLoading(true);
|
|
9820
|
-
|
|
9823
|
+
setAlert(null);
|
|
9821
9824
|
const socialProvider = config.social?.providers?.find(
|
|
9822
9825
|
(p) => (p.id || "").toLowerCase() === normalizedKey && p.enabled
|
|
9823
9826
|
);
|
|
@@ -9855,7 +9858,7 @@ function useLinkSocial() {
|
|
|
9855
9858
|
} catch (e) {
|
|
9856
9859
|
console.error(`[ManageWallet] Failed to link ${providerIdRaw}:`, e);
|
|
9857
9860
|
const message = e?.message || `Failed to link ${providerIdRaw}`;
|
|
9858
|
-
|
|
9861
|
+
setAlert({ title: "Error", message });
|
|
9859
9862
|
setProviderType(null);
|
|
9860
9863
|
} finally {
|
|
9861
9864
|
setLinkIsLoading(false);
|
|
@@ -9884,9 +9887,9 @@ function useLinkSocial() {
|
|
|
9884
9887
|
}
|
|
9885
9888
|
|
|
9886
9889
|
// src/internal/components/ManageWalletMenu/hooks/useLinkTelegram.ts
|
|
9890
|
+
init_telegram2();
|
|
9887
9891
|
import { useQueryClient as useQueryClient13 } from "@tanstack/react-query";
|
|
9888
9892
|
import { useCallback as useCallback11, useEffect as useEffect23, useState as useState8 } from "react";
|
|
9889
|
-
init_telegram2();
|
|
9890
9893
|
function useLinkTelegram() {
|
|
9891
9894
|
const {
|
|
9892
9895
|
config: { current: config },
|
|
@@ -9894,12 +9897,13 @@ function useLinkTelegram() {
|
|
|
9894
9897
|
} = useLumiaPassportConfig();
|
|
9895
9898
|
const qc = useQueryClient13();
|
|
9896
9899
|
const address = useLumiaPassportSession((st) => st.address);
|
|
9897
|
-
const
|
|
9900
|
+
const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking);
|
|
9901
|
+
const { providerType, linkIsLoading, setLinkIsLoading, setProviderType, setAlert } = useManageWalletStore();
|
|
9898
9902
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
9899
9903
|
const handleLinkTelegram = useCallback11(async () => {
|
|
9900
9904
|
try {
|
|
9901
9905
|
setLinkIsLoading(true);
|
|
9902
|
-
|
|
9906
|
+
setAlert(null);
|
|
9903
9907
|
const telegramProvider = config.social?.providers?.find(
|
|
9904
9908
|
(p) => (p.id || "").toLowerCase() === "telegram" && p.enabled
|
|
9905
9909
|
);
|
|
@@ -9932,7 +9936,7 @@ function useLinkTelegram() {
|
|
|
9932
9936
|
setProviderType(null);
|
|
9933
9937
|
} catch (e) {
|
|
9934
9938
|
console.error("[ManageWallet] Failed to link Telegram:", e);
|
|
9935
|
-
|
|
9939
|
+
setAlert({ title: "Error", message: e?.message || "Failed to link Telegram" });
|
|
9936
9940
|
setProviderType(null);
|
|
9937
9941
|
} finally {
|
|
9938
9942
|
setLinkIsLoading(false);
|
|
@@ -9940,7 +9944,12 @@ function useLinkTelegram() {
|
|
|
9940
9944
|
}, [config.social?.providers, callbacks]);
|
|
9941
9945
|
const [telegramLinkStarted, setTelegramLinkStarted] = useState8(false);
|
|
9942
9946
|
useEffect23(() => {
|
|
9943
|
-
console.log("[useLinkTelegram] Effect triggered:", {
|
|
9947
|
+
console.log("[useLinkTelegram] Effect triggered:", {
|
|
9948
|
+
providerType,
|
|
9949
|
+
linkIsLoading,
|
|
9950
|
+
telegramLinkStarted,
|
|
9951
|
+
isWalletLinking
|
|
9952
|
+
});
|
|
9944
9953
|
if (isWalletLinking) {
|
|
9945
9954
|
console.log("[useLinkTelegram] Skipping - wallet linking in progress");
|
|
9946
9955
|
return;
|
|
@@ -10008,7 +10017,7 @@ function ProviderCard(props) {
|
|
|
10008
10017
|
}
|
|
10009
10018
|
|
|
10010
10019
|
// src/internal/components/ManageWalletMenu/ManageWallet.tsx
|
|
10011
|
-
import { jsx as jsx50, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
10020
|
+
import { Fragment as Fragment14, jsx as jsx50, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
10012
10021
|
var POSSIBLE_PROVIDERS = [
|
|
10013
10022
|
"email",
|
|
10014
10023
|
// 'google',
|
|
@@ -10041,22 +10050,18 @@ function ManageWalletMenu() {
|
|
|
10041
10050
|
config: { current: config }
|
|
10042
10051
|
} = useLumiaPassportConfig();
|
|
10043
10052
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
10053
|
+
const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking);
|
|
10054
|
+
const setIsWalletLinking = useLayoutDataStore((st) => st.setIsWalletLinking);
|
|
10044
10055
|
const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight);
|
|
10045
10056
|
const {
|
|
10057
|
+
alert: alert2,
|
|
10046
10058
|
providerType,
|
|
10047
|
-
|
|
10048
|
-
linkError,
|
|
10049
|
-
verificationError,
|
|
10050
|
-
emailCodeSentError,
|
|
10059
|
+
setAlert,
|
|
10051
10060
|
setProviderType,
|
|
10052
10061
|
setEmail,
|
|
10053
10062
|
setEmailStep,
|
|
10054
|
-
setEmailCodeSentError,
|
|
10055
10063
|
setEmailCodeExpiresIn,
|
|
10056
|
-
setEmailCode
|
|
10057
|
-
setLinkError,
|
|
10058
|
-
setVerificationError,
|
|
10059
|
-
setIsWalletLinking
|
|
10064
|
+
setEmailCode
|
|
10060
10065
|
} = useManageWalletStore();
|
|
10061
10066
|
const configuredProviders = getConfiguredProviders(config);
|
|
10062
10067
|
const { data: providers = [], isLoading: isProvidersLoading, error: providersError } = useProvidersList();
|
|
@@ -10082,17 +10087,16 @@ function ManageWalletMenu() {
|
|
|
10082
10087
|
disabled: isWalletLinking,
|
|
10083
10088
|
onClick: () => {
|
|
10084
10089
|
if (isWalletLinking) return;
|
|
10090
|
+
setAlert(null);
|
|
10085
10091
|
switch (provider) {
|
|
10086
10092
|
case "email":
|
|
10087
10093
|
setEmail("");
|
|
10088
10094
|
setEmailCode("");
|
|
10089
|
-
setEmailCodeSentError("");
|
|
10090
10095
|
setEmailCodeExpiresIn(0);
|
|
10091
10096
|
setEmailStep("input");
|
|
10092
10097
|
setProviderType(provider);
|
|
10093
10098
|
break;
|
|
10094
10099
|
case "twitter":
|
|
10095
|
-
console.log("[ManageWallet] Twitter button clicked!");
|
|
10096
10100
|
setProviderType("twitter");
|
|
10097
10101
|
break;
|
|
10098
10102
|
case "wallet":
|
|
@@ -10120,7 +10124,7 @@ function ManageWalletMenu() {
|
|
|
10120
10124
|
useLinkSocial();
|
|
10121
10125
|
const showCurrentProviders = !isProvidersLoading && !providersError && (providerType !== "email" && providerType !== "passkey" || providerType === null);
|
|
10122
10126
|
const showExtraProvidersUi = !isProvidersLoading && !providersError && (providerType === "email" || providerType === "passkey");
|
|
10123
|
-
const
|
|
10127
|
+
const combinedAlertMessage = alert2?.message || providersError?.message || null;
|
|
10124
10128
|
return /* @__PURE__ */ jsxs41(
|
|
10125
10129
|
"div",
|
|
10126
10130
|
{
|
|
@@ -10138,15 +10142,13 @@ function ManageWalletMenu() {
|
|
|
10138
10142
|
size: "icon",
|
|
10139
10143
|
title: "Back",
|
|
10140
10144
|
onClick: () => {
|
|
10145
|
+
setAlert(null);
|
|
10141
10146
|
if (providerType === "email") {
|
|
10142
10147
|
setEmail("");
|
|
10143
10148
|
setEmailCode("");
|
|
10144
10149
|
setEmailStep("input");
|
|
10145
|
-
setEmailCodeSentError("");
|
|
10146
10150
|
setEmailCodeExpiresIn(0);
|
|
10147
|
-
setVerificationError("");
|
|
10148
10151
|
}
|
|
10149
|
-
setLinkError("");
|
|
10150
10152
|
if (!providerType) setPage("settings" /* SETTINGS */);
|
|
10151
10153
|
setProviderType(null);
|
|
10152
10154
|
},
|
|
@@ -10155,16 +10157,19 @@ function ManageWalletMenu() {
|
|
|
10155
10157
|
),
|
|
10156
10158
|
/* @__PURE__ */ jsx50("span", { className: "text-xl font-semibold", children: "Profiles" })
|
|
10157
10159
|
] }),
|
|
10158
|
-
/* @__PURE__ */
|
|
10159
|
-
|
|
10160
|
-
|
|
10161
|
-
|
|
10162
|
-
|
|
10163
|
-
|
|
10164
|
-
/* @__PURE__ */
|
|
10165
|
-
|
|
10166
|
-
|
|
10167
|
-
|
|
10160
|
+
isProvidersLoading && /* @__PURE__ */ jsx50("div", { className: "flex items-center justify-center p-4 text-[var(--l-pass-fg-muted)]", children: /* @__PURE__ */ jsx50(Loader13, { className: "w-5 h-5 animate-spin" }) }),
|
|
10161
|
+
/* @__PURE__ */ jsx50(EmailNotConnectedWarning, {}),
|
|
10162
|
+
showCurrentProviders && renderProviders.map((node) => node),
|
|
10163
|
+
showExtraProvidersUi && /* @__PURE__ */ jsx50(AddProvider, {}),
|
|
10164
|
+
combinedAlertMessage && /* @__PURE__ */ jsxs41(Highlight, { type: "error", className: "flex gap-[var(--l-pass-gap)]", children: [
|
|
10165
|
+
/* @__PURE__ */ jsx50(AlertTriangle3, { className: "w-4 h-4 shrink-0" }),
|
|
10166
|
+
/* @__PURE__ */ jsxs41("span", { className: "break-words whitespace-pre-wrap", children: [
|
|
10167
|
+
alert2?.title && /* @__PURE__ */ jsxs41(Fragment14, { children: [
|
|
10168
|
+
/* @__PURE__ */ jsx50("strong", { children: alert2.title }),
|
|
10169
|
+
/* @__PURE__ */ jsx50("br", {})
|
|
10170
|
+
] }),
|
|
10171
|
+
combinedAlertMessage
|
|
10172
|
+
] })
|
|
10168
10173
|
] })
|
|
10169
10174
|
]
|
|
10170
10175
|
}
|
|
@@ -10182,7 +10187,7 @@ function UnlinkProviderMenu() {
|
|
|
10182
10187
|
const address = useLumiaPassportSession((st) => st.address);
|
|
10183
10188
|
const { callbacks } = useLumiaPassportConfig();
|
|
10184
10189
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
10185
|
-
const { confirmUnlink, setConfirmUnlink,
|
|
10190
|
+
const { confirmUnlink, setConfirmUnlink, setAlert } = useManageWalletStore();
|
|
10186
10191
|
const [confirmInput, setConfirmInput] = useState9("");
|
|
10187
10192
|
const { mutate: handleUnlinkProvider, isPending: isProviderUnlinking } = useMutation14({
|
|
10188
10193
|
mutationFn: async () => {
|
|
@@ -10204,7 +10209,7 @@ function UnlinkProviderMenu() {
|
|
|
10204
10209
|
}
|
|
10205
10210
|
},
|
|
10206
10211
|
onError: (error) => {
|
|
10207
|
-
|
|
10212
|
+
setAlert({ title: "Error", message: error?.message || "Failed to unlink provider" });
|
|
10208
10213
|
setPage("manage-wallet" /* MANAGE_WALLET */);
|
|
10209
10214
|
}
|
|
10210
10215
|
});
|
|
@@ -10258,193 +10263,355 @@ function UnlinkProviderMenu() {
|
|
|
10258
10263
|
|
|
10259
10264
|
// src/internal/components/PortfolioMenu/PortfolioMenu.tsx
|
|
10260
10265
|
import { useQueryClient as useQueryClient16 } from "@tanstack/react-query";
|
|
10261
|
-
import { ArrowLeft as ArrowLeft11, Gem, Loader as Loader16, RefreshCw } from "lucide-react";
|
|
10262
|
-
import { useCallback as
|
|
10266
|
+
import { AlertCircle as AlertCircle4, ArrowLeft as ArrowLeft11, Gem, Loader as Loader16, RefreshCw } from "lucide-react";
|
|
10267
|
+
import { useCallback as useCallback13 } from "react";
|
|
10263
10268
|
|
|
10264
|
-
// src/
|
|
10269
|
+
// src/internal/hooks/useBlockscoutAssets.ts
|
|
10270
|
+
init_lumiaPassport();
|
|
10265
10271
|
init_base();
|
|
10266
|
-
import
|
|
10267
|
-
import {
|
|
10268
|
-
import {
|
|
10269
|
-
|
|
10270
|
-
|
|
10271
|
-
|
|
10272
|
-
|
|
10273
|
-
|
|
10274
|
-
|
|
10275
|
-
|
|
10276
|
-
|
|
10277
|
-
|
|
10272
|
+
import { useCallback as useCallback12, useMemo as useMemo4, useRef as useRef12 } from "react";
|
|
10273
|
+
import { useQuery as useQuery11 } from "@tanstack/react-query";
|
|
10274
|
+
import { useBalance as useBalance2, usePublicClient } from "wagmi";
|
|
10275
|
+
import { formatUnits } from "viem";
|
|
10276
|
+
import {
|
|
10277
|
+
createBlockscoutClient
|
|
10278
|
+
} from "@lumiapassport/core/clients";
|
|
10279
|
+
var BLOCKSCOUT_QUERY_KEY = "blockscout-token-balances";
|
|
10280
|
+
var ERC3643_DETECTION_QUERY_KEY = "erc3643-detection";
|
|
10281
|
+
var ERC3643_ABI = [
|
|
10282
|
+
{
|
|
10283
|
+
name: "identityRegistry",
|
|
10284
|
+
type: "function",
|
|
10285
|
+
stateMutability: "view",
|
|
10286
|
+
inputs: [],
|
|
10287
|
+
outputs: [{ name: "", type: "address" }]
|
|
10288
|
+
}
|
|
10278
10289
|
];
|
|
10279
|
-
function
|
|
10280
|
-
|
|
10290
|
+
function resolveIpfsUri(uri) {
|
|
10291
|
+
if (!uri) return "";
|
|
10292
|
+
if (uri.startsWith("ipfs://")) {
|
|
10293
|
+
return uri.replace("ipfs://", IPFS_GATEWAY);
|
|
10294
|
+
}
|
|
10295
|
+
if (uri.startsWith("data:application/json")) {
|
|
10296
|
+
return uri;
|
|
10297
|
+
}
|
|
10298
|
+
return uri;
|
|
10299
|
+
}
|
|
10300
|
+
function mapTokenType(blockscoutType) {
|
|
10301
|
+
switch (blockscoutType) {
|
|
10302
|
+
case "ERC-20":
|
|
10303
|
+
return "erc20";
|
|
10304
|
+
case "ERC-721":
|
|
10305
|
+
return "erc721";
|
|
10306
|
+
case "ERC-1155":
|
|
10307
|
+
return "erc1155";
|
|
10308
|
+
default:
|
|
10309
|
+
return "erc20";
|
|
10310
|
+
}
|
|
10311
|
+
}
|
|
10312
|
+
function mapBlockscoutToAsset(balance) {
|
|
10313
|
+
const { token, value, token_id, token_instance } = balance;
|
|
10314
|
+
const type = mapTokenType(token.type);
|
|
10315
|
+
const decimals = token.decimals ? parseInt(token.decimals, 10) : void 0;
|
|
10316
|
+
let formattedBalance;
|
|
10317
|
+
if (type === "erc721") {
|
|
10318
|
+
formattedBalance = "1";
|
|
10319
|
+
} else if (decimals !== void 0) {
|
|
10320
|
+
formattedBalance = parseFloat(formatUnits(BigInt(value), decimals)).toFixed(4);
|
|
10321
|
+
} else {
|
|
10322
|
+
formattedBalance = value;
|
|
10323
|
+
}
|
|
10324
|
+
const asset = {
|
|
10325
|
+
type,
|
|
10326
|
+
address: token.address,
|
|
10327
|
+
name: token.name || "Unknown Token",
|
|
10328
|
+
symbol: token.symbol || "???",
|
|
10329
|
+
balance: value,
|
|
10330
|
+
formattedBalance,
|
|
10331
|
+
decimals,
|
|
10332
|
+
logo: token.icon_url || void 0
|
|
10333
|
+
};
|
|
10334
|
+
if (type === "erc721" || type === "erc1155") {
|
|
10335
|
+
asset.tokenId = token_id || void 0;
|
|
10336
|
+
if (token_instance?.metadata) {
|
|
10337
|
+
const metadata = token_instance.metadata;
|
|
10338
|
+
asset.image = metadata.image ? resolveIpfsUri(metadata.image) : void 0;
|
|
10339
|
+
asset.nftMetadata = {
|
|
10340
|
+
name: metadata.name,
|
|
10341
|
+
description: metadata.description,
|
|
10342
|
+
image: asset.image,
|
|
10343
|
+
externalUrl: metadata.external_url,
|
|
10344
|
+
collectionName: token.name,
|
|
10345
|
+
attributes: metadata.attributes
|
|
10346
|
+
};
|
|
10347
|
+
}
|
|
10348
|
+
}
|
|
10349
|
+
return asset;
|
|
10350
|
+
}
|
|
10351
|
+
function mapBlockscoutNftToAsset(nft) {
|
|
10352
|
+
const { token, value, id, image_url, metadata } = nft;
|
|
10353
|
+
const type = mapTokenType(token.type);
|
|
10354
|
+
const imageUrl = image_url || (metadata?.image ? resolveIpfsUri(metadata.image) : void 0);
|
|
10355
|
+
const asset = {
|
|
10356
|
+
type,
|
|
10357
|
+
address: token.address,
|
|
10358
|
+
name: token.name || "Unknown NFT",
|
|
10359
|
+
symbol: token.symbol || "???",
|
|
10360
|
+
balance: value || "1",
|
|
10361
|
+
formattedBalance: "1",
|
|
10362
|
+
tokenId: id,
|
|
10363
|
+
logo: token.icon_url || void 0,
|
|
10364
|
+
image: imageUrl,
|
|
10365
|
+
nftMetadata: {
|
|
10366
|
+
name: metadata?.name,
|
|
10367
|
+
description: metadata?.description,
|
|
10368
|
+
image: imageUrl,
|
|
10369
|
+
externalUrl: metadata?.external_url,
|
|
10370
|
+
collectionName: token.name,
|
|
10371
|
+
attributes: metadata?.attributes
|
|
10372
|
+
}
|
|
10373
|
+
};
|
|
10374
|
+
return asset;
|
|
10375
|
+
}
|
|
10376
|
+
function createError(error) {
|
|
10377
|
+
if (error instanceof Error) {
|
|
10378
|
+
const message = error.message;
|
|
10379
|
+
if (message.includes("abort") || message.includes("timeout")) {
|
|
10380
|
+
return {
|
|
10381
|
+
type: "timeout",
|
|
10382
|
+
message: "Unable to load token list - request timed out",
|
|
10383
|
+
retryable: true
|
|
10384
|
+
};
|
|
10385
|
+
}
|
|
10386
|
+
if (message.includes("network") || message.includes("fetch")) {
|
|
10387
|
+
return {
|
|
10388
|
+
type: "network",
|
|
10389
|
+
message: "Unable to load token list - network error",
|
|
10390
|
+
retryable: true
|
|
10391
|
+
};
|
|
10392
|
+
}
|
|
10393
|
+
if (message.includes("Blockscout") || message.includes("API")) {
|
|
10394
|
+
return {
|
|
10395
|
+
type: "api",
|
|
10396
|
+
message: "Token service unavailable",
|
|
10397
|
+
retryable: true
|
|
10398
|
+
};
|
|
10399
|
+
}
|
|
10400
|
+
return {
|
|
10401
|
+
type: "unknown",
|
|
10402
|
+
message: "Unable to load token list",
|
|
10403
|
+
retryable: true
|
|
10404
|
+
};
|
|
10405
|
+
}
|
|
10406
|
+
return {
|
|
10407
|
+
type: "unknown",
|
|
10408
|
+
message: "Unable to load token list",
|
|
10409
|
+
retryable: true
|
|
10410
|
+
};
|
|
10411
|
+
}
|
|
10412
|
+
function useBlockscoutAssets(options) {
|
|
10413
|
+
const { address, enabled = true, detectSecurityTokens = true } = options;
|
|
10414
|
+
const blockscoutApiUrl = getBlockscoutApiUrl();
|
|
10415
|
+
const blockscoutClient = useMemo4(
|
|
10416
|
+
() => createBlockscoutClient({ baseUrl: blockscoutApiUrl }),
|
|
10417
|
+
[blockscoutApiUrl]
|
|
10418
|
+
);
|
|
10419
|
+
const publicClient2 = usePublicClient({ chainId: lumiaBeam.id });
|
|
10420
|
+
const lastRefreshRef = useRef12(0);
|
|
10421
|
+
const {
|
|
10422
|
+
data: nativeBalanceData,
|
|
10423
|
+
isLoading: nativeLoading,
|
|
10424
|
+
refetch: refetchNative
|
|
10425
|
+
} = useBalance2({
|
|
10281
10426
|
address,
|
|
10282
10427
|
chainId: lumiaBeam.id,
|
|
10283
10428
|
query: {
|
|
10284
|
-
enabled: !!address
|
|
10429
|
+
enabled: !!address && enabled
|
|
10285
10430
|
}
|
|
10286
10431
|
});
|
|
10287
|
-
const
|
|
10288
|
-
|
|
10289
|
-
|
|
10290
|
-
|
|
10291
|
-
|
|
10292
|
-
|
|
10293
|
-
}
|
|
10294
|
-
|
|
10295
|
-
|
|
10296
|
-
|
|
10297
|
-
|
|
10298
|
-
|
|
10432
|
+
const {
|
|
10433
|
+
data: tokenBalances,
|
|
10434
|
+
isLoading: tokensLoading,
|
|
10435
|
+
error: tokensError,
|
|
10436
|
+
refetch: refetchTokens,
|
|
10437
|
+
dataUpdatedAt
|
|
10438
|
+
} = useQuery11({
|
|
10439
|
+
queryKey: [BLOCKSCOUT_QUERY_KEY, address, blockscoutApiUrl],
|
|
10440
|
+
queryFn: () => blockscoutClient.getTokenBalances(address),
|
|
10441
|
+
enabled: !!address && enabled,
|
|
10442
|
+
staleTime: BLOCKSCOUT_QUERY_STALE_TIME,
|
|
10443
|
+
gcTime: BLOCKSCOUT_QUERY_GC_TIME,
|
|
10444
|
+
retry: 2,
|
|
10445
|
+
retryDelay: 1e3
|
|
10299
10446
|
});
|
|
10300
|
-
const {
|
|
10301
|
-
|
|
10302
|
-
|
|
10303
|
-
|
|
10304
|
-
|
|
10447
|
+
const {
|
|
10448
|
+
data: nftItems,
|
|
10449
|
+
isLoading: nftsLoading,
|
|
10450
|
+
refetch: refetchNfts
|
|
10451
|
+
} = useQuery11({
|
|
10452
|
+
queryKey: [BLOCKSCOUT_QUERY_KEY, "nfts", address, blockscoutApiUrl],
|
|
10453
|
+
queryFn: () => blockscoutClient.getNfts(address),
|
|
10454
|
+
enabled: !!address && enabled,
|
|
10455
|
+
staleTime: BLOCKSCOUT_QUERY_STALE_TIME,
|
|
10456
|
+
gcTime: BLOCKSCOUT_QUERY_GC_TIME,
|
|
10457
|
+
retry: 2,
|
|
10458
|
+
retryDelay: 1e3
|
|
10459
|
+
});
|
|
10460
|
+
const erc20TokenAddresses = useMemo4(() => {
|
|
10461
|
+
if (!tokenBalances) return [];
|
|
10462
|
+
return tokenBalances.filter((tb) => tb.token.type === "ERC-20").map((tb) => tb.token.address);
|
|
10463
|
+
}, [tokenBalances]);
|
|
10464
|
+
const { data: erc3643Results } = useQuery11({
|
|
10465
|
+
queryKey: [ERC3643_DETECTION_QUERY_KEY, address, erc20TokenAddresses],
|
|
10466
|
+
queryFn: async () => {
|
|
10467
|
+
if (!publicClient2 || erc20TokenAddresses.length === 0) {
|
|
10468
|
+
return /* @__PURE__ */ new Map();
|
|
10469
|
+
}
|
|
10470
|
+
const results = /* @__PURE__ */ new Map();
|
|
10471
|
+
const batchSize = 10;
|
|
10472
|
+
for (let i = 0; i < erc20TokenAddresses.length; i += batchSize) {
|
|
10473
|
+
const batch = erc20TokenAddresses.slice(i, i + batchSize);
|
|
10474
|
+
const promises = batch.map(async (tokenAddress) => {
|
|
10475
|
+
try {
|
|
10476
|
+
const registry = await publicClient2.readContract({
|
|
10477
|
+
address: tokenAddress,
|
|
10478
|
+
abi: ERC3643_ABI,
|
|
10479
|
+
functionName: "identityRegistry"
|
|
10480
|
+
});
|
|
10481
|
+
if (registry && registry !== "0x0000000000000000000000000000000000000000") {
|
|
10482
|
+
return { tokenAddress, registry };
|
|
10483
|
+
}
|
|
10484
|
+
return null;
|
|
10485
|
+
} catch {
|
|
10486
|
+
return null;
|
|
10487
|
+
}
|
|
10488
|
+
});
|
|
10489
|
+
const batchResults = await Promise.allSettled(promises);
|
|
10490
|
+
batchResults.forEach((result) => {
|
|
10491
|
+
if (result.status === "fulfilled" && result.value) {
|
|
10492
|
+
results.set(result.value.tokenAddress.toLowerCase(), result.value.registry);
|
|
10493
|
+
}
|
|
10494
|
+
});
|
|
10495
|
+
}
|
|
10496
|
+
return results;
|
|
10497
|
+
},
|
|
10498
|
+
enabled: !!address && enabled && detectSecurityTokens && erc20TokenAddresses.length > 0 && !!publicClient2,
|
|
10499
|
+
staleTime: BLOCKSCOUT_QUERY_STALE_TIME * 2,
|
|
10500
|
+
// Less frequent refresh for contract calls
|
|
10501
|
+
gcTime: BLOCKSCOUT_QUERY_GC_TIME,
|
|
10502
|
+
retry: 1
|
|
10503
|
+
});
|
|
10504
|
+
const assets = useMemo4(() => {
|
|
10505
|
+
const result = [];
|
|
10506
|
+
if (nativeBalanceData) {
|
|
10507
|
+
result.push({
|
|
10305
10508
|
type: "native",
|
|
10306
10509
|
name: "Lumia",
|
|
10307
10510
|
symbol: "LUMIA",
|
|
10308
|
-
balance:
|
|
10309
|
-
formattedBalance: parseFloat(
|
|
10511
|
+
balance: nativeBalanceData.value.toString(),
|
|
10512
|
+
formattedBalance: parseFloat(nativeBalanceData.formatted).toFixed(4),
|
|
10310
10513
|
decimals: 18
|
|
10311
10514
|
});
|
|
10312
10515
|
}
|
|
10313
|
-
if (tokenBalances
|
|
10314
|
-
tokenBalances.
|
|
10315
|
-
|
|
10316
|
-
|
|
10317
|
-
|
|
10318
|
-
const
|
|
10319
|
-
|
|
10320
|
-
type
|
|
10321
|
-
|
|
10322
|
-
|
|
10323
|
-
|
|
10324
|
-
|
|
10325
|
-
|
|
10326
|
-
decimals: token.decimals,
|
|
10327
|
-
logo: token.logo
|
|
10328
|
-
});
|
|
10516
|
+
if (tokenBalances) {
|
|
10517
|
+
const erc20Tokens = tokenBalances.filter((balance) => balance.token.type === "ERC-20");
|
|
10518
|
+
const mappedTokens = erc20Tokens.map((balance) => {
|
|
10519
|
+
const asset = mapBlockscoutToAsset(balance);
|
|
10520
|
+
if (asset.type === "erc20" && asset.address && erc3643Results) {
|
|
10521
|
+
const registryAddress = erc3643Results.get(asset.address.toLowerCase());
|
|
10522
|
+
if (registryAddress) {
|
|
10523
|
+
asset.type = "erc3643";
|
|
10524
|
+
asset.complianceStatus = {
|
|
10525
|
+
isSecurityToken: true,
|
|
10526
|
+
identityRegistry: registryAddress
|
|
10527
|
+
};
|
|
10528
|
+
}
|
|
10329
10529
|
}
|
|
10530
|
+
return asset;
|
|
10330
10531
|
});
|
|
10532
|
+
result.push(...mappedTokens);
|
|
10331
10533
|
}
|
|
10332
|
-
|
|
10333
|
-
|
|
10334
|
-
|
|
10335
|
-
const tokenIndex = COMMON_TOKENS.findIndex(
|
|
10336
|
-
(token2) => token2.address.toLowerCase() === tokenAddress.toLowerCase()
|
|
10337
|
-
);
|
|
10338
|
-
if (tokenIndex === -1 || !tokenBalances?.[tokenIndex]) {
|
|
10339
|
-
return null;
|
|
10340
|
-
}
|
|
10341
|
-
const balance = tokenBalances[tokenIndex];
|
|
10342
|
-
const token = COMMON_TOKENS[tokenIndex];
|
|
10343
|
-
if (balance.status === "success" && balance.result) {
|
|
10344
|
-
const balanceValue = balance.result;
|
|
10345
|
-
const formattedBalance = formatUnits(balanceValue, token.decimals);
|
|
10346
|
-
return {
|
|
10347
|
-
address: token.address,
|
|
10348
|
-
name: token.name,
|
|
10349
|
-
symbol: token.symbol,
|
|
10350
|
-
decimals: token.decimals,
|
|
10351
|
-
balance: balanceValue.toString(),
|
|
10352
|
-
formattedBalance: parseFloat(formattedBalance).toFixed(4),
|
|
10353
|
-
logo: token.logo
|
|
10354
|
-
};
|
|
10534
|
+
if (nftItems && nftItems.length > 0) {
|
|
10535
|
+
const mappedNfts = nftItems.map(mapBlockscoutNftToAsset);
|
|
10536
|
+
result.push(...mappedNfts);
|
|
10355
10537
|
}
|
|
10356
|
-
return
|
|
10357
|
-
};
|
|
10358
|
-
const
|
|
10359
|
-
|
|
10360
|
-
refetchNativeBalance(),
|
|
10361
|
-
refetchTokenBalances()
|
|
10362
|
-
]);
|
|
10363
|
-
};
|
|
10364
|
-
return {
|
|
10365
|
-
nativeBalance,
|
|
10366
|
-
tokenBalances,
|
|
10367
|
-
assets: getAllAssets(),
|
|
10368
|
-
getTokenBalance,
|
|
10369
|
-
refreshBalances,
|
|
10370
|
-
isLoading: nativeBalanceLoading || tokenBalancesLoading,
|
|
10371
|
-
isConnected: !!address
|
|
10372
|
-
};
|
|
10373
|
-
}
|
|
10374
|
-
function useTokenInfo(tokenAddress) {
|
|
10375
|
-
const readContractsResult = useReadContracts({
|
|
10376
|
-
contracts: [
|
|
10377
|
-
{ address: tokenAddress, abi: erc20Abi, functionName: "name", chainId: lumiaBeam.id },
|
|
10378
|
-
{ address: tokenAddress, abi: erc20Abi, functionName: "symbol", chainId: lumiaBeam.id },
|
|
10379
|
-
{ address: tokenAddress, abi: erc20Abi, functionName: "decimals", chainId: lumiaBeam.id }
|
|
10380
|
-
]
|
|
10381
|
-
});
|
|
10382
|
-
const { data: tokenData, isLoading } = readContractsResult;
|
|
10383
|
-
if (!tokenData || isLoading) {
|
|
10384
|
-
return { isLoading, tokenInfo: null };
|
|
10385
|
-
}
|
|
10386
|
-
const [nameResult, symbolResult, decimalsResult] = tokenData;
|
|
10387
|
-
if (nameResult.status === "success" && symbolResult.status === "success" && decimalsResult.status === "success") {
|
|
10538
|
+
return result;
|
|
10539
|
+
}, [nativeBalanceData, tokenBalances, nftItems, erc3643Results]);
|
|
10540
|
+
const nativeBalance = useMemo4(() => {
|
|
10541
|
+
if (!nativeBalanceData) return null;
|
|
10388
10542
|
return {
|
|
10389
|
-
|
|
10390
|
-
|
|
10391
|
-
|
|
10392
|
-
symbol: symbolResult.result,
|
|
10393
|
-
decimals: decimalsResult.result,
|
|
10394
|
-
address: tokenAddress
|
|
10395
|
-
}
|
|
10543
|
+
value: nativeBalanceData.value,
|
|
10544
|
+
formatted: nativeBalanceData.formatted,
|
|
10545
|
+
symbol: "LUMIA"
|
|
10396
10546
|
};
|
|
10397
|
-
}
|
|
10398
|
-
|
|
10399
|
-
|
|
10400
|
-
|
|
10401
|
-
|
|
10402
|
-
|
|
10403
|
-
|
|
10404
|
-
|
|
10405
|
-
|
|
10406
|
-
chainId: lumiaBeam.id,
|
|
10407
|
-
query: {
|
|
10408
|
-
enabled: !!userAddress
|
|
10547
|
+
}, [nativeBalanceData]);
|
|
10548
|
+
const error = useMemo4(() => {
|
|
10549
|
+
if (!tokensError) return null;
|
|
10550
|
+
return createError(tokensError);
|
|
10551
|
+
}, [tokensError]);
|
|
10552
|
+
const refreshBalances = useCallback12(async () => {
|
|
10553
|
+
const now = Date.now();
|
|
10554
|
+
if (now - lastRefreshRef.current < BLOCKSCOUT_REFRESH_DEBOUNCE) {
|
|
10555
|
+
return;
|
|
10409
10556
|
}
|
|
10410
|
-
|
|
10411
|
-
|
|
10412
|
-
|
|
10413
|
-
|
|
10414
|
-
|
|
10415
|
-
|
|
10557
|
+
lastRefreshRef.current = now;
|
|
10558
|
+
await Promise.all([refetchNative(), refetchTokens(), refetchNfts()]);
|
|
10559
|
+
}, [refetchNative, refetchTokens, refetchNfts]);
|
|
10560
|
+
const getTokenBalance = useCallback12(
|
|
10561
|
+
(tokenAddress) => {
|
|
10562
|
+
return assets.find((a) => a.address?.toLowerCase() === tokenAddress.toLowerCase()) || null;
|
|
10563
|
+
},
|
|
10564
|
+
[assets]
|
|
10565
|
+
);
|
|
10416
10566
|
return {
|
|
10417
|
-
|
|
10418
|
-
|
|
10419
|
-
|
|
10420
|
-
|
|
10421
|
-
|
|
10567
|
+
nativeBalance,
|
|
10568
|
+
assets,
|
|
10569
|
+
isLoading: nativeLoading || tokensLoading || nftsLoading,
|
|
10570
|
+
isInitialLoading: nativeLoading && !nativeBalanceData,
|
|
10571
|
+
error,
|
|
10572
|
+
isBlockscoutAvailable: !tokensError,
|
|
10573
|
+
refreshBalances,
|
|
10574
|
+
getTokenBalance,
|
|
10575
|
+
lastUpdated: dataUpdatedAt || null
|
|
10422
10576
|
};
|
|
10423
10577
|
}
|
|
10424
10578
|
|
|
10425
10579
|
// src/internal/components/PortfolioMenu/PortfolioItem.tsx
|
|
10426
10580
|
init_base();
|
|
10427
|
-
import { useQuery as
|
|
10428
|
-
import { Loader as Loader15 } from "lucide-react";
|
|
10429
|
-
import {
|
|
10581
|
+
import { useQuery as useQuery12, useQueryClient as useQueryClient15 } from "@tanstack/react-query";
|
|
10582
|
+
import { Image as ImageIcon, Loader as Loader15, Shield, Sparkles } from "lucide-react";
|
|
10583
|
+
import { useState as useState10 } from "react";
|
|
10584
|
+
import { Fragment as Fragment15, jsx as jsx52, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
10430
10585
|
var price16 = Intl.NumberFormat("en-US", { minimumFractionDigits: 16, maximumFractionDigits: 16 });
|
|
10431
10586
|
function formatValue(price) {
|
|
10432
|
-
if (!price) return /* @__PURE__ */ jsx52(
|
|
10587
|
+
if (!price) return /* @__PURE__ */ jsx52(Fragment15, { children: `0.00` });
|
|
10433
10588
|
if (price < 0.01) {
|
|
10434
10589
|
const strigified = price16.format(price);
|
|
10435
10590
|
const absValue = parseInt(strigified.replace(/^0\./, "")).toString().slice(0, 2);
|
|
10436
10591
|
const zeroQnt = strigified.replace(/^0\./, "").split("").findIndex((el) => +el > 0);
|
|
10437
|
-
return /* @__PURE__ */ jsxs43(
|
|
10592
|
+
return /* @__PURE__ */ jsxs43(Fragment15, { children: [
|
|
10438
10593
|
`0.0`,
|
|
10439
10594
|
/* @__PURE__ */ jsx52("sub", { className: "text-[10px]", children: zeroQnt }),
|
|
10440
10595
|
absValue
|
|
10441
10596
|
] });
|
|
10442
10597
|
}
|
|
10443
|
-
return /* @__PURE__ */ jsx52(
|
|
10598
|
+
return /* @__PURE__ */ jsx52(Fragment15, { children: price.toFixed(2) });
|
|
10444
10599
|
}
|
|
10445
10600
|
function openInExplorer(address) {
|
|
10446
10601
|
window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank");
|
|
10447
10602
|
}
|
|
10603
|
+
function isNftAsset(asset) {
|
|
10604
|
+
if (!("type" in asset)) return false;
|
|
10605
|
+
return asset.type === "erc721" || asset.type === "erc1155";
|
|
10606
|
+
}
|
|
10607
|
+
function getNftImage(asset) {
|
|
10608
|
+
if (!("type" in asset)) return void 0;
|
|
10609
|
+
return asset.image || asset.nftMetadata?.image;
|
|
10610
|
+
}
|
|
10611
|
+
function isSecurityToken(asset) {
|
|
10612
|
+
if (!("type" in asset)) return false;
|
|
10613
|
+
return asset.type === "erc3643";
|
|
10614
|
+
}
|
|
10448
10615
|
async function getAssetRate2(symbol) {
|
|
10449
10616
|
const assetURL = `https://api.binance.com/api/v3/ticker/price?symbol=${symbol.toUpperCase()}USDT`;
|
|
10450
10617
|
const response = await fetch(assetURL);
|
|
@@ -10453,14 +10620,18 @@ async function getAssetRate2(symbol) {
|
|
|
10453
10620
|
var ASSETS_RATES_QUERY_KEY = "lumia-passport-assets-rates-query-key";
|
|
10454
10621
|
function PortfolioItem(props) {
|
|
10455
10622
|
const { address, asset, isProjectAsset } = props;
|
|
10623
|
+
const [nftImageError, setNftImageError] = useState10(false);
|
|
10456
10624
|
const { assets: projectAssets, showBalanceAs: showBalanceAsSymbol } = useLumiaPassportConfig().config.current.projectAssets || {};
|
|
10457
10625
|
const qc = useQueryClient15();
|
|
10458
10626
|
const { balanceQueryKey } = projectAssets?.find((a) => a.symbol === showBalanceAsSymbol) || {};
|
|
10459
10627
|
const projectAssetBalance = !!balanceQueryKey ? qc.getQueryData(balanceQueryKey) : null;
|
|
10460
|
-
const
|
|
10628
|
+
const isNft = isNftAsset(asset);
|
|
10629
|
+
const nftImage = getNftImage(asset);
|
|
10630
|
+
const isSecurity = isSecurityToken(asset);
|
|
10631
|
+
const { data: assetRate, isLoading: isRateLoading } = useQuery12({
|
|
10461
10632
|
retry: false,
|
|
10462
10633
|
staleTime: 4 * 60 * 1e3,
|
|
10463
|
-
enabled: !!address && !!asset.symbol && !isProjectAsset,
|
|
10634
|
+
enabled: !!address && !!asset.symbol && !isProjectAsset && !isNft && !isSecurity,
|
|
10464
10635
|
queryKey: [ASSETS_RATES_QUERY_KEY, address, asset.symbol],
|
|
10465
10636
|
queryFn: async () => await getAssetRate2(asset.symbol)
|
|
10466
10637
|
});
|
|
@@ -10476,22 +10647,68 @@ function PortfolioItem(props) {
|
|
|
10476
10647
|
),
|
|
10477
10648
|
onClick: () => asset.address ? openInExplorer(asset.address) : void 0,
|
|
10478
10649
|
children: [
|
|
10479
|
-
/* @__PURE__ */
|
|
10650
|
+
/* @__PURE__ */ jsxs43(
|
|
10480
10651
|
"div",
|
|
10481
10652
|
{
|
|
10482
10653
|
className: cn(
|
|
10483
|
-
"flex-none
|
|
10484
|
-
"group-hover:opacity-60 transition-opacity"
|
|
10654
|
+
"flex-none flex items-center justify-center overflow-hidden relative",
|
|
10655
|
+
"group-hover:opacity-60 transition-opacity",
|
|
10656
|
+
// NFTs get rounded corners, tokens get circular
|
|
10657
|
+
isNft ? "w-12 h-12 rounded-lg" : "w-10 h-10 rounded-full",
|
|
10658
|
+
!asset.logo && !nftImage && "bg-[var(--l-pass-fg)]"
|
|
10485
10659
|
),
|
|
10486
|
-
children:
|
|
10660
|
+
children: [
|
|
10661
|
+
isNft && nftImage && !nftImageError ? /* @__PURE__ */ jsx52(
|
|
10662
|
+
"img",
|
|
10663
|
+
{
|
|
10664
|
+
src: nftImage,
|
|
10665
|
+
alt: asset.nftMetadata?.name || asset.name,
|
|
10666
|
+
className: "w-full h-full object-cover",
|
|
10667
|
+
onError: () => setNftImageError(true)
|
|
10668
|
+
}
|
|
10669
|
+
) : isNft && (!nftImage || nftImageError) ? (
|
|
10670
|
+
// NFT placeholder when no image available
|
|
10671
|
+
/* @__PURE__ */ jsx52("div", { className: "w-full h-full bg-[var(--l-pass-fg)] flex items-center justify-center", children: /* @__PURE__ */ jsx52(ImageIcon, { className: "w-5 h-5 text-[var(--l-pass-fg-inverted)]" }) })
|
|
10672
|
+
) : asset.logo ? /* @__PURE__ */ jsx52(
|
|
10673
|
+
"img",
|
|
10674
|
+
{
|
|
10675
|
+
src: asset.logo,
|
|
10676
|
+
alt: asset.symbol,
|
|
10677
|
+
className: "w-full h-full object-cover",
|
|
10678
|
+
onError: (e) => {
|
|
10679
|
+
const target = e.target;
|
|
10680
|
+
target.style.display = "none";
|
|
10681
|
+
target.parentElement.classList.add("bg-[var(--l-pass-fg)]");
|
|
10682
|
+
target.parentElement.innerHTML = `<span class="text-[var(--l-pass-fg-inverted)] font-bold text-sm">${asset.symbol.charAt(0)}</span>`;
|
|
10683
|
+
}
|
|
10684
|
+
}
|
|
10685
|
+
) : /* @__PURE__ */ jsx52("span", { className: "text-[var(--l-pass-fg-inverted)] font-bold text-sm", children: asset.symbol.charAt(0) }),
|
|
10686
|
+
isNft && /* @__PURE__ */ jsx52("div", { className: "absolute -top-1 -right-1 w-4 h-4 rounded-full bg-[var(--l-pass-accent)] flex items-center justify-center", children: /* @__PURE__ */ jsx52(Sparkles, { className: "w-2.5 h-2.5 text-[var(--l-pass-fg-inverted)]" }) }),
|
|
10687
|
+
isSecurity && /* @__PURE__ */ jsx52(
|
|
10688
|
+
"div",
|
|
10689
|
+
{
|
|
10690
|
+
className: "absolute -top-1 -right-1 w-4 h-4 rounded-full bg-amber-500 flex items-center justify-center",
|
|
10691
|
+
title: "Security Token (ERC-3643)",
|
|
10692
|
+
children: /* @__PURE__ */ jsx52(Shield, { className: "w-2.5 h-2.5 text-white" })
|
|
10693
|
+
}
|
|
10694
|
+
)
|
|
10695
|
+
]
|
|
10487
10696
|
}
|
|
10488
10697
|
),
|
|
10489
10698
|
/* @__PURE__ */ jsxs43("div", { className: "w-full flex-1", children: [
|
|
10490
10699
|
/* @__PURE__ */ jsxs43("div", { className: "w-full flex items-center justify-between text-xs", children: [
|
|
10491
|
-
/* @__PURE__ */ jsx52("span", { children: asset.name }),
|
|
10492
|
-
!isProjectAsset && /* @__PURE__ */ jsx52("span", { className: "text-[var(--l-pass-fg-muted)]", children: "USD" })
|
|
10700
|
+
/* @__PURE__ */ jsx52("span", { className: "truncate max-w-[150px]", title: isNft ? asset.nftMetadata?.collectionName || asset.name : asset.name, children: isNft ? asset.nftMetadata?.collectionName || asset.name || (asset.address ? `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` : "Unknown") : asset.name || (asset.address ? `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` : "Unknown") }),
|
|
10701
|
+
!isProjectAsset && !isNft && !isSecurity && /* @__PURE__ */ jsx52("span", { className: "text-[var(--l-pass-fg-muted)]", children: "USD" }),
|
|
10702
|
+
isNft && "type" in asset && /* @__PURE__ */ jsx52("span", { className: "text-[var(--l-pass-fg-muted)] uppercase text-[10px]", children: asset.type === "erc721" ? "ERC-721" : "ERC-1155" }),
|
|
10703
|
+
isSecurity && /* @__PURE__ */ jsx52("span", { className: "text-amber-500 uppercase text-[10px] font-medium", children: "Security Token" })
|
|
10493
10704
|
] }),
|
|
10494
|
-
/* @__PURE__ */
|
|
10705
|
+
/* @__PURE__ */ jsx52("div", { className: "w-full flex items-center justify-between font-bold text-lg leading-5", children: isNft ? /* @__PURE__ */ jsxs43(Fragment15, { children: [
|
|
10706
|
+
/* @__PURE__ */ jsx52("span", { className: "truncate max-w-[160px]", title: asset.nftMetadata?.name || asset.symbol, children: asset.nftMetadata?.name || asset.symbol }),
|
|
10707
|
+
"tokenId" in asset && asset.tokenId && /* @__PURE__ */ jsxs43("span", { className: "text-xs text-[var(--l-pass-fg-muted)] font-normal", children: [
|
|
10708
|
+
"#",
|
|
10709
|
+
asset.tokenId.length > 8 ? `${asset.tokenId.slice(0, 6)}...` : asset.tokenId
|
|
10710
|
+
] })
|
|
10711
|
+
] }) : /* @__PURE__ */ jsxs43(Fragment15, { children: [
|
|
10495
10712
|
/* @__PURE__ */ jsxs43("span", { children: [
|
|
10496
10713
|
/* @__PURE__ */ jsx52("span", { children: formatValue(Number(renderBalance)) }),
|
|
10497
10714
|
/* @__PURE__ */ jsx52("span", { children: " " + asset.symbol })
|
|
@@ -10503,7 +10720,7 @@ function PortfolioItem(props) {
|
|
|
10503
10720
|
currency: "USD",
|
|
10504
10721
|
style: "currency"
|
|
10505
10722
|
}) })
|
|
10506
|
-
] })
|
|
10723
|
+
] }) })
|
|
10507
10724
|
] })
|
|
10508
10725
|
]
|
|
10509
10726
|
}
|
|
@@ -10520,8 +10737,10 @@ function PortfolioMenu() {
|
|
|
10520
10737
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
10521
10738
|
const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight);
|
|
10522
10739
|
const address = useLumiaPassportSession((st) => st.address);
|
|
10523
|
-
const { assets, refreshBalances, isLoading } =
|
|
10524
|
-
|
|
10740
|
+
const { assets, refreshBalances, isLoading, error, isBlockscoutAvailable } = useBlockscoutAssets({
|
|
10741
|
+
address
|
|
10742
|
+
});
|
|
10743
|
+
const refreshAllAssetsBalances = useCallback13(() => {
|
|
10525
10744
|
Promise.all(projectAssets.map((asset) => qc.invalidateQueries({ queryKey: asset.balanceQueryKey })));
|
|
10526
10745
|
refreshBalances();
|
|
10527
10746
|
}, [qc, projectAssets, refreshBalances]);
|
|
@@ -10550,6 +10769,10 @@ function PortfolioMenu() {
|
|
|
10550
10769
|
)
|
|
10551
10770
|
] }),
|
|
10552
10771
|
/* @__PURE__ */ jsxs44("div", { className: "w-full flex flex-col gap-[var(--l-pass-gap)]", children: [
|
|
10772
|
+
error && !isBlockscoutAvailable && /* @__PURE__ */ jsxs44("div", { className: "w-full flex items-center gap-2 p-3 rounded-lg bg-[var(--l-pass-warning-bg)] text-[var(--l-pass-warning)]", children: [
|
|
10773
|
+
/* @__PURE__ */ jsx53(AlertCircle4, { className: "h-4 w-4 flex-shrink-0" }),
|
|
10774
|
+
/* @__PURE__ */ jsx53("span", { className: "text-sm", children: error.message })
|
|
10775
|
+
] }),
|
|
10553
10776
|
isLoading && /* @__PURE__ */ jsxs44("div", { className: "w-full flex items-center justify-center gap-[var(--l-pass-gap)] p-[var(--l-pass-pd)]", children: [
|
|
10554
10777
|
/* @__PURE__ */ jsx53(Loader16, { className: "h-5 w-5 animate-spin" }),
|
|
10555
10778
|
/* @__PURE__ */ jsx53("span", { className: "text-[var(--l-pass-muted)]", children: "Loading assets..." })
|
|
@@ -10566,7 +10789,7 @@ function PortfolioMenu() {
|
|
|
10566
10789
|
address,
|
|
10567
10790
|
asset
|
|
10568
10791
|
},
|
|
10569
|
-
`${asset.type}-${asset.address || "native"}-${index}`
|
|
10792
|
+
`${asset.type}-${asset.address || "native"}-${asset.tokenId || index}`
|
|
10570
10793
|
))
|
|
10571
10794
|
] })
|
|
10572
10795
|
] })
|
|
@@ -10578,7 +10801,7 @@ function PortfolioMenu() {
|
|
|
10578
10801
|
// src/internal/components/SecurityMenu/SecurityMenu.tsx
|
|
10579
10802
|
init_auth();
|
|
10580
10803
|
init_keyshare();
|
|
10581
|
-
import { useQuery as
|
|
10804
|
+
import { useQuery as useQuery13, useQueryClient as useQueryClient17 } from "@tanstack/react-query";
|
|
10582
10805
|
import {
|
|
10583
10806
|
AlertTriangle as AlertTriangle4,
|
|
10584
10807
|
ArrowLeft as ArrowLeft12,
|
|
@@ -10589,10 +10812,10 @@ import {
|
|
|
10589
10812
|
Loader as Loader17,
|
|
10590
10813
|
RefreshCw as RefreshCw2,
|
|
10591
10814
|
Server as Server2,
|
|
10592
|
-
Shield,
|
|
10815
|
+
Shield as Shield2,
|
|
10593
10816
|
Trash2 as Trash22
|
|
10594
10817
|
} from "lucide-react";
|
|
10595
|
-
import { useEffect as useEffect24, useState as
|
|
10818
|
+
import { useEffect as useEffect24, useState as useState11 } from "react";
|
|
10596
10819
|
init_iframe_manager();
|
|
10597
10820
|
init_vaultClient();
|
|
10598
10821
|
import { jsx as jsx54, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
@@ -10614,21 +10837,21 @@ function SecurityMenu() {
|
|
|
10614
10837
|
useEffect24(() => {
|
|
10615
10838
|
if (!userId) setPage("main-menu" /* MAIN_MENU */);
|
|
10616
10839
|
}, [userId, setPage]);
|
|
10617
|
-
const [localInfo, setLocalInfo] =
|
|
10618
|
-
const [recoveryCreatedAt, setRecoveryCreatedAt] =
|
|
10619
|
-
const [recoveryBrowser, setRecoveryBrowser] =
|
|
10620
|
-
const [recoveryUa, setRecoveryUa] =
|
|
10621
|
-
const [recoveryDeviceId, setRecoveryDeviceId] =
|
|
10622
|
-
const [recoveryDeviceName, setRecoveryDeviceName] =
|
|
10623
|
-
const [recoveryCountry, setRecoveryCountry] =
|
|
10624
|
-
const [hasServerBackup, setHasServerBackup] =
|
|
10625
|
-
const [trustedApps, setTrustedApps] =
|
|
10626
|
-
const [appToRemove, setAppToRemove] =
|
|
10840
|
+
const [localInfo, setLocalInfo] = useState11(null);
|
|
10841
|
+
const [recoveryCreatedAt, setRecoveryCreatedAt] = useState11(null);
|
|
10842
|
+
const [recoveryBrowser, setRecoveryBrowser] = useState11(null);
|
|
10843
|
+
const [recoveryUa, setRecoveryUa] = useState11(null);
|
|
10844
|
+
const [recoveryDeviceId, setRecoveryDeviceId] = useState11(null);
|
|
10845
|
+
const [recoveryDeviceName, setRecoveryDeviceName] = useState11(null);
|
|
10846
|
+
const [recoveryCountry, setRecoveryCountry] = useState11(null);
|
|
10847
|
+
const [hasServerBackup, setHasServerBackup] = useState11(false);
|
|
10848
|
+
const [trustedApps, setTrustedApps] = useState11([]);
|
|
10849
|
+
const [appToRemove, setAppToRemove] = useState11(null);
|
|
10627
10850
|
const {
|
|
10628
10851
|
data: recoveryData,
|
|
10629
10852
|
isFetching: isRecoveryRefreshing
|
|
10630
10853
|
// error: recoveryError
|
|
10631
|
-
} =
|
|
10854
|
+
} = useQuery13({
|
|
10632
10855
|
enabled: !!userId,
|
|
10633
10856
|
queryKey: [KEYSHARE_RECOVERY_STATS_QUERY, userId],
|
|
10634
10857
|
queryFn: async () => {
|
|
@@ -10727,7 +10950,7 @@ function SecurityMenu() {
|
|
|
10727
10950
|
] }),
|
|
10728
10951
|
/* @__PURE__ */ jsxs45("div", { className: "space-y-2 text-center", children: [
|
|
10729
10952
|
/* @__PURE__ */ jsxs45("div", { className: "flex items-center justify-center gap-[var(--l-pass-gap)]", children: [
|
|
10730
|
-
/* @__PURE__ */ jsx54(
|
|
10953
|
+
/* @__PURE__ */ jsx54(Shield2, { className: "h-4 w-4" }),
|
|
10731
10954
|
/* @__PURE__ */ jsx54("span", { className: "text-xs font-medium", children: "Vault" })
|
|
10732
10955
|
] }),
|
|
10733
10956
|
/* @__PURE__ */ jsxs45(
|
|
@@ -10873,22 +11096,22 @@ function SecurityMenu() {
|
|
|
10873
11096
|
}
|
|
10874
11097
|
|
|
10875
11098
|
// src/internal/components/SendRecieveMenu/SendLumiaMenu.tsx
|
|
10876
|
-
import { AlertCircle as
|
|
10877
|
-
import { useEffect as useEffect25, useState as
|
|
11099
|
+
import { AlertCircle as AlertCircle5, ArrowLeft as ArrowLeft13, CheckCircle2 as CheckCircle24, Loader as Loader18, Wallet as Wallet3 } from "lucide-react";
|
|
11100
|
+
import { useEffect as useEffect25, useState as useState13 } from "react";
|
|
10878
11101
|
import { isAddress as isAddress2 } from "viem";
|
|
10879
|
-
import { useBalance as
|
|
11102
|
+
import { useBalance as useBalance4 } from "wagmi";
|
|
10880
11103
|
|
|
10881
11104
|
// src/hooks/useSendTransaction.ts
|
|
10882
|
-
import { useCallback as
|
|
11105
|
+
import { useCallback as useCallback14, useState as useState12 } from "react";
|
|
10883
11106
|
import { isAddress, parseEther as parseEther2 } from "viem";
|
|
10884
11107
|
init_account();
|
|
10885
11108
|
function useSendTransaction() {
|
|
10886
11109
|
const session = useLumiaPassportSession((st) => st.session);
|
|
10887
11110
|
const address = useLumiaPassportSession((st) => st.address);
|
|
10888
|
-
const [isLoading, setIsLoading] =
|
|
10889
|
-
const [error, setError] =
|
|
10890
|
-
const [userOpHash, setUserOpHash] =
|
|
10891
|
-
const sendTransaction =
|
|
11111
|
+
const [isLoading, setIsLoading] = useState12(false);
|
|
11112
|
+
const [error, setError] = useState12(null);
|
|
11113
|
+
const [userOpHash, setUserOpHash] = useState12(null);
|
|
11114
|
+
const sendTransaction = useCallback14(
|
|
10892
11115
|
async (params) => {
|
|
10893
11116
|
if (!session || !address) {
|
|
10894
11117
|
setError("No active session");
|
|
@@ -10928,7 +11151,7 @@ function useSendTransaction() {
|
|
|
10928
11151
|
},
|
|
10929
11152
|
[session, address]
|
|
10930
11153
|
);
|
|
10931
|
-
const reset =
|
|
11154
|
+
const reset = useCallback14(() => {
|
|
10932
11155
|
setError(null);
|
|
10933
11156
|
setUserOpHash(null);
|
|
10934
11157
|
setIsLoading(false);
|
|
@@ -10942,9 +11165,170 @@ function useSendTransaction() {
|
|
|
10942
11165
|
};
|
|
10943
11166
|
}
|
|
10944
11167
|
|
|
11168
|
+
// src/modules/assets.ts
|
|
11169
|
+
init_base();
|
|
11170
|
+
import React8 from "react";
|
|
11171
|
+
import { useBalance as useBalance3, useReadContract, useReadContracts } from "wagmi";
|
|
11172
|
+
import { formatUnits as formatUnits2, erc20Abi } from "viem";
|
|
11173
|
+
var COMMON_TOKENS = [
|
|
11174
|
+
// Add real token addresses here when available
|
|
11175
|
+
// {
|
|
11176
|
+
// address: '0x....',
|
|
11177
|
+
// name: 'USD Coin',
|
|
11178
|
+
// symbol: 'USDC',
|
|
11179
|
+
// decimals: 6,
|
|
11180
|
+
// logo: 'https://...'
|
|
11181
|
+
// }
|
|
11182
|
+
];
|
|
11183
|
+
function useAssets(address) {
|
|
11184
|
+
const { data: nativeBalance, isLoading: nativeBalanceLoading, refetch: refetchNativeBalance } = useBalance3({
|
|
11185
|
+
address,
|
|
11186
|
+
chainId: lumiaBeam.id,
|
|
11187
|
+
query: {
|
|
11188
|
+
enabled: !!address
|
|
11189
|
+
}
|
|
11190
|
+
});
|
|
11191
|
+
const tokenContracts = COMMON_TOKENS.map((token) => ({
|
|
11192
|
+
address: token.address,
|
|
11193
|
+
abi: erc20Abi,
|
|
11194
|
+
functionName: "balanceOf",
|
|
11195
|
+
args: [address],
|
|
11196
|
+
chainId: lumiaBeam.id
|
|
11197
|
+
}));
|
|
11198
|
+
const readContractsResult = useReadContracts({
|
|
11199
|
+
contracts: tokenContracts,
|
|
11200
|
+
query: {
|
|
11201
|
+
enabled: !!address && COMMON_TOKENS.length > 0
|
|
11202
|
+
}
|
|
11203
|
+
});
|
|
11204
|
+
const { data: tokenBalances, isLoading: tokenBalancesLoading, refetch: refetchTokenBalances } = readContractsResult;
|
|
11205
|
+
const getAllAssets = () => {
|
|
11206
|
+
const assets = [];
|
|
11207
|
+
if (nativeBalance) {
|
|
11208
|
+
assets.push({
|
|
11209
|
+
type: "native",
|
|
11210
|
+
name: "Lumia",
|
|
11211
|
+
symbol: "LUMIA",
|
|
11212
|
+
balance: nativeBalance.value.toString(),
|
|
11213
|
+
formattedBalance: parseFloat(nativeBalance.formatted).toFixed(4),
|
|
11214
|
+
decimals: 18
|
|
11215
|
+
});
|
|
11216
|
+
}
|
|
11217
|
+
if (tokenBalances && COMMON_TOKENS.length > 0) {
|
|
11218
|
+
tokenBalances.forEach((balance, index) => {
|
|
11219
|
+
const token = COMMON_TOKENS[index];
|
|
11220
|
+
if (balance.status === "success" && balance.result) {
|
|
11221
|
+
const balanceValue = balance.result;
|
|
11222
|
+
const formattedBalance = formatUnits2(balanceValue, token.decimals);
|
|
11223
|
+
assets.push({
|
|
11224
|
+
type: "erc20",
|
|
11225
|
+
address: token.address,
|
|
11226
|
+
name: token.name,
|
|
11227
|
+
symbol: token.symbol,
|
|
11228
|
+
balance: balanceValue.toString(),
|
|
11229
|
+
formattedBalance: parseFloat(formattedBalance).toFixed(4),
|
|
11230
|
+
decimals: token.decimals,
|
|
11231
|
+
logo: token.logo
|
|
11232
|
+
});
|
|
11233
|
+
}
|
|
11234
|
+
});
|
|
11235
|
+
}
|
|
11236
|
+
return assets;
|
|
11237
|
+
};
|
|
11238
|
+
const getTokenBalance = (tokenAddress) => {
|
|
11239
|
+
const tokenIndex = COMMON_TOKENS.findIndex(
|
|
11240
|
+
(token2) => token2.address.toLowerCase() === tokenAddress.toLowerCase()
|
|
11241
|
+
);
|
|
11242
|
+
if (tokenIndex === -1 || !tokenBalances?.[tokenIndex]) {
|
|
11243
|
+
return null;
|
|
11244
|
+
}
|
|
11245
|
+
const balance = tokenBalances[tokenIndex];
|
|
11246
|
+
const token = COMMON_TOKENS[tokenIndex];
|
|
11247
|
+
if (balance.status === "success" && balance.result) {
|
|
11248
|
+
const balanceValue = balance.result;
|
|
11249
|
+
const formattedBalance = formatUnits2(balanceValue, token.decimals);
|
|
11250
|
+
return {
|
|
11251
|
+
address: token.address,
|
|
11252
|
+
name: token.name,
|
|
11253
|
+
symbol: token.symbol,
|
|
11254
|
+
decimals: token.decimals,
|
|
11255
|
+
balance: balanceValue.toString(),
|
|
11256
|
+
formattedBalance: parseFloat(formattedBalance).toFixed(4),
|
|
11257
|
+
logo: token.logo
|
|
11258
|
+
};
|
|
11259
|
+
}
|
|
11260
|
+
return null;
|
|
11261
|
+
};
|
|
11262
|
+
const refreshBalances = async () => {
|
|
11263
|
+
await Promise.all([
|
|
11264
|
+
refetchNativeBalance(),
|
|
11265
|
+
refetchTokenBalances()
|
|
11266
|
+
]);
|
|
11267
|
+
};
|
|
11268
|
+
return {
|
|
11269
|
+
nativeBalance,
|
|
11270
|
+
tokenBalances,
|
|
11271
|
+
assets: getAllAssets(),
|
|
11272
|
+
getTokenBalance,
|
|
11273
|
+
refreshBalances,
|
|
11274
|
+
isLoading: nativeBalanceLoading || tokenBalancesLoading,
|
|
11275
|
+
isConnected: !!address
|
|
11276
|
+
};
|
|
11277
|
+
}
|
|
11278
|
+
function useTokenInfo(tokenAddress) {
|
|
11279
|
+
const readContractsResult = useReadContracts({
|
|
11280
|
+
contracts: [
|
|
11281
|
+
{ address: tokenAddress, abi: erc20Abi, functionName: "name", chainId: lumiaBeam.id },
|
|
11282
|
+
{ address: tokenAddress, abi: erc20Abi, functionName: "symbol", chainId: lumiaBeam.id },
|
|
11283
|
+
{ address: tokenAddress, abi: erc20Abi, functionName: "decimals", chainId: lumiaBeam.id }
|
|
11284
|
+
]
|
|
11285
|
+
});
|
|
11286
|
+
const { data: tokenData, isLoading } = readContractsResult;
|
|
11287
|
+
if (!tokenData || isLoading) {
|
|
11288
|
+
return { isLoading, tokenInfo: null };
|
|
11289
|
+
}
|
|
11290
|
+
const [nameResult, symbolResult, decimalsResult] = tokenData;
|
|
11291
|
+
if (nameResult.status === "success" && symbolResult.status === "success" && decimalsResult.status === "success") {
|
|
11292
|
+
return {
|
|
11293
|
+
isLoading: false,
|
|
11294
|
+
tokenInfo: {
|
|
11295
|
+
name: nameResult.result,
|
|
11296
|
+
symbol: symbolResult.result,
|
|
11297
|
+
decimals: decimalsResult.result,
|
|
11298
|
+
address: tokenAddress
|
|
11299
|
+
}
|
|
11300
|
+
};
|
|
11301
|
+
}
|
|
11302
|
+
return { isLoading: false, tokenInfo: null };
|
|
11303
|
+
}
|
|
11304
|
+
function useTokenBalance(tokenAddress, userAddress) {
|
|
11305
|
+
const { data: balance, isLoading, refetch } = useReadContract({
|
|
11306
|
+
address: tokenAddress,
|
|
11307
|
+
abi: erc20Abi,
|
|
11308
|
+
functionName: "balanceOf",
|
|
11309
|
+
args: userAddress ? [userAddress] : void 0,
|
|
11310
|
+
chainId: lumiaBeam.id,
|
|
11311
|
+
query: {
|
|
11312
|
+
enabled: !!userAddress
|
|
11313
|
+
}
|
|
11314
|
+
});
|
|
11315
|
+
const { tokenInfo } = useTokenInfo(tokenAddress);
|
|
11316
|
+
const formattedBalance = React8.useMemo(() => {
|
|
11317
|
+
if (!balance || !tokenInfo) return "0";
|
|
11318
|
+
return formatUnits2(balance, tokenInfo.decimals);
|
|
11319
|
+
}, [balance, tokenInfo]);
|
|
11320
|
+
return {
|
|
11321
|
+
balance,
|
|
11322
|
+
formattedBalance,
|
|
11323
|
+
tokenInfo,
|
|
11324
|
+
isLoading,
|
|
11325
|
+
refetch
|
|
11326
|
+
};
|
|
11327
|
+
}
|
|
11328
|
+
|
|
10945
11329
|
// src/internal/components/SendRecieveMenu/SendLumiaMenu.tsx
|
|
10946
11330
|
init_base();
|
|
10947
|
-
import { Fragment as
|
|
11331
|
+
import { Fragment as Fragment16, jsx as jsx55, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
10948
11332
|
function SendLumiaMenu() {
|
|
10949
11333
|
const page = useLayoutDataStore((st) => st.page);
|
|
10950
11334
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
@@ -10952,14 +11336,14 @@ function SendLumiaMenu() {
|
|
|
10952
11336
|
const address = useLumiaPassportSession((st) => st.address);
|
|
10953
11337
|
const { assets } = useAssets(address);
|
|
10954
11338
|
const { sendTransaction, isLoading, error, userOpHash, reset } = useSendTransaction();
|
|
10955
|
-
const { refetch: refetchBalance } =
|
|
11339
|
+
const { refetch: refetchBalance } = useBalance4({
|
|
10956
11340
|
address,
|
|
10957
11341
|
chainId: lumiaBeam.id
|
|
10958
11342
|
});
|
|
10959
|
-
const [recipient, setRecipient] =
|
|
10960
|
-
const [amount, setAmount] =
|
|
10961
|
-
const [txStep, setTxStep] =
|
|
10962
|
-
const [validationError, setValidationError] =
|
|
11343
|
+
const [recipient, setRecipient] = useState13("");
|
|
11344
|
+
const [amount, setAmount] = useState13("");
|
|
11345
|
+
const [txStep, setTxStep] = useState13("input");
|
|
11346
|
+
const [validationError, setValidationError] = useState13(null);
|
|
10963
11347
|
const nativeAsset = assets.find((a) => a.type === "native");
|
|
10964
11348
|
const balance = nativeAsset ? parseFloat(nativeAsset.formattedBalance) : 0;
|
|
10965
11349
|
useEffect25(() => {
|
|
@@ -11022,13 +11406,13 @@ function SendLumiaMenu() {
|
|
|
11022
11406
|
txStep === "input" && /* @__PURE__ */ jsx55(Button, { variant: "ghost", size: "icon", title: "Back", onClick: () => setPage("main-menu" /* MAIN_MENU */), children: /* @__PURE__ */ jsx55(ArrowLeft13, { className: "h-4 w-4" }) }),
|
|
11023
11407
|
/* @__PURE__ */ jsx55("span", { className: "text-xl font-semibold", children: "Send LUMIA" })
|
|
11024
11408
|
] }),
|
|
11025
|
-
txStep === "input" && /* @__PURE__ */ jsxs46(
|
|
11409
|
+
txStep === "input" && /* @__PURE__ */ jsxs46(Fragment16, { children: [
|
|
11026
11410
|
/* @__PURE__ */ jsxs46("div", { className: "w-full flex flex-col gap-2", children: [
|
|
11027
11411
|
/* @__PURE__ */ jsx55("span", { className: "block text-sm font-medium mb-2 text-[var(--l-pass-fg-muted)]", children: "Recipient Address" }),
|
|
11028
11412
|
/* @__PURE__ */ jsx55(
|
|
11029
11413
|
Input,
|
|
11030
11414
|
{
|
|
11031
|
-
Icon:
|
|
11415
|
+
Icon: Wallet3,
|
|
11032
11416
|
type: "text",
|
|
11033
11417
|
value: recipient,
|
|
11034
11418
|
onChange: (e) => setRecipient(e.target.value),
|
|
@@ -11071,12 +11455,12 @@ function SendLumiaMenu() {
|
|
|
11071
11455
|
] })
|
|
11072
11456
|
] }),
|
|
11073
11457
|
(validationError || error) && /* @__PURE__ */ jsxs46("div", { className: "flex items-center gap-2 p-3 bg-[var(--l-pass-bg-error)] text-[var(--l-pass-error)] rounded-[var(--l-pass-el-bdrs)]", children: [
|
|
11074
|
-
/* @__PURE__ */ jsx55(
|
|
11458
|
+
/* @__PURE__ */ jsx55(AlertCircle5, { className: "h-4 w-4" }),
|
|
11075
11459
|
/* @__PURE__ */ jsx55("span", { className: "text-sm", children: validationError || error })
|
|
11076
11460
|
] }),
|
|
11077
11461
|
/* @__PURE__ */ jsx55(Button, { onClick: handleSend, disabled: isLoading, className: "w-full", size: "large", children: "Continue" })
|
|
11078
11462
|
] }),
|
|
11079
|
-
txStep === "confirm" && /* @__PURE__ */ jsxs46(
|
|
11463
|
+
txStep === "confirm" && /* @__PURE__ */ jsxs46(Fragment16, { children: [
|
|
11080
11464
|
/* @__PURE__ */ jsxs46("div", { className: "bg-gray-50 rounded-lg p-4", children: [
|
|
11081
11465
|
/* @__PURE__ */ jsx55("h3", { className: "font-medium mb-3", children: "Transaction Details" }),
|
|
11082
11466
|
/* @__PURE__ */ jsxs46("div", { className: "space-y-2 text-sm", children: [
|
|
@@ -11112,7 +11496,7 @@ function SendLumiaMenu() {
|
|
|
11112
11496
|
/* @__PURE__ */ jsx55("span", { className: "block text-sm mt-1", children: "Please wait while we process your transaction" })
|
|
11113
11497
|
] })
|
|
11114
11498
|
] }),
|
|
11115
|
-
txStep === "success" && userOpHash && /* @__PURE__ */ jsxs46(
|
|
11499
|
+
txStep === "success" && userOpHash && /* @__PURE__ */ jsxs46(Fragment16, { children: [
|
|
11116
11500
|
/* @__PURE__ */ jsxs46("div", { className: "text-center py-4", children: [
|
|
11117
11501
|
/* @__PURE__ */ jsx55(CheckCircle24, { className: "h-12 w-12 text-[var(--l-pass-success)] mx-auto mb-3" }),
|
|
11118
11502
|
/* @__PURE__ */ jsx55("p", { className: "font-medium", children: "Transaction Sent!" }),
|
|
@@ -11127,16 +11511,16 @@ function SendLumiaMenu() {
|
|
|
11127
11511
|
init_clients();
|
|
11128
11512
|
import { ArrowLeft as ArrowLeft14, CheckCircle2 as CheckCircle25, Copy as Copy2, Loader as Loader19 } from "lucide-react";
|
|
11129
11513
|
import QRCode from "qrcode";
|
|
11130
|
-
import { useCallback as
|
|
11131
|
-
import { Fragment as
|
|
11514
|
+
import { useCallback as useCallback15, useEffect as useEffect26, useState as useState14 } from "react";
|
|
11515
|
+
import { Fragment as Fragment17, jsx as jsx56, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
11132
11516
|
function ReceiveLumiaMenu() {
|
|
11133
11517
|
const address = useLumiaPassportSession((st) => st.address);
|
|
11134
11518
|
const page = useLayoutDataStore((st) => st.page);
|
|
11135
11519
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
11136
11520
|
const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight);
|
|
11137
11521
|
const open = page === "receive";
|
|
11138
|
-
const [qrCodeUrl, setQrCodeUrl] =
|
|
11139
|
-
const [copied, setCopied] =
|
|
11522
|
+
const [qrCodeUrl, setQrCodeUrl] = useState14("");
|
|
11523
|
+
const [copied, setCopied] = useState14(false);
|
|
11140
11524
|
useEffect26(() => {
|
|
11141
11525
|
if (open && address) {
|
|
11142
11526
|
QRCode.toDataURL(address, {
|
|
@@ -11150,7 +11534,7 @@ function ReceiveLumiaMenu() {
|
|
|
11150
11534
|
});
|
|
11151
11535
|
}
|
|
11152
11536
|
}, [open, address]);
|
|
11153
|
-
const handleCopy =
|
|
11537
|
+
const handleCopy = useCallback15(async () => {
|
|
11154
11538
|
if (!address) return;
|
|
11155
11539
|
try {
|
|
11156
11540
|
await navigator.clipboard.writeText(address);
|
|
@@ -11180,10 +11564,10 @@ function ReceiveLumiaMenu() {
|
|
|
11180
11564
|
/* @__PURE__ */ jsx56("div", { className: "flex items-center justify-center p-[var(--l-pass-pd)]", style: { minHeight: "216px" }, children: qrCodeUrl ? /* @__PURE__ */ jsx56("img", { src: qrCodeUrl, alt: "Wallet QR Code", className: "w-48 h-48" }) : /* @__PURE__ */ jsx56(Loader19, { className: "w-5 h-5 animate-spin text-[var(--l-pass-fg-muted)]" }) }),
|
|
11181
11565
|
/* @__PURE__ */ jsxs47(Highlight, { type: "info", children: [
|
|
11182
11566
|
/* @__PURE__ */ jsx56("span", { className: "block w-full text-center font-mono text-[10px] break-all mb-2", children: address }),
|
|
11183
|
-
/* @__PURE__ */ jsx56(Button, { onClick: handleCopy, className: "w-full", size: "medium", children: copied ? /* @__PURE__ */ jsxs47(
|
|
11567
|
+
/* @__PURE__ */ jsx56(Button, { onClick: handleCopy, className: "w-full", size: "medium", children: copied ? /* @__PURE__ */ jsxs47(Fragment17, { children: [
|
|
11184
11568
|
/* @__PURE__ */ jsx56(CheckCircle25, { className: "h-4 w-4" }),
|
|
11185
11569
|
/* @__PURE__ */ jsx56("span", { children: "Copied!" })
|
|
11186
|
-
] }) : /* @__PURE__ */ jsxs47(
|
|
11570
|
+
] }) : /* @__PURE__ */ jsxs47(Fragment17, { children: [
|
|
11187
11571
|
/* @__PURE__ */ jsx56(Copy2, { className: "h-4 w-4" }),
|
|
11188
11572
|
/* @__PURE__ */ jsx56("span", { children: "Copy Address" })
|
|
11189
11573
|
] }) })
|
|
@@ -11289,9 +11673,9 @@ function TermsOfService() {
|
|
|
11289
11673
|
}
|
|
11290
11674
|
|
|
11291
11675
|
// src/internal/components/TransactionsMenu/TransactionsMenu.tsx
|
|
11292
|
-
import { useQuery as
|
|
11676
|
+
import { useQuery as useQuery14, useQueryClient as useQueryClient18 } from "@tanstack/react-query";
|
|
11293
11677
|
import { ArrowLeft as ArrowLeft17, Loader as Loader20, RefreshCw as RefreshCw3, XCircle as XCircle2 } from "lucide-react";
|
|
11294
|
-
import { useCallback as
|
|
11678
|
+
import { useCallback as useCallback16, useState as useState15 } from "react";
|
|
11295
11679
|
|
|
11296
11680
|
// src/internal/components/TransactionsMenu/api.ts
|
|
11297
11681
|
init_base();
|
|
@@ -11640,7 +12024,7 @@ var formatTimestamp = (timestampMs) => {
|
|
|
11640
12024
|
};
|
|
11641
12025
|
|
|
11642
12026
|
// src/internal/components/TransactionsMenu/TransactionsGroup.tsx
|
|
11643
|
-
import { Fragment as
|
|
12027
|
+
import { Fragment as Fragment18, jsx as jsx61, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
11644
12028
|
function InternalTransaction({ internal, assetSymbol, assetDecimals }) {
|
|
11645
12029
|
const internalSymbol = internal.assetSymbol || assetSymbol;
|
|
11646
12030
|
const internalDecimals = internal.decimals ?? assetDecimals;
|
|
@@ -11717,7 +12101,7 @@ function TransactionsGroup(props) {
|
|
|
11717
12101
|
)
|
|
11718
12102
|
] })
|
|
11719
12103
|
] }),
|
|
11720
|
-
internalsToRender.length > 0 && /* @__PURE__ */ jsxs51(
|
|
12104
|
+
internalsToRender.length > 0 && /* @__PURE__ */ jsxs51(Fragment18, { children: [
|
|
11721
12105
|
/* @__PURE__ */ jsxs51("div", { className: "w-full flex items-center", children: [
|
|
11722
12106
|
/* @__PURE__ */ jsx61("div", { style: { borderTop: "1px solid var(--l-pass-bd)" }, className: "flex-1" }),
|
|
11723
12107
|
/* @__PURE__ */ jsx61("div", { className: "flex-none font-bold px-2 text-xs leading-4 text-[var(--l-pass-fg-muted)]", children: "Internals" }),
|
|
@@ -11772,19 +12156,19 @@ function TransactionsMenu() {
|
|
|
11772
12156
|
const page = useLayoutDataStore((st) => st.page);
|
|
11773
12157
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
11774
12158
|
const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight);
|
|
11775
|
-
const [expandedGroups, setExpandedGroups] =
|
|
12159
|
+
const [expandedGroups, setExpandedGroups] = useState15({});
|
|
11776
12160
|
const {
|
|
11777
12161
|
data: txHistoryGroups = [],
|
|
11778
12162
|
isLoading: isTxHistoryLoading,
|
|
11779
12163
|
isFetching: isTxHistoryFetching,
|
|
11780
12164
|
error: txHistoryError
|
|
11781
|
-
} =
|
|
12165
|
+
} = useQuery14({
|
|
11782
12166
|
retry: false,
|
|
11783
12167
|
enabled: !!address && page === "transactions",
|
|
11784
12168
|
queryKey: [TRANSACTIONS_HISTORY_QUERY_KEY, address],
|
|
11785
12169
|
queryFn: () => getTransactionsListQuery(address)
|
|
11786
12170
|
});
|
|
11787
|
-
const refreshTxHistory =
|
|
12171
|
+
const refreshTxHistory = useCallback16(
|
|
11788
12172
|
() => qc.invalidateQueries({ queryKey: [TRANSACTIONS_HISTORY_QUERY_KEY, address] }),
|
|
11789
12173
|
[qc, address]
|
|
11790
12174
|
);
|
|
@@ -11944,7 +12328,7 @@ function usePageMapper() {
|
|
|
11944
12328
|
setIsDialogOpen,
|
|
11945
12329
|
setIsDialogClosing
|
|
11946
12330
|
} = useLayoutStore();
|
|
11947
|
-
const closeDialog =
|
|
12331
|
+
const closeDialog = useCallback17(() => {
|
|
11948
12332
|
setIsDialogClosing(true);
|
|
11949
12333
|
setTimeout(() => {
|
|
11950
12334
|
setDialogContent(null);
|
|
@@ -11955,7 +12339,7 @@ function usePageMapper() {
|
|
|
11955
12339
|
setIsDialogOpen(false);
|
|
11956
12340
|
}, CLEAR_DIALOG_TIMEOUT);
|
|
11957
12341
|
}, [setDialogContent, setDialogDescription, setDialogTitle, setIsDialogForced, setIsDialogOpen, setIsDialogClosing]);
|
|
11958
|
-
const openDialog =
|
|
12342
|
+
const openDialog = useCallback17(
|
|
11959
12343
|
(pageItem) => {
|
|
11960
12344
|
const PageContentComponent = pageItem.component;
|
|
11961
12345
|
setDialogTitle(pageItem.title);
|
|
@@ -12056,6 +12440,7 @@ function LumiaPassportDialog() {
|
|
|
12056
12440
|
useBackupStatusChanges();
|
|
12057
12441
|
useDetectMaxScrollHeight();
|
|
12058
12442
|
useSettingsNotifications();
|
|
12443
|
+
useListenIframeAuthEvents();
|
|
12059
12444
|
useBackupWarning();
|
|
12060
12445
|
useWalletStatus();
|
|
12061
12446
|
return /* @__PURE__ */ jsx64(
|
|
@@ -12089,7 +12474,7 @@ function LumiaPassportDialog() {
|
|
|
12089
12474
|
}
|
|
12090
12475
|
|
|
12091
12476
|
// src/internal/components/TssManager.tsx
|
|
12092
|
-
import React10, { useCallback as
|
|
12477
|
+
import React10, { useCallback as useCallback18 } from "react";
|
|
12093
12478
|
init_auth();
|
|
12094
12479
|
init_clients();
|
|
12095
12480
|
var TssManagerWithRef = React10.forwardRef((props, ref) => {
|
|
@@ -12098,7 +12483,7 @@ var TssManagerWithRef = React10.forwardRef((props, ref) => {
|
|
|
12098
12483
|
const setStatus = useLumiaPassportSession((st) => st.setStatus);
|
|
12099
12484
|
const setSession = useLumiaPassportSession((st) => st.setSession);
|
|
12100
12485
|
const setAddress = useLumiaPassportSession((st) => st.setAddress);
|
|
12101
|
-
const onSessionCreated =
|
|
12486
|
+
const onSessionCreated = useCallback18(
|
|
12102
12487
|
(session, address) => {
|
|
12103
12488
|
setSession(session);
|
|
12104
12489
|
setAddress(address);
|
|
@@ -12133,48 +12518,52 @@ var TssManagerWithRef = React10.forwardRef((props, ref) => {
|
|
|
12133
12518
|
// src/internal/components/WalletConnectHandler.tsx
|
|
12134
12519
|
init_wallet();
|
|
12135
12520
|
import { useConnectModal } from "@rainbow-me/rainbowkit";
|
|
12136
|
-
import { useQueryClient as useQueryClient19 } from "@tanstack/react-query";
|
|
12137
|
-
import React11, { useCallback as
|
|
12521
|
+
import { useMutation as useMutation15, useQueryClient as useQueryClient19 } from "@tanstack/react-query";
|
|
12522
|
+
import React11, { useCallback as useCallback19, useEffect as useEffect32 } from "react";
|
|
12138
12523
|
import { useAccount, useDisconnect, useSignMessage } from "wagmi";
|
|
12139
12524
|
function WalletConnectHandler() {
|
|
12140
12525
|
const qc = useQueryClient19();
|
|
12141
|
-
const
|
|
12142
|
-
const
|
|
12526
|
+
const callbacks = useLumiaPassportConfig().callbacks;
|
|
12527
|
+
const passportWalletAddress = useLumiaPassportSession((st) => st.address);
|
|
12143
12528
|
const { address: walletAddress, isConnected, chain, connector } = useAccount();
|
|
12529
|
+
const { openConnectModal, connectModalOpen } = useConnectModal();
|
|
12144
12530
|
const { disconnect } = useDisconnect();
|
|
12145
12531
|
const { signMessageAsync } = useSignMessage();
|
|
12532
|
+
const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking);
|
|
12146
12533
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
12147
|
-
const
|
|
12148
|
-
const
|
|
12149
|
-
|
|
12150
|
-
|
|
12151
|
-
|
|
12152
|
-
|
|
12153
|
-
const onLinkingComplete = useCallback18(
|
|
12534
|
+
const setIsWalletLinking = useLayoutDataStore((st) => st.setIsWalletLinking);
|
|
12535
|
+
const setAuthError = useAuthStore((st) => st.setAlert);
|
|
12536
|
+
const setManageWalletLinkError = useManageWalletStore((st) => st.setLinkError);
|
|
12537
|
+
const setLinkIsLoading = useManageWalletStore((st) => st.setLinkIsLoading);
|
|
12538
|
+
const setProviderType = useManageWalletStore((st) => st.setProviderType);
|
|
12539
|
+
const onLinkingComplete = useCallback19(
|
|
12154
12540
|
async (success) => {
|
|
12155
|
-
console.log("[WalletConnectHandler] onLinkingComplete called:", { success, userAddress });
|
|
12156
12541
|
setIsWalletLinking(false);
|
|
12542
|
+
if (!success && !passportWalletAddress) {
|
|
12543
|
+
setProviderType(null);
|
|
12544
|
+
setPage("auth" /* AUTH */);
|
|
12545
|
+
return;
|
|
12546
|
+
}
|
|
12547
|
+
if (!success && passportWalletAddress) {
|
|
12548
|
+
setProviderType(null);
|
|
12549
|
+
setPage("manage-wallet" /* MANAGE_WALLET */);
|
|
12550
|
+
return;
|
|
12551
|
+
}
|
|
12157
12552
|
setProviderType(null);
|
|
12158
12553
|
setPage("manage-wallet" /* MANAGE_WALLET */);
|
|
12159
|
-
|
|
12160
|
-
|
|
12161
|
-
|
|
12162
|
-
|
|
12163
|
-
|
|
12164
|
-
|
|
12165
|
-
|
|
12166
|
-
|
|
12167
|
-
try {
|
|
12168
|
-
callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, userAddress]) });
|
|
12169
|
-
} catch {
|
|
12170
|
-
}
|
|
12554
|
+
await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, passportWalletAddress], refetchType: "active" });
|
|
12555
|
+
await qc.invalidateQueries({
|
|
12556
|
+
queryKey: [LINKED_PROFILES_QUERY_KEY, passportWalletAddress],
|
|
12557
|
+
refetchType: "active"
|
|
12558
|
+
});
|
|
12559
|
+
try {
|
|
12560
|
+
callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, passportWalletAddress]) });
|
|
12561
|
+
} catch {
|
|
12171
12562
|
}
|
|
12172
12563
|
},
|
|
12173
|
-
[qc,
|
|
12564
|
+
[qc, passportWalletAddress, callbacks, setProviderType, setPage, setIsWalletLinking]
|
|
12174
12565
|
);
|
|
12175
|
-
const { openConnectModal, connectModalOpen } = useConnectModal();
|
|
12176
12566
|
const [hasStartedLinking, setHasStartedLinking] = React11.useState(false);
|
|
12177
|
-
const timeoutRef = React11.useRef();
|
|
12178
12567
|
useEffect32(() => {
|
|
12179
12568
|
if (isWalletLinking && !hasStartedLinking) {
|
|
12180
12569
|
setHasStartedLinking(true);
|
|
@@ -12182,94 +12571,101 @@ function WalletConnectHandler() {
|
|
|
12182
12571
|
if (isConnected) {
|
|
12183
12572
|
disconnect();
|
|
12184
12573
|
setTimeout(() => {
|
|
12185
|
-
if (openConnectModal) {
|
|
12186
|
-
setPage(null);
|
|
12187
|
-
openConnectModal();
|
|
12188
|
-
}
|
|
12189
|
-
}, 500);
|
|
12190
|
-
} else {
|
|
12191
|
-
if (openConnectModal) {
|
|
12192
12574
|
setPage(null);
|
|
12193
12575
|
openConnectModal();
|
|
12194
|
-
}
|
|
12576
|
+
}, 500);
|
|
12577
|
+
} else {
|
|
12578
|
+
setPage(null);
|
|
12579
|
+
openConnectModal();
|
|
12195
12580
|
}
|
|
12196
12581
|
}
|
|
12197
12582
|
if (!isWalletLinking && hasStartedLinking) {
|
|
12198
12583
|
setHasStartedLinking(false);
|
|
12199
|
-
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
12200
12584
|
if (isConnected) disconnect();
|
|
12201
12585
|
}
|
|
12202
12586
|
}, [isWalletLinking, hasStartedLinking, isConnected, openConnectModal, disconnect, setPage, setProviderType]);
|
|
12203
12587
|
useEffect32(() => {
|
|
12204
|
-
console.log("[WalletConnectHandler] Modal state check:", {
|
|
12205
|
-
hasStartedLinking,
|
|
12206
|
-
connectModalOpen,
|
|
12207
|
-
isConnected,
|
|
12208
|
-
isWalletLinking
|
|
12209
|
-
});
|
|
12210
12588
|
if (hasStartedLinking && !connectModalOpen && !isConnected && isWalletLinking) {
|
|
12211
|
-
console.log("[WalletConnectHandler] Modal closed without connecting
|
|
12589
|
+
console.log("[WalletConnectHandler] Modal closed without connecting");
|
|
12212
12590
|
onLinkingComplete(false);
|
|
12213
12591
|
setHasStartedLinking(false);
|
|
12214
12592
|
}
|
|
12215
12593
|
}, [connectModalOpen, hasStartedLinking, isConnected, isWalletLinking]);
|
|
12216
|
-
|
|
12217
|
-
|
|
12218
|
-
|
|
12219
|
-
|
|
12220
|
-
|
|
12221
|
-
|
|
12222
|
-
|
|
12223
|
-
|
|
12224
|
-
|
|
12225
|
-
|
|
12226
|
-
|
|
12227
|
-
|
|
12228
|
-
|
|
12229
|
-
|
|
12230
|
-
|
|
12231
|
-
|
|
12232
|
-
try {
|
|
12594
|
+
const { mutate: handleWalletSign, isPending: isWalletSigning } = useMutation15({
|
|
12595
|
+
mutationFn: async (payload) => {
|
|
12596
|
+
const { chainId, signingWalletAddress } = payload;
|
|
12597
|
+
if (!signingWalletAddress || !chainId) {
|
|
12598
|
+
disconnect();
|
|
12599
|
+
if (passportWalletAddress) {
|
|
12600
|
+
setManageWalletLinkError("Wallet error! No wallet available");
|
|
12601
|
+
} else {
|
|
12602
|
+
setAuthError({ title: "Wallet error", message: "No wallet available" });
|
|
12603
|
+
}
|
|
12604
|
+
setIsWalletLinking(false);
|
|
12605
|
+
setHasStartedLinking(false);
|
|
12606
|
+
onLinkingComplete(false);
|
|
12607
|
+
setPage(passportWalletAddress ? "manage-wallet" /* MANAGE_WALLET */ : "auth" /* AUTH */);
|
|
12608
|
+
return;
|
|
12609
|
+
}
|
|
12233
12610
|
setLinkIsLoading(true);
|
|
12234
|
-
const message = createSignatureMessage(
|
|
12235
|
-
const signature = await signMessageAsync({ message });
|
|
12611
|
+
const message = createSignatureMessage(signingWalletAddress);
|
|
12612
|
+
const signature = await signMessageAsync({ message, account: signingWalletAddress });
|
|
12236
12613
|
if (!signature) {
|
|
12237
12614
|
throw new Error("Failed to get signature");
|
|
12238
12615
|
}
|
|
12239
12616
|
const walletName = connector?.name || "Unknown Wallet";
|
|
12240
12617
|
const walletType = connector?.id || "unknown";
|
|
12241
|
-
|
|
12242
|
-
|
|
12243
|
-
|
|
12244
|
-
|
|
12245
|
-
});
|
|
12246
|
-
await linkWallet({
|
|
12247
|
-
address: walletAddress,
|
|
12618
|
+
return await linkWallet({
|
|
12619
|
+
// chainId: chain.id,
|
|
12620
|
+
chainId,
|
|
12621
|
+
address: signingWalletAddress,
|
|
12248
12622
|
signature,
|
|
12249
12623
|
message,
|
|
12250
|
-
chainId: chain.id,
|
|
12251
12624
|
walletName,
|
|
12252
12625
|
walletType
|
|
12253
12626
|
});
|
|
12627
|
+
},
|
|
12628
|
+
onSuccess: () => {
|
|
12254
12629
|
disconnect();
|
|
12630
|
+
setHasStartedLinking(false);
|
|
12255
12631
|
onLinkingComplete(true);
|
|
12632
|
+
setLinkIsLoading(false);
|
|
12633
|
+
},
|
|
12634
|
+
onError: (err) => {
|
|
12635
|
+
disconnect();
|
|
12636
|
+
setIsWalletLinking(false);
|
|
12637
|
+
onLinkingComplete(false);
|
|
12256
12638
|
setHasStartedLinking(false);
|
|
12257
|
-
|
|
12639
|
+
setLinkIsLoading(false);
|
|
12258
12640
|
const errorMsg = err?.message || "Failed to link wallet";
|
|
12259
12641
|
if (errorMsg.includes("User rejected") || errorMsg.includes("User denied")) {
|
|
12260
|
-
|
|
12642
|
+
if (passportWalletAddress) {
|
|
12643
|
+
setManageWalletLinkError("Signature request was cancelled");
|
|
12644
|
+
} else {
|
|
12645
|
+
setAuthError({ title: "Signature error", message: "Signature request was cancelled" });
|
|
12646
|
+
}
|
|
12261
12647
|
} else if (errorMsg.includes("already linked")) {
|
|
12262
|
-
|
|
12648
|
+
if (passportWalletAddress) {
|
|
12649
|
+
setManageWalletLinkError("This wallet is already linked to another account");
|
|
12650
|
+
} else {
|
|
12651
|
+
setAuthError({ title: "Wallet error", message: "This wallet is already linked to another account" });
|
|
12652
|
+
}
|
|
12263
12653
|
} else {
|
|
12264
|
-
|
|
12654
|
+
if (passportWalletAddress) {
|
|
12655
|
+
setManageWalletLinkError(errorMsg);
|
|
12656
|
+
} else {
|
|
12657
|
+
setAuthError({ title: "Error", message: errorMsg });
|
|
12658
|
+
}
|
|
12265
12659
|
}
|
|
12266
|
-
|
|
12267
|
-
onLinkingComplete(false);
|
|
12268
|
-
setHasStartedLinking(false);
|
|
12269
|
-
} finally {
|
|
12270
|
-
setLinkIsLoading(false);
|
|
12660
|
+
setPage(passportWalletAddress ? "manage-wallet" /* MANAGE_WALLET */ : "auth" /* AUTH */);
|
|
12271
12661
|
}
|
|
12272
|
-
};
|
|
12662
|
+
});
|
|
12663
|
+
useEffect32(() => {
|
|
12664
|
+
if (!!chain?.id && isConnected && walletAddress && isWalletLinking && hasStartedLinking) {
|
|
12665
|
+
console.log("[WalletConnectHandler] handleWalletSign triggered");
|
|
12666
|
+
handleWalletSign({ chainId: chain.id, signingWalletAddress: walletAddress });
|
|
12667
|
+
}
|
|
12668
|
+
}, [chain, isConnected, walletAddress, isWalletLinking, hasStartedLinking]);
|
|
12273
12669
|
return null;
|
|
12274
12670
|
}
|
|
12275
12671
|
|
|
@@ -12300,7 +12696,7 @@ var useLumiaPassportSession = create6((set) => ({
|
|
|
12300
12696
|
}));
|
|
12301
12697
|
function LumiaPassportSessionProvider({ children }) {
|
|
12302
12698
|
const config = useLumiaPassportConfig().config;
|
|
12303
|
-
return /* @__PURE__ */ jsxs54(
|
|
12699
|
+
return /* @__PURE__ */ jsxs54(Fragment19, { children: [
|
|
12304
12700
|
children,
|
|
12305
12701
|
config.current?.wallet?.enabled && /* @__PURE__ */ jsx65(WalletConnectHandler, {}),
|
|
12306
12702
|
/* @__PURE__ */ jsx65(BalanceFeedProvider, {}),
|
|
@@ -12358,8 +12754,8 @@ function LumiaPassportProvider(props) {
|
|
|
12358
12754
|
const setIsIframeReady = useLumiaPassportSession((st) => st.setIsIframeReady);
|
|
12359
12755
|
const setWalletReadyStatus = useLumiaPassportSession((st) => st.setWalletReadyStatus);
|
|
12360
12756
|
useEffect33(() => notifyNoProjetctId(projectId), [projectId]);
|
|
12361
|
-
const config =
|
|
12362
|
-
const updateConfig =
|
|
12757
|
+
const config = useRef13({ projectId, ...DEFAULT_LUMIA_PASSPORT_CONFIG });
|
|
12758
|
+
const updateConfig = useCallback20((updates) => {
|
|
12363
12759
|
const prev = config.current;
|
|
12364
12760
|
const next = { ...prev };
|
|
12365
12761
|
if (updates.projectId !== void 0) next.projectId = updates.projectId;
|
|
@@ -12439,7 +12835,7 @@ function LumiaPassportProvider(props) {
|
|
|
12439
12835
|
console.error("[LumiaPassport] Error setting up iframe manager:", error);
|
|
12440
12836
|
}
|
|
12441
12837
|
}, [projectId, initialConfig, callbacks, updateConfig, setIsIframeReady, setWalletReadyStatus]);
|
|
12442
|
-
const contextValue =
|
|
12838
|
+
const contextValue = useMemo5(() => ({ config, updateConfig, callbacks }), [config, updateConfig, callbacks]);
|
|
12443
12839
|
return /* @__PURE__ */ jsx67(LumiaWagmiProvider, { children: /* @__PURE__ */ jsx67(LumiaPassportContext.Provider, { value: contextValue, children }) });
|
|
12444
12840
|
}
|
|
12445
12841
|
var useLumiaPassportConfig = () => {
|
|
@@ -12449,10 +12845,10 @@ var useLumiaPassportConfig = () => {
|
|
|
12449
12845
|
};
|
|
12450
12846
|
|
|
12451
12847
|
// src/components/ConnectWalletButton.tsx
|
|
12452
|
-
import { Cloud as Cloud4, Laptop as Laptop2, Loader as Loader21, Shield as
|
|
12453
|
-
import { useEffect as useEffect34, useMemo as
|
|
12848
|
+
import { Cloud as Cloud4, Laptop as Laptop2, Loader as Loader21, Shield as Shield3 } from "lucide-react";
|
|
12849
|
+
import { useEffect as useEffect34, useMemo as useMemo6 } from "react";
|
|
12454
12850
|
init_auth();
|
|
12455
|
-
import { Fragment as
|
|
12851
|
+
import { Fragment as Fragment20, jsx as jsx68, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
12456
12852
|
function getFormattedStatus(label, status, showStatus) {
|
|
12457
12853
|
const isStatus = showStatus && status && status !== "idle" && status !== "ready";
|
|
12458
12854
|
if (!isStatus) return label;
|
|
@@ -12474,7 +12870,7 @@ function ConnectWalletButton(props) {
|
|
|
12474
12870
|
useEffect34(() => setUsePaymaster(usePaymaster), [setUsePaymaster, usePaymaster]);
|
|
12475
12871
|
const avatar = jwtTokenManager2.getAvatar();
|
|
12476
12872
|
const displayName = jwtTokenManager2.getDisplayName();
|
|
12477
|
-
const indicators =
|
|
12873
|
+
const indicators = useMemo6(() => {
|
|
12478
12874
|
const userId = jwtTokenManager2.getUserId();
|
|
12479
12875
|
if (!userId) return { server: false, local: false, backup: false };
|
|
12480
12876
|
const server = jwtTokenManager2.getHasKeyshare() ?? false;
|
|
@@ -12484,7 +12880,7 @@ function ConnectWalletButton(props) {
|
|
|
12484
12880
|
const isConnecting = connectButtonLabel !== label || isLoading;
|
|
12485
12881
|
return /* @__PURE__ */ jsx68("div", { "data-lumia-passport-mode": colorMode, className: cn("lumia-scope w-fit h-fit", className), children: !address ? (
|
|
12486
12882
|
/** external Buttons can be provided */
|
|
12487
|
-
/* @__PURE__ */ jsx68(
|
|
12883
|
+
/* @__PURE__ */ jsx68(Fragment20, { children: ConnectButton ? /* @__PURE__ */ jsxs55(
|
|
12488
12884
|
ConnectButton,
|
|
12489
12885
|
{
|
|
12490
12886
|
type: "button",
|
|
@@ -12584,7 +12980,7 @@ function ConnectWalletButton(props) {
|
|
|
12584
12980
|
] }),
|
|
12585
12981
|
/* @__PURE__ */ jsxs55("div", { className: "group relative", children: [
|
|
12586
12982
|
/* @__PURE__ */ jsx68(
|
|
12587
|
-
|
|
12983
|
+
Shield3,
|
|
12588
12984
|
{
|
|
12589
12985
|
className: `w-3 h-3 ${indicators.backup ? "text-[var(--l-pass-bg-success)]" : "text-[var(--l-pass-bg-warning)]"}`
|
|
12590
12986
|
}
|
|
@@ -12646,13 +13042,13 @@ var useLumiaPassportRecoveryUserId = () => useLumiaPassportSession((st) => st.re
|
|
|
12646
13042
|
var useLumiaPassportHasServerVault = () => useLumiaPassportSession((st) => st.hasServerVault);
|
|
12647
13043
|
|
|
12648
13044
|
// src/hooks/useLumiaPassportOpen.ts
|
|
12649
|
-
import { useCallback as
|
|
13045
|
+
import { useCallback as useCallback21 } from "react";
|
|
12650
13046
|
function useLumiaPassportOpen() {
|
|
12651
13047
|
const page = useLayoutDataStore((st) => st.page);
|
|
12652
13048
|
const setPage = useLayoutDataStore((st) => st.setPage);
|
|
12653
13049
|
const setPageParams = useLayoutDataStore((st) => st.setPageParams);
|
|
12654
13050
|
const address = useLumiaPassportSession((st) => st.address);
|
|
12655
|
-
const open =
|
|
13051
|
+
const open = useCallback21(
|
|
12656
13052
|
(passportPage, params) => {
|
|
12657
13053
|
if (!address) return setPage("auth" /* AUTH */);
|
|
12658
13054
|
if (!!address && passportPage === "auth" /* AUTH */) return setPage("manage-wallet" /* MANAGE_WALLET */);
|
|
@@ -12661,12 +13057,12 @@ function useLumiaPassportOpen() {
|
|
|
12661
13057
|
},
|
|
12662
13058
|
[setPage, setPageParams, address]
|
|
12663
13059
|
);
|
|
12664
|
-
const close =
|
|
13060
|
+
const close = useCallback21(() => setPage(null), [setPage]);
|
|
12665
13061
|
return { open, close, isOpen: page !== null };
|
|
12666
13062
|
}
|
|
12667
13063
|
|
|
12668
13064
|
// src/hooks/useLumiaPassportColorMode.ts
|
|
12669
|
-
import { useCallback as
|
|
13065
|
+
import { useCallback as useCallback22, useEffect as useEffect35 } from "react";
|
|
12670
13066
|
function useLumiaPassportColorMode() {
|
|
12671
13067
|
const {
|
|
12672
13068
|
config: { current: config }
|
|
@@ -12674,7 +13070,7 @@ function useLumiaPassportColorMode() {
|
|
|
12674
13070
|
const preferedColorMode = config?.preferedColorMode;
|
|
12675
13071
|
const colorMode = useLayoutStore((st) => st.colorMode);
|
|
12676
13072
|
const handleStoreColorMode = useLayoutStore((st) => st.setColorMode);
|
|
12677
|
-
const setColorMode =
|
|
13073
|
+
const setColorMode = useCallback22(
|
|
12678
13074
|
(mode) => {
|
|
12679
13075
|
localStorage.setItem(LOCAL_COLOR_MODE_KEY, mode);
|
|
12680
13076
|
handleStoreColorMode(mode);
|
|
@@ -12724,7 +13120,7 @@ function ThemeToggle(props) {
|
|
|
12724
13120
|
|
|
12725
13121
|
// src/context/RainbowKitContext.tsx
|
|
12726
13122
|
import { darkTheme, lightTheme, RainbowKitProvider } from "@rainbow-me/rainbowkit";
|
|
12727
|
-
import { useMemo as
|
|
13123
|
+
import { useMemo as useMemo7 } from "react";
|
|
12728
13124
|
import { WagmiProvider as WagmiProvider2 } from "wagmi";
|
|
12729
13125
|
|
|
12730
13126
|
// src/config/rainbowkit.ts
|
|
@@ -12952,12 +13348,12 @@ var rainbowTheme = {
|
|
|
12952
13348
|
|
|
12953
13349
|
// src/context/RainbowKitContext.tsx
|
|
12954
13350
|
import "@rainbow-me/rainbowkit/styles.css";
|
|
12955
|
-
import { Fragment as
|
|
13351
|
+
import { Fragment as Fragment21, jsx as jsx70 } from "react/jsx-runtime";
|
|
12956
13352
|
function LumiaRainbowKitProvider({ children }) {
|
|
12957
13353
|
const config = useLumiaPassportConfig().config;
|
|
12958
13354
|
const colorMode = useLayoutStore((st) => st.colorMode);
|
|
12959
|
-
const rainbowConfig2 =
|
|
12960
|
-
const customTheme =
|
|
13355
|
+
const rainbowConfig2 = useMemo7(() => createRainbowConfig(config.current?.wallet?.walletConnectProjectId), [config]);
|
|
13356
|
+
const customTheme = useMemo7(
|
|
12961
13357
|
() => colorMode === "dark" ? {
|
|
12962
13358
|
...darkTheme(),
|
|
12963
13359
|
colors: { ...darkTheme().colors, ...rainbowTheme.darkMode.colors },
|
|
@@ -12971,13 +13367,13 @@ function LumiaRainbowKitProvider({ children }) {
|
|
|
12971
13367
|
},
|
|
12972
13368
|
[colorMode]
|
|
12973
13369
|
);
|
|
12974
|
-
if (!config.current?.wallet?.enabled) return /* @__PURE__ */ jsx70(
|
|
13370
|
+
if (!config.current?.wallet?.enabled) return /* @__PURE__ */ jsx70(Fragment21, { children });
|
|
12975
13371
|
return /* @__PURE__ */ jsx70(WagmiProvider2, { config: rainbowConfig2, children: /* @__PURE__ */ jsx70(RainbowKitProvider, { theme: customTheme, modalSize: "compact", showRecentTransactions: true, children }) });
|
|
12976
13372
|
}
|
|
12977
13373
|
|
|
12978
13374
|
// src/internal/components/UserOpStatus.tsx
|
|
12979
13375
|
init_base();
|
|
12980
|
-
import { AlertCircle as
|
|
13376
|
+
import { AlertCircle as AlertCircle6, CheckCircle2 as CheckCircle27, Clock as Clock2, Copy as Copy5, ExternalLink as ExternalLink2, RefreshCw as RefreshCw4 } from "lucide-react";
|
|
12981
13377
|
import * as React13 from "react";
|
|
12982
13378
|
|
|
12983
13379
|
// src/internal/utils/cn.ts
|
|
@@ -13207,19 +13603,19 @@ var UserOpStatus = ({
|
|
|
13207
13603
|
if (receipt) {
|
|
13208
13604
|
const ok = !!receipt.success;
|
|
13209
13605
|
return /* @__PURE__ */ jsxs57(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
13210
|
-
ok ? /* @__PURE__ */ jsx73(CheckCircle27, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx73(
|
|
13606
|
+
ok ? /* @__PURE__ */ jsx73(CheckCircle27, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx73(AlertCircle6, { className: "h-3 w-3" }),
|
|
13211
13607
|
ok ? "Included" : "Failed"
|
|
13212
13608
|
] });
|
|
13213
13609
|
}
|
|
13214
13610
|
if (rejected) {
|
|
13215
13611
|
return /* @__PURE__ */ jsxs57(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
13216
|
-
/* @__PURE__ */ jsx73(
|
|
13612
|
+
/* @__PURE__ */ jsx73(AlertCircle6, { className: "h-3 w-3" }),
|
|
13217
13613
|
" Rejected by bundler"
|
|
13218
13614
|
] });
|
|
13219
13615
|
}
|
|
13220
13616
|
if (timedOut) {
|
|
13221
13617
|
return /* @__PURE__ */ jsxs57(Badge, { variant: "warning", className: "gap-1", children: [
|
|
13222
|
-
/* @__PURE__ */ jsx73(
|
|
13618
|
+
/* @__PURE__ */ jsx73(AlertCircle6, { className: "h-3 w-3" }),
|
|
13223
13619
|
" Timeout - may be rejected"
|
|
13224
13620
|
] });
|
|
13225
13621
|
}
|
|
@@ -13327,16 +13723,16 @@ var UserOpStatus = ({
|
|
|
13327
13723
|
] })
|
|
13328
13724
|
] }),
|
|
13329
13725
|
error && /* @__PURE__ */ jsxs57("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
13330
|
-
/* @__PURE__ */ jsx73(
|
|
13726
|
+
/* @__PURE__ */ jsx73(AlertCircle6, { className: "h-4 w-4" }),
|
|
13331
13727
|
" ",
|
|
13332
13728
|
error
|
|
13333
13729
|
] }),
|
|
13334
13730
|
rejected && /* @__PURE__ */ jsxs57("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
13335
|
-
/* @__PURE__ */ jsx73(
|
|
13731
|
+
/* @__PURE__ */ jsx73(AlertCircle6, { className: "h-4 w-4" }),
|
|
13336
13732
|
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
13337
13733
|
] }),
|
|
13338
13734
|
timedOut && /* @__PURE__ */ jsxs57("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
13339
|
-
/* @__PURE__ */ jsx73(
|
|
13735
|
+
/* @__PURE__ */ jsx73(AlertCircle6, { className: "h-4 w-4" }),
|
|
13340
13736
|
"Stopped polling after ",
|
|
13341
13737
|
Math.round(maxPollTimeMs / 1e3),
|
|
13342
13738
|
"s. UserOperation may have been rejected by the bundler."
|
|
@@ -13410,12 +13806,12 @@ var Hash = ({
|
|
|
13410
13806
|
|
|
13411
13807
|
// src/internal/components/TransactionsMenu/TransactionsList.tsx
|
|
13412
13808
|
init_base();
|
|
13413
|
-
import { useEffect as useEffect37, useState as
|
|
13809
|
+
import { useEffect as useEffect37, useState as useState19 } from "react";
|
|
13414
13810
|
import { jsx as jsx75, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
13415
13811
|
var TransactionsList = ({ address, itemsCount = 10 }) => {
|
|
13416
|
-
const [transactions, setTransactions] =
|
|
13417
|
-
const [loading, setLoading] =
|
|
13418
|
-
const [error, setError] =
|
|
13812
|
+
const [transactions, setTransactions] = useState19([]);
|
|
13813
|
+
const [loading, setLoading] = useState19(true);
|
|
13814
|
+
const [error, setError] = useState19(null);
|
|
13419
13815
|
useEffect37(() => {
|
|
13420
13816
|
const fetchTransactions = async () => {
|
|
13421
13817
|
try {
|
|
@@ -13718,11 +14114,11 @@ function useUserOpStatus(options = {}) {
|
|
|
13718
14114
|
|
|
13719
14115
|
// src/hooks/useLogout.ts
|
|
13720
14116
|
import { logout as coreLogout, jwtTokenManager as jwtTokenManager3 } from "@lumiapassport/core/auth";
|
|
13721
|
-
import { useCallback as
|
|
14117
|
+
import { useCallback as useCallback25 } from "react";
|
|
13722
14118
|
function useLogout() {
|
|
13723
14119
|
const { setSession, setIsLoading, setAddress, setStatus, setError, address } = useLumiaPassportSession();
|
|
13724
14120
|
const { callbacks } = useLumiaPassportConfig();
|
|
13725
|
-
const logout2 =
|
|
14121
|
+
const logout2 = useCallback25(async () => {
|
|
13726
14122
|
const prevAddress = address;
|
|
13727
14123
|
let userId = null;
|
|
13728
14124
|
setIsLoading(true);
|
|
@@ -13761,10 +14157,10 @@ init_profile();
|
|
|
13761
14157
|
|
|
13762
14158
|
// src/modules/transactions.ts
|
|
13763
14159
|
init_base();
|
|
13764
|
-
import { usePublicClient, useWalletClient, useAccount as useAccount2 } from "wagmi";
|
|
14160
|
+
import { usePublicClient as usePublicClient2, useWalletClient, useAccount as useAccount2 } from "wagmi";
|
|
13765
14161
|
import { parseEther as parseEther4 } from "viem";
|
|
13766
14162
|
function useTransactions() {
|
|
13767
|
-
const publicClient2 =
|
|
14163
|
+
const publicClient2 = usePublicClient2({ chainId: lumiaBeam.id });
|
|
13768
14164
|
const { data: walletClient } = useWalletClient();
|
|
13769
14165
|
const { address } = useAccount2();
|
|
13770
14166
|
const sendTransaction = async (params) => {
|