@lumiapassport/ui-kit 1.10.1 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/iframe/index.html +17 -1
- package/dist/iframe/main.js +44 -25
- package/dist/iframe/main.js.map +1 -1
- package/dist/iframe/oauth/x.html +160 -0
- package/dist/iframe/oauth/x.js +378 -0
- package/dist/index.cjs +2329 -1229
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +44 -3
- package/dist/index.d.ts +44 -3
- package/dist/index.js +1996 -895
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -18,16 +18,29 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
21
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
22
|
|
|
22
23
|
// src/styles/built.css
|
|
23
24
|
var built_default;
|
|
24
25
|
var init_built = __esm({
|
|
25
26
|
"src/styles/built.css"() {
|
|
26
|
-
built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0;background-color:transparent;border:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .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-1\\.5{margin-bottom:.375rem}.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-1\\.5{margin-right:.375rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-1\\.5{margin-top:.375rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-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-\\[32px\\]{height:32px}.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-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-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-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes glow-warning{0%,to{box-shadow:0 0 0 rgba(234,88,12,.5)}50%{box-shadow:0 0 20px rgba(234,88,12,.8)}}.lumia-scope .animate-glow-warning{animation:glow-warning 2s ease-in-out infinite}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.6}}.lumia-scope .animate-pulse-warning{animation:pulse-warning 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*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-3\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-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-500\\/30{border-color:rgba(245,158,11,.3)}.lumia-scope .border-amber-500\\/40{border-color:rgba(245,158,11,.4)}.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-500\\/30{border-color:rgba(59,130,246,.3)}.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-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.lumia-scope .border-green-500\\/40{border-color:rgba(34,197,94,.4)}.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-green-900\\/60{border-color:rgba(20,83,45,.6)}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-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-500\\/40{border-color:rgba(239,68,68,.4)}.lumia-scope .border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity,1))}.lumia-scope .border-red-800\\/80{border-color:rgba(153,27,27,.8)}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-red-900\\/40{border-color:rgba(127,29,29,.4)}.lumia-scope .border-red-900\\/60{border-color:rgba(127,29,29,.6)}.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-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500\\/10{background-color:rgba(245,158,11,.1)}.lumia-scope .bg-amber-500\\/15{background-color:rgba(245,158,11,.15)}.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-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-500\\/10{background-color:rgba(59,130,246,.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-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-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-500\\/15{background-color:rgba(34,197,94,.15)}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-950\\/50{background-color:rgba(5,46,22,.5)}.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-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-500\\/10{background-color:rgba(168,85,247,.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-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-500\\/15{background-color:rgba(239,68,68,.15)}.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-700\\/80{background-color:rgba(185,28,28,.8)}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/20{background-color:rgba(127,29,29,.2)}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-950\\/50{background-color:rgba(69,10,10,.5)}.lumia-scope .bg-red-950\\/90{background-color:rgba(69,10,10,.9)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-500\\/10{background-color:rgba(14,165,233,.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-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-3{padding-bottom:.75rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-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-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-relaxed{line-height:1.625}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.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-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-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-muted-foreground{color:hsl(var(--muted-foreground))}.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-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-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-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-300\\/95{color:hsla(0,94%,82%,.95)}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-400\\/80{color:hsla(0,91%,71%,.8)}.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-600\\/90{color:rgba(220,38,38,.9)}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lumia-scope .\\[background\\:var\\(--lumia-bg\\)\\]{background:var(--lumia-bg)}.lumia-scope .\\[border-color\\:var\\(--lumia-border\\)\\]{border-color:var(--lumia-border)}.lumia-scope .\\[color\\:var\\(--lumia-text\\)\\]{color:var(--lumia-text)}.lumia-scope .\\[color\\:var\\(--lumia-text-muted\\)\\]{color:var(--lumia-text-muted)}.lumia-scope .\\[color\\:var\\(--lumia-text-secondary\\)\\]{color:var(--lumia-text-secondary)}.lumia-scope .file\\:mr-3::file-selector-button{margin-right:.75rem}.lumia-scope .file\\:cursor-pointer::file-selector-button{cursor:pointer}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-purple-600::file-selector-button{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-3::file-selector-button{padding-left:.75rem;padding-right:.75rem}.lumia-scope .file\\:py-1\\.5::file-selector-button{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:text-xs::file-selector-button{font-size:.75rem;line-height:1rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:text-white::file-selector-button{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-600\\/90:hover{background-color:rgba(220,38,38,.9)}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-purple-700::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
27
|
+
built_default = '.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\\201C""\\201D""\\2018""\\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0;background-color:transparent;border:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .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-1\\.5{margin-bottom:.375rem}.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-1\\.5{margin-right:.375rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-1\\.5{margin-top:.375rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-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-\\[32px\\]{height:32px}.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-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-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-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes glow-warning{0%,to{box-shadow:0 0 0 rgba(234,88,12,.5)}50%{box-shadow:0 0 20px rgba(234,88,12,.8)}}.lumia-scope .animate-glow-warning{animation:glow-warning 2s ease-in-out infinite}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.6}}.lumia-scope .animate-pulse-warning{animation:pulse-warning 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*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-3\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-dashed{border-style:dashed}.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-500\\/30{border-color:rgba(245,158,11,.3)}.lumia-scope .border-amber-500\\/40{border-color:rgba(245,158,11,.4)}.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-500\\/30{border-color:rgba(59,130,246,.3)}.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-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.lumia-scope .border-green-500\\/40{border-color:rgba(34,197,94,.4)}.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-green-900\\/60{border-color:rgba(20,83,45,.6)}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-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-500\\/40{border-color:rgba(239,68,68,.4)}.lumia-scope .border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity,1))}.lumia-scope .border-red-800\\/80{border-color:rgba(153,27,27,.8)}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-red-900\\/40{border-color:rgba(127,29,29,.4)}.lumia-scope .border-red-900\\/60{border-color:rgba(127,29,29,.6)}.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-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500\\/10{background-color:rgba(245,158,11,.1)}.lumia-scope .bg-amber-500\\/15{background-color:rgba(245,158,11,.15)}.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-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-500\\/10{background-color:rgba(59,130,246,.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-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900\\/60{background-color:rgba(17,24,39,.6)}.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-500\\/15{background-color:rgba(34,197,94,.15)}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-950\\/50{background-color:rgba(5,46,22,.5)}.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-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-500\\/10{background-color:rgba(168,85,247,.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-900\\/40{background-color:rgba(88,28,135,.4)}.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-500\\/15{background-color:rgba(239,68,68,.15)}.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-700\\/80{background-color:rgba(185,28,28,.8)}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/20{background-color:rgba(127,29,29,.2)}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-950\\/50{background-color:rgba(69,10,10,.5)}.lumia-scope .bg-red-950\\/90{background-color:rgba(69,10,10,.9)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-500\\/10{background-color:rgba(14,165,233,.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-white\\/70{background-color:hsla(0,0%,100%,.7)}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-3{padding-bottom:.75rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-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-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .uppercase{text-transform:uppercase}.lumia-scope .italic{font-style:italic}.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-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-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-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-muted-foreground{color:hsl(var(--muted-foreground))}.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-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.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-300\\/95{color:hsla(0,94%,82%,.95)}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-400\\/80{color:hsla(0,91%,71%,.8)}.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-600\\/90{color:rgba(220,38,38,.9)}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lumia-scope .\\[background\\:var\\(--lumia-bg\\)\\]{background:var(--lumia-bg)}.lumia-scope .\\[border-color\\:var\\(--lumia-border\\)\\]{border-color:var(--lumia-border)}.lumia-scope .\\[color\\:var\\(--lumia-text\\)\\]{color:var(--lumia-text)}.lumia-scope .\\[color\\:var\\(--lumia-text-muted\\)\\]{color:var(--lumia-text-muted)}.lumia-scope .\\[color\\:var\\(--lumia-text-secondary\\)\\]{color:var(--lumia-text-secondary)}.lumia-scope .file\\:mr-3::file-selector-button{margin-right:.75rem}.lumia-scope .file\\:cursor-pointer::file-selector-button{cursor:pointer}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-purple-600::file-selector-button{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-3::file-selector-button{padding-left:.75rem;padding-right:.75rem}.lumia-scope .file\\:py-1\\.5::file-selector-button{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:text-xs::file-selector-button{font-size:.75rem;line-height:1rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:text-white::file-selector-button{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-600\\/90:hover{background-color:rgba(220,38,38,.9)}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-purple-700::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}';
|
|
27
28
|
}
|
|
28
29
|
});
|
|
29
30
|
|
|
30
31
|
// src/config/lumiaPassport.tsx
|
|
32
|
+
var lumiaPassport_exports = {};
|
|
33
|
+
__export(lumiaPassport_exports, {
|
|
34
|
+
DiscordIcon: () => DiscordIcon,
|
|
35
|
+
GoogleIcon: () => GoogleIcon,
|
|
36
|
+
TelegramIcon: () => TelegramIcon,
|
|
37
|
+
TwitterIcon: () => TwitterIcon,
|
|
38
|
+
defaultLumiaPassportConfig: () => defaultLumiaPassportConfig,
|
|
39
|
+
getIframeUrl: () => getIframeUrl,
|
|
40
|
+
getLumiaPassportConfig: () => getLumiaPassportConfig,
|
|
41
|
+
getServiceUrls: () => getServiceUrls,
|
|
42
|
+
updateLumiaPassportConfig: () => updateLumiaPassportConfig
|
|
43
|
+
});
|
|
31
44
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
32
45
|
function getServiceUrls() {
|
|
33
46
|
const config = defaultLumiaPassportConfig;
|
|
@@ -59,6 +72,29 @@ function getIframeUrl() {
|
|
|
59
72
|
const iframeUrl = buildIframeUrl || config.services.iframeUrl || "https://auth.lumiapassport.com";
|
|
60
73
|
return iframeUrl;
|
|
61
74
|
}
|
|
75
|
+
function getLumiaPassportConfig() {
|
|
76
|
+
return defaultLumiaPassportConfig;
|
|
77
|
+
}
|
|
78
|
+
function updateLumiaPassportConfig(updates) {
|
|
79
|
+
const config = { ...defaultLumiaPassportConfig };
|
|
80
|
+
if (updates.passkey) config.passkey = { ...config.passkey, ...updates.passkey };
|
|
81
|
+
if (updates.email) config.email = { ...config.email, ...updates.email };
|
|
82
|
+
if (updates.social) {
|
|
83
|
+
config.social = { ...config.social, ...updates.social };
|
|
84
|
+
if (updates.social.providers) config.social.providers = updates.social.providers;
|
|
85
|
+
}
|
|
86
|
+
if (updates.development) config.development = { ...config.development, ...updates.development };
|
|
87
|
+
if (updates.ui) {
|
|
88
|
+
config.ui = { ...config.ui, ...updates.ui };
|
|
89
|
+
if (updates.ui.branding) config.ui.branding = { ...config.ui.branding, ...updates.ui.branding };
|
|
90
|
+
if (updates.ui.modal) config.ui.modal = { ...config.ui.modal, ...updates.ui.modal };
|
|
91
|
+
}
|
|
92
|
+
if (updates.network) config.network = { ...config.network, ...updates.network };
|
|
93
|
+
if (updates.features) config.features = { ...config.features, ...updates.features };
|
|
94
|
+
if (updates.warnings) config.warnings = { ...config.warnings, ...updates.warnings };
|
|
95
|
+
if (updates.kyc) config.kyc = { ...config.kyc, ...updates.kyc };
|
|
96
|
+
return config;
|
|
97
|
+
}
|
|
62
98
|
var GoogleIcon, TelegramIcon, TwitterIcon, DiscordIcon, defaultLumiaPassportConfig;
|
|
63
99
|
var init_lumiaPassport = __esm({
|
|
64
100
|
"src/config/lumiaPassport.tsx"() {
|
|
@@ -773,9 +809,10 @@ async function ensureDkgAndGetOwner(userId, _clientSeedHex) {
|
|
|
773
809
|
}
|
|
774
810
|
await iframeManager.authenticate(userId);
|
|
775
811
|
const { jwtTokenManager: jwtTokenManager4 } = await Promise.resolve().then(() => (init_auth(), auth_exports));
|
|
776
|
-
|
|
812
|
+
let accessToken = jwtTokenManager4.getAccessToken();
|
|
777
813
|
if (!accessToken) {
|
|
778
|
-
|
|
814
|
+
console.warn("[iframe-mpc-client] No access token available for DKG, attempting cookie-based session");
|
|
815
|
+
accessToken = void 0;
|
|
779
816
|
}
|
|
780
817
|
const ownerAddress = await iframeManager.startDKG(userId, accessToken);
|
|
781
818
|
return {
|
|
@@ -2305,6 +2342,34 @@ var init_wallet = __esm({
|
|
|
2305
2342
|
}
|
|
2306
2343
|
});
|
|
2307
2344
|
|
|
2345
|
+
// src/internal/auth/providers/x.ts
|
|
2346
|
+
async function linkX() {
|
|
2347
|
+
const hasValidToken = await ensureValidToken();
|
|
2348
|
+
if (!hasValidToken) throw new Error("No authentication token available");
|
|
2349
|
+
throw new Error('Use openSocialAuthPopup("x") to link X account');
|
|
2350
|
+
}
|
|
2351
|
+
async function loginWithX() {
|
|
2352
|
+
throw new Error('Use openSocialAuthPopup("x") to login with X account');
|
|
2353
|
+
}
|
|
2354
|
+
async function unlinkX(externalId) {
|
|
2355
|
+
const hasValidToken = await ensureValidToken();
|
|
2356
|
+
if (!hasValidToken) throw new Error("No authentication token available");
|
|
2357
|
+
const url = externalId ? `${getTssUrl3()}/api/auth/unlink/x?externalId=${encodeURIComponent(externalId)}` : `${getTssUrl3()}/api/auth/unlink/x`;
|
|
2358
|
+
const response = await authenticatedFetch(url, {
|
|
2359
|
+
method: "DELETE"
|
|
2360
|
+
});
|
|
2361
|
+
if (!response.ok) {
|
|
2362
|
+
const errorData = await response.json().catch(() => ({}));
|
|
2363
|
+
throw new Error(errorData.message || `Failed to unlink X account: ${response.statusText}`);
|
|
2364
|
+
}
|
|
2365
|
+
}
|
|
2366
|
+
var init_x = __esm({
|
|
2367
|
+
"src/internal/auth/providers/x.ts"() {
|
|
2368
|
+
init_auth();
|
|
2369
|
+
init_types();
|
|
2370
|
+
}
|
|
2371
|
+
});
|
|
2372
|
+
|
|
2308
2373
|
// src/internal/auth/providers/index.ts
|
|
2309
2374
|
var init_providers = __esm({
|
|
2310
2375
|
"src/internal/auth/providers/index.ts"() {
|
|
@@ -2314,6 +2379,7 @@ var init_providers = __esm({
|
|
|
2314
2379
|
init_passkey2();
|
|
2315
2380
|
init_telegram2();
|
|
2316
2381
|
init_wallet();
|
|
2382
|
+
init_x();
|
|
2317
2383
|
}
|
|
2318
2384
|
});
|
|
2319
2385
|
|
|
@@ -2354,9 +2420,11 @@ __export(auth_exports, {
|
|
|
2354
2420
|
linkPasskeyWithWebAuthn: () => linkPasskeyWithWebAuthn,
|
|
2355
2421
|
linkTelegram: () => linkTelegram,
|
|
2356
2422
|
linkWallet: () => linkWallet,
|
|
2423
|
+
linkX: () => linkX,
|
|
2357
2424
|
loginWithEmail: () => loginWithEmail,
|
|
2358
2425
|
loginWithTelegram: () => loginWithTelegram,
|
|
2359
2426
|
loginWithUserId: () => loginWithUserId,
|
|
2427
|
+
loginWithX: () => loginWithX,
|
|
2360
2428
|
logout: () => logout,
|
|
2361
2429
|
mountTelegramLoginWidget: () => mountTelegramLoginWidget,
|
|
2362
2430
|
registerPasskey: () => registerPasskey,
|
|
@@ -2366,6 +2434,7 @@ __export(auth_exports, {
|
|
|
2366
2434
|
syncKeyshareStatus: () => syncKeyshareStatus,
|
|
2367
2435
|
unlinkProvider: () => unlinkProvider,
|
|
2368
2436
|
unlinkWallet: () => unlinkWallet,
|
|
2437
|
+
unlinkX: () => unlinkX,
|
|
2369
2438
|
verifyEmailLinkCode: () => verifyEmailLinkCode,
|
|
2370
2439
|
verifyToken: () => verifyToken
|
|
2371
2440
|
});
|
|
@@ -2438,6 +2507,13 @@ var init_iframe_manager = __esm({
|
|
|
2438
2507
|
this.pendingRequests = /* @__PURE__ */ new Map();
|
|
2439
2508
|
this.usedNonces = /* @__PURE__ */ new Set();
|
|
2440
2509
|
this.messageListener = null;
|
|
2510
|
+
// Track hidden dialog elements for restoration
|
|
2511
|
+
this.hiddenElements = [];
|
|
2512
|
+
this.pointerGuardCleanup = null;
|
|
2513
|
+
this.iframeHideTimeout = null;
|
|
2514
|
+
this.iframeActive = false;
|
|
2515
|
+
this.providerSessions = /* @__PURE__ */ new Map();
|
|
2516
|
+
this.providerConnections = /* @__PURE__ */ new Map();
|
|
2441
2517
|
// Timeouts
|
|
2442
2518
|
this.REQUEST_TIMEOUT = 3e5;
|
|
2443
2519
|
// 5 minutes (for user interactions like consent)
|
|
@@ -2493,6 +2569,7 @@ var init_iframe_manager = __esm({
|
|
|
2493
2569
|
document.body.appendChild(this.iframe);
|
|
2494
2570
|
await this.readyPromise;
|
|
2495
2571
|
await this.authenticateSDK();
|
|
2572
|
+
await this.primeProviderSessions();
|
|
2496
2573
|
this.log("[IframeManager] \u2705 Iframe ready and authenticated");
|
|
2497
2574
|
}
|
|
2498
2575
|
/**
|
|
@@ -2728,7 +2805,18 @@ var init_iframe_manager = __esm({
|
|
|
2728
2805
|
*/
|
|
2729
2806
|
showIframe() {
|
|
2730
2807
|
if (this.iframe) {
|
|
2808
|
+
if (this.iframeHideTimeout) {
|
|
2809
|
+
clearTimeout(this.iframeHideTimeout);
|
|
2810
|
+
this.iframeHideTimeout = null;
|
|
2811
|
+
}
|
|
2812
|
+
this.hideAllDialogs();
|
|
2813
|
+
this.iframeActive = true;
|
|
2814
|
+
this.enablePointerEventGuards();
|
|
2731
2815
|
this.iframe.style.display = "block";
|
|
2816
|
+
this.iframe.style.zIndex = "2147483648";
|
|
2817
|
+
this.iframe.style.pointerEvents = "auto";
|
|
2818
|
+
this.iframe.style.visibility = "visible";
|
|
2819
|
+
this.iframe.style.background = "rgba(0, 0, 0, 0.5)";
|
|
2732
2820
|
}
|
|
2733
2821
|
}
|
|
2734
2822
|
/**
|
|
@@ -2736,7 +2824,123 @@ var init_iframe_manager = __esm({
|
|
|
2736
2824
|
*/
|
|
2737
2825
|
hideIframe() {
|
|
2738
2826
|
if (this.iframe) {
|
|
2739
|
-
this.iframe
|
|
2827
|
+
this.log("[IframeManager] hideIframe called - making iframe non-blocking");
|
|
2828
|
+
this.iframeActive = false;
|
|
2829
|
+
this.iframe.style.zIndex = "1";
|
|
2830
|
+
this.iframe.style.background = "transparent";
|
|
2831
|
+
this.iframe.style.pointerEvents = "none";
|
|
2832
|
+
this.iframe.style.visibility = "hidden";
|
|
2833
|
+
this.log("[IframeManager] iframe z-index set to 1, transparent, pointer-events: none");
|
|
2834
|
+
this.restoreAllDialogs();
|
|
2835
|
+
this.disablePointerEventGuards();
|
|
2836
|
+
this.iframeHideTimeout = setTimeout(() => {
|
|
2837
|
+
if (this.iframe) {
|
|
2838
|
+
this.log("[IframeManager] Fully hiding iframe with display: none");
|
|
2839
|
+
this.iframe.style.display = "none";
|
|
2840
|
+
this.iframe.style.zIndex = "999999";
|
|
2841
|
+
this.iframe.style.background = "rgba(0, 0, 0, 0.5)";
|
|
2842
|
+
this.iframe.style.pointerEvents = "auto";
|
|
2843
|
+
this.iframe.style.visibility = "visible";
|
|
2844
|
+
}
|
|
2845
|
+
this.iframeHideTimeout = null;
|
|
2846
|
+
}, 200);
|
|
2847
|
+
}
|
|
2848
|
+
}
|
|
2849
|
+
/**
|
|
2850
|
+
* Hide all Radix Dialog modals (SendModal, etc.)
|
|
2851
|
+
*/
|
|
2852
|
+
hideAllDialogs() {
|
|
2853
|
+
this.hiddenElements = [];
|
|
2854
|
+
const allElements = document.body.querySelectorAll("*");
|
|
2855
|
+
allElements.forEach((element) => {
|
|
2856
|
+
const htmlElement = element;
|
|
2857
|
+
if (htmlElement.id === "lumia-passport-iframe" || htmlElement.closest("#lumia-passport-iframe")) {
|
|
2858
|
+
return;
|
|
2859
|
+
}
|
|
2860
|
+
if (htmlElement.hasAttribute("data-lumia-auth-modal") || htmlElement.closest("[data-lumia-auth-modal]")) {
|
|
2861
|
+
return;
|
|
2862
|
+
}
|
|
2863
|
+
const computedStyle = window.getComputedStyle(htmlElement);
|
|
2864
|
+
const zIndex = parseInt(computedStyle.zIndex, 10);
|
|
2865
|
+
const isRadixElement = htmlElement.hasAttribute("data-radix-focus-guard") || htmlElement.hasAttribute("data-radix-portal") || htmlElement.hasAttribute("data-radix-popper-content-wrapper");
|
|
2866
|
+
if (!isNaN(zIndex) && zIndex > 1e6 || isRadixElement) {
|
|
2867
|
+
this.hiddenElements.push({
|
|
2868
|
+
element: htmlElement,
|
|
2869
|
+
originalDisplay: htmlElement.style.display || "",
|
|
2870
|
+
originalVisibility: htmlElement.style.visibility || "",
|
|
2871
|
+
originalPointerEvents: htmlElement.style.pointerEvents || "",
|
|
2872
|
+
originalZIndex: htmlElement.style.zIndex || ""
|
|
2873
|
+
});
|
|
2874
|
+
htmlElement.style.display = "none";
|
|
2875
|
+
htmlElement.style.visibility = "hidden";
|
|
2876
|
+
htmlElement.style.pointerEvents = "none";
|
|
2877
|
+
htmlElement.style.zIndex = "-1";
|
|
2878
|
+
const elementType = isRadixElement ? "Radix element" : `z-index ${zIndex}`;
|
|
2879
|
+
this.log(`[IframeManager] Hiding ${elementType}: ${htmlElement.className || "(no class)"} (Tag: ${htmlElement.tagName})`);
|
|
2880
|
+
}
|
|
2881
|
+
});
|
|
2882
|
+
this.log(`[IframeManager] Hidden ${this.hiddenElements.length} elements total`);
|
|
2883
|
+
}
|
|
2884
|
+
/**
|
|
2885
|
+
* Restore all previously hidden Radix Dialog modals
|
|
2886
|
+
*/
|
|
2887
|
+
restoreAllDialogs() {
|
|
2888
|
+
this.log(`[IframeManager] Restoring ${this.hiddenElements.length} elements`);
|
|
2889
|
+
this.hiddenElements.forEach(({ element, originalDisplay, originalVisibility, originalPointerEvents, originalZIndex }) => {
|
|
2890
|
+
element.style.display = originalDisplay;
|
|
2891
|
+
element.style.visibility = originalVisibility;
|
|
2892
|
+
element.style.pointerEvents = originalPointerEvents || "auto";
|
|
2893
|
+
element.style.zIndex = originalZIndex;
|
|
2894
|
+
this.log(`[IframeManager] Restored element: ${element.className} (Tag: ${element.tagName}), pointerEvents set to: ${element.style.pointerEvents}`);
|
|
2895
|
+
});
|
|
2896
|
+
this.hiddenElements = [];
|
|
2897
|
+
this.log(`[IframeManager] All elements restored`);
|
|
2898
|
+
}
|
|
2899
|
+
/**
|
|
2900
|
+
* Stop Radix dismissable layers from swallowing the first click on the iframe.
|
|
2901
|
+
* Radix attaches pointer event guards at the document level; we intercept at window
|
|
2902
|
+
* capture phase so user clicks flow straight into the consent iframe.
|
|
2903
|
+
*/
|
|
2904
|
+
enablePointerEventGuards() {
|
|
2905
|
+
if (this.pointerGuardCleanup) {
|
|
2906
|
+
return;
|
|
2907
|
+
}
|
|
2908
|
+
const handler = (event) => {
|
|
2909
|
+
if (!this.iframeActive || !this.iframe) {
|
|
2910
|
+
return;
|
|
2911
|
+
}
|
|
2912
|
+
const target = event.target;
|
|
2913
|
+
const composedPath = typeof event.composedPath === "function" ? event.composedPath() : [];
|
|
2914
|
+
const hitsIframe = target === this.iframe || Array.isArray(composedPath) && composedPath.includes(this.iframe);
|
|
2915
|
+
if (!hitsIframe) {
|
|
2916
|
+
return;
|
|
2917
|
+
}
|
|
2918
|
+
if (typeof event.stopImmediatePropagation === "function") {
|
|
2919
|
+
event.stopImmediatePropagation();
|
|
2920
|
+
}
|
|
2921
|
+
event.stopPropagation();
|
|
2922
|
+
};
|
|
2923
|
+
const options = { capture: true };
|
|
2924
|
+
const eventNames = ["pointerdown", "mousedown", "mouseup", "click", "touchstart", "focusin"];
|
|
2925
|
+
eventNames.forEach((eventName) => {
|
|
2926
|
+
window.addEventListener(eventName, handler, options);
|
|
2927
|
+
});
|
|
2928
|
+
this.pointerGuardCleanup = () => {
|
|
2929
|
+
eventNames.forEach((eventName) => {
|
|
2930
|
+
window.removeEventListener(eventName, handler, options);
|
|
2931
|
+
});
|
|
2932
|
+
this.pointerGuardCleanup = null;
|
|
2933
|
+
};
|
|
2934
|
+
this.log("[IframeManager] Enabled pointer event guards for iframe consent");
|
|
2935
|
+
}
|
|
2936
|
+
/**
|
|
2937
|
+
* Remove pointer interception once iframe is hidden again.
|
|
2938
|
+
*/
|
|
2939
|
+
disablePointerEventGuards() {
|
|
2940
|
+
if (this.pointerGuardCleanup) {
|
|
2941
|
+
this.pointerGuardCleanup();
|
|
2942
|
+
this.pointerGuardCleanup = null;
|
|
2943
|
+
this.log("[IframeManager] Disabled pointer event guards for iframe consent");
|
|
2740
2944
|
}
|
|
2741
2945
|
}
|
|
2742
2946
|
// ========================================
|
|
@@ -2745,10 +2949,12 @@ var init_iframe_manager = __esm({
|
|
|
2745
2949
|
/**
|
|
2746
2950
|
* Authenticate user with application
|
|
2747
2951
|
*/
|
|
2748
|
-
async authenticate(userId) {
|
|
2952
|
+
async authenticate(userId, avatar, displayName) {
|
|
2749
2953
|
const response = await this.sendMessage("AUTHENTICATE", {
|
|
2750
2954
|
userId,
|
|
2751
|
-
projectId: this.projectId
|
|
2955
|
+
projectId: this.projectId,
|
|
2956
|
+
avatar,
|
|
2957
|
+
displayName
|
|
2752
2958
|
});
|
|
2753
2959
|
if (response.type === "LUMIA_PASSPORT_AUTH_SUCCESS") {
|
|
2754
2960
|
return {
|
|
@@ -2776,13 +2982,20 @@ var init_iframe_manager = __esm({
|
|
|
2776
2982
|
/**
|
|
2777
2983
|
* Sign transaction
|
|
2778
2984
|
*/
|
|
2779
|
-
async signTransaction(userId, transaction, accessToken) {
|
|
2985
|
+
async signTransaction(userId, transaction, accessToken, avatar, displayName) {
|
|
2986
|
+
if (!avatar || !displayName) {
|
|
2987
|
+
const { jwtTokenManager: jwtTokenManager4 } = await import("@lumiapassport/core/auth");
|
|
2988
|
+
avatar = avatar || jwtTokenManager4.getAvatar();
|
|
2989
|
+
displayName = displayName || jwtTokenManager4.getDisplayName();
|
|
2990
|
+
}
|
|
2780
2991
|
const response = await this.sendMessage("SIGN_TRANSACTION", {
|
|
2781
2992
|
userId,
|
|
2782
2993
|
projectId: this.projectId,
|
|
2783
2994
|
transaction,
|
|
2784
|
-
accessToken
|
|
2995
|
+
accessToken,
|
|
2785
2996
|
// Pass access token for TSS API authentication
|
|
2997
|
+
avatar,
|
|
2998
|
+
displayName
|
|
2786
2999
|
});
|
|
2787
3000
|
if (response.type === "LUMIA_PASSPORT_SIGNATURE") {
|
|
2788
3001
|
return response.signature;
|
|
@@ -2792,19 +3005,26 @@ var init_iframe_manager = __esm({
|
|
|
2792
3005
|
/**
|
|
2793
3006
|
* Sign EIP712 typed data
|
|
2794
3007
|
*/
|
|
2795
|
-
async signTypedData(userId, typedData, digest32, accessToken) {
|
|
3008
|
+
async signTypedData(userId, typedData, digest32, accessToken, avatar, displayName) {
|
|
2796
3009
|
console.log("[IframeManager] signTypedData: Sending SIGN_TYPED_DATA message", {
|
|
2797
3010
|
userId,
|
|
2798
3011
|
primaryType: typedData.primaryType,
|
|
2799
3012
|
digest32
|
|
2800
3013
|
});
|
|
3014
|
+
if (!avatar || !displayName) {
|
|
3015
|
+
const { jwtTokenManager: jwtTokenManager4 } = await import("@lumiapassport/core/auth");
|
|
3016
|
+
avatar = avatar || jwtTokenManager4.getAvatar();
|
|
3017
|
+
displayName = displayName || jwtTokenManager4.getDisplayName();
|
|
3018
|
+
}
|
|
2801
3019
|
const response = await this.sendMessage("SIGN_TYPED_DATA", {
|
|
2802
3020
|
userId,
|
|
2803
3021
|
projectId: this.projectId,
|
|
2804
3022
|
typedData,
|
|
2805
3023
|
digest32,
|
|
2806
|
-
accessToken
|
|
3024
|
+
accessToken,
|
|
2807
3025
|
// Pass access token for TSS API authentication
|
|
3026
|
+
avatar,
|
|
3027
|
+
displayName
|
|
2808
3028
|
});
|
|
2809
3029
|
console.log("[IframeManager] signTypedData: Response received", {
|
|
2810
3030
|
type: response.type,
|
|
@@ -2848,8 +3068,13 @@ var init_iframe_manager = __esm({
|
|
|
2848
3068
|
async openSocialAuthPopup(provider, config) {
|
|
2849
3069
|
this.log(`[IframeManager] Opening social auth popup for provider: ${provider}`);
|
|
2850
3070
|
return new Promise((resolve, reject) => {
|
|
3071
|
+
const normalizedProviderName = provider.toLowerCase();
|
|
3072
|
+
const providerKey = normalizedProviderName === "twitter" ? "x" : normalizedProviderName;
|
|
3073
|
+
const xMode = config?.mode === "link" ? "link" : "login";
|
|
3074
|
+
const sessionBeforeFlow = providerKey === "x" ? this.getKnownSessionId("x") : null;
|
|
3075
|
+
const connectionBeforeFlow = providerKey === "x" ? this.getKnownProviderConnection("x") : null;
|
|
2851
3076
|
let popupUrl;
|
|
2852
|
-
if (
|
|
3077
|
+
if (providerKey === "telegram") {
|
|
2853
3078
|
const iframeOrigin = new URL(this.iframeUrl).origin;
|
|
2854
3079
|
const botUsername = config?.botUsername;
|
|
2855
3080
|
this.log("[IframeManager] Telegram config:", config);
|
|
@@ -2860,6 +3085,25 @@ var init_iframe_manager = __esm({
|
|
|
2860
3085
|
}
|
|
2861
3086
|
popupUrl = url.toString();
|
|
2862
3087
|
this.log("[IframeManager] Popup URL:", popupUrl);
|
|
3088
|
+
} else if (providerKey === "x") {
|
|
3089
|
+
const iframeOrigin = new URL(this.iframeUrl).origin;
|
|
3090
|
+
this.log("[IframeManager] X OAuth config:", config);
|
|
3091
|
+
const url = new URL(`${iframeOrigin}/oauth/x.html`);
|
|
3092
|
+
const { getServiceUrls: getServiceUrls2 } = (init_lumiaPassport(), __toCommonJS(lumiaPassport_exports));
|
|
3093
|
+
const { tssUrl } = getServiceUrls2();
|
|
3094
|
+
const projectId = typeof window !== "undefined" ? window.__LUMIA_PROJECT_ID__ : void 0;
|
|
3095
|
+
this.log("[IframeManager] TSS URL from config:", tssUrl);
|
|
3096
|
+
this.log("[IframeManager] Project ID:", projectId);
|
|
3097
|
+
url.searchParams.set("tssUrl", tssUrl);
|
|
3098
|
+
url.searchParams.set("mode", xMode);
|
|
3099
|
+
if (projectId) {
|
|
3100
|
+
url.searchParams.set("projectId", projectId);
|
|
3101
|
+
}
|
|
3102
|
+
if (xMode === "link" && config?.token) {
|
|
3103
|
+
url.searchParams.set("token", config.token);
|
|
3104
|
+
}
|
|
3105
|
+
popupUrl = url.toString();
|
|
3106
|
+
this.log("[IframeManager] X OAuth Popup URL:", popupUrl);
|
|
2863
3107
|
} else {
|
|
2864
3108
|
reject(new Error(`Provider ${provider} not supported yet`));
|
|
2865
3109
|
return;
|
|
@@ -2873,46 +3117,267 @@ var init_iframe_manager = __esm({
|
|
|
2873
3117
|
reject(new Error("Failed to open popup. Please allow popups for this site."));
|
|
2874
3118
|
return;
|
|
2875
3119
|
}
|
|
2876
|
-
|
|
3120
|
+
let checkClosed;
|
|
3121
|
+
let resolved = false;
|
|
3122
|
+
let messageHandler = null;
|
|
3123
|
+
let pendingCancellation = false;
|
|
3124
|
+
const cleanup = (closePopup = true) => {
|
|
3125
|
+
if (messageHandler) {
|
|
3126
|
+
window.removeEventListener("message", messageHandler);
|
|
3127
|
+
}
|
|
3128
|
+
if (checkClosed) {
|
|
3129
|
+
clearInterval(checkClosed);
|
|
3130
|
+
checkClosed = void 0;
|
|
3131
|
+
}
|
|
3132
|
+
if (closePopup && !popup.closed) {
|
|
3133
|
+
popup.close();
|
|
3134
|
+
}
|
|
3135
|
+
};
|
|
3136
|
+
const finalize = (result, closePopup = true) => {
|
|
3137
|
+
if (resolved) {
|
|
3138
|
+
return;
|
|
3139
|
+
}
|
|
3140
|
+
resolved = true;
|
|
3141
|
+
cleanup(closePopup);
|
|
3142
|
+
if (result.success && providerKey === "x") {
|
|
3143
|
+
this.updateProviderTrackingFromUser("x", result.user);
|
|
3144
|
+
}
|
|
3145
|
+
resolve({
|
|
3146
|
+
provider,
|
|
3147
|
+
...result
|
|
3148
|
+
});
|
|
3149
|
+
};
|
|
3150
|
+
messageHandler = (event) => {
|
|
2877
3151
|
const iframeOrigin = new URL(this.iframeUrl).origin;
|
|
2878
3152
|
if (event.origin !== iframeOrigin) {
|
|
2879
3153
|
return;
|
|
2880
3154
|
}
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
popup.close();
|
|
2886
|
-
}
|
|
2887
|
-
resolve({
|
|
2888
|
-
provider,
|
|
3155
|
+
const eventProvider = event.data.provider?.toLowerCase();
|
|
3156
|
+
if (event.data.type === "TELEGRAM_AUTH_SUCCESS" && eventProvider === "telegram" && providerKey === "telegram") {
|
|
3157
|
+
this.log("[IframeManager] Telegram auth successful from popup:", event.data);
|
|
3158
|
+
finalize({
|
|
2889
3159
|
success: true,
|
|
2890
3160
|
user: event.data.user
|
|
2891
3161
|
});
|
|
2892
|
-
} else if (event.data.type === "
|
|
2893
|
-
this.log("[IframeManager]
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
3162
|
+
} else if (event.data.type === "X_AUTH_SUCCESS" && eventProvider === "x" && providerKey === "x") {
|
|
3163
|
+
this.log("[IframeManager] X auth successful from popup:", event.data);
|
|
3164
|
+
finalize({
|
|
3165
|
+
success: true,
|
|
3166
|
+
user: event.data.user,
|
|
3167
|
+
mode: event.data.mode
|
|
3168
|
+
});
|
|
3169
|
+
} else if (event.data.type === "TELEGRAM_AUTH_CANCELLED" && eventProvider === "telegram" && providerKey === "telegram") {
|
|
3170
|
+
this.log("[IframeManager] Telegram auth cancelled by user");
|
|
3171
|
+
finalize({
|
|
2897
3172
|
success: false,
|
|
2898
3173
|
error: "User cancelled authentication"
|
|
3174
|
+
}, false);
|
|
3175
|
+
} else if (event.data.type === "X_AUTH_CANCELLED" && eventProvider === "x" && providerKey === "x") {
|
|
3176
|
+
this.log("[IframeManager] X auth cancelled by user");
|
|
3177
|
+
pendingCancellation = true;
|
|
3178
|
+
this.verifyXAuthSession().then((verification) => {
|
|
3179
|
+
const sessionId = verification.sessionId || null;
|
|
3180
|
+
const providers = verification.providers || [];
|
|
3181
|
+
const isConnectedNow = providers.includes("x");
|
|
3182
|
+
const sessionChanged = !!sessionId && sessionId !== sessionBeforeFlow;
|
|
3183
|
+
const connectionGained = connectionBeforeFlow === false && isConnectedNow;
|
|
3184
|
+
if (verification.success) {
|
|
3185
|
+
if (sessionChanged || connectionGained) {
|
|
3186
|
+
this.log("[IframeManager] X auth cancellation fallback found active session change, treating as success");
|
|
3187
|
+
finalize(
|
|
3188
|
+
{
|
|
3189
|
+
success: true,
|
|
3190
|
+
user: verification.user,
|
|
3191
|
+
mode: xMode
|
|
3192
|
+
},
|
|
3193
|
+
true
|
|
3194
|
+
);
|
|
3195
|
+
} else {
|
|
3196
|
+
this.log("[IframeManager] X auth fallback did not detect new session, treating as cancellation");
|
|
3197
|
+
if (popup.closed) {
|
|
3198
|
+
finalize(
|
|
3199
|
+
{
|
|
3200
|
+
success: false,
|
|
3201
|
+
error: "User cancelled authentication"
|
|
3202
|
+
},
|
|
3203
|
+
false
|
|
3204
|
+
);
|
|
3205
|
+
}
|
|
3206
|
+
}
|
|
3207
|
+
} else {
|
|
3208
|
+
this.log("[IframeManager] X auth fallback verification reported no session, treating as cancellation");
|
|
3209
|
+
if (popup.closed) {
|
|
3210
|
+
finalize(
|
|
3211
|
+
{
|
|
3212
|
+
success: false,
|
|
3213
|
+
error: "User cancelled authentication"
|
|
3214
|
+
},
|
|
3215
|
+
false
|
|
3216
|
+
);
|
|
3217
|
+
}
|
|
3218
|
+
}
|
|
3219
|
+
}).catch((error) => {
|
|
3220
|
+
this.log("[IframeManager] X auth fallback verification error:", error);
|
|
3221
|
+
if (popup.closed) {
|
|
3222
|
+
finalize(
|
|
3223
|
+
{
|
|
3224
|
+
success: false,
|
|
3225
|
+
error: "User cancelled authentication"
|
|
3226
|
+
},
|
|
3227
|
+
false
|
|
3228
|
+
);
|
|
3229
|
+
}
|
|
3230
|
+
});
|
|
3231
|
+
} else if (event.data.type === "X_AUTH_ERROR" && eventProvider === "x" && providerKey === "x") {
|
|
3232
|
+
this.log("[IframeManager] X auth error from popup:", event.data.error);
|
|
3233
|
+
finalize({
|
|
3234
|
+
success: false,
|
|
3235
|
+
error: event.data.error || "Authentication failed"
|
|
2899
3236
|
});
|
|
2900
3237
|
}
|
|
2901
3238
|
};
|
|
2902
3239
|
window.addEventListener("message", messageHandler);
|
|
2903
|
-
|
|
3240
|
+
checkClosed = setInterval(() => {
|
|
2904
3241
|
if (popup.closed) {
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
3242
|
+
if (checkClosed) {
|
|
3243
|
+
clearInterval(checkClosed);
|
|
3244
|
+
checkClosed = void 0;
|
|
3245
|
+
}
|
|
3246
|
+
if (!resolved) {
|
|
3247
|
+
if (providerKey === "x" && pendingCancellation) {
|
|
3248
|
+
finalize({
|
|
3249
|
+
success: false,
|
|
3250
|
+
error: "User cancelled authentication"
|
|
3251
|
+
}, false);
|
|
3252
|
+
} else {
|
|
3253
|
+
finalize({
|
|
3254
|
+
success: false,
|
|
3255
|
+
error: "Popup was closed"
|
|
3256
|
+
}, false);
|
|
3257
|
+
}
|
|
3258
|
+
}
|
|
2912
3259
|
}
|
|
2913
3260
|
}, 500);
|
|
2914
3261
|
});
|
|
2915
3262
|
}
|
|
3263
|
+
/**
|
|
3264
|
+
* Fallback verification for X OAuth cancellations.
|
|
3265
|
+
* Attempts to detect if the backend session was still established.
|
|
3266
|
+
*/
|
|
3267
|
+
async verifyXAuthSession(options = {}) {
|
|
3268
|
+
if (typeof window === "undefined" || typeof fetch === "undefined") {
|
|
3269
|
+
return { success: false };
|
|
3270
|
+
}
|
|
3271
|
+
try {
|
|
3272
|
+
const { getServiceUrls: getServiceUrls2 } = (init_lumiaPassport(), __toCommonJS(lumiaPassport_exports));
|
|
3273
|
+
const { tssUrl } = getServiceUrls2();
|
|
3274
|
+
const projectId = typeof window !== "undefined" ? window.__LUMIA_PROJECT_ID__ : void 0;
|
|
3275
|
+
if (!tssUrl) {
|
|
3276
|
+
this.log("[IframeManager] X auth fallback aborted: missing TSS URL");
|
|
3277
|
+
return { success: false };
|
|
3278
|
+
}
|
|
3279
|
+
const verifyUrl = new URL(`${tssUrl}/api/auth/verify`);
|
|
3280
|
+
if (projectId) {
|
|
3281
|
+
verifyUrl.searchParams.set("projectId", projectId);
|
|
3282
|
+
}
|
|
3283
|
+
const response = await fetch(verifyUrl.toString(), {
|
|
3284
|
+
method: "GET",
|
|
3285
|
+
credentials: "include"
|
|
3286
|
+
});
|
|
3287
|
+
if (!response.ok) {
|
|
3288
|
+
this.log("[IframeManager] X auth fallback verify returned status:", response.status);
|
|
3289
|
+
this.recordProviderSession("x", null);
|
|
3290
|
+
this.recordProviderConnection("x", false);
|
|
3291
|
+
return { success: false };
|
|
3292
|
+
}
|
|
3293
|
+
let userData = void 0;
|
|
3294
|
+
try {
|
|
3295
|
+
userData = await response.json();
|
|
3296
|
+
} catch (jsonError) {
|
|
3297
|
+
this.log("[IframeManager] X auth fallback verify JSON parse failed:", jsonError);
|
|
3298
|
+
}
|
|
3299
|
+
const sessionId = this.extractSessionId(userData);
|
|
3300
|
+
const providers = this.getProvidersList(userData);
|
|
3301
|
+
this.recordProviderSession("x", sessionId);
|
|
3302
|
+
this.recordProviderConnection("x", providers.includes("x"));
|
|
3303
|
+
if (!options.silent) {
|
|
3304
|
+
this.log("[IframeManager] X auth verify result:", {
|
|
3305
|
+
sessionId,
|
|
3306
|
+
providers
|
|
3307
|
+
});
|
|
3308
|
+
}
|
|
3309
|
+
return {
|
|
3310
|
+
success: true,
|
|
3311
|
+
user: userData,
|
|
3312
|
+
sessionId,
|
|
3313
|
+
providers
|
|
3314
|
+
};
|
|
3315
|
+
} catch (error) {
|
|
3316
|
+
this.log("[IframeManager] X auth fallback verify threw error:", error);
|
|
3317
|
+
this.recordProviderSession("x", null);
|
|
3318
|
+
this.recordProviderConnection("x", false);
|
|
3319
|
+
return { success: false };
|
|
3320
|
+
}
|
|
3321
|
+
}
|
|
3322
|
+
/**
|
|
3323
|
+
* Prime provider session/cache state to detect future changes.
|
|
3324
|
+
*/
|
|
3325
|
+
async primeProviderSessions() {
|
|
3326
|
+
try {
|
|
3327
|
+
await this.verifyXAuthSession({ silent: true });
|
|
3328
|
+
} catch (error) {
|
|
3329
|
+
this.log("[IframeManager] Prime provider sessions failed:", error);
|
|
3330
|
+
}
|
|
3331
|
+
}
|
|
3332
|
+
getKnownSessionId(providerKey) {
|
|
3333
|
+
return this.providerSessions.has(providerKey) ? this.providerSessions.get(providerKey) ?? null : null;
|
|
3334
|
+
}
|
|
3335
|
+
getKnownProviderConnection(providerKey) {
|
|
3336
|
+
if (!this.providerConnections.has(providerKey)) {
|
|
3337
|
+
return null;
|
|
3338
|
+
}
|
|
3339
|
+
const value = this.providerConnections.get(providerKey);
|
|
3340
|
+
return typeof value === "boolean" ? value : null;
|
|
3341
|
+
}
|
|
3342
|
+
recordProviderSession(providerKey, sessionId) {
|
|
3343
|
+
this.providerSessions.set(providerKey, sessionId ?? null);
|
|
3344
|
+
}
|
|
3345
|
+
recordProviderConnection(providerKey, connected) {
|
|
3346
|
+
this.providerConnections.set(providerKey, connected);
|
|
3347
|
+
}
|
|
3348
|
+
updateProviderTrackingFromUser(providerKey, user) {
|
|
3349
|
+
if (!user) {
|
|
3350
|
+
return;
|
|
3351
|
+
}
|
|
3352
|
+
if (providerKey === "x") {
|
|
3353
|
+
const sessionId = this.extractSessionId(user);
|
|
3354
|
+
this.recordProviderSession("x", sessionId);
|
|
3355
|
+
const providers = this.getProvidersList(user);
|
|
3356
|
+
this.recordProviderConnection("x", providers.includes("x"));
|
|
3357
|
+
}
|
|
3358
|
+
}
|
|
3359
|
+
extractSessionId(user) {
|
|
3360
|
+
if (!user || typeof user !== "object") {
|
|
3361
|
+
return null;
|
|
3362
|
+
}
|
|
3363
|
+
if (typeof user.sessionId === "string") {
|
|
3364
|
+
return user.sessionId;
|
|
3365
|
+
}
|
|
3366
|
+
if (user.data && typeof user.data.sessionId === "string") {
|
|
3367
|
+
return user.data.sessionId;
|
|
3368
|
+
}
|
|
3369
|
+
return null;
|
|
3370
|
+
}
|
|
3371
|
+
getProvidersList(user) {
|
|
3372
|
+
if (!user || typeof user !== "object") {
|
|
3373
|
+
return [];
|
|
3374
|
+
}
|
|
3375
|
+
const providersRaw = user.providers || user.data?.providers;
|
|
3376
|
+
if (!Array.isArray(providersRaw)) {
|
|
3377
|
+
return [];
|
|
3378
|
+
}
|
|
3379
|
+
return providersRaw.map((provider) => typeof provider === "string" ? provider.toLowerCase() : null).filter((provider) => provider !== null);
|
|
3380
|
+
}
|
|
2916
3381
|
/**
|
|
2917
3382
|
* Get trusted apps for user
|
|
2918
3383
|
*/
|
|
@@ -4840,7 +5305,11 @@ var init_AuthModal = __esm({
|
|
|
4840
5305
|
const needsRecovery = loginResponse.hasKeyshare && !loginResponse.isNewUser && !localKeyshare;
|
|
4841
5306
|
const displayNameRequired = await checkDisplayNameRequired(loginResponse);
|
|
4842
5307
|
if (displayNameRequired) {
|
|
4843
|
-
|
|
5308
|
+
if (loginResponse.accessToken && loginResponse.refreshToken) {
|
|
5309
|
+
await jwtTokenManager2.setTokens(loginResponse);
|
|
5310
|
+
} else {
|
|
5311
|
+
console.warn("[AuthModal] Display name flow skipped token save - tokens missing");
|
|
5312
|
+
}
|
|
4844
5313
|
setStep("display-name");
|
|
4845
5314
|
return;
|
|
4846
5315
|
}
|
|
@@ -4947,7 +5416,11 @@ var init_AuthModal = __esm({
|
|
|
4947
5416
|
if (loginResponse.isNewUser) {
|
|
4948
5417
|
const displayNameRequired = await checkDisplayNameRequired(loginResponse);
|
|
4949
5418
|
if (displayNameRequired) {
|
|
4950
|
-
|
|
5419
|
+
if (loginResponse.accessToken && loginResponse.refreshToken) {
|
|
5420
|
+
await jwtTokenManager2.setTokens(loginResponse);
|
|
5421
|
+
} else {
|
|
5422
|
+
console.warn("[AuthModal] Verification flow skipped token save - tokens missing");
|
|
5423
|
+
}
|
|
4951
5424
|
setStep("display-name");
|
|
4952
5425
|
return;
|
|
4953
5426
|
}
|
|
@@ -5030,7 +5503,11 @@ var init_AuthModal = __esm({
|
|
|
5030
5503
|
}
|
|
5031
5504
|
const displayNameRequired = await checkDisplayNameRequired(result.loginResponse);
|
|
5032
5505
|
if (displayNameRequired) {
|
|
5033
|
-
|
|
5506
|
+
if (result.loginResponse?.accessToken && result.loginResponse?.refreshToken) {
|
|
5507
|
+
await jwtTokenManager2.setTokens(result.loginResponse);
|
|
5508
|
+
} else {
|
|
5509
|
+
console.warn("[AuthModal] Passkey auth flow skipped token save - tokens missing");
|
|
5510
|
+
}
|
|
5034
5511
|
setStep("display-name");
|
|
5035
5512
|
return;
|
|
5036
5513
|
}
|
|
@@ -5075,7 +5552,8 @@ var init_AuthModal = __esm({
|
|
|
5075
5552
|
}
|
|
5076
5553
|
}, [onAuthSuccess, onOpenChange, callbacks]);
|
|
5077
5554
|
const handleSocialAuth = React13.useCallback(async (providerId) => {
|
|
5078
|
-
const
|
|
5555
|
+
const normalizedProviderId = providerId.toLowerCase();
|
|
5556
|
+
const provider = config?.social?.providers?.find((p) => (p.id || "").toLowerCase() === normalizedProviderId && p.enabled);
|
|
5079
5557
|
if (!provider) {
|
|
5080
5558
|
showError("Configuration Error", `${providerId} provider not found or not enabled.`);
|
|
5081
5559
|
return;
|
|
@@ -5084,8 +5562,277 @@ var init_AuthModal = __esm({
|
|
|
5084
5562
|
try {
|
|
5085
5563
|
const { getIframeManager: getIframeManager2 } = await Promise.resolve().then(() => (init_index(), index_exports));
|
|
5086
5564
|
const iframeManager = getIframeManager2();
|
|
5565
|
+
const normalizeLoginResponse = async (rawLoginResponse, providerKey, userData) => {
|
|
5566
|
+
if (!rawLoginResponse) {
|
|
5567
|
+
return rawLoginResponse;
|
|
5568
|
+
}
|
|
5569
|
+
let normalized = { ...rawLoginResponse };
|
|
5570
|
+
if (providerKey === "x") {
|
|
5571
|
+
const needsEnrichment = typeof normalized.hasKeyshare !== "boolean" || typeof normalized.isNewUser === "undefined";
|
|
5572
|
+
if (needsEnrichment) {
|
|
5573
|
+
try {
|
|
5574
|
+
const { getUserProfile: getUserProfile2 } = await Promise.resolve().then(() => (init_profile(), profile_exports));
|
|
5575
|
+
const profile = await getUserProfile2();
|
|
5576
|
+
if (typeof normalized.hasKeyshare !== "boolean" && typeof profile.hasKeyshare === "boolean") {
|
|
5577
|
+
normalized.hasKeyshare = profile.hasKeyshare;
|
|
5578
|
+
}
|
|
5579
|
+
if (typeof normalized.isNewUser === "undefined") {
|
|
5580
|
+
normalized.isNewUser = !profile.hasKeyshare;
|
|
5581
|
+
}
|
|
5582
|
+
if (profile.displayName && (normalized.displayName === void 0 || normalized.displayName === null)) {
|
|
5583
|
+
normalized.displayName = profile.displayName;
|
|
5584
|
+
}
|
|
5585
|
+
if (profile.avatar && (normalized.avatar === void 0 || normalized.avatar === null)) {
|
|
5586
|
+
normalized.avatar = profile.avatar;
|
|
5587
|
+
}
|
|
5588
|
+
} catch (profileError) {
|
|
5589
|
+
console.warn("[AuthModal] Failed to enrich X login response with profile:", profileError);
|
|
5590
|
+
if (typeof normalized.hasKeyshare !== "boolean") {
|
|
5591
|
+
normalized.hasKeyshare = false;
|
|
5592
|
+
}
|
|
5593
|
+
if (typeof normalized.isNewUser === "undefined") {
|
|
5594
|
+
normalized.isNewUser = false;
|
|
5595
|
+
}
|
|
5596
|
+
}
|
|
5597
|
+
}
|
|
5598
|
+
}
|
|
5599
|
+
return normalized;
|
|
5600
|
+
};
|
|
5601
|
+
const fetchTokensFromRefreshEndpoint = async () => {
|
|
5602
|
+
try {
|
|
5603
|
+
const { tssUrl: tssUrl2 } = getServiceUrls();
|
|
5604
|
+
const refreshUrl = addProjectIdToUrl(`${tssUrl2}/api/auth/refresh`);
|
|
5605
|
+
const response2 = await fetch(refreshUrl, {
|
|
5606
|
+
method: "POST",
|
|
5607
|
+
headers: { "Content-Type": "application/json" },
|
|
5608
|
+
credentials: "include",
|
|
5609
|
+
body: JSON.stringify({})
|
|
5610
|
+
});
|
|
5611
|
+
if (!response2.ok) {
|
|
5612
|
+
const errorText = await response2.text().catch(() => "Token refresh failed");
|
|
5613
|
+
console.warn("[AuthModal] Token refresh endpoint responded with error:", response2.status, errorText);
|
|
5614
|
+
return null;
|
|
5615
|
+
}
|
|
5616
|
+
const refreshData = await response2.json();
|
|
5617
|
+
if (refreshData?.accessToken && refreshData?.refreshToken) {
|
|
5618
|
+
return {
|
|
5619
|
+
accessToken: refreshData.accessToken,
|
|
5620
|
+
refreshToken: refreshData.refreshToken,
|
|
5621
|
+
expiresIn: refreshData.accessTokenExpiresIn ?? refreshData.expiresIn ?? 3600,
|
|
5622
|
+
refreshTokenExpiresIn: refreshData.refreshTokenExpiresIn
|
|
5623
|
+
};
|
|
5624
|
+
}
|
|
5625
|
+
console.warn("[AuthModal] Token refresh response missing tokens:", refreshData);
|
|
5626
|
+
return null;
|
|
5627
|
+
} catch (error) {
|
|
5628
|
+
console.error("[AuthModal] Token refresh request failed:", error);
|
|
5629
|
+
return null;
|
|
5630
|
+
}
|
|
5631
|
+
};
|
|
5632
|
+
const enrichLoginResponseWithTokens = async (loginResponse2, providerKey, exchangeConfig) => {
|
|
5633
|
+
if (!loginResponse2) {
|
|
5634
|
+
return loginResponse2;
|
|
5635
|
+
}
|
|
5636
|
+
const hasAccessToken = typeof loginResponse2.accessToken === "string" && loginResponse2.accessToken.length > 0;
|
|
5637
|
+
const hasRefreshToken = typeof loginResponse2.refreshToken === "string" && loginResponse2.refreshToken.length > 0;
|
|
5638
|
+
if (hasAccessToken && hasRefreshToken) {
|
|
5639
|
+
return loginResponse2;
|
|
5640
|
+
}
|
|
5641
|
+
if (!exchangeConfig) {
|
|
5642
|
+
console.warn("[AuthModal] Token exchange skipped - no configuration provided for provider:", providerKey);
|
|
5643
|
+
return loginResponse2;
|
|
5644
|
+
}
|
|
5645
|
+
const sessionId = loginResponse2.sessionId;
|
|
5646
|
+
if (!sessionId) {
|
|
5647
|
+
console.warn("[AuthModal] Missing sessionId in login response, cannot exchange tokens");
|
|
5648
|
+
return loginResponse2;
|
|
5649
|
+
}
|
|
5650
|
+
const { audience, scopes, ttl, additionalBody } = exchangeConfig;
|
|
5651
|
+
try {
|
|
5652
|
+
const { tssUrl: tssUrl2 } = getServiceUrls();
|
|
5653
|
+
const exchangeUrl = addProjectIdToUrl(`${tssUrl2}/api/auth/token/exchange`);
|
|
5654
|
+
const exchangeResponse = await fetch(exchangeUrl, {
|
|
5655
|
+
method: "POST",
|
|
5656
|
+
headers: { "Content-Type": "application/json" },
|
|
5657
|
+
credentials: "include",
|
|
5658
|
+
body: JSON.stringify({
|
|
5659
|
+
sessionId,
|
|
5660
|
+
provider: providerKey,
|
|
5661
|
+
audience,
|
|
5662
|
+
scopes,
|
|
5663
|
+
...typeof ttl === "number" ? { ttl } : {},
|
|
5664
|
+
...additionalBody || {}
|
|
5665
|
+
})
|
|
5666
|
+
});
|
|
5667
|
+
if (!exchangeResponse.ok) {
|
|
5668
|
+
const errorText = await exchangeResponse.text().catch(() => "Token exchange failed");
|
|
5669
|
+
console.warn("[AuthModal] Token exchange failed:", exchangeResponse.status, errorText);
|
|
5670
|
+
return loginResponse2;
|
|
5671
|
+
}
|
|
5672
|
+
const tokenData = await exchangeResponse.json();
|
|
5673
|
+
if (tokenData && tokenData.accessToken && tokenData.refreshToken) {
|
|
5674
|
+
console.log("[AuthModal] Token exchange successful for provider:", providerKey);
|
|
5675
|
+
const merged = {
|
|
5676
|
+
...loginResponse2,
|
|
5677
|
+
accessToken: tokenData.accessToken,
|
|
5678
|
+
refreshToken: tokenData.refreshToken,
|
|
5679
|
+
expiresIn: tokenData.expiresIn ?? loginResponse2.expiresIn ?? 3600,
|
|
5680
|
+
hasKeyshare: tokenData.hasKeyshare ?? loginResponse2.hasKeyshare,
|
|
5681
|
+
isNewUser: tokenData.isNewUser ?? loginResponse2.isNewUser,
|
|
5682
|
+
avatar: tokenData.avatar ?? loginResponse2.avatar,
|
|
5683
|
+
displayName: tokenData.displayName ?? loginResponse2.displayName,
|
|
5684
|
+
providers: tokenData.providers ?? loginResponse2.providers
|
|
5685
|
+
};
|
|
5686
|
+
return merged;
|
|
5687
|
+
}
|
|
5688
|
+
console.warn("[AuthModal] Token exchange response missing tokens:", tokenData);
|
|
5689
|
+
return loginResponse2;
|
|
5690
|
+
} catch (error) {
|
|
5691
|
+
console.error("[AuthModal] Token exchange error:", error);
|
|
5692
|
+
return loginResponse2;
|
|
5693
|
+
}
|
|
5694
|
+
};
|
|
5695
|
+
const finalizeSocialLogin = async (rawLoginResponse, providerKey, userData) => {
|
|
5696
|
+
let loginResponse2 = await normalizeLoginResponse(rawLoginResponse, providerKey, userData);
|
|
5697
|
+
const tokenExchangeConfig = authConfig?.tokenExchange || provider?.tokenExchange;
|
|
5698
|
+
loginResponse2 = await enrichLoginResponseWithTokens(loginResponse2, providerKey, tokenExchangeConfig);
|
|
5699
|
+
if (!loginResponse2.accessToken || !loginResponse2.refreshToken) {
|
|
5700
|
+
const refreshTokens = await fetchTokensFromRefreshEndpoint();
|
|
5701
|
+
if (refreshTokens) {
|
|
5702
|
+
loginResponse2 = {
|
|
5703
|
+
...loginResponse2,
|
|
5704
|
+
accessToken: refreshTokens.accessToken,
|
|
5705
|
+
refreshToken: refreshTokens.refreshToken,
|
|
5706
|
+
expiresIn: refreshTokens.expiresIn
|
|
5707
|
+
};
|
|
5708
|
+
}
|
|
5709
|
+
}
|
|
5710
|
+
if (!loginResponse2) {
|
|
5711
|
+
showError("Authentication Failed", "No login response received");
|
|
5712
|
+
setIsLoading(false);
|
|
5713
|
+
return;
|
|
5714
|
+
}
|
|
5715
|
+
await jwtTokenManager2.clearTokens();
|
|
5716
|
+
if (!loginResponse2.accessToken || !loginResponse2.refreshToken) {
|
|
5717
|
+
console.warn("[AuthModal] Authentication tokens were not issued; continuing with cookie-based session only.");
|
|
5718
|
+
}
|
|
5719
|
+
let tokensPersisted = false;
|
|
5720
|
+
const persistTokensIfAvailable = async () => {
|
|
5721
|
+
if (!tokensPersisted && loginResponse2.accessToken && loginResponse2.refreshToken) {
|
|
5722
|
+
await jwtTokenManager2.setTokens(loginResponse2);
|
|
5723
|
+
tokensPersisted = true;
|
|
5724
|
+
}
|
|
5725
|
+
};
|
|
5726
|
+
_pendingLoginResponse = loginResponse2;
|
|
5727
|
+
const missingStatusInfo = typeof loginResponse2.hasKeyshare !== "boolean" && typeof loginResponse2.isNewUser === "undefined";
|
|
5728
|
+
if (missingStatusInfo) {
|
|
5729
|
+
if (providerKey === "x") {
|
|
5730
|
+
loginResponse2.hasKeyshare = false;
|
|
5731
|
+
loginResponse2.isNewUser = false;
|
|
5732
|
+
} else {
|
|
5733
|
+
setFailedMessage(
|
|
5734
|
+
"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."
|
|
5735
|
+
);
|
|
5736
|
+
setFailedType("config");
|
|
5737
|
+
setStep("failed");
|
|
5738
|
+
setIsLoading(false);
|
|
5739
|
+
_pendingLoginResponse = null;
|
|
5740
|
+
return;
|
|
5741
|
+
}
|
|
5742
|
+
}
|
|
5743
|
+
if (loginResponse2.hasKeyshare === false && loginResponse2.isNewUser === false && providerKey !== "x") {
|
|
5744
|
+
setFailedMessage(
|
|
5745
|
+
"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."
|
|
5746
|
+
);
|
|
5747
|
+
setFailedType("critical");
|
|
5748
|
+
setStep("failed");
|
|
5749
|
+
setIsLoading(false);
|
|
5750
|
+
_pendingLoginResponse = null;
|
|
5751
|
+
return;
|
|
5752
|
+
}
|
|
5753
|
+
const displayNameRequired = await checkDisplayNameRequired(loginResponse2);
|
|
5754
|
+
if (displayNameRequired) {
|
|
5755
|
+
let autoDisplayName = null;
|
|
5756
|
+
if (providerKey === "telegram" && userData) {
|
|
5757
|
+
autoDisplayName = [userData.first_name, userData.last_name].filter(Boolean).join(" ").trim() || userData.username || "Telegram User";
|
|
5758
|
+
} else if (providerKey === "x") {
|
|
5759
|
+
const providerMeta = userData?.meta || loginResponse2.providers?.find((p) => (p.provider || "").toLowerCase() === "x")?.meta;
|
|
5760
|
+
autoDisplayName = providerMeta?.name || providerMeta?.username || loginResponse2.displayName || null;
|
|
5761
|
+
}
|
|
5762
|
+
if (providerKey === "x" && !autoDisplayName) {
|
|
5763
|
+
try {
|
|
5764
|
+
await persistTokensIfAvailable();
|
|
5765
|
+
const { getUserProfile: getUserProfile2 } = await Promise.resolve().then(() => (init_profile(), profile_exports));
|
|
5766
|
+
const profile = await getUserProfile2();
|
|
5767
|
+
const xProvider = profile.providers?.find((p) => (p.provider || "").toLowerCase() === "x");
|
|
5768
|
+
autoDisplayName = xProvider?.meta?.name || xProvider?.meta?.username || profile.displayName || autoDisplayName;
|
|
5769
|
+
} catch (error) {
|
|
5770
|
+
console.warn("[AuthModal] Failed to fetch profile for display name:", error);
|
|
5771
|
+
}
|
|
5772
|
+
}
|
|
5773
|
+
if (autoDisplayName) {
|
|
5774
|
+
console.log("[AuthModal] Auto-setting display name for", providerKey, ":", autoDisplayName);
|
|
5775
|
+
await persistTokensIfAvailable();
|
|
5776
|
+
try {
|
|
5777
|
+
const { updateUserProfile: updateUserProfile2 } = await Promise.resolve().then(() => (init_profile(), profile_exports));
|
|
5778
|
+
await updateUserProfile2({ displayName: autoDisplayName });
|
|
5779
|
+
loginResponse2.displayName = autoDisplayName;
|
|
5780
|
+
console.log("[AuthModal] Display name set successfully for", providerKey);
|
|
5781
|
+
} catch (error) {
|
|
5782
|
+
console.error("[AuthModal] Failed to set display name:", error);
|
|
5783
|
+
}
|
|
5784
|
+
} else {
|
|
5785
|
+
await persistTokensIfAvailable();
|
|
5786
|
+
setStep("display-name");
|
|
5787
|
+
setIsLoading(false);
|
|
5788
|
+
return;
|
|
5789
|
+
}
|
|
5790
|
+
}
|
|
5791
|
+
if (loginResponse2.isNewUser || !loginResponse2.hasKeyshare) {
|
|
5792
|
+
console.log("[AuthModal] New user detected - closing modal before DKG...");
|
|
5793
|
+
setStep("signin");
|
|
5794
|
+
setEmail("");
|
|
5795
|
+
setVerificationError("");
|
|
5796
|
+
setPasskeyError("");
|
|
5797
|
+
setPasskeyStatus("idle");
|
|
5798
|
+
setIsLoading(false);
|
|
5799
|
+
onOpenChange(false);
|
|
5800
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
5801
|
+
console.log("[AuthModal] Calling onAuthSuccess for new user...");
|
|
5802
|
+
if (onAuthSuccess) {
|
|
5803
|
+
await onAuthSuccess();
|
|
5804
|
+
}
|
|
5805
|
+
console.log("[AuthModal] New user setup completed");
|
|
5806
|
+
} else {
|
|
5807
|
+
console.log("[AuthModal] Existing user - calling onAuthSuccess...");
|
|
5808
|
+
try {
|
|
5809
|
+
if (onAuthSuccess) {
|
|
5810
|
+
await onAuthSuccess();
|
|
5811
|
+
console.log("[AuthModal] onAuthSuccess completed successfully");
|
|
5812
|
+
}
|
|
5813
|
+
} catch (authError) {
|
|
5814
|
+
console.error("[AuthModal] onAuthSuccess failed:", authError);
|
|
5815
|
+
if (authError?.message?.includes("User denied authorization")) {
|
|
5816
|
+
setFailedMessage("Authorization cancelled");
|
|
5817
|
+
setStep("failed");
|
|
5818
|
+
setIsLoading(false);
|
|
5819
|
+
return;
|
|
5820
|
+
}
|
|
5821
|
+
throw authError;
|
|
5822
|
+
}
|
|
5823
|
+
console.log("[AuthModal] Resetting state and closing modal...");
|
|
5824
|
+
setStep("signin");
|
|
5825
|
+
setEmail("");
|
|
5826
|
+
setVerificationError("");
|
|
5827
|
+
setPasskeyError("");
|
|
5828
|
+
setPasskeyStatus("idle");
|
|
5829
|
+
setIsLoading(false);
|
|
5830
|
+
onOpenChange(false);
|
|
5831
|
+
console.log("[AuthModal] Modal closed");
|
|
5832
|
+
}
|
|
5833
|
+
};
|
|
5087
5834
|
let authConfig = provider?.meta || {};
|
|
5088
|
-
if (
|
|
5835
|
+
if (normalizedProviderId === "telegram" && !authConfig.botUsername) {
|
|
5089
5836
|
const defaultBotUsername = "LumiaPassportDevBot";
|
|
5090
5837
|
if (defaultBotUsername) {
|
|
5091
5838
|
authConfig = { ...authConfig, botUsername: defaultBotUsername };
|
|
@@ -5093,7 +5840,7 @@ var init_AuthModal = __esm({
|
|
|
5093
5840
|
}
|
|
5094
5841
|
console.log("[AuthModal] Auth config for", providerId, ":", authConfig);
|
|
5095
5842
|
const result = await iframeManager.openSocialAuthPopup(
|
|
5096
|
-
|
|
5843
|
+
normalizedProviderId,
|
|
5097
5844
|
authConfig
|
|
5098
5845
|
);
|
|
5099
5846
|
if (!result.success) {
|
|
@@ -5102,116 +5849,55 @@ var init_AuthModal = __esm({
|
|
|
5102
5849
|
return;
|
|
5103
5850
|
}
|
|
5104
5851
|
const { user } = result;
|
|
5852
|
+
if (normalizedProviderId === "x" || normalizedProviderId === "twitter") {
|
|
5853
|
+
console.log("[AuthModal] X OAuth completed, user authenticated via callback");
|
|
5854
|
+
const { tssUrl: tssUrl2 } = getServiceUrls();
|
|
5855
|
+
const verifyUrl = addProjectIdToUrl(`${tssUrl2}/api/auth/verify`);
|
|
5856
|
+
const verifyResponse = await fetch(verifyUrl, {
|
|
5857
|
+
method: "GET",
|
|
5858
|
+
credentials: "include"
|
|
5859
|
+
});
|
|
5860
|
+
if (!verifyResponse.ok) {
|
|
5861
|
+
showError("Authentication Failed", "Failed to verify X authentication");
|
|
5862
|
+
setIsLoading(false);
|
|
5863
|
+
return;
|
|
5864
|
+
}
|
|
5865
|
+
const loginResponse2 = await verifyResponse.json();
|
|
5866
|
+
console.log("[AuthModal] X login verified:", loginResponse2);
|
|
5867
|
+
await finalizeSocialLogin(loginResponse2, "x");
|
|
5868
|
+
return;
|
|
5869
|
+
}
|
|
5105
5870
|
if (!user) {
|
|
5106
5871
|
showError("Authentication Failed", "No user data received");
|
|
5107
5872
|
setIsLoading(false);
|
|
5108
5873
|
return;
|
|
5109
5874
|
}
|
|
5110
5875
|
const { tssUrl } = getServiceUrls();
|
|
5111
|
-
const apiUrl = addProjectIdToUrl(`${tssUrl}/api/auth/
|
|
5112
|
-
const
|
|
5876
|
+
const apiUrl = addProjectIdToUrl(`${tssUrl}/api/auth/${providerId}/login`);
|
|
5877
|
+
const payload = normalizedProviderId === "telegram" ? {
|
|
5113
5878
|
id: user.id,
|
|
5114
5879
|
first_name: user.first_name,
|
|
5115
5880
|
auth_date: user.auth_date,
|
|
5116
5881
|
hash: user.hash
|
|
5117
|
-
};
|
|
5118
|
-
if (
|
|
5119
|
-
|
|
5120
|
-
|
|
5882
|
+
} : user;
|
|
5883
|
+
if (normalizedProviderId === "telegram") {
|
|
5884
|
+
if (user.last_name) payload.last_name = user.last_name;
|
|
5885
|
+
if (user.username) payload.username = user.username;
|
|
5886
|
+
if (user.photo_url) payload.photo_url = user.photo_url;
|
|
5887
|
+
}
|
|
5121
5888
|
const response = await fetch(apiUrl, {
|
|
5122
5889
|
method: "POST",
|
|
5123
5890
|
headers: { "Content-Type": "application/json" },
|
|
5124
5891
|
credentials: "include",
|
|
5125
|
-
body: JSON.stringify(
|
|
5892
|
+
body: JSON.stringify(payload)
|
|
5126
5893
|
});
|
|
5127
5894
|
if (!response.ok) {
|
|
5128
5895
|
const errorText = await response.text().catch(() => "Login failed");
|
|
5129
5896
|
throw new Error(`Login failed: ${response.status} ${errorText}`);
|
|
5130
5897
|
}
|
|
5131
5898
|
const loginResponse = await response.json();
|
|
5132
|
-
console.log(
|
|
5133
|
-
|
|
5134
|
-
showError("Authentication Failed", "No login response received");
|
|
5135
|
-
setIsLoading(false);
|
|
5136
|
-
return;
|
|
5137
|
-
}
|
|
5138
|
-
jwtTokenManager2.clearTokens();
|
|
5139
|
-
_pendingLoginResponse = loginResponse;
|
|
5140
|
-
if (!loginResponse.hasKeyshare && loginResponse.isNewUser === void 0) {
|
|
5141
|
-
setFailedMessage(
|
|
5142
|
-
"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."
|
|
5143
|
-
);
|
|
5144
|
-
setFailedType("config");
|
|
5145
|
-
setStep("failed");
|
|
5146
|
-
setIsLoading(false);
|
|
5147
|
-
_pendingLoginResponse = null;
|
|
5148
|
-
return;
|
|
5149
|
-
}
|
|
5150
|
-
if (!loginResponse.hasKeyshare && loginResponse.isNewUser === false) {
|
|
5151
|
-
setFailedMessage(
|
|
5152
|
-
"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."
|
|
5153
|
-
);
|
|
5154
|
-
setFailedType("critical");
|
|
5155
|
-
setStep("failed");
|
|
5156
|
-
setIsLoading(false);
|
|
5157
|
-
_pendingLoginResponse = null;
|
|
5158
|
-
return;
|
|
5159
|
-
}
|
|
5160
|
-
const displayNameRequired = await checkDisplayNameRequired(loginResponse);
|
|
5161
|
-
if (displayNameRequired) {
|
|
5162
|
-
const displayName = [user.first_name, user.last_name].filter(Boolean).join(" ").trim() || user.username || "Telegram User";
|
|
5163
|
-
console.log("[AuthModal] Auto-setting display name for Telegram user:", displayName);
|
|
5164
|
-
await jwtTokenManager2.setTokens(loginResponse);
|
|
5165
|
-
try {
|
|
5166
|
-
const { updateUserProfile: updateUserProfile2 } = await Promise.resolve().then(() => (init_profile(), profile_exports));
|
|
5167
|
-
await updateUserProfile2({ displayName });
|
|
5168
|
-
console.log("[AuthModal] Display name set successfully");
|
|
5169
|
-
} catch (error) {
|
|
5170
|
-
console.error("[AuthModal] Failed to set display name:", error);
|
|
5171
|
-
}
|
|
5172
|
-
}
|
|
5173
|
-
if (loginResponse.isNewUser || !loginResponse.hasKeyshare) {
|
|
5174
|
-
console.log("[AuthModal] New user detected - closing modal before DKG...");
|
|
5175
|
-
setStep("signin");
|
|
5176
|
-
setEmail("");
|
|
5177
|
-
setVerificationError("");
|
|
5178
|
-
setPasskeyError("");
|
|
5179
|
-
setPasskeyStatus("idle");
|
|
5180
|
-
setIsLoading(false);
|
|
5181
|
-
onOpenChange(false);
|
|
5182
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
5183
|
-
console.log("[AuthModal] Calling onAuthSuccess for new user...");
|
|
5184
|
-
if (onAuthSuccess) {
|
|
5185
|
-
await onAuthSuccess();
|
|
5186
|
-
}
|
|
5187
|
-
console.log("[AuthModal] New user setup completed");
|
|
5188
|
-
} else {
|
|
5189
|
-
console.log("[AuthModal] Existing user - calling onAuthSuccess...");
|
|
5190
|
-
try {
|
|
5191
|
-
if (onAuthSuccess) {
|
|
5192
|
-
await onAuthSuccess();
|
|
5193
|
-
console.log("[AuthModal] onAuthSuccess completed successfully");
|
|
5194
|
-
}
|
|
5195
|
-
} catch (authError) {
|
|
5196
|
-
console.error("[AuthModal] onAuthSuccess failed:", authError);
|
|
5197
|
-
if (authError?.message?.includes("User denied authorization")) {
|
|
5198
|
-
setFailedMessage("Authorization cancelled");
|
|
5199
|
-
setStep("failed");
|
|
5200
|
-
setIsLoading(false);
|
|
5201
|
-
return;
|
|
5202
|
-
}
|
|
5203
|
-
throw authError;
|
|
5204
|
-
}
|
|
5205
|
-
console.log("[AuthModal] Resetting state and closing modal...");
|
|
5206
|
-
setStep("signin");
|
|
5207
|
-
setEmail("");
|
|
5208
|
-
setVerificationError("");
|
|
5209
|
-
setPasskeyError("");
|
|
5210
|
-
setPasskeyStatus("idle");
|
|
5211
|
-
setIsLoading(false);
|
|
5212
|
-
onOpenChange(false);
|
|
5213
|
-
console.log("[AuthModal] Modal closed");
|
|
5214
|
-
}
|
|
5899
|
+
console.log(`[AuthModal] ${providerId} login response:`, loginResponse);
|
|
5900
|
+
await finalizeSocialLogin(loginResponse, normalizedProviderId, user);
|
|
5215
5901
|
} catch (error) {
|
|
5216
5902
|
showError(
|
|
5217
5903
|
`${provider.name} Authentication Failed`,
|
|
@@ -5220,9 +5906,6 @@ var init_AuthModal = __esm({
|
|
|
5220
5906
|
setIsLoading(false);
|
|
5221
5907
|
}
|
|
5222
5908
|
}, [config?.social?.providers, onAuthSuccess, onOpenChange, callbacks]);
|
|
5223
|
-
const handleTelegramAuth = React13.useCallback(async () => {
|
|
5224
|
-
await handleSocialAuth("telegram");
|
|
5225
|
-
}, [handleSocialAuth]);
|
|
5226
5909
|
const handleComingSoon = (providerName) => {
|
|
5227
5910
|
showError("Coming Soon", `${providerName} authentication is coming soon!`);
|
|
5228
5911
|
};
|
|
@@ -5232,6 +5915,7 @@ var init_AuthModal = __esm({
|
|
|
5232
5915
|
{
|
|
5233
5916
|
className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
5234
5917
|
hideClose: true,
|
|
5918
|
+
"data-lumia-auth-modal": "true",
|
|
5235
5919
|
children: [
|
|
5236
5920
|
/* @__PURE__ */ jsx19(DialogTitle, { className: "sr-only", children: "Restore Account Access" }),
|
|
5237
5921
|
/* @__PURE__ */ jsx19(KeyshareRestore, { userId: recoveryUserId, onClose: onRecoveryClose, onRestoreSuccess: onRecoverySuccess })
|
|
@@ -5249,6 +5933,7 @@ var init_AuthModal = __esm({
|
|
|
5249
5933
|
maxWidth: config.ui.modal?.width || "400px"
|
|
5250
5934
|
},
|
|
5251
5935
|
hideClose: true,
|
|
5936
|
+
"data-lumia-auth-modal": "true",
|
|
5252
5937
|
children: [
|
|
5253
5938
|
/* @__PURE__ */ jsx19(DialogTitle, { className: "sr-only", children: "Enter Your Name" }),
|
|
5254
5939
|
/* @__PURE__ */ jsx19("div", { className: "p-8", children: /* @__PURE__ */ jsx19(
|
|
@@ -5293,6 +5978,7 @@ var init_AuthModal = __esm({
|
|
|
5293
5978
|
borderRadius: config.ui.modal?.borderRadius || "24px",
|
|
5294
5979
|
maxWidth: config.ui.modal?.width || "400px"
|
|
5295
5980
|
},
|
|
5981
|
+
"data-lumia-auth-modal": "true",
|
|
5296
5982
|
children: [
|
|
5297
5983
|
/* @__PURE__ */ jsx19(DialogTitle, { className: "sr-only", children: failedType === "config" ? "Configuration Error" : failedType === "critical" ? "Critical Error" : "Authentication Failed" }),
|
|
5298
5984
|
/* @__PURE__ */ jsx19("div", { className: "p-8", children: /* @__PURE__ */ jsx19(
|
|
@@ -5321,6 +6007,7 @@ var init_AuthModal = __esm({
|
|
|
5321
6007
|
borderRadius: config.ui.modal?.borderRadius || "24px",
|
|
5322
6008
|
maxWidth: config.ui.modal?.width || "400px"
|
|
5323
6009
|
},
|
|
6010
|
+
"data-lumia-auth-modal": "true",
|
|
5324
6011
|
children: [
|
|
5325
6012
|
/* @__PURE__ */ jsx19(DialogTitle, { className: "sr-only", children: "Email Verification" }),
|
|
5326
6013
|
/* @__PURE__ */ jsxs11("div", { className: "p-5", children: [
|
|
@@ -5357,6 +6044,7 @@ var init_AuthModal = __esm({
|
|
|
5357
6044
|
DialogContent,
|
|
5358
6045
|
{
|
|
5359
6046
|
className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden`,
|
|
6047
|
+
"data-lumia-auth-modal": "true",
|
|
5360
6048
|
children: [
|
|
5361
6049
|
/* @__PURE__ */ jsx19(DialogTitle, { className: "sr-only", children: "Sign in to Lumia Passport" }),
|
|
5362
6050
|
/* @__PURE__ */ jsxs11("div", { className: "p-8", children: [
|
|
@@ -5466,7 +6154,10 @@ var init_AuthModal = __esm({
|
|
|
5466
6154
|
discord: DiscordIcon
|
|
5467
6155
|
};
|
|
5468
6156
|
const IconComponent = provider.icon ?? fallbackMap[(provider.id || "").toLowerCase()];
|
|
5469
|
-
const
|
|
6157
|
+
const supportedProviders = ["telegram", "x", "twitter"];
|
|
6158
|
+
const providerId = (provider.id || "").toLowerCase();
|
|
6159
|
+
const isSupported = supportedProviders.includes(providerId);
|
|
6160
|
+
const handleClick = isSupported ? () => handleSocialAuth(providerId) : () => handleComingSoon(provider.name);
|
|
5470
6161
|
return /* @__PURE__ */ jsx19(
|
|
5471
6162
|
Button,
|
|
5472
6163
|
{
|
|
@@ -6390,6 +7081,7 @@ var init_ManageWallet = __esm({
|
|
|
6390
7081
|
init_lumiaPassport();
|
|
6391
7082
|
init_VerificationCodeInput();
|
|
6392
7083
|
init_WalletConnectHandler();
|
|
7084
|
+
init_auth();
|
|
6393
7085
|
ManageWallet = ({ open, onOpenChange, onBack }) => {
|
|
6394
7086
|
const [providers, setProviders] = useState7([]);
|
|
6395
7087
|
const [loading, setLoading] = useState7(false);
|
|
@@ -6493,6 +7185,68 @@ var init_ManageWallet = __esm({
|
|
|
6493
7185
|
setTelegramLinkStarted(false);
|
|
6494
7186
|
}
|
|
6495
7187
|
}, [providerType]);
|
|
7188
|
+
const handleLinkSocialProvider = React16.useCallback(async (providerIdRaw) => {
|
|
7189
|
+
const providerKey = providerIdRaw.toLowerCase();
|
|
7190
|
+
try {
|
|
7191
|
+
setLinkIsLoading(true);
|
|
7192
|
+
setLinkError("");
|
|
7193
|
+
setError("");
|
|
7194
|
+
const socialProvider = config.social?.providers?.find(
|
|
7195
|
+
(p) => (p.id || "").toLowerCase() === providerKey && p.enabled
|
|
7196
|
+
);
|
|
7197
|
+
if (!socialProvider) {
|
|
7198
|
+
throw new Error(`${providerIdRaw} provider not configured`);
|
|
7199
|
+
}
|
|
7200
|
+
let authConfig = {
|
|
7201
|
+
...socialProvider.meta || {},
|
|
7202
|
+
mode: "link"
|
|
7203
|
+
};
|
|
7204
|
+
try {
|
|
7205
|
+
await ensureValidToken();
|
|
7206
|
+
} catch (tokenError) {
|
|
7207
|
+
console.warn("[ManageWallet] ensureValidToken failed before linking", tokenError);
|
|
7208
|
+
}
|
|
7209
|
+
const accessToken = jwtTokenManager2.getAccessToken();
|
|
7210
|
+
if (accessToken) {
|
|
7211
|
+
authConfig.token = accessToken;
|
|
7212
|
+
}
|
|
7213
|
+
const normalizedProvider = providerKey === "twitter" ? "x" : providerKey;
|
|
7214
|
+
const { getIframeManager: getIframeManager2 } = await Promise.resolve().then(() => (init_index(), index_exports));
|
|
7215
|
+
const iframeManager = getIframeManager2();
|
|
7216
|
+
const result = await iframeManager.openSocialAuthPopup(normalizedProvider, authConfig);
|
|
7217
|
+
if (!result.success) {
|
|
7218
|
+
throw new Error(result.error || `${socialProvider.name || providerIdRaw} authentication failed`);
|
|
7219
|
+
}
|
|
7220
|
+
const list = await getLinkedProviders();
|
|
7221
|
+
setProviders(list);
|
|
7222
|
+
setProvidersJustUpdated(true);
|
|
7223
|
+
try {
|
|
7224
|
+
callbacks?.onLumiaPassportUpdate?.({ providers: list });
|
|
7225
|
+
} catch {
|
|
7226
|
+
}
|
|
7227
|
+
setShowAdd(false);
|
|
7228
|
+
setProviderType(null);
|
|
7229
|
+
} catch (e) {
|
|
7230
|
+
console.error(`[ManageWallet] Failed to link ${providerIdRaw}:`, e);
|
|
7231
|
+
const message = e?.message || `Failed to link ${providerIdRaw}`;
|
|
7232
|
+
setLinkError(message);
|
|
7233
|
+
setProviderType(null);
|
|
7234
|
+
} finally {
|
|
7235
|
+
setLinkIsLoading(false);
|
|
7236
|
+
}
|
|
7237
|
+
}, [config.social?.providers, callbacks]);
|
|
7238
|
+
const [socialLinkStarted, setSocialLinkStarted] = React16.useState(false);
|
|
7239
|
+
useEffect6(() => {
|
|
7240
|
+
const key = providerType?.toLowerCase();
|
|
7241
|
+
if (key && key !== "telegram" && key !== "email" && key !== "passkey" && key !== "wallet") {
|
|
7242
|
+
if (!linkIsLoading && !socialLinkStarted) {
|
|
7243
|
+
setSocialLinkStarted(true);
|
|
7244
|
+
handleLinkSocialProvider(key);
|
|
7245
|
+
}
|
|
7246
|
+
} else if (socialLinkStarted) {
|
|
7247
|
+
setSocialLinkStarted(false);
|
|
7248
|
+
}
|
|
7249
|
+
}, [providerType, linkIsLoading, socialLinkStarted, handleLinkSocialProvider]);
|
|
6496
7250
|
const canUnlink = (p) => {
|
|
6497
7251
|
const verified = providers.filter((x) => x.verified);
|
|
6498
7252
|
if (verified.length <= 1 && p.verified) return false;
|
|
@@ -6831,13 +7585,7 @@ var init_ManageWallet = __esm({
|
|
|
6831
7585
|
),
|
|
6832
7586
|
linkError && /* @__PURE__ */ jsx20("div", { className: `p-3 rounded text-sm break-words whitespace-pre-wrap ${isDark ? "bg-red-900/30 border border-red-900 text-red-400" : "bg-red-50 border border-red-200 text-red-700"}`, children: linkError })
|
|
6833
7587
|
] }),
|
|
6834
|
-
providerType && providerType !== "email" && providerType !== "passkey" && providerType !== "telegram" && providerType !== "wallet" && /* @__PURE__ */
|
|
6835
|
-
"Linking with ",
|
|
6836
|
-
providerType.charAt(0).toUpperCase() + providerType.slice(1),
|
|
6837
|
-
" requires OAuth implementation. This would typically redirect to ",
|
|
6838
|
-
providerType,
|
|
6839
|
-
" for authentication."
|
|
6840
|
-
] })
|
|
7588
|
+
providerType && providerType !== "email" && providerType !== "passkey" && providerType !== "telegram" && providerType !== "wallet" && /* @__PURE__ */ jsx20("div", { className: `p-3 rounded-xl text-sm ${isDark ? "bg-blue-900/30 border border-blue-900 text-blue-400" : "bg-blue-50 border border-blue-200 text-blue-700"}`, children: linkIsLoading ? `Linking with ${providerType.charAt(0).toUpperCase() + providerType.slice(1)}\u2026 Follow the popup to approve the connection.` : `Launching ${providerType.charAt(0).toUpperCase() + providerType.slice(1)} authentication\u2026` })
|
|
6841
7589
|
] })
|
|
6842
7590
|
] }) }) }),
|
|
6843
7591
|
/* @__PURE__ */ jsx20(Dialog, { open: !!confirmUnlink, onOpenChange: (v) => {
|
|
@@ -6932,6 +7680,8 @@ var init_SecurityModal = __esm({
|
|
|
6932
7680
|
const iframeManager = getIframeManager2();
|
|
6933
7681
|
const apps = await iframeManager.getTrustedApps(userId);
|
|
6934
7682
|
console.log("[SecurityModal] Received trusted apps:", apps);
|
|
7683
|
+
console.log("[SecurityModal] Trusted apps count:", apps?.length);
|
|
7684
|
+
console.log("[SecurityModal] Setting trusted apps state with:", apps);
|
|
6935
7685
|
setTrustedApps(apps);
|
|
6936
7686
|
} catch (error) {
|
|
6937
7687
|
console.error("[SecurityModal] Failed to load trusted apps:", error);
|
|
@@ -7489,7 +8239,7 @@ var init_KeyshareBackup = __esm({
|
|
|
7489
8239
|
import React19 from "react";
|
|
7490
8240
|
import { Activity, ArrowUpRight, ArrowDownRight, CheckCircle2 as CheckCircle24, XCircle, ArrowLeft as ArrowLeft6, RefreshCw as RefreshCw3 } from "lucide-react";
|
|
7491
8241
|
import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
7492
|
-
var TransactionsModal;
|
|
8242
|
+
var ENTRYPOINT_ADDRESSES, MAX_HISTORY_ITEMS, TransactionsModal;
|
|
7493
8243
|
var init_TransactionsModal = __esm({
|
|
7494
8244
|
"src/internal/components/TransactionsModal.tsx"() {
|
|
7495
8245
|
init_dialog();
|
|
@@ -7498,65 +8248,366 @@ var init_TransactionsModal = __esm({
|
|
|
7498
8248
|
init_base();
|
|
7499
8249
|
init_LumiaPassportContext();
|
|
7500
8250
|
init_useTheme();
|
|
8251
|
+
ENTRYPOINT_ADDRESSES = new Set(
|
|
8252
|
+
[
|
|
8253
|
+
"0x000000000000000000000000000000000000a032",
|
|
8254
|
+
// User mentioned EntryPoint-like address
|
|
8255
|
+
"0x0576a174d229e3cfa37253523e645a78a0c91b57",
|
|
8256
|
+
// Canonical EntryPoint (v0.6)
|
|
8257
|
+
"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789"
|
|
8258
|
+
// EntryPoint v0.7
|
|
8259
|
+
].map((addr) => addr.toLowerCase())
|
|
8260
|
+
);
|
|
8261
|
+
MAX_HISTORY_ITEMS = 40;
|
|
7501
8262
|
TransactionsModal = ({ open, onOpenChange, onBack }) => {
|
|
7502
8263
|
const { address } = useLumiaPassportSession();
|
|
7503
|
-
const [
|
|
8264
|
+
const [historyGroups, setHistoryGroups] = React19.useState([]);
|
|
7504
8265
|
const [loading, setLoading] = React19.useState(false);
|
|
7505
8266
|
const [error, setError] = React19.useState(null);
|
|
7506
8267
|
const { config } = useLumiaPassportConfig();
|
|
7507
8268
|
const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);
|
|
8269
|
+
const [expandedGroups, setExpandedGroups] = React19.useState({});
|
|
7508
8270
|
const loadTransactions = React19.useCallback(async () => {
|
|
7509
8271
|
if (!address) return;
|
|
7510
8272
|
setLoading(true);
|
|
7511
8273
|
setError(null);
|
|
8274
|
+
const toBigInt = (value) => {
|
|
8275
|
+
try {
|
|
8276
|
+
return BigInt(value || "0");
|
|
8277
|
+
} catch {
|
|
8278
|
+
return 0n;
|
|
8279
|
+
}
|
|
8280
|
+
};
|
|
7512
8281
|
try {
|
|
7513
8282
|
const explorerUrl = getExplorerUrl();
|
|
7514
8283
|
const baseUrl = explorerUrl.replace(/\/$/, "");
|
|
7515
|
-
const
|
|
7516
|
-
const
|
|
7517
|
-
|
|
7518
|
-
|
|
8284
|
+
const transactionsUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=20`;
|
|
8285
|
+
const internalsUrl = `${baseUrl}/api/v2/addresses/${address}/internal-transactions?items_count=40`;
|
|
8286
|
+
const tokenTransfersUrl = `${baseUrl}/api/v2/addresses/${address}/token-transfers?type=ERC-20&items_count=40`;
|
|
8287
|
+
const [transactionsResponse, internalResponse, tokenResponse] = await Promise.allSettled([
|
|
8288
|
+
fetch(transactionsUrl),
|
|
8289
|
+
fetch(internalsUrl),
|
|
8290
|
+
fetch(tokenTransfersUrl)
|
|
8291
|
+
]);
|
|
8292
|
+
if (transactionsResponse.status !== "fulfilled" || !transactionsResponse.value.ok) {
|
|
8293
|
+
const status = transactionsResponse.status === "fulfilled" ? transactionsResponse.value.status : "fetch_error";
|
|
8294
|
+
throw new Error(`Failed to fetch transactions: ${status}`);
|
|
7519
8295
|
}
|
|
7520
|
-
|
|
7521
|
-
|
|
7522
|
-
|
|
7523
|
-
|
|
7524
|
-
|
|
8296
|
+
let transactionsData = [];
|
|
8297
|
+
const transactionsJson = await transactionsResponse.value.json();
|
|
8298
|
+
if (transactionsJson?.items && Array.isArray(transactionsJson.items)) {
|
|
8299
|
+
transactionsData = transactionsJson.items;
|
|
8300
|
+
}
|
|
8301
|
+
let internalData = [];
|
|
8302
|
+
if (internalResponse.status === "fulfilled") {
|
|
8303
|
+
if (internalResponse.value.ok) {
|
|
8304
|
+
const internalsJson = await internalResponse.value.json();
|
|
8305
|
+
if (internalsJson?.items && Array.isArray(internalsJson.items)) {
|
|
8306
|
+
internalData = internalsJson.items;
|
|
8307
|
+
}
|
|
8308
|
+
} else if (internalResponse.value.status !== 404) {
|
|
8309
|
+
throw new Error(`Failed to fetch internal transactions: ${internalResponse.value.status}`);
|
|
8310
|
+
}
|
|
8311
|
+
} else if (internalResponse.status === "rejected") {
|
|
8312
|
+
console.warn("[TransactionsModal] Failed to load internal transactions", internalResponse.reason);
|
|
8313
|
+
}
|
|
8314
|
+
let tokenTransfersData = [];
|
|
8315
|
+
if (tokenResponse.status === "fulfilled") {
|
|
8316
|
+
if (tokenResponse.value.ok) {
|
|
8317
|
+
const tokensJson = await tokenResponse.value.json();
|
|
8318
|
+
if (tokensJson?.items && Array.isArray(tokensJson.items)) {
|
|
8319
|
+
tokenTransfersData = tokensJson.items;
|
|
8320
|
+
}
|
|
8321
|
+
} else if (tokenResponse.value.status !== 404) {
|
|
8322
|
+
console.warn("[TransactionsModal] Token transfers unavailable", tokenResponse.value.status);
|
|
8323
|
+
}
|
|
8324
|
+
} else if (tokenResponse.status === "rejected") {
|
|
8325
|
+
console.warn("[TransactionsModal] Failed to load token transfers", tokenResponse.reason);
|
|
8326
|
+
}
|
|
8327
|
+
const combinedHistory = [];
|
|
8328
|
+
const lowerAddress = address.toLowerCase();
|
|
8329
|
+
const now = Date.now();
|
|
8330
|
+
transactionsData.forEach((tx) => {
|
|
8331
|
+
const toMatches = tx.to?.hash?.toLowerCase() === lowerAddress;
|
|
8332
|
+
const fromMatches = tx.from?.hash?.toLowerCase() === lowerAddress;
|
|
8333
|
+
const direction = toMatches ? "in" : "out";
|
|
8334
|
+
const counterpart = direction === "in" ? tx.from : tx.to;
|
|
8335
|
+
const counterpartHash = counterpart?.hash ?? "0x0000000000000000000000000000000000000000";
|
|
8336
|
+
const counterpartLower = counterpartHash.toLowerCase();
|
|
8337
|
+
const isEntryPoint = ENTRYPOINT_ADDRESSES.has(counterpartLower);
|
|
8338
|
+
const timestampMs = tx.timestamp ? new Date(tx.timestamp).getTime() : now;
|
|
8339
|
+
combinedHistory.push({
|
|
8340
|
+
id: `tx-${tx.hash}`,
|
|
8341
|
+
kind: "transaction",
|
|
8342
|
+
hash: tx.hash,
|
|
8343
|
+
parentHash: tx.hash,
|
|
8344
|
+
direction,
|
|
8345
|
+
counterparty: counterpartHash,
|
|
8346
|
+
counterpartyName: counterpart?.name ?? null,
|
|
8347
|
+
counterpartyIsContract: Boolean(counterpart?.is_contract),
|
|
8348
|
+
value: tx.value ?? "0",
|
|
8349
|
+
status: tx.status === "ok" ? "ok" : "error",
|
|
8350
|
+
timestampMs: Number.isFinite(timestampMs) ? timestampMs : now,
|
|
8351
|
+
method: tx.method,
|
|
8352
|
+
blockNumber: tx.block_number,
|
|
8353
|
+
badgeLabel: Array.isArray(tx.transaction_types) && tx.transaction_types.length > 0 ? tx.transaction_types[0]?.replace(/_/g, " ") : void 0,
|
|
8354
|
+
assetSymbol: "LUMIA",
|
|
8355
|
+
decimals: 18,
|
|
8356
|
+
isEntryPoint
|
|
8357
|
+
});
|
|
8358
|
+
if (!toMatches && !fromMatches && Array.isArray(tx.transaction_types)) {
|
|
8359
|
+
const hasUserOpTag = tx.transaction_types.some((type) => type.includes("erc4337"));
|
|
8360
|
+
if (hasUserOpTag) {
|
|
8361
|
+
combinedHistory[combinedHistory.length - 1].badgeLabel = "User Operation";
|
|
8362
|
+
}
|
|
8363
|
+
}
|
|
8364
|
+
});
|
|
8365
|
+
internalData.forEach((trace, index) => {
|
|
8366
|
+
const fromHash = trace.from?.hash?.toLowerCase();
|
|
8367
|
+
const toHash = trace.to?.hash?.toLowerCase();
|
|
8368
|
+
if (fromHash !== lowerAddress && toHash !== lowerAddress) {
|
|
8369
|
+
return;
|
|
8370
|
+
}
|
|
8371
|
+
const direction = fromHash === lowerAddress ? "out" : "in";
|
|
8372
|
+
const counterpart = direction === "out" ? trace.to : trace.from;
|
|
8373
|
+
const counterpartHash = counterpart?.hash ?? "0x0000000000000000000000000000000000000000";
|
|
8374
|
+
const counterpartLower = counterpartHash.toLowerCase();
|
|
8375
|
+
const isEntryPoint = ENTRYPOINT_ADDRESSES.has(counterpartLower);
|
|
8376
|
+
const tsInput = trace.timestamp;
|
|
8377
|
+
const timestampMs = typeof tsInput === "number" ? tsInput * 1e3 : tsInput ? new Date(tsInput).getTime() : now;
|
|
8378
|
+
combinedHistory.push({
|
|
8379
|
+
id: `internal-${trace.transaction_hash}-${index}`,
|
|
8380
|
+
kind: "internal",
|
|
8381
|
+
hash: trace.transaction_hash,
|
|
8382
|
+
parentHash: trace.transaction_hash,
|
|
8383
|
+
direction,
|
|
8384
|
+
counterparty: counterpartHash,
|
|
8385
|
+
counterpartyName: counterpart?.name ?? null,
|
|
8386
|
+
counterpartyIsContract: Boolean(counterpart?.is_contract),
|
|
8387
|
+
value: trace.value ?? "0",
|
|
8388
|
+
status: trace.success === false || trace.status === "error" ? "error" : "ok",
|
|
8389
|
+
timestampMs: Number.isFinite(timestampMs) ? timestampMs : now,
|
|
8390
|
+
method: trace.call_type ? trace.call_type.toUpperCase() : void 0,
|
|
8391
|
+
blockNumber: trace.block_number,
|
|
8392
|
+
badgeLabel: "Internal",
|
|
8393
|
+
assetSymbol: "LUMIA",
|
|
8394
|
+
decimals: 18,
|
|
8395
|
+
isEntryPoint
|
|
8396
|
+
});
|
|
8397
|
+
});
|
|
8398
|
+
const parentMap = /* @__PURE__ */ new Map();
|
|
8399
|
+
const orphanInternals = [];
|
|
8400
|
+
combinedHistory.forEach((item) => {
|
|
8401
|
+
if (item.kind === "transaction") {
|
|
8402
|
+
parentMap.set(item.parentHash.toLowerCase(), {
|
|
8403
|
+
id: item.parentHash,
|
|
8404
|
+
parent: item,
|
|
8405
|
+
internals: [],
|
|
8406
|
+
timestampMs: item.timestampMs
|
|
8407
|
+
});
|
|
8408
|
+
}
|
|
8409
|
+
});
|
|
8410
|
+
combinedHistory.forEach((item) => {
|
|
8411
|
+
if (item.kind === "internal") {
|
|
8412
|
+
const group = parentMap.get(item.parentHash.toLowerCase());
|
|
8413
|
+
if (group) {
|
|
8414
|
+
group.internals.push(item);
|
|
8415
|
+
group.timestampMs = Math.max(group.timestampMs, item.timestampMs);
|
|
8416
|
+
} else {
|
|
8417
|
+
orphanInternals.push(item);
|
|
8418
|
+
}
|
|
8419
|
+
}
|
|
8420
|
+
});
|
|
8421
|
+
const groups = Array.from(parentMap.values());
|
|
8422
|
+
groups.forEach((group) => {
|
|
8423
|
+
if (group.internals.length === 0) {
|
|
8424
|
+
return;
|
|
8425
|
+
}
|
|
8426
|
+
const meaningfulInternals = group.internals.filter((internal) => {
|
|
8427
|
+
const amount = toBigInt(internal.value);
|
|
8428
|
+
return amount !== 0n && !internal.isEntryPoint;
|
|
8429
|
+
});
|
|
8430
|
+
if (meaningfulInternals.length === 0) {
|
|
8431
|
+
group.internals = [];
|
|
8432
|
+
return;
|
|
8433
|
+
}
|
|
8434
|
+
let totalIn = 0n;
|
|
8435
|
+
let totalOut = 0n;
|
|
8436
|
+
meaningfulInternals.forEach((internal) => {
|
|
8437
|
+
const amount = toBigInt(internal.value);
|
|
8438
|
+
if (amount === 0n) {
|
|
8439
|
+
return;
|
|
8440
|
+
}
|
|
8441
|
+
if (internal.direction === "in") {
|
|
8442
|
+
totalIn += amount;
|
|
8443
|
+
} else {
|
|
8444
|
+
totalOut += amount;
|
|
8445
|
+
}
|
|
8446
|
+
});
|
|
8447
|
+
const hasPositiveFlow = totalIn > 0n || totalOut > 0n;
|
|
8448
|
+
if (hasPositiveFlow) {
|
|
8449
|
+
const direction = totalIn >= totalOut ? "in" : "out";
|
|
8450
|
+
const netValue = direction === "in" ? totalIn - totalOut : totalOut - totalIn;
|
|
8451
|
+
group.parent.direction = direction;
|
|
8452
|
+
group.parent.value = netValue > 0n ? netValue.toString() : group.parent.value;
|
|
8453
|
+
const candidates = meaningfulInternals.filter((internal) => internal.direction === direction).map((internal) => ({
|
|
8454
|
+
internal,
|
|
8455
|
+
amount: toBigInt(internal.value)
|
|
8456
|
+
})).sort((a, b) => {
|
|
8457
|
+
if (a.amount === b.amount) return 0;
|
|
8458
|
+
return a.amount > b.amount ? -1 : 1;
|
|
8459
|
+
});
|
|
8460
|
+
const primary = candidates.length > 0 ? candidates[0].internal : meaningfulInternals[0];
|
|
8461
|
+
if (primary) {
|
|
8462
|
+
group.parent.counterparty = primary.counterparty;
|
|
8463
|
+
group.parent.counterpartyName = primary.counterpartyName;
|
|
8464
|
+
group.parent.counterpartyIsContract = primary.counterpartyIsContract;
|
|
8465
|
+
group.parent.method = group.parent.method || primary.method;
|
|
8466
|
+
}
|
|
8467
|
+
group.internals = meaningfulInternals;
|
|
8468
|
+
} else {
|
|
8469
|
+
group.internals = [];
|
|
8470
|
+
}
|
|
8471
|
+
});
|
|
8472
|
+
orphanInternals.forEach((internalItem) => {
|
|
8473
|
+
if (internalItem.isEntryPoint || toBigInt(internalItem.value) === 0n) {
|
|
8474
|
+
return;
|
|
8475
|
+
}
|
|
8476
|
+
groups.push({
|
|
8477
|
+
id: internalItem.id,
|
|
8478
|
+
parent: internalItem,
|
|
8479
|
+
internals: [],
|
|
8480
|
+
timestampMs: internalItem.timestampMs
|
|
8481
|
+
});
|
|
8482
|
+
});
|
|
8483
|
+
tokenTransfersData.forEach((transfer, index) => {
|
|
8484
|
+
const rawValue = transfer.value ?? "0";
|
|
8485
|
+
const amount = toBigInt(rawValue);
|
|
8486
|
+
if (amount === 0n) {
|
|
8487
|
+
return;
|
|
8488
|
+
}
|
|
8489
|
+
const toHash = transfer.to?.hash ?? "";
|
|
8490
|
+
const fromHash = transfer.from?.hash ?? "";
|
|
8491
|
+
const toLower = toHash.toLowerCase();
|
|
8492
|
+
const fromLower = fromHash.toLowerCase();
|
|
8493
|
+
const direction = toLower === lowerAddress ? "in" : "out";
|
|
8494
|
+
const counterparty = direction === "in" ? fromHash : toHash;
|
|
8495
|
+
if (!counterparty || ENTRYPOINT_ADDRESSES.has(counterparty.toLowerCase())) {
|
|
8496
|
+
return;
|
|
8497
|
+
}
|
|
8498
|
+
const tsInput = transfer.timestamp;
|
|
8499
|
+
const timestampMs = typeof tsInput === "number" ? tsInput > 1e12 ? tsInput : tsInput * 1e3 : tsInput ? new Date(tsInput).getTime() : now;
|
|
8500
|
+
const decimalsRaw = transfer.token?.decimals;
|
|
8501
|
+
const decimals = typeof decimalsRaw === "string" ? parseInt(decimalsRaw, 10) : typeof decimalsRaw === "number" ? decimalsRaw : 18;
|
|
8502
|
+
const assetSymbol = transfer.token?.symbol || "Token";
|
|
8503
|
+
const tokenItem = {
|
|
8504
|
+
id: `token-${transfer.tx_hash}-${index}`,
|
|
8505
|
+
kind: "token",
|
|
8506
|
+
hash: transfer.tx_hash,
|
|
8507
|
+
parentHash: transfer.tx_hash,
|
|
8508
|
+
direction,
|
|
8509
|
+
counterparty,
|
|
8510
|
+
counterpartyName: null,
|
|
8511
|
+
counterpartyIsContract: false,
|
|
8512
|
+
value: rawValue,
|
|
8513
|
+
status: "ok",
|
|
8514
|
+
timestampMs: Number.isFinite(timestampMs) ? timestampMs : now,
|
|
8515
|
+
method: "ERC20",
|
|
8516
|
+
blockNumber: transfer.block_number ?? 0,
|
|
8517
|
+
badgeLabel: assetSymbol.toUpperCase(),
|
|
8518
|
+
assetSymbol: assetSymbol.toUpperCase(),
|
|
8519
|
+
decimals: Number.isFinite(decimals) ? Number(decimals) : 18,
|
|
8520
|
+
isEntryPoint: false
|
|
8521
|
+
};
|
|
8522
|
+
groups.push({
|
|
8523
|
+
id: tokenItem.id,
|
|
8524
|
+
parent: tokenItem,
|
|
8525
|
+
internals: [],
|
|
8526
|
+
timestampMs: tokenItem.timestampMs
|
|
8527
|
+
});
|
|
8528
|
+
});
|
|
8529
|
+
const filteredGroups = groups.filter((group) => {
|
|
8530
|
+
const parent = group.parent;
|
|
8531
|
+
if (parent.kind === "token") {
|
|
8532
|
+
return true;
|
|
8533
|
+
}
|
|
8534
|
+
const amount = toBigInt(parent.value);
|
|
8535
|
+
if (amount === 0n) {
|
|
8536
|
+
return false;
|
|
8537
|
+
}
|
|
8538
|
+
const counterpartyLower = parent.counterparty?.toLowerCase?.() || "";
|
|
8539
|
+
if (ENTRYPOINT_ADDRESSES.has(counterpartyLower)) {
|
|
8540
|
+
return false;
|
|
8541
|
+
}
|
|
8542
|
+
if (parent.assetSymbol && parent.assetSymbol !== "LUMIA") {
|
|
8543
|
+
return amount > 0n;
|
|
8544
|
+
}
|
|
8545
|
+
return true;
|
|
8546
|
+
});
|
|
8547
|
+
filteredGroups.sort((a, b) => b.timestampMs - a.timestampMs);
|
|
8548
|
+
setHistoryGroups(filteredGroups.slice(0, MAX_HISTORY_ITEMS));
|
|
8549
|
+
setExpandedGroups({});
|
|
8550
|
+
} catch (err) {
|
|
8551
|
+
console.error("Failed to load transactions:", err);
|
|
8552
|
+
setError(err instanceof Error ? err.message : "Failed to load transactions");
|
|
7525
8553
|
} finally {
|
|
7526
8554
|
setLoading(false);
|
|
7527
8555
|
}
|
|
7528
8556
|
}, [address]);
|
|
7529
8557
|
React19.useEffect(() => {
|
|
7530
|
-
if (open && address && !loading &&
|
|
8558
|
+
if (open && address && !loading && historyGroups.length === 0) {
|
|
7531
8559
|
loadTransactions();
|
|
7532
8560
|
}
|
|
7533
8561
|
}, [open]);
|
|
7534
8562
|
const formatAddress = (addr) => {
|
|
8563
|
+
if (!addr) return "Unknown";
|
|
8564
|
+
if (!addr.startsWith("0x") || addr.length <= 12) {
|
|
8565
|
+
return addr;
|
|
8566
|
+
}
|
|
7535
8567
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
7536
8568
|
};
|
|
7537
|
-
const
|
|
7538
|
-
return new Date(timestamp).toLocaleString();
|
|
7539
|
-
};
|
|
7540
|
-
const formatValue = (value) => {
|
|
8569
|
+
const parseValue = (value) => {
|
|
7541
8570
|
try {
|
|
7542
|
-
|
|
7543
|
-
const eth = Number(wei) / 1e18;
|
|
7544
|
-
return eth.toFixed(4);
|
|
8571
|
+
return BigInt(value || "0");
|
|
7545
8572
|
} catch {
|
|
7546
|
-
return
|
|
8573
|
+
return 0n;
|
|
7547
8574
|
}
|
|
7548
8575
|
};
|
|
7549
|
-
const
|
|
7550
|
-
|
|
7551
|
-
|
|
7552
|
-
|
|
7553
|
-
|
|
7554
|
-
|
|
8576
|
+
const formatValue = (value, decimals = 18) => {
|
|
8577
|
+
const amount = parseValue(value);
|
|
8578
|
+
if (amount === 0n) return "0";
|
|
8579
|
+
if (decimals <= 0) {
|
|
8580
|
+
return amount.toString();
|
|
8581
|
+
}
|
|
8582
|
+
const scale = 10n ** BigInt(decimals);
|
|
8583
|
+
const whole = amount / scale;
|
|
8584
|
+
const fraction = amount % scale;
|
|
8585
|
+
if (fraction === 0n) {
|
|
8586
|
+
return whole.toString();
|
|
8587
|
+
}
|
|
8588
|
+
const fractionStr = fraction.toString().padStart(decimals, "0").replace(/0+$/, "");
|
|
8589
|
+
const trimmed = fractionStr.slice(0, Math.min(6, fractionStr.length));
|
|
8590
|
+
return `${whole.toString()}.${trimmed}`;
|
|
7555
8591
|
};
|
|
8592
|
+
const getStatusIcon = (status) => status === "ok" ? /* @__PURE__ */ jsx23(CheckCircle24, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx23(XCircle, { className: "w-4 h-4 text-red-500" });
|
|
8593
|
+
const getTransactionIcon = (direction) => direction === "in" ? /* @__PURE__ */ jsx23(ArrowDownRight, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsx23(ArrowUpRight, { className: "w-4 h-4 text-blue-500" });
|
|
7556
8594
|
const openInExplorer = (txHash) => {
|
|
7557
8595
|
const explorerUrl = getExplorerUrl();
|
|
7558
8596
|
window.open(`${explorerUrl}/tx/${txHash}`, "_blank");
|
|
7559
8597
|
};
|
|
8598
|
+
const formatTimestamp = (timestampMs) => {
|
|
8599
|
+
try {
|
|
8600
|
+
return new Date(timestampMs).toLocaleString();
|
|
8601
|
+
} catch {
|
|
8602
|
+
return "";
|
|
8603
|
+
}
|
|
8604
|
+
};
|
|
8605
|
+
const toggleGroup = (groupId) => {
|
|
8606
|
+
setExpandedGroups((prev) => ({
|
|
8607
|
+
...prev,
|
|
8608
|
+
[groupId]: !prev[groupId]
|
|
8609
|
+
}));
|
|
8610
|
+
};
|
|
7560
8611
|
return /* @__PURE__ */ jsx23(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs15(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
7561
8612
|
/* @__PURE__ */ jsx23(VisuallyHidden, { children: /* @__PURE__ */ jsx23(DialogTitle, { children: "Transaction History" }) }),
|
|
7562
8613
|
/* @__PURE__ */ jsx23(DialogDescription, { className: "sr-only", children: "View your transaction history" }),
|
|
@@ -7588,76 +8639,107 @@ var init_TransactionsModal = __esm({
|
|
|
7588
8639
|
/* @__PURE__ */ jsx23("div", { className: "p-5 max-h-[60vh] overflow-y-auto", children: loading ? /* @__PURE__ */ jsx23("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsx23("div", { className: `${theme.mutedText}`, children: "Loading transactions..." }) }) : error ? /* @__PURE__ */ jsxs15("div", { className: `flex flex-col items-center justify-center py-8 ${isDark ? "text-red-400" : "text-red-500"}`, children: [
|
|
7589
8640
|
/* @__PURE__ */ jsx23(XCircle, { className: "w-12 h-12 mb-2" }),
|
|
7590
8641
|
/* @__PURE__ */ jsx23("p", { className: "text-center text-sm", children: error })
|
|
7591
|
-
] }) :
|
|
8642
|
+
] }) : historyGroups.length === 0 ? /* @__PURE__ */ jsxs15("div", { className: `flex flex-col items-center justify-center py-8 ${theme.mutedText}`, children: [
|
|
7592
8643
|
/* @__PURE__ */ jsx23(Activity, { className: `w-12 h-12 mb-2 ${isDark ? "text-gray-600" : "text-gray-300"}` }),
|
|
7593
8644
|
/* @__PURE__ */ jsxs15("p", { className: "text-center", children: [
|
|
7594
8645
|
"No transactions found",
|
|
7595
8646
|
/* @__PURE__ */ jsx23("br", {}),
|
|
7596
8647
|
/* @__PURE__ */ jsx23("span", { className: "text-xs mt-2", children: "Smart account transactions will appear here" })
|
|
7597
8648
|
] })
|
|
7598
|
-
] }) : /* @__PURE__ */ jsx23("div", { className: "space-y-3", children:
|
|
7599
|
-
const
|
|
7600
|
-
const
|
|
8649
|
+
] }) : /* @__PURE__ */ jsx23("div", { className: "space-y-3", children: historyGroups.map((group) => {
|
|
8650
|
+
const { parent } = group;
|
|
8651
|
+
const isIncoming = parent.direction === "in";
|
|
8652
|
+
const expanded = expandedGroups[group.id] ?? false;
|
|
8653
|
+
const assetSymbol = parent.assetSymbol || "LUMIA";
|
|
8654
|
+
const assetDecimals = parent.decimals ?? 18;
|
|
8655
|
+
const internalsToRender = group.internals.filter((internal) => parseValue(internal.value) !== 0n);
|
|
7601
8656
|
return /* @__PURE__ */ jsxs15(
|
|
7602
8657
|
"div",
|
|
7603
8658
|
{
|
|
7604
8659
|
className: `${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-4 transition-colors cursor-pointer`,
|
|
7605
|
-
onClick: () => openInExplorer(
|
|
8660
|
+
onClick: () => openInExplorer(parent.parentHash),
|
|
7606
8661
|
children: [
|
|
7607
8662
|
/* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between mb-2", children: [
|
|
7608
8663
|
/* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
|
|
7609
|
-
getTransactionIcon(
|
|
8664
|
+
getTransactionIcon(parent.direction),
|
|
7610
8665
|
/* @__PURE__ */ jsx23("span", { className: `font-medium ${theme.titleText}`, children: isIncoming ? "Received" : "Sent" }),
|
|
7611
|
-
getStatusIcon(
|
|
8666
|
+
getStatusIcon(parent.status),
|
|
8667
|
+
parent.badgeLabel && /* @__PURE__ */ jsx23("span", { className: `text-[10px] uppercase tracking-wide ${isDark ? "bg-purple-900/40 text-purple-200" : "bg-purple-100 text-purple-700"} px-2 py-0.5 rounded-full`, children: parent.badgeLabel })
|
|
7612
8668
|
] }),
|
|
7613
|
-
/* @__PURE__ */ jsx23("div", { className: `text-xs ${theme.mutedText}`, children:
|
|
8669
|
+
/* @__PURE__ */ jsx23("div", { className: `text-xs ${theme.mutedText}`, children: formatTimestamp(group.timestampMs) })
|
|
7614
8670
|
] }),
|
|
7615
8671
|
/* @__PURE__ */ jsxs15("div", { className: "space-y-1 text-sm", children: [
|
|
7616
8672
|
/* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
7617
8673
|
/* @__PURE__ */ jsx23("span", { className: `${theme.bodyText}`, children: isIncoming ? "From:" : "To:" }),
|
|
7618
8674
|
/* @__PURE__ */ jsxs15("span", { className: `font-mono ${theme.titleText}`, children: [
|
|
7619
|
-
formatAddress(
|
|
7620
|
-
|
|
8675
|
+
parent.counterpartyName || formatAddress(parent.counterparty),
|
|
8676
|
+
parent.counterpartyIsContract && /* @__PURE__ */ jsx23("span", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} ml-1`, children: "(Contract)" })
|
|
7621
8677
|
] })
|
|
7622
8678
|
] }),
|
|
7623
8679
|
/* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
7624
8680
|
/* @__PURE__ */ jsx23("span", { className: `${theme.bodyText}`, children: "Value:" }),
|
|
7625
8681
|
/* @__PURE__ */ jsxs15("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
7626
|
-
formatValue(
|
|
7627
|
-
"
|
|
8682
|
+
formatValue(parent.value, assetDecimals),
|
|
8683
|
+
" ",
|
|
8684
|
+
assetSymbol
|
|
7628
8685
|
] })
|
|
7629
8686
|
] }),
|
|
7630
8687
|
/* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
7631
8688
|
/* @__PURE__ */ jsx23("span", { className: `${theme.bodyText}`, children: "Block:" }),
|
|
7632
|
-
/* @__PURE__ */
|
|
7633
|
-
"#",
|
|
7634
|
-
tx.block_number
|
|
7635
|
-
] })
|
|
8689
|
+
/* @__PURE__ */ jsx23("span", { className: `font-mono ${theme.titleText}`, children: parent.blockNumber ? `#${parent.blockNumber}` : "-" })
|
|
7636
8690
|
] }),
|
|
7637
|
-
|
|
8691
|
+
parent.method && /* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
7638
8692
|
/* @__PURE__ */ jsx23("span", { className: `${theme.bodyText}`, children: "Method:" }),
|
|
7639
|
-
/* @__PURE__ */ jsx23("span", { className: `${isDark ? "text-blue-400" : "text-blue-600"} text-xs`, children:
|
|
7640
|
-
] })
|
|
7641
|
-
|
|
7642
|
-
|
|
7643
|
-
|
|
7644
|
-
|
|
7645
|
-
|
|
7646
|
-
|
|
7647
|
-
|
|
7648
|
-
|
|
7649
|
-
|
|
8693
|
+
/* @__PURE__ */ jsx23("span", { className: `${isDark ? "text-blue-400" : "text-blue-600"} text-xs`, children: parent.method })
|
|
8694
|
+
] })
|
|
8695
|
+
] }),
|
|
8696
|
+
internalsToRender.length > 0 && /* @__PURE__ */ jsxs15(
|
|
8697
|
+
"div",
|
|
8698
|
+
{
|
|
8699
|
+
className: `mt-4 rounded-lg ${isDark ? "bg-gray-900/60" : "bg-white/70"} border border-dashed ${isDark ? "border-gray-700" : "border-gray-200"}`,
|
|
8700
|
+
onClick: (event) => event.stopPropagation(),
|
|
8701
|
+
children: [
|
|
8702
|
+
/* @__PURE__ */ jsxs15(
|
|
8703
|
+
"button",
|
|
8704
|
+
{
|
|
8705
|
+
className: `w-full flex items-center justify-between px-3 py-2 text-xs ${theme.bodyText}`,
|
|
8706
|
+
onClick: () => toggleGroup(group.id),
|
|
8707
|
+
children: [
|
|
8708
|
+
/* @__PURE__ */ jsxs15("span", { children: [
|
|
8709
|
+
"View internal calls (",
|
|
8710
|
+
internalsToRender.length,
|
|
8711
|
+
")"
|
|
8712
|
+
] }),
|
|
8713
|
+
/* @__PURE__ */ jsx23("span", { children: expanded ? "Hide" : "Show" })
|
|
8714
|
+
]
|
|
8715
|
+
}
|
|
8716
|
+
),
|
|
8717
|
+
expanded && /* @__PURE__ */ jsx23("div", { className: "px-3 pb-3 space-y-2 text-xs", children: internalsToRender.map((internal) => {
|
|
8718
|
+
const internalSymbol = internal.assetSymbol || assetSymbol;
|
|
8719
|
+
const internalDecimals = internal.decimals ?? assetDecimals;
|
|
8720
|
+
return /* @__PURE__ */ jsxs15("div", { className: "border-t border-dashed border-current pt-2", children: [
|
|
8721
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
8722
|
+
/* @__PURE__ */ jsx23("span", { className: `${theme.mutedText}`, children: internal.method || "CALL" }),
|
|
8723
|
+
/* @__PURE__ */ jsxs15("span", { className: `${theme.bodyText}`, children: [
|
|
8724
|
+
formatValue(internal.value, internalDecimals),
|
|
8725
|
+
" ",
|
|
8726
|
+
internalSymbol
|
|
8727
|
+
] })
|
|
8728
|
+
] }),
|
|
8729
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
8730
|
+
/* @__PURE__ */ jsx23("span", { className: `${theme.bodyText}`, children: internal.direction === "in" ? "From" : "To" }),
|
|
8731
|
+
/* @__PURE__ */ jsx23("span", { className: `font-mono ${theme.titleText}`, children: internal.counterpartyName || formatAddress(internal.counterparty) })
|
|
8732
|
+
] })
|
|
8733
|
+
] }, internal.id);
|
|
8734
|
+
}) })
|
|
8735
|
+
]
|
|
8736
|
+
}
|
|
8737
|
+
)
|
|
7650
8738
|
]
|
|
7651
8739
|
},
|
|
7652
|
-
|
|
8740
|
+
group.id
|
|
7653
8741
|
);
|
|
7654
|
-
}) }) })
|
|
7655
|
-
transactions.length > 0 && /* @__PURE__ */ jsx23("div", { className: `p-5 border-t ${theme.divider}`, children: /* @__PURE__ */ jsxs15("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
7656
|
-
"Total: ",
|
|
7657
|
-
transactions.length,
|
|
7658
|
-
" transaction",
|
|
7659
|
-
transactions.length !== 1 ? "s" : ""
|
|
7660
|
-
] }) })
|
|
8742
|
+
}) }) })
|
|
7661
8743
|
] }) });
|
|
7662
8744
|
};
|
|
7663
8745
|
}
|
|
@@ -7831,7 +8913,7 @@ var init_assets = __esm({
|
|
|
7831
8913
|
|
|
7832
8914
|
// src/internal/components/ViewAssetsModal.tsx
|
|
7833
8915
|
import React21 from "react";
|
|
7834
|
-
import { Gem, RefreshCw as RefreshCw4, Copy, ExternalLink
|
|
8916
|
+
import { Gem, RefreshCw as RefreshCw4, Copy, ExternalLink, ArrowLeft as ArrowLeft7 } from "lucide-react";
|
|
7835
8917
|
import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
7836
8918
|
var ViewAssetsModal;
|
|
7837
8919
|
var init_ViewAssetsModal = __esm({
|
|
@@ -7926,7 +9008,7 @@ var init_ViewAssetsModal = __esm({
|
|
|
7926
9008
|
onClick: () => openInExplorer(asset.address),
|
|
7927
9009
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7928
9010
|
title: "View in explorer",
|
|
7929
|
-
children: /* @__PURE__ */ jsx24(
|
|
9011
|
+
children: /* @__PURE__ */ jsx24(ExternalLink, { className: "w-3 h-3" })
|
|
7930
9012
|
}
|
|
7931
9013
|
)
|
|
7932
9014
|
] })
|
|
@@ -7955,7 +9037,7 @@ var init_ViewAssetsModal = __esm({
|
|
|
7955
9037
|
onClick: () => openInExplorer(address),
|
|
7956
9038
|
className: `${isDark ? "text-gray-500 hover:text-gray-300" : "text-gray-400 hover:text-gray-600"}`,
|
|
7957
9039
|
title: "View in explorer",
|
|
7958
|
-
children: /* @__PURE__ */ jsx24(
|
|
9040
|
+
children: /* @__PURE__ */ jsx24(ExternalLink, { className: "w-3 h-3" })
|
|
7959
9041
|
}
|
|
7960
9042
|
)
|
|
7961
9043
|
] })
|
|
@@ -8037,414 +9119,21 @@ var init_useSendTransaction = __esm({
|
|
|
8037
9119
|
}
|
|
8038
9120
|
});
|
|
8039
9121
|
|
|
8040
|
-
// src/internal/
|
|
8041
|
-
import {
|
|
8042
|
-
import {
|
|
8043
|
-
|
|
8044
|
-
|
|
8045
|
-
}
|
|
8046
|
-
var
|
|
8047
|
-
|
|
8048
|
-
|
|
8049
|
-
|
|
8050
|
-
|
|
8051
|
-
// src/internal/components/ui/badge.tsx
|
|
8052
|
-
import { cva as cva2 } from "class-variance-authority";
|
|
8053
|
-
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
8054
|
-
function Badge({ className, variant, ...props }) {
|
|
8055
|
-
return /* @__PURE__ */ jsx25("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
8056
|
-
}
|
|
8057
|
-
var badgeVariants;
|
|
8058
|
-
var init_badge = __esm({
|
|
8059
|
-
"src/internal/components/ui/badge.tsx"() {
|
|
8060
|
-
init_cn();
|
|
8061
|
-
badgeVariants = cva2(
|
|
8062
|
-
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
8063
|
-
{
|
|
8064
|
-
variants: {
|
|
8065
|
-
variant: {
|
|
8066
|
-
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
8067
|
-
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
8068
|
-
destructive: "border-transparent bg-red-600 text-white hover:bg-red-700 dark:bg-red-700 dark:hover:bg-red-600",
|
|
8069
|
-
outline: "text-foreground",
|
|
8070
|
-
success: "border-transparent bg-green-600 text-white hover:bg-green-700 dark:bg-green-700 dark:hover:bg-green-600",
|
|
8071
|
-
warning: "border-transparent bg-yellow-500 text-white hover:bg-yellow-600 dark:bg-yellow-600 dark:hover:bg-yellow-500"
|
|
8072
|
-
}
|
|
8073
|
-
},
|
|
8074
|
-
defaultVariants: {
|
|
8075
|
-
variant: "default"
|
|
8076
|
-
}
|
|
8077
|
-
}
|
|
8078
|
-
);
|
|
8079
|
-
}
|
|
8080
|
-
});
|
|
8081
|
-
|
|
8082
|
-
// src/internal/components/Address.tsx
|
|
8083
|
-
import * as React22 from "react";
|
|
8084
|
-
import { Copy as Copy2, ExternalLink as ExternalLink3 } from "lucide-react";
|
|
8085
|
-
import { jsx as jsx26, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
8086
|
-
function toExplorerAddressUrl(address, chain) {
|
|
8087
|
-
const base2 = chain?.blockExplorers?.default?.url;
|
|
8088
|
-
if (!base2) return null;
|
|
8089
|
-
return `${base2.replace(/\/$/, "")}/address/${address}`;
|
|
8090
|
-
}
|
|
8091
|
-
function short(addr) {
|
|
8092
|
-
if (addr.length <= 14) return addr;
|
|
8093
|
-
return `${addr.slice(0, 10)}...${addr.slice(-8)}`;
|
|
8094
|
-
}
|
|
8095
|
-
var Address;
|
|
8096
|
-
var init_Address = __esm({
|
|
8097
|
-
"src/internal/components/Address.tsx"() {
|
|
8098
|
-
init_button();
|
|
8099
|
-
init_cn();
|
|
8100
|
-
Address = ({
|
|
8101
|
-
address,
|
|
8102
|
-
chain,
|
|
8103
|
-
className,
|
|
8104
|
-
truncate = true,
|
|
8105
|
-
showCopy = true,
|
|
8106
|
-
showExplorer = true,
|
|
8107
|
-
label
|
|
8108
|
-
}) => {
|
|
8109
|
-
const addr = address || "";
|
|
8110
|
-
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
8111
|
-
const [copied, setCopied] = React22.useState(false);
|
|
8112
|
-
if (!addr) return /* @__PURE__ */ jsx26("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
8113
|
-
return /* @__PURE__ */ jsxs17("div", { className: cn2("flex items-center gap-2", className), style: { listStyle: "none" }, children: [
|
|
8114
|
-
label && /* @__PURE__ */ jsx26("span", { className: "text-sm font-medium", children: label }),
|
|
8115
|
-
/* @__PURE__ */ jsx26("code", { className: "text-xs bg-background px-2 py-1 rounded select-all", children: truncate ? short(addr) : addr }),
|
|
8116
|
-
showCopy && /* @__PURE__ */ jsx26(
|
|
8117
|
-
Button,
|
|
8118
|
-
{
|
|
8119
|
-
variant: "ghost",
|
|
8120
|
-
size: "sm",
|
|
8121
|
-
title: copied ? "Copied" : "Copy address",
|
|
8122
|
-
onClick: async () => {
|
|
8123
|
-
try {
|
|
8124
|
-
await navigator.clipboard.writeText(addr);
|
|
8125
|
-
setCopied(true);
|
|
8126
|
-
setTimeout(() => setCopied(false), 1200);
|
|
8127
|
-
} catch {
|
|
8128
|
-
}
|
|
8129
|
-
},
|
|
8130
|
-
children: /* @__PURE__ */ jsx26(Copy2, { className: "h-4 w-4" })
|
|
8131
|
-
}
|
|
8132
|
-
),
|
|
8133
|
-
showExplorer && explorer && /* @__PURE__ */ jsx26(
|
|
8134
|
-
"a",
|
|
8135
|
-
{
|
|
8136
|
-
href: explorer,
|
|
8137
|
-
target: "_blank",
|
|
8138
|
-
rel: "noreferrer noopener",
|
|
8139
|
-
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
8140
|
-
title: "Open in explorer",
|
|
8141
|
-
children: /* @__PURE__ */ jsx26(ExternalLink3, { className: "h-4 w-4" })
|
|
8142
|
-
}
|
|
8143
|
-
)
|
|
8144
|
-
] });
|
|
8145
|
-
};
|
|
8146
|
-
}
|
|
8147
|
-
});
|
|
8148
|
-
|
|
8149
|
-
// src/internal/components/UserOpStatus.tsx
|
|
8150
|
-
import * as React23 from "react";
|
|
8151
|
-
import { AlertCircle as AlertCircle3, CheckCircle2 as CheckCircle25, Clock as Clock3, Copy as Copy3, ExternalLink as ExternalLink4, RefreshCw as RefreshCw5 } from "lucide-react";
|
|
8152
|
-
import { jsx as jsx27, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
8153
|
-
var UserOpStatus;
|
|
8154
|
-
var init_UserOpStatus = __esm({
|
|
8155
|
-
"src/internal/components/UserOpStatus.tsx"() {
|
|
8156
|
-
init_button();
|
|
8157
|
-
init_badge();
|
|
8158
|
-
init_Address();
|
|
8159
|
-
init_cn();
|
|
8160
|
-
init_base();
|
|
8161
|
-
UserOpStatus = ({
|
|
8162
|
-
userOpHash,
|
|
8163
|
-
chain,
|
|
8164
|
-
className,
|
|
8165
|
-
pollMs = 1e3,
|
|
8166
|
-
maxPollTimeMs = 6e4,
|
|
8167
|
-
// Default 1 minute
|
|
8168
|
-
externalState
|
|
8169
|
-
}) => {
|
|
8170
|
-
const useExternalState = !!externalState;
|
|
8171
|
-
const [internalReceipt, setInternalReceipt] = React23.useState(null);
|
|
8172
|
-
const [internalMempool, setInternalMempool] = React23.useState(null);
|
|
8173
|
-
const [internalError, setInternalError] = React23.useState(null);
|
|
8174
|
-
const [attempt, setAttempt] = React23.useState(0);
|
|
8175
|
-
const [internalRefreshing, setInternalRefreshing] = React23.useState(false);
|
|
8176
|
-
const [timedOut, setTimedOut] = React23.useState(false);
|
|
8177
|
-
const [rejected, setRejected] = React23.useState(false);
|
|
8178
|
-
const intervalRef = React23.useRef(null);
|
|
8179
|
-
const startTimeRef = React23.useRef(Date.now());
|
|
8180
|
-
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
8181
|
-
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
8182
|
-
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
8183
|
-
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
8184
|
-
const rpc = React23.useCallback(async (method, params) => {
|
|
8185
|
-
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
8186
|
-
const res = await fetch(getBundlerUrl(), {
|
|
8187
|
-
method: "POST",
|
|
8188
|
-
headers: { "content-type": "application/json" },
|
|
8189
|
-
body: JSON.stringify(body)
|
|
8190
|
-
});
|
|
8191
|
-
const json = await res.json();
|
|
8192
|
-
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
8193
|
-
return json.result;
|
|
8194
|
-
}, []);
|
|
8195
|
-
const extractMempoolInfo = React23.useCallback((m) => {
|
|
8196
|
-
if (!m) return null;
|
|
8197
|
-
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
8198
|
-
const sender = m.sender || m?.userOperation?.sender || null;
|
|
8199
|
-
if (!entryPoint && !sender) return null;
|
|
8200
|
-
return { entryPoint, sender };
|
|
8201
|
-
}, []);
|
|
8202
|
-
const tick = React23.useCallback(async () => {
|
|
8203
|
-
if (useExternalState) return;
|
|
8204
|
-
const elapsed = Date.now() - startTimeRef.current;
|
|
8205
|
-
if (elapsed > maxPollTimeMs) {
|
|
8206
|
-
setTimedOut(true);
|
|
8207
|
-
setInternalMempool(null);
|
|
8208
|
-
if (intervalRef.current) {
|
|
8209
|
-
clearInterval(intervalRef.current);
|
|
8210
|
-
intervalRef.current = null;
|
|
8211
|
-
}
|
|
8212
|
-
return;
|
|
8213
|
-
}
|
|
8214
|
-
try {
|
|
8215
|
-
setInternalRefreshing(true);
|
|
8216
|
-
setInternalError(null);
|
|
8217
|
-
const r = await rpc("eth_getUserOperationReceipt", [userOpHash]);
|
|
8218
|
-
if (r) {
|
|
8219
|
-
setInternalReceipt(r);
|
|
8220
|
-
setInternalMempool(null);
|
|
8221
|
-
if (intervalRef.current) {
|
|
8222
|
-
clearInterval(intervalRef.current);
|
|
8223
|
-
intervalRef.current = null;
|
|
8224
|
-
}
|
|
8225
|
-
return;
|
|
8226
|
-
}
|
|
8227
|
-
const m = await rpc("eth_getUserOperationByHash", [userOpHash]);
|
|
8228
|
-
if (m === null) {
|
|
8229
|
-
setRejected(true);
|
|
8230
|
-
setInternalMempool(null);
|
|
8231
|
-
if (intervalRef.current) {
|
|
8232
|
-
clearInterval(intervalRef.current);
|
|
8233
|
-
intervalRef.current = null;
|
|
8234
|
-
}
|
|
8235
|
-
return;
|
|
8236
|
-
}
|
|
8237
|
-
const info = extractMempoolInfo(m);
|
|
8238
|
-
setInternalMempool(info);
|
|
8239
|
-
} catch (e) {
|
|
8240
|
-
setInternalError(e?.message || String(e));
|
|
8241
|
-
} finally {
|
|
8242
|
-
setInternalRefreshing(false);
|
|
8243
|
-
setAttempt((x) => x + 1);
|
|
8244
|
-
}
|
|
8245
|
-
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
8246
|
-
React23.useEffect(() => {
|
|
8247
|
-
if (useExternalState) return;
|
|
8248
|
-
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
8249
|
-
startTimeRef.current = Date.now();
|
|
8250
|
-
setTimedOut(false);
|
|
8251
|
-
setRejected(false);
|
|
8252
|
-
setInternalReceipt(null);
|
|
8253
|
-
setInternalMempool(null);
|
|
8254
|
-
setInternalError(null);
|
|
8255
|
-
setAttempt(0);
|
|
8256
|
-
setInternalRefreshing(false);
|
|
8257
|
-
}, [userOpHash, useExternalState]);
|
|
8258
|
-
React23.useEffect(() => {
|
|
8259
|
-
if (useExternalState) {
|
|
8260
|
-
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
8261
|
-
return;
|
|
8262
|
-
}
|
|
8263
|
-
if (receipt) {
|
|
8264
|
-
console.log("[UserOpStatus] Already have receipt, not starting polling");
|
|
8265
|
-
return;
|
|
8266
|
-
}
|
|
8267
|
-
let mounted = true;
|
|
8268
|
-
const startPolling = async () => {
|
|
8269
|
-
if (mounted) {
|
|
8270
|
-
console.log("[UserOpStatus] Starting polling for hash:", userOpHash, "pollMs:", pollMs);
|
|
8271
|
-
await tick();
|
|
8272
|
-
if (mounted && !receipt) {
|
|
8273
|
-
console.log("[UserOpStatus] Starting interval polling every", pollMs, "ms");
|
|
8274
|
-
intervalRef.current = setInterval(() => {
|
|
8275
|
-
if (mounted) tick();
|
|
8276
|
-
}, pollMs);
|
|
8277
|
-
}
|
|
8278
|
-
}
|
|
8279
|
-
};
|
|
8280
|
-
startPolling();
|
|
8281
|
-
return () => {
|
|
8282
|
-
mounted = false;
|
|
8283
|
-
if (intervalRef.current) {
|
|
8284
|
-
console.log("[UserOpStatus] Clearing interval in cleanup");
|
|
8285
|
-
clearInterval(intervalRef.current);
|
|
8286
|
-
intervalRef.current = null;
|
|
8287
|
-
}
|
|
8288
|
-
};
|
|
8289
|
-
}, [userOpHash, pollMs, useExternalState]);
|
|
8290
|
-
const stateBadge = () => {
|
|
8291
|
-
if (receipt) {
|
|
8292
|
-
const ok = !!receipt.success;
|
|
8293
|
-
return /* @__PURE__ */ jsxs18(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
8294
|
-
ok ? /* @__PURE__ */ jsx27(CheckCircle25, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx27(AlertCircle3, { className: "h-3 w-3" }),
|
|
8295
|
-
ok ? "Included" : "Failed"
|
|
8296
|
-
] });
|
|
8297
|
-
}
|
|
8298
|
-
if (rejected) {
|
|
8299
|
-
return /* @__PURE__ */ jsxs18(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
8300
|
-
/* @__PURE__ */ jsx27(AlertCircle3, { className: "h-3 w-3" }),
|
|
8301
|
-
" Rejected by bundler"
|
|
8302
|
-
] });
|
|
8303
|
-
}
|
|
8304
|
-
if (timedOut) {
|
|
8305
|
-
return /* @__PURE__ */ jsxs18(Badge, { variant: "warning", className: "gap-1", children: [
|
|
8306
|
-
/* @__PURE__ */ jsx27(AlertCircle3, { className: "h-3 w-3" }),
|
|
8307
|
-
" Timeout - may be rejected"
|
|
8308
|
-
] });
|
|
8309
|
-
}
|
|
8310
|
-
if (mempool) {
|
|
8311
|
-
return /* @__PURE__ */ jsxs18(Badge, { variant: "outline", className: "gap-1", children: [
|
|
8312
|
-
/* @__PURE__ */ jsx27(Clock3, { className: "h-3 w-3" }),
|
|
8313
|
-
" Pending in bundler"
|
|
8314
|
-
] });
|
|
8315
|
-
}
|
|
8316
|
-
return /* @__PURE__ */ jsxs18(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
8317
|
-
/* @__PURE__ */ jsx27(Clock3, { className: "h-3 w-3" }),
|
|
8318
|
-
" Waiting"
|
|
8319
|
-
] });
|
|
8320
|
-
};
|
|
8321
|
-
return /* @__PURE__ */ jsxs18(
|
|
8322
|
-
"div",
|
|
8323
|
-
{
|
|
8324
|
-
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
8325
|
-
style: { textAlign: "left", listStyle: "none" },
|
|
8326
|
-
children: [
|
|
8327
|
-
/* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-between mb-3", children: [
|
|
8328
|
-
/* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-2", children: [
|
|
8329
|
-
stateBadge(),
|
|
8330
|
-
/* @__PURE__ */ jsx27("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
8331
|
-
] }),
|
|
8332
|
-
/* @__PURE__ */ jsxs18(Button, { variant: "ghost", size: "sm", onClick: () => tick(), disabled: refreshing, className: "h-8", children: [
|
|
8333
|
-
/* @__PURE__ */ jsx27(RefreshCw5, { className: cn2("h-3.5 w-3.5 mr-1", refreshing && "animate-spin") }),
|
|
8334
|
-
/* @__PURE__ */ jsx27("span", { className: "text-xs", children: "Refresh" })
|
|
8335
|
-
] })
|
|
8336
|
-
] }),
|
|
8337
|
-
/* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
8338
|
-
/* @__PURE__ */ jsx27("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "UO Hash" }),
|
|
8339
|
-
/* @__PURE__ */ jsx27("code", { className: "text-xs font-mono flex-1 select-all", children: userOpHash }),
|
|
8340
|
-
/* @__PURE__ */ jsx27(
|
|
8341
|
-
Button,
|
|
8342
|
-
{
|
|
8343
|
-
variant: "ghost",
|
|
8344
|
-
size: "sm",
|
|
8345
|
-
className: "h-8 w-8 p-0",
|
|
8346
|
-
onClick: async () => {
|
|
8347
|
-
try {
|
|
8348
|
-
await navigator.clipboard.writeText(userOpHash);
|
|
8349
|
-
} catch {
|
|
8350
|
-
}
|
|
8351
|
-
},
|
|
8352
|
-
children: /* @__PURE__ */ jsx27(Copy3, { className: "h-3.5 w-3.5" })
|
|
8353
|
-
}
|
|
8354
|
-
)
|
|
8355
|
-
] }),
|
|
8356
|
-
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
8357
|
-
/* @__PURE__ */ jsx27("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "Tx Hash" }),
|
|
8358
|
-
/* @__PURE__ */ jsx27("code", { className: "text-xs font-mono flex-1 select-all", children: receipt.receipt.transactionHash }),
|
|
8359
|
-
/* @__PURE__ */ jsx27(
|
|
8360
|
-
Button,
|
|
8361
|
-
{
|
|
8362
|
-
variant: "ghost",
|
|
8363
|
-
size: "sm",
|
|
8364
|
-
className: "h-8 w-8 p-0",
|
|
8365
|
-
onClick: async () => {
|
|
8366
|
-
try {
|
|
8367
|
-
await navigator.clipboard.writeText(receipt.receipt.transactionHash);
|
|
8368
|
-
} catch {
|
|
8369
|
-
}
|
|
8370
|
-
},
|
|
8371
|
-
children: /* @__PURE__ */ jsx27(Copy3, { className: "h-3.5 w-3.5" })
|
|
8372
|
-
}
|
|
8373
|
-
),
|
|
8374
|
-
chain?.blockExplorers?.default?.url && /* @__PURE__ */ jsx27(
|
|
8375
|
-
"a",
|
|
8376
|
-
{
|
|
8377
|
-
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
8378
|
-
target: "_blank",
|
|
8379
|
-
rel: "noreferrer noopener",
|
|
8380
|
-
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
8381
|
-
title: "Open in explorer",
|
|
8382
|
-
children: /* @__PURE__ */ jsx27(ExternalLink4, { className: "h-3.5 w-3.5" })
|
|
8383
|
-
}
|
|
8384
|
-
)
|
|
8385
|
-
] }),
|
|
8386
|
-
receipt && /* @__PURE__ */ jsxs18("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
8387
|
-
"Block ",
|
|
8388
|
-
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
8389
|
-
" \u2022 Gas Used",
|
|
8390
|
-
" ",
|
|
8391
|
-
parseInt(receipt.actualGasUsed || "0x0", 16),
|
|
8392
|
-
" \u2022 Success ",
|
|
8393
|
-
String(!!receipt.success)
|
|
8394
|
-
] }),
|
|
8395
|
-
/* @__PURE__ */ jsx27("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ jsxs18("span", { className: "ml-2", children: [
|
|
8396
|
-
"\u2022 Polling for ",
|
|
8397
|
-
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
8398
|
-
"s"
|
|
8399
|
-
] }) }),
|
|
8400
|
-
mempool && /* @__PURE__ */ jsxs18("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
8401
|
-
/* @__PURE__ */ jsxs18("div", { children: [
|
|
8402
|
-
"Seen by bundler at ",
|
|
8403
|
-
/* @__PURE__ */ jsx27(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
8404
|
-
] }),
|
|
8405
|
-
/* @__PURE__ */ jsxs18("div", { children: [
|
|
8406
|
-
"sender ",
|
|
8407
|
-
/* @__PURE__ */ jsx27(Address, { address: mempool.sender, chain, truncate: false })
|
|
8408
|
-
] })
|
|
8409
|
-
] }),
|
|
8410
|
-
error && /* @__PURE__ */ jsxs18("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8411
|
-
/* @__PURE__ */ jsx27(AlertCircle3, { className: "h-4 w-4" }),
|
|
8412
|
-
" ",
|
|
8413
|
-
error
|
|
8414
|
-
] }),
|
|
8415
|
-
rejected && /* @__PURE__ */ jsxs18("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8416
|
-
/* @__PURE__ */ jsx27(AlertCircle3, { className: "h-4 w-4" }),
|
|
8417
|
-
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
8418
|
-
] }),
|
|
8419
|
-
timedOut && /* @__PURE__ */ jsxs18("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
8420
|
-
/* @__PURE__ */ jsx27(AlertCircle3, { className: "h-4 w-4" }),
|
|
8421
|
-
"Stopped polling after ",
|
|
8422
|
-
Math.round(maxPollTimeMs / 1e3),
|
|
8423
|
-
"s. UserOperation may have been rejected by the bundler."
|
|
8424
|
-
] })
|
|
8425
|
-
]
|
|
8426
|
-
}
|
|
8427
|
-
);
|
|
8428
|
-
};
|
|
8429
|
-
}
|
|
8430
|
-
});
|
|
8431
|
-
|
|
8432
|
-
// src/internal/components/SendModal.tsx
|
|
8433
|
-
import { useState as useState12, useEffect as useEffect9 } from "react";
|
|
8434
|
-
import { Send, ArrowLeft as ArrowLeft8, Loader2, CheckCircle2 as CheckCircle26, AlertCircle as AlertCircle4 } from "lucide-react";
|
|
8435
|
-
import { isAddress as isAddress2 } from "viem";
|
|
8436
|
-
import { useBalance as useBalance2 } from "wagmi";
|
|
8437
|
-
import { jsx as jsx28, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
8438
|
-
var SendModal;
|
|
8439
|
-
var init_SendModal = __esm({
|
|
8440
|
-
"src/internal/components/SendModal.tsx"() {
|
|
8441
|
-
init_dialog();
|
|
8442
|
-
init_visually_hidden();
|
|
9122
|
+
// src/internal/components/SendModal.tsx
|
|
9123
|
+
import { useState as useState10, useEffect as useEffect8 } from "react";
|
|
9124
|
+
import { Send, ArrowLeft as ArrowLeft8, Loader2, CheckCircle2 as CheckCircle25, AlertCircle as AlertCircle3 } from "lucide-react";
|
|
9125
|
+
import { isAddress as isAddress2 } from "viem";
|
|
9126
|
+
import { useBalance as useBalance2 } from "wagmi";
|
|
9127
|
+
import { jsx as jsx25, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
9128
|
+
var SendModal;
|
|
9129
|
+
var init_SendModal = __esm({
|
|
9130
|
+
"src/internal/components/SendModal.tsx"() {
|
|
9131
|
+
init_dialog();
|
|
9132
|
+
init_visually_hidden();
|
|
8443
9133
|
init_button();
|
|
8444
9134
|
init_useSendTransaction();
|
|
8445
9135
|
init_LumiaPassportSessionContext();
|
|
8446
9136
|
init_assets();
|
|
8447
|
-
init_UserOpStatus();
|
|
8448
9137
|
init_base();
|
|
8449
9138
|
init_LumiaPassportContext();
|
|
8450
9139
|
init_useTheme();
|
|
@@ -8452,6 +9141,7 @@ var init_SendModal = __esm({
|
|
|
8452
9141
|
open,
|
|
8453
9142
|
onOpenChange,
|
|
8454
9143
|
onBack,
|
|
9144
|
+
onSuccess,
|
|
8455
9145
|
recipientAddress: initialRecipient = "",
|
|
8456
9146
|
amount: initialAmount = ""
|
|
8457
9147
|
}) => {
|
|
@@ -8464,13 +9154,13 @@ var init_SendModal = __esm({
|
|
|
8464
9154
|
address,
|
|
8465
9155
|
chainId: lumiaBeam.id
|
|
8466
9156
|
});
|
|
8467
|
-
const [recipient, setRecipient] =
|
|
8468
|
-
const [amount, setAmount] =
|
|
8469
|
-
const [txStep, setTxStep] =
|
|
8470
|
-
const [validationError, setValidationError] =
|
|
9157
|
+
const [recipient, setRecipient] = useState10(initialRecipient);
|
|
9158
|
+
const [amount, setAmount] = useState10(initialAmount);
|
|
9159
|
+
const [txStep, setTxStep] = useState10("input");
|
|
9160
|
+
const [validationError, setValidationError] = useState10(null);
|
|
8471
9161
|
const nativeAsset = assets.find((a) => a.type === "native");
|
|
8472
9162
|
const balance = nativeAsset ? parseFloat(nativeAsset.formattedBalance) : 0;
|
|
8473
|
-
|
|
9163
|
+
useEffect8(() => {
|
|
8474
9164
|
if (open) {
|
|
8475
9165
|
setTxStep("input");
|
|
8476
9166
|
setValidationError(null);
|
|
@@ -8526,11 +9216,22 @@ var init_SendModal = __esm({
|
|
|
8526
9216
|
const handleClose = () => {
|
|
8527
9217
|
onOpenChange(false);
|
|
8528
9218
|
};
|
|
9219
|
+
const handleDone = () => {
|
|
9220
|
+
console.log("[SendModal] handleDone called, onSuccess exists:", !!onSuccess);
|
|
9221
|
+
if (onSuccess) {
|
|
9222
|
+
console.log("[SendModal] Calling onSuccess to open Transaction History");
|
|
9223
|
+
onSuccess();
|
|
9224
|
+
}
|
|
9225
|
+
setTimeout(() => {
|
|
9226
|
+
console.log("[SendModal] Closing SendModal");
|
|
9227
|
+
onOpenChange(false);
|
|
9228
|
+
}, 50);
|
|
9229
|
+
};
|
|
8529
9230
|
const handleMaxAmount = () => {
|
|
8530
9231
|
const maxAmount = Math.max(0, balance - 1e-3);
|
|
8531
9232
|
setAmount(maxAmount.toFixed(6));
|
|
8532
9233
|
};
|
|
8533
|
-
return /* @__PURE__ */
|
|
9234
|
+
return /* @__PURE__ */ jsx25(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs17(
|
|
8534
9235
|
DialogContent,
|
|
8535
9236
|
{
|
|
8536
9237
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8542,28 +9243,28 @@ var init_SendModal = __esm({
|
|
|
8542
9243
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8543
9244
|
},
|
|
8544
9245
|
children: [
|
|
8545
|
-
/* @__PURE__ */
|
|
8546
|
-
/* @__PURE__ */
|
|
8547
|
-
/* @__PURE__ */
|
|
8548
|
-
onBack && txStep === "input" && /* @__PURE__ */
|
|
9246
|
+
/* @__PURE__ */ jsx25(VisuallyHidden, { children: /* @__PURE__ */ jsx25(DialogTitle, { children: "Send Transaction" }) }),
|
|
9247
|
+
/* @__PURE__ */ jsx25(DialogDescription, { className: "sr-only", children: "Send LUMIA tokens to another address" }),
|
|
9248
|
+
/* @__PURE__ */ jsx25("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
|
|
9249
|
+
onBack && txStep === "input" && /* @__PURE__ */ jsx25(
|
|
8549
9250
|
"button",
|
|
8550
9251
|
{
|
|
8551
9252
|
onClick: onBack,
|
|
8552
9253
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8553
9254
|
title: "Back",
|
|
8554
|
-
children: /* @__PURE__ */
|
|
9255
|
+
children: /* @__PURE__ */ jsx25(ArrowLeft8, { className: "h-4 w-4" })
|
|
8555
9256
|
}
|
|
8556
9257
|
),
|
|
8557
|
-
/* @__PURE__ */
|
|
8558
|
-
/* @__PURE__ */
|
|
8559
|
-
/* @__PURE__ */
|
|
9258
|
+
/* @__PURE__ */ jsxs17("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
9259
|
+
/* @__PURE__ */ jsx25(Send, { className: "h-5 w-5" }),
|
|
9260
|
+
/* @__PURE__ */ jsx25("span", { children: "Send LUMIA" })
|
|
8560
9261
|
] })
|
|
8561
9262
|
] }) }),
|
|
8562
|
-
/* @__PURE__ */
|
|
8563
|
-
txStep === "input" && /* @__PURE__ */
|
|
8564
|
-
/* @__PURE__ */
|
|
8565
|
-
/* @__PURE__ */
|
|
8566
|
-
/* @__PURE__ */
|
|
9263
|
+
/* @__PURE__ */ jsxs17("div", { className: "p-5", children: [
|
|
9264
|
+
txStep === "input" && /* @__PURE__ */ jsxs17("div", { className: "space-y-4", children: [
|
|
9265
|
+
/* @__PURE__ */ jsxs17("div", { children: [
|
|
9266
|
+
/* @__PURE__ */ jsx25("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Recipient Address" }),
|
|
9267
|
+
/* @__PURE__ */ jsx25(
|
|
8567
9268
|
"input",
|
|
8568
9269
|
{
|
|
8569
9270
|
type: "text",
|
|
@@ -8574,17 +9275,17 @@ var init_SendModal = __esm({
|
|
|
8574
9275
|
}
|
|
8575
9276
|
)
|
|
8576
9277
|
] }),
|
|
8577
|
-
/* @__PURE__ */
|
|
8578
|
-
/* @__PURE__ */
|
|
8579
|
-
/* @__PURE__ */
|
|
8580
|
-
/* @__PURE__ */
|
|
9278
|
+
/* @__PURE__ */ jsxs17("div", { children: [
|
|
9279
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex justify-between items-center mb-2", children: [
|
|
9280
|
+
/* @__PURE__ */ jsx25("label", { className: `text-sm font-medium ${theme.bodyText}`, children: "Amount" }),
|
|
9281
|
+
/* @__PURE__ */ jsxs17("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
8581
9282
|
"Balance: ",
|
|
8582
9283
|
balance.toFixed(4),
|
|
8583
9284
|
" LUMIA"
|
|
8584
9285
|
] })
|
|
8585
9286
|
] }),
|
|
8586
|
-
/* @__PURE__ */
|
|
8587
|
-
/* @__PURE__ */
|
|
9287
|
+
/* @__PURE__ */ jsxs17("div", { className: "relative", children: [
|
|
9288
|
+
/* @__PURE__ */ jsx25(
|
|
8588
9289
|
"input",
|
|
8589
9290
|
{
|
|
8590
9291
|
type: "number",
|
|
@@ -8595,7 +9296,7 @@ var init_SendModal = __esm({
|
|
|
8595
9296
|
className: `w-full px-3 py-2 pr-16 border ${isDark ? "bg-gray-800 border-gray-600 text-white placeholder:text-gray-400" : "bg-white border-gray-300 text-gray-900 placeholder:text-gray-400"} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`
|
|
8596
9297
|
}
|
|
8597
9298
|
),
|
|
8598
|
-
/* @__PURE__ */
|
|
9299
|
+
/* @__PURE__ */ jsx25(
|
|
8599
9300
|
"button",
|
|
8600
9301
|
{
|
|
8601
9302
|
onClick: handleMaxAmount,
|
|
@@ -8605,11 +9306,11 @@ var init_SendModal = __esm({
|
|
|
8605
9306
|
)
|
|
8606
9307
|
] })
|
|
8607
9308
|
] }),
|
|
8608
|
-
(validationError || error) && /* @__PURE__ */
|
|
8609
|
-
/* @__PURE__ */
|
|
8610
|
-
/* @__PURE__ */
|
|
9309
|
+
(validationError || error) && /* @__PURE__ */ jsxs17("div", { className: `flex items-center gap-2 p-3 ${isDark ? "bg-red-900/30 text-red-400" : "bg-red-50 text-red-700"} rounded-lg`, children: [
|
|
9310
|
+
/* @__PURE__ */ jsx25(AlertCircle3, { className: "h-4 w-4" }),
|
|
9311
|
+
/* @__PURE__ */ jsx25("span", { className: "text-sm", children: validationError || error })
|
|
8611
9312
|
] }),
|
|
8612
|
-
/* @__PURE__ */
|
|
9313
|
+
/* @__PURE__ */ jsx25(
|
|
8613
9314
|
Button,
|
|
8614
9315
|
{
|
|
8615
9316
|
onClick: handleSend,
|
|
@@ -8620,29 +9321,29 @@ var init_SendModal = __esm({
|
|
|
8620
9321
|
}
|
|
8621
9322
|
)
|
|
8622
9323
|
] }),
|
|
8623
|
-
txStep === "confirm" && /* @__PURE__ */
|
|
8624
|
-
/* @__PURE__ */
|
|
8625
|
-
/* @__PURE__ */
|
|
8626
|
-
/* @__PURE__ */
|
|
8627
|
-
/* @__PURE__ */
|
|
8628
|
-
/* @__PURE__ */
|
|
8629
|
-
/* @__PURE__ */
|
|
9324
|
+
txStep === "confirm" && /* @__PURE__ */ jsxs17("div", { className: "space-y-4", children: [
|
|
9325
|
+
/* @__PURE__ */ jsxs17("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
9326
|
+
/* @__PURE__ */ jsx25("h3", { className: `font-medium ${theme.titleText} mb-3`, children: "Transaction Details" }),
|
|
9327
|
+
/* @__PURE__ */ jsxs17("div", { className: "space-y-2 text-sm", children: [
|
|
9328
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex justify-between", children: [
|
|
9329
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "To:" }),
|
|
9330
|
+
/* @__PURE__ */ jsx25("span", { className: `font-mono ${theme.titleText}`, children: `${recipient.slice(0, 6)}...${recipient.slice(-4)}` })
|
|
8630
9331
|
] }),
|
|
8631
|
-
/* @__PURE__ */
|
|
8632
|
-
/* @__PURE__ */
|
|
8633
|
-
/* @__PURE__ */
|
|
9332
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex justify-between", children: [
|
|
9333
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Amount:" }),
|
|
9334
|
+
/* @__PURE__ */ jsxs17("span", { className: `font-semibold ${theme.titleText}`, children: [
|
|
8634
9335
|
amount,
|
|
8635
9336
|
" LUMIA"
|
|
8636
9337
|
] })
|
|
8637
9338
|
] }),
|
|
8638
|
-
/* @__PURE__ */
|
|
8639
|
-
/* @__PURE__ */
|
|
8640
|
-
/* @__PURE__ */
|
|
9339
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex justify-between", children: [
|
|
9340
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.bodyText}`, children: "Network:" }),
|
|
9341
|
+
/* @__PURE__ */ jsx25("span", { className: `${theme.titleText}`, children: "Lumia Beam" })
|
|
8641
9342
|
] })
|
|
8642
9343
|
] })
|
|
8643
9344
|
] }),
|
|
8644
|
-
/* @__PURE__ */
|
|
8645
|
-
/* @__PURE__ */
|
|
9345
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex gap-2", children: [
|
|
9346
|
+
/* @__PURE__ */ jsx25(
|
|
8646
9347
|
Button,
|
|
8647
9348
|
{
|
|
8648
9349
|
onClick: () => setTxStep("input"),
|
|
@@ -8652,7 +9353,7 @@ var init_SendModal = __esm({
|
|
|
8652
9353
|
children: "Back"
|
|
8653
9354
|
}
|
|
8654
9355
|
),
|
|
8655
|
-
/* @__PURE__ */
|
|
9356
|
+
/* @__PURE__ */ jsxs17(
|
|
8656
9357
|
Button,
|
|
8657
9358
|
{
|
|
8658
9359
|
onClick: handleConfirm,
|
|
@@ -8660,31 +9361,30 @@ var init_SendModal = __esm({
|
|
|
8660
9361
|
className: "flex-1",
|
|
8661
9362
|
size: "lg",
|
|
8662
9363
|
children: [
|
|
8663
|
-
isLoading && /* @__PURE__ */
|
|
9364
|
+
isLoading && /* @__PURE__ */ jsx25(Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
8664
9365
|
"Confirm"
|
|
8665
9366
|
]
|
|
8666
9367
|
}
|
|
8667
9368
|
)
|
|
8668
9369
|
] })
|
|
8669
9370
|
] }),
|
|
8670
|
-
txStep === "pending" && /* @__PURE__ */
|
|
8671
|
-
/* @__PURE__ */
|
|
8672
|
-
/* @__PURE__ */
|
|
8673
|
-
/* @__PURE__ */
|
|
8674
|
-
/* @__PURE__ */
|
|
9371
|
+
txStep === "pending" && /* @__PURE__ */ jsxs17("div", { className: "py-8 text-center space-y-4", children: [
|
|
9372
|
+
/* @__PURE__ */ jsx25(Loader2, { className: `h-12 w-12 animate-spin ${isDark ? "text-blue-400" : "text-blue-600"} mx-auto` }),
|
|
9373
|
+
/* @__PURE__ */ jsxs17("div", { children: [
|
|
9374
|
+
/* @__PURE__ */ jsx25("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Pending" }),
|
|
9375
|
+
/* @__PURE__ */ jsx25("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Please wait while we process your transaction" })
|
|
8675
9376
|
] })
|
|
8676
9377
|
] }),
|
|
8677
|
-
txStep === "success" && userOpHash && /* @__PURE__ */
|
|
8678
|
-
/* @__PURE__ */
|
|
8679
|
-
/* @__PURE__ */
|
|
8680
|
-
/* @__PURE__ */
|
|
8681
|
-
/* @__PURE__ */
|
|
9378
|
+
txStep === "success" && userOpHash && /* @__PURE__ */ jsxs17("div", { className: "space-y-6", children: [
|
|
9379
|
+
/* @__PURE__ */ jsxs17("div", { className: "text-center py-4", children: [
|
|
9380
|
+
/* @__PURE__ */ jsx25(CheckCircle25, { className: `h-12 w-12 ${isDark ? "text-green-400" : "text-green-500"} mx-auto mb-3` }),
|
|
9381
|
+
/* @__PURE__ */ jsx25("p", { className: `font-medium ${theme.titleText}`, children: "Transaction Sent!" }),
|
|
9382
|
+
/* @__PURE__ */ jsx25("p", { className: `text-sm ${theme.mutedText} mt-1`, children: "Your transaction is being processed" })
|
|
8682
9383
|
] }),
|
|
8683
|
-
/* @__PURE__ */
|
|
8684
|
-
/* @__PURE__ */ jsx28(
|
|
9384
|
+
/* @__PURE__ */ jsx25(
|
|
8685
9385
|
Button,
|
|
8686
9386
|
{
|
|
8687
|
-
onClick:
|
|
9387
|
+
onClick: handleDone,
|
|
8688
9388
|
className: "w-full",
|
|
8689
9389
|
size: "lg",
|
|
8690
9390
|
children: "Done"
|
|
@@ -8700,10 +9400,10 @@ var init_SendModal = __esm({
|
|
|
8700
9400
|
});
|
|
8701
9401
|
|
|
8702
9402
|
// src/internal/components/ReceiveModal.tsx
|
|
8703
|
-
import { useState as
|
|
8704
|
-
import { QrCode, Copy as
|
|
9403
|
+
import { useState as useState11, useEffect as useEffect9 } from "react";
|
|
9404
|
+
import { QrCode, Copy as Copy2, ArrowLeft as ArrowLeft9, CheckCircle2 as CheckCircle26 } from "lucide-react";
|
|
8705
9405
|
import QRCode from "qrcode";
|
|
8706
|
-
import { Fragment as Fragment5, jsx as
|
|
9406
|
+
import { Fragment as Fragment5, jsx as jsx26, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
8707
9407
|
var ReceiveModal;
|
|
8708
9408
|
var init_ReceiveModal = __esm({
|
|
8709
9409
|
"src/internal/components/ReceiveModal.tsx"() {
|
|
@@ -8719,11 +9419,11 @@ var init_ReceiveModal = __esm({
|
|
|
8719
9419
|
onBack
|
|
8720
9420
|
}) => {
|
|
8721
9421
|
const { address } = useLumiaPassportSession();
|
|
8722
|
-
const [qrCodeUrl, setQrCodeUrl] =
|
|
9422
|
+
const [qrCodeUrl, setQrCodeUrl] = useState11("");
|
|
8723
9423
|
const { config } = useLumiaPassportConfig();
|
|
8724
9424
|
const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);
|
|
8725
|
-
const [copied, setCopied] =
|
|
8726
|
-
|
|
9425
|
+
const [copied, setCopied] = useState11(false);
|
|
9426
|
+
useEffect9(() => {
|
|
8727
9427
|
if (open && address) {
|
|
8728
9428
|
QRCode.toDataURL(address, {
|
|
8729
9429
|
width: 200,
|
|
@@ -8753,7 +9453,7 @@ var init_ReceiveModal = __esm({
|
|
|
8753
9453
|
if (!addr) return "";
|
|
8754
9454
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
8755
9455
|
};
|
|
8756
|
-
return /* @__PURE__ */
|
|
9456
|
+
return /* @__PURE__ */ jsx26(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs18(
|
|
8757
9457
|
DialogContent,
|
|
8758
9458
|
{
|
|
8759
9459
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8765,51 +9465,51 @@ var init_ReceiveModal = __esm({
|
|
|
8765
9465
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8766
9466
|
},
|
|
8767
9467
|
children: [
|
|
8768
|
-
/* @__PURE__ */
|
|
8769
|
-
/* @__PURE__ */
|
|
8770
|
-
/* @__PURE__ */
|
|
8771
|
-
onBack && /* @__PURE__ */
|
|
9468
|
+
/* @__PURE__ */ jsx26(VisuallyHidden, { children: /* @__PURE__ */ jsx26(DialogTitle, { children: "Receive LUMIA" }) }),
|
|
9469
|
+
/* @__PURE__ */ jsx26(DialogDescription, { className: "sr-only", children: "Your wallet address and QR code for receiving LUMIA" }),
|
|
9470
|
+
/* @__PURE__ */ jsx26("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-2", children: [
|
|
9471
|
+
onBack && /* @__PURE__ */ jsx26(
|
|
8772
9472
|
"button",
|
|
8773
9473
|
{
|
|
8774
9474
|
onClick: onBack,
|
|
8775
9475
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8776
9476
|
title: "Back",
|
|
8777
|
-
children: /* @__PURE__ */
|
|
9477
|
+
children: /* @__PURE__ */ jsx26(ArrowLeft9, { className: "h-4 w-4" })
|
|
8778
9478
|
}
|
|
8779
9479
|
),
|
|
8780
|
-
/* @__PURE__ */
|
|
8781
|
-
/* @__PURE__ */
|
|
8782
|
-
/* @__PURE__ */
|
|
9480
|
+
/* @__PURE__ */ jsxs18("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
9481
|
+
/* @__PURE__ */ jsx26(QrCode, { className: "h-5 w-5" }),
|
|
9482
|
+
/* @__PURE__ */ jsx26("span", { children: "Receive LUMIA" })
|
|
8783
9483
|
] })
|
|
8784
9484
|
] }) }),
|
|
8785
|
-
/* @__PURE__ */
|
|
8786
|
-
qrCodeUrl && /* @__PURE__ */
|
|
8787
|
-
/* @__PURE__ */
|
|
8788
|
-
/* @__PURE__ */
|
|
8789
|
-
/* @__PURE__ */
|
|
9485
|
+
/* @__PURE__ */ jsxs18("div", { className: "p-5 space-y-4", children: [
|
|
9486
|
+
qrCodeUrl && /* @__PURE__ */ jsx26("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx26("div", { className: `${isDark ? "bg-white" : "bg-white"} p-4 rounded-xl border ${theme.divider}`, children: /* @__PURE__ */ jsx26("img", { src: qrCodeUrl, alt: "Wallet QR Code", className: "w-48 h-48" }) }) }),
|
|
9487
|
+
/* @__PURE__ */ jsx26("div", { className: `${isDark ? "bg-blue-900/30 border-blue-600" : "bg-blue-50 border-blue-200"} rounded-lg p-3`, children: /* @__PURE__ */ jsx26("div", { className: `flex items-center gap-2 ${isDark ? "text-blue-300" : "text-blue-700"} text-sm`, children: /* @__PURE__ */ jsxs18("div", { className: "flex-1", children: [
|
|
9488
|
+
/* @__PURE__ */ jsx26("p", { className: "font-medium", children: "Network: Lumia Beam" }),
|
|
9489
|
+
/* @__PURE__ */ jsx26("p", { className: `text-xs ${isDark ? "text-blue-400" : "text-blue-600"} mt-0.5`, children: "Ensure sender is on the same network" })
|
|
8790
9490
|
] }) }) }),
|
|
8791
|
-
/* @__PURE__ */
|
|
8792
|
-
/* @__PURE__ */
|
|
8793
|
-
/* @__PURE__ */
|
|
8794
|
-
/* @__PURE__ */
|
|
9491
|
+
/* @__PURE__ */ jsxs18("div", { className: `${isDark ? "bg-gray-800" : "bg-gray-50"} rounded-lg p-4`, children: [
|
|
9492
|
+
/* @__PURE__ */ jsx26("label", { className: `block text-sm font-medium ${theme.bodyText} mb-2`, children: "Your Wallet Address" }),
|
|
9493
|
+
/* @__PURE__ */ jsx26("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx26("div", { className: `flex-1 font-mono text-sm ${isDark ? "text-white bg-gray-700 border-gray-600" : "text-gray-900 bg-white border-gray-300"} rounded-lg px-3 py-2 break-all`, children: address }) }),
|
|
9494
|
+
/* @__PURE__ */ jsx26(
|
|
8795
9495
|
Button,
|
|
8796
9496
|
{
|
|
8797
9497
|
onClick: handleCopy,
|
|
8798
9498
|
className: "w-full mt-3",
|
|
8799
9499
|
size: "lg",
|
|
8800
|
-
children: copied ? /* @__PURE__ */
|
|
8801
|
-
/* @__PURE__ */
|
|
8802
|
-
/* @__PURE__ */
|
|
8803
|
-
] }) : /* @__PURE__ */
|
|
8804
|
-
/* @__PURE__ */
|
|
8805
|
-
/* @__PURE__ */
|
|
9500
|
+
children: copied ? /* @__PURE__ */ jsxs18(Fragment5, { children: [
|
|
9501
|
+
/* @__PURE__ */ jsx26(CheckCircle26, { className: "h-4 w-4" }),
|
|
9502
|
+
/* @__PURE__ */ jsx26("span", { children: "Copied!" })
|
|
9503
|
+
] }) : /* @__PURE__ */ jsxs18(Fragment5, { children: [
|
|
9504
|
+
/* @__PURE__ */ jsx26(Copy2, { className: "h-4 w-4" }),
|
|
9505
|
+
/* @__PURE__ */ jsx26("span", { children: "Copy Address" })
|
|
8806
9506
|
] })
|
|
8807
9507
|
}
|
|
8808
9508
|
)
|
|
8809
9509
|
] }),
|
|
8810
|
-
/* @__PURE__ */
|
|
8811
|
-
/* @__PURE__ */
|
|
8812
|
-
/* @__PURE__ */
|
|
9510
|
+
/* @__PURE__ */ jsxs18("div", { className: `text-center text-sm ${theme.mutedText}`, children: [
|
|
9511
|
+
/* @__PURE__ */ jsx26("p", { children: "Share this address to receive LUMIA tokens." }),
|
|
9512
|
+
/* @__PURE__ */ jsx26("p", { className: "mt-1", children: "Only send LUMIA tokens to this address on Lumia Beam network." })
|
|
8813
9513
|
] })
|
|
8814
9514
|
] })
|
|
8815
9515
|
]
|
|
@@ -8821,7 +9521,7 @@ var init_ReceiveModal = __esm({
|
|
|
8821
9521
|
|
|
8822
9522
|
// src/internal/components/BuyModal.tsx
|
|
8823
9523
|
import { CreditCard, ArrowLeft as ArrowLeft10 } from "lucide-react";
|
|
8824
|
-
import { jsx as
|
|
9524
|
+
import { jsx as jsx27, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
8825
9525
|
var BuyModal;
|
|
8826
9526
|
var init_BuyModal = __esm({
|
|
8827
9527
|
"src/internal/components/BuyModal.tsx"() {
|
|
@@ -8833,7 +9533,7 @@ var init_BuyModal = __esm({
|
|
|
8833
9533
|
BuyModal = ({ open, onOpenChange, onBack }) => {
|
|
8834
9534
|
const { config } = useLumiaPassportConfig();
|
|
8835
9535
|
const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);
|
|
8836
|
-
return /* @__PURE__ */
|
|
9536
|
+
return /* @__PURE__ */ jsx27(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs19(
|
|
8837
9537
|
DialogContent,
|
|
8838
9538
|
{
|
|
8839
9539
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8845,26 +9545,26 @@ var init_BuyModal = __esm({
|
|
|
8845
9545
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8846
9546
|
},
|
|
8847
9547
|
children: [
|
|
8848
|
-
/* @__PURE__ */
|
|
8849
|
-
/* @__PURE__ */
|
|
8850
|
-
/* @__PURE__ */
|
|
8851
|
-
onBack && /* @__PURE__ */
|
|
9548
|
+
/* @__PURE__ */ jsx27(VisuallyHidden, { children: /* @__PURE__ */ jsx27(DialogTitle, { children: "Buy Crypto" }) }),
|
|
9549
|
+
/* @__PURE__ */ jsx27(DialogDescription, { className: "sr-only", children: "On-ramp placeholder" }),
|
|
9550
|
+
/* @__PURE__ */ jsx27("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2", children: [
|
|
9551
|
+
onBack && /* @__PURE__ */ jsx27(
|
|
8852
9552
|
"button",
|
|
8853
9553
|
{
|
|
8854
9554
|
onClick: onBack,
|
|
8855
9555
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8856
9556
|
title: "Back",
|
|
8857
|
-
children: /* @__PURE__ */
|
|
9557
|
+
children: /* @__PURE__ */ jsx27(ArrowLeft10, { className: "h-4 w-4" })
|
|
8858
9558
|
}
|
|
8859
9559
|
),
|
|
8860
|
-
/* @__PURE__ */
|
|
8861
|
-
/* @__PURE__ */
|
|
8862
|
-
/* @__PURE__ */
|
|
9560
|
+
/* @__PURE__ */ jsxs19("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
9561
|
+
/* @__PURE__ */ jsx27(CreditCard, { className: "h-5 w-5" }),
|
|
9562
|
+
/* @__PURE__ */ jsx27("span", { children: "Buy" })
|
|
8863
9563
|
] })
|
|
8864
9564
|
] }) }),
|
|
8865
|
-
/* @__PURE__ */
|
|
8866
|
-
/* @__PURE__ */
|
|
8867
|
-
/* @__PURE__ */
|
|
9565
|
+
/* @__PURE__ */ jsxs19("div", { className: "p-5", children: [
|
|
9566
|
+
/* @__PURE__ */ jsx27("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ jsx27("div", { className: `text-sm ${theme.mutedText}`, children: "On-ramp coming soon\u2026" }) }),
|
|
9567
|
+
/* @__PURE__ */ jsx27("div", { className: "pt-4", children: /* @__PURE__ */ jsx27(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
8868
9568
|
] })
|
|
8869
9569
|
]
|
|
8870
9570
|
}
|
|
@@ -8875,7 +9575,7 @@ var init_BuyModal = __esm({
|
|
|
8875
9575
|
|
|
8876
9576
|
// src/internal/components/KycModal.tsx
|
|
8877
9577
|
import { ShieldCheck, ArrowLeft as ArrowLeft11 } from "lucide-react";
|
|
8878
|
-
import { jsx as
|
|
9578
|
+
import { jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
8879
9579
|
var KycModal;
|
|
8880
9580
|
var init_KycModal = __esm({
|
|
8881
9581
|
"src/internal/components/KycModal.tsx"() {
|
|
@@ -8889,7 +9589,7 @@ var init_KycModal = __esm({
|
|
|
8889
9589
|
const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);
|
|
8890
9590
|
const provider = config.kyc?.provider;
|
|
8891
9591
|
const options = config.kyc?.options || {};
|
|
8892
|
-
return /* @__PURE__ */
|
|
9592
|
+
return /* @__PURE__ */ jsx28(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs20(
|
|
8893
9593
|
DialogContent,
|
|
8894
9594
|
{
|
|
8895
9595
|
className: `lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`,
|
|
@@ -8901,32 +9601,32 @@ var init_KycModal = __esm({
|
|
|
8901
9601
|
fontFamily: config.ui.fonts?.base || "system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif"
|
|
8902
9602
|
},
|
|
8903
9603
|
children: [
|
|
8904
|
-
/* @__PURE__ */
|
|
8905
|
-
/* @__PURE__ */
|
|
8906
|
-
/* @__PURE__ */
|
|
8907
|
-
onBack && /* @__PURE__ */
|
|
9604
|
+
/* @__PURE__ */ jsx28(VisuallyHidden, { children: /* @__PURE__ */ jsx28(DialogTitle, { children: "KYC" }) }),
|
|
9605
|
+
/* @__PURE__ */ jsx28(DialogDescription, { className: "sr-only", children: "KYC placeholder" }),
|
|
9606
|
+
/* @__PURE__ */ jsx28("div", { className: `p-5 border-b ${theme.divider}`, children: /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
|
|
9607
|
+
onBack && /* @__PURE__ */ jsx28(
|
|
8908
9608
|
"button",
|
|
8909
9609
|
{
|
|
8910
9610
|
onClick: onBack,
|
|
8911
9611
|
className: `${theme.iconColor} hover:${isDark ? "text-gray-200" : "text-gray-700"} p-1 mr-1`,
|
|
8912
9612
|
title: "Back",
|
|
8913
|
-
children: /* @__PURE__ */
|
|
9613
|
+
children: /* @__PURE__ */ jsx28(ArrowLeft11, { className: "h-4 w-4" })
|
|
8914
9614
|
}
|
|
8915
9615
|
),
|
|
8916
|
-
/* @__PURE__ */
|
|
8917
|
-
/* @__PURE__ */
|
|
8918
|
-
/* @__PURE__ */
|
|
9616
|
+
/* @__PURE__ */ jsxs20("div", { className: `flex items-center gap-2 ${theme.titleText} font-semibold`, children: [
|
|
9617
|
+
/* @__PURE__ */ jsx28(ShieldCheck, { className: "h-5 w-5" }),
|
|
9618
|
+
/* @__PURE__ */ jsx28("span", { children: "KYC" })
|
|
8919
9619
|
] })
|
|
8920
9620
|
] }) }),
|
|
8921
|
-
/* @__PURE__ */
|
|
8922
|
-
provider ? /* @__PURE__ */
|
|
8923
|
-
/* @__PURE__ */
|
|
9621
|
+
/* @__PURE__ */ jsxs20("div", { className: "p-5", children: [
|
|
9622
|
+
provider ? /* @__PURE__ */ jsxs20("div", { className: `rounded-xl p-4 ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: [
|
|
9623
|
+
/* @__PURE__ */ jsxs20("div", { className: `text-sm ${theme.titleText} mb-2`, children: [
|
|
8924
9624
|
"KYC provider: ",
|
|
8925
|
-
/* @__PURE__ */
|
|
9625
|
+
/* @__PURE__ */ jsx28("span", { className: "font-medium", children: provider })
|
|
8926
9626
|
] }),
|
|
8927
|
-
Object.keys(options).length > 0 ? /* @__PURE__ */
|
|
8928
|
-
] }) : /* @__PURE__ */
|
|
8929
|
-
/* @__PURE__ */
|
|
9627
|
+
Object.keys(options).length > 0 ? /* @__PURE__ */ jsx28("div", { className: `text-xs ${theme.mutedText} break-words whitespace-pre-wrap`, children: JSON.stringify(options, null, 2) }) : /* @__PURE__ */ jsx28("div", { className: `text-sm ${theme.mutedText}`, children: "No provider options configured." })
|
|
9628
|
+
] }) : /* @__PURE__ */ jsx28("div", { className: `rounded-xl p-4 text-center ${isDark ? "bg-gray-800" : "bg-gray-50"}`, children: /* @__PURE__ */ jsx28("div", { className: `text-sm ${theme.mutedText}`, children: "KYC verification coming soon\u2026" }) }),
|
|
9629
|
+
/* @__PURE__ */ jsx28("div", { className: "pt-4", children: /* @__PURE__ */ jsx28(Button, { className: "w-full", onClick: () => onOpenChange(false), size: "lg", children: "Close" }) })
|
|
8930
9630
|
] })
|
|
8931
9631
|
]
|
|
8932
9632
|
}
|
|
@@ -8936,13 +9636,13 @@ var init_KycModal = __esm({
|
|
|
8936
9636
|
});
|
|
8937
9637
|
|
|
8938
9638
|
// src/modules/linkedProfiles.ts
|
|
8939
|
-
import * as
|
|
9639
|
+
import * as React24 from "react";
|
|
8940
9640
|
function useLumiaPassportLinkedProfiles() {
|
|
8941
|
-
const [profiles, setProfiles] =
|
|
8942
|
-
const [avatar, setAvatar] =
|
|
8943
|
-
const [isLoading, setIsLoading] =
|
|
8944
|
-
const [error, setError] =
|
|
8945
|
-
const load =
|
|
9641
|
+
const [profiles, setProfiles] = React24.useState([]);
|
|
9642
|
+
const [avatar, setAvatar] = React24.useState(null);
|
|
9643
|
+
const [isLoading, setIsLoading] = React24.useState(false);
|
|
9644
|
+
const [error, setError] = React24.useState(null);
|
|
9645
|
+
const load = React24.useCallback(async () => {
|
|
8946
9646
|
setIsLoading(true);
|
|
8947
9647
|
setError(null);
|
|
8948
9648
|
try {
|
|
@@ -8968,7 +9668,7 @@ function useLumiaPassportLinkedProfiles() {
|
|
|
8968
9668
|
setIsLoading(false);
|
|
8969
9669
|
}
|
|
8970
9670
|
}, []);
|
|
8971
|
-
|
|
9671
|
+
React24.useEffect(() => {
|
|
8972
9672
|
load();
|
|
8973
9673
|
}, [load]);
|
|
8974
9674
|
return { profiles, avatar, isLoading, error, refresh: load };
|
|
@@ -8987,7 +9687,7 @@ var init_package = __esm({
|
|
|
8987
9687
|
"package.json"() {
|
|
8988
9688
|
package_default = {
|
|
8989
9689
|
name: "@lumiapassport/ui-kit",
|
|
8990
|
-
version: "1.
|
|
9690
|
+
version: "1.11.0",
|
|
8991
9691
|
description: "React UI components and hooks for Lumia Passport authentication and Account Abstraction",
|
|
8992
9692
|
type: "module",
|
|
8993
9693
|
main: "./dist/index.cjs",
|
|
@@ -9079,11 +9779,11 @@ var init_package = __esm({
|
|
|
9079
9779
|
});
|
|
9080
9780
|
|
|
9081
9781
|
// src/components/ConnectWalletButton.tsx
|
|
9082
|
-
import
|
|
9782
|
+
import React25 from "react";
|
|
9083
9783
|
import { flushSync } from "react-dom";
|
|
9084
9784
|
import { useBalance as useBalance3 } from "wagmi";
|
|
9085
|
-
import { Cloud as Cloud3, Laptop as Laptop2, Shield as Shield4, Copy as
|
|
9086
|
-
import { jsx as
|
|
9785
|
+
import { Cloud as Cloud3, Laptop as Laptop2, Shield as Shield4, Copy as Copy3, ArrowUp, ArrowDown, Plus, Activity as Activity2, Gem as Gem2, CreditCard as CreditCard2, Lock as Lock2, ArrowUpRight as ArrowUpRight2, AlertTriangle as AlertTriangle5, ShieldCheck as ShieldCheck2 } from "lucide-react";
|
|
9786
|
+
import { jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
9087
9787
|
var ConnectWalletButton;
|
|
9088
9788
|
var init_ConnectWalletButton = __esm({
|
|
9089
9789
|
"src/components/ConnectWalletButton.tsx"() {
|
|
@@ -9119,7 +9819,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9119
9819
|
}) => {
|
|
9120
9820
|
console.log("[ConnectWalletButton] Component rendering");
|
|
9121
9821
|
const { config, callbacks: contextCallbacks } = useLumiaPassportConfig();
|
|
9122
|
-
const callbacks =
|
|
9822
|
+
const callbacks = React25.useMemo(() => ({
|
|
9123
9823
|
onLumiaPassportConnecting: buttonCallbacks?.onLumiaPassportConnecting ?? contextCallbacks?.onLumiaPassportConnecting,
|
|
9124
9824
|
onLumiaPassportConnect: buttonCallbacks?.onLumiaPassportConnect ?? contextCallbacks?.onLumiaPassportConnect,
|
|
9125
9825
|
onLumiaPassportAccount: buttonCallbacks?.onLumiaPassportAccount ?? contextCallbacks?.onLumiaPassportAccount,
|
|
@@ -9144,20 +9844,20 @@ var init_ConnectWalletButton = __esm({
|
|
|
9144
9844
|
setIsRecoveryModalOpen
|
|
9145
9845
|
} = useLumiaPassportSession();
|
|
9146
9846
|
const { profiles, isLoading: profilesLoading } = useLumiaPassportLinkedProfiles();
|
|
9147
|
-
const [isAuthModalOpen, setIsAuthModalOpen] =
|
|
9148
|
-
const tssManagerRef =
|
|
9149
|
-
const [isWalletMenuOpen, setIsWalletMenuOpen] =
|
|
9150
|
-
const [copied, setCopied] =
|
|
9151
|
-
const [isManageWalletOpen, setIsManageWalletOpen] =
|
|
9152
|
-
const [isSecurityOpen, setIsSecurityOpen] =
|
|
9153
|
-
const [isBackupOpen, setIsBackupOpen] =
|
|
9154
|
-
const [isTransactionsOpen, setIsTransactionsOpen] =
|
|
9155
|
-
const [isViewAssetsOpen, setIsViewAssetsOpen] =
|
|
9156
|
-
const [isSendOpen, setIsSendOpen] =
|
|
9157
|
-
const [isReceiveOpen, setIsReceiveOpen] =
|
|
9158
|
-
const [isBuyOpen, setIsBuyOpen] =
|
|
9159
|
-
const [isKycOpen, setIsKycOpen] =
|
|
9160
|
-
|
|
9847
|
+
const [isAuthModalOpen, setIsAuthModalOpen] = React25.useState(false);
|
|
9848
|
+
const tssManagerRef = React25.useRef(null);
|
|
9849
|
+
const [isWalletMenuOpen, setIsWalletMenuOpen] = React25.useState(false);
|
|
9850
|
+
const [copied, setCopied] = React25.useState(false);
|
|
9851
|
+
const [isManageWalletOpen, setIsManageWalletOpen] = React25.useState(false);
|
|
9852
|
+
const [isSecurityOpen, setIsSecurityOpen] = React25.useState(false);
|
|
9853
|
+
const [isBackupOpen, setIsBackupOpen] = React25.useState(false);
|
|
9854
|
+
const [isTransactionsOpen, setIsTransactionsOpen] = React25.useState(false);
|
|
9855
|
+
const [isViewAssetsOpen, setIsViewAssetsOpen] = React25.useState(false);
|
|
9856
|
+
const [isSendOpen, setIsSendOpen] = React25.useState(false);
|
|
9857
|
+
const [isReceiveOpen, setIsReceiveOpen] = React25.useState(false);
|
|
9858
|
+
const [isBuyOpen, setIsBuyOpen] = React25.useState(false);
|
|
9859
|
+
const [isKycOpen, setIsKycOpen] = React25.useState(false);
|
|
9860
|
+
React25.useEffect(() => {
|
|
9161
9861
|
if (!callbacks?.onWalletReady) return;
|
|
9162
9862
|
if (!config.projectId) {
|
|
9163
9863
|
return;
|
|
@@ -9172,7 +9872,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9172
9872
|
}
|
|
9173
9873
|
})();
|
|
9174
9874
|
}, [callbacks?.onWalletReady, config.projectId]);
|
|
9175
|
-
|
|
9875
|
+
React25.useEffect(() => {
|
|
9176
9876
|
try {
|
|
9177
9877
|
const shouldAutoOpen = authOpen ?? config?.ui?.authOpen;
|
|
9178
9878
|
if (!address && !session && shouldAutoOpen) {
|
|
@@ -9199,25 +9899,25 @@ var init_ConnectWalletButton = __esm({
|
|
|
9199
9899
|
refetchOnWindowFocus: true
|
|
9200
9900
|
}
|
|
9201
9901
|
});
|
|
9202
|
-
const formatAddress =
|
|
9902
|
+
const formatAddress = React25.useCallback((addr) => {
|
|
9203
9903
|
if (!addr) return "";
|
|
9204
9904
|
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
9205
9905
|
}, []);
|
|
9206
|
-
const avatar =
|
|
9207
|
-
const displayName =
|
|
9208
|
-
const formatBalance =
|
|
9906
|
+
const avatar = React25.useMemo(() => jwtTokenManager2.getAvatar(), [isAuthModalOpen, status]);
|
|
9907
|
+
const displayName = React25.useMemo(() => jwtTokenManager2.getDisplayName(), [isAuthModalOpen, status]);
|
|
9908
|
+
const formatBalance = React25.useCallback(() => {
|
|
9209
9909
|
if (!balance || balanceLoading) return "0.0000";
|
|
9210
9910
|
return parseFloat(balance.formatted).toFixed(4);
|
|
9211
9911
|
}, [balance, balanceLoading]);
|
|
9212
|
-
const [hasServerVault, setHasServerVault] =
|
|
9213
|
-
const indicators =
|
|
9912
|
+
const [hasServerVault, setHasServerVault] = React25.useState(false);
|
|
9913
|
+
const indicators = React25.useMemo(() => {
|
|
9214
9914
|
const userId = jwtTokenManager2.getUserId();
|
|
9215
9915
|
if (!userId) return { server: false, local: false, backup: false };
|
|
9216
9916
|
const server = jwtTokenManager2.getHasKeyshare() ?? false;
|
|
9217
9917
|
const local = !!address;
|
|
9218
9918
|
return { server, local, backup: hasServerVault };
|
|
9219
9919
|
}, [session, address, hasServerVault]);
|
|
9220
|
-
const handleAuthModalSuccess =
|
|
9920
|
+
const handleAuthModalSuccess = React25.useCallback(async () => {
|
|
9221
9921
|
console.log("[ConnectWalletButton] handleAuthModalSuccess called");
|
|
9222
9922
|
const { getPendingLoginResponse: getPendingLoginResponse2, clearPendingLoginResponse: clearPendingLoginResponse2 } = await Promise.resolve().then(() => (init_AuthModal(), AuthModal_exports));
|
|
9223
9923
|
const loginResponse = getPendingLoginResponse2();
|
|
@@ -9238,9 +9938,13 @@ var init_ConnectWalletButton = __esm({
|
|
|
9238
9938
|
const { getIframeManager: getIframeManager2 } = await Promise.resolve().then(() => (init_iframe_manager(), iframe_manager_exports));
|
|
9239
9939
|
const iframeManager = getIframeManager2();
|
|
9240
9940
|
console.log("[ConnectWalletButton] Calling iframeManager.authenticate...");
|
|
9241
|
-
await iframeManager.authenticate(userId);
|
|
9941
|
+
await iframeManager.authenticate(userId, loginResponse.avatar, loginResponse.displayName);
|
|
9242
9942
|
console.log("[ConnectWalletButton] iframeManager.authenticate completed");
|
|
9243
|
-
|
|
9943
|
+
if (loginResponse.accessToken && loginResponse.refreshToken) {
|
|
9944
|
+
await jwtTokenManager2.setTokens(loginResponse);
|
|
9945
|
+
} else {
|
|
9946
|
+
console.warn("[ConnectWalletButton] Login response missing tokens; skipping jwtTokenManager.setTokens");
|
|
9947
|
+
}
|
|
9244
9948
|
clearPendingLoginResponse2();
|
|
9245
9949
|
const jwt = await Promise.resolve().then(() => (init_auth(), auth_exports)).then((m) => m.jwtTokenManager.getTokens());
|
|
9246
9950
|
const { session: sess, address: addr } = await createSessionWithKeyshare(userId, hasServerKeyshare, jwt?.isNewUser);
|
|
@@ -9286,7 +9990,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9286
9990
|
}
|
|
9287
9991
|
}
|
|
9288
9992
|
}, [onConnected, setAddress, setError, setSession, setStatus]);
|
|
9289
|
-
const handleDisconnect =
|
|
9993
|
+
const handleDisconnect = React25.useCallback(async () => {
|
|
9290
9994
|
const prevAddress = address;
|
|
9291
9995
|
let userId = null;
|
|
9292
9996
|
try {
|
|
@@ -9306,7 +10010,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9306
10010
|
} catch {
|
|
9307
10011
|
}
|
|
9308
10012
|
}, [setAddress, setError, setSession, setStatus]);
|
|
9309
|
-
const createSessionWithKeyshare =
|
|
10013
|
+
const createSessionWithKeyshare = React25.useCallback(async (userId, hasServerKeyshare, isNewUser) => {
|
|
9310
10014
|
try {
|
|
9311
10015
|
try {
|
|
9312
10016
|
callbacks?.onLumiaPassportConnecting?.({ method: "wallet" });
|
|
@@ -9332,7 +10036,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9332
10036
|
throw error2;
|
|
9333
10037
|
}
|
|
9334
10038
|
}, [usePaymaster, setStatus, callbacks]);
|
|
9335
|
-
|
|
10039
|
+
React25.useEffect(() => {
|
|
9336
10040
|
if (address) {
|
|
9337
10041
|
(async () => {
|
|
9338
10042
|
try {
|
|
@@ -9349,7 +10053,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9349
10053
|
setHasServerVault(false);
|
|
9350
10054
|
}
|
|
9351
10055
|
}, [address]);
|
|
9352
|
-
|
|
10056
|
+
React25.useEffect(() => {
|
|
9353
10057
|
const handleBackupStatusChanged = async (event) => {
|
|
9354
10058
|
const customEvent = event;
|
|
9355
10059
|
const { method, success } = customEvent.detail || {};
|
|
@@ -9370,8 +10074,8 @@ var init_ConnectWalletButton = __esm({
|
|
|
9370
10074
|
window.removeEventListener("lumia-passport-backup-status-changed", handleBackupStatusChanged);
|
|
9371
10075
|
};
|
|
9372
10076
|
}, []);
|
|
9373
|
-
const autoConnectAttemptedRef =
|
|
9374
|
-
|
|
10077
|
+
const autoConnectAttemptedRef = React25.useRef(false);
|
|
10078
|
+
React25.useEffect(() => {
|
|
9375
10079
|
if (autoConnectAttemptedRef.current) return;
|
|
9376
10080
|
const tryAutoConnect = async (attempt) => {
|
|
9377
10081
|
if (address || session) return;
|
|
@@ -9457,13 +10161,13 @@ var init_ConnectWalletButton = __esm({
|
|
|
9457
10161
|
autoConnectAttemptedRef.current = true;
|
|
9458
10162
|
tryAutoConnect(0);
|
|
9459
10163
|
}, []);
|
|
9460
|
-
|
|
10164
|
+
React25.useEffect(() => {
|
|
9461
10165
|
if (address && refetchBalance) {
|
|
9462
10166
|
refetchBalance();
|
|
9463
10167
|
}
|
|
9464
10168
|
}, [address]);
|
|
9465
|
-
return /* @__PURE__ */
|
|
9466
|
-
/* @__PURE__ */
|
|
10169
|
+
return /* @__PURE__ */ jsxs21("div", { className: [className, "lumia-scope"].filter(Boolean).join(" "), children: [
|
|
10170
|
+
/* @__PURE__ */ jsx29("div", { className: "inline-flex items-center gap-2", children: !address ? /* @__PURE__ */ jsx29("div", { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx29(
|
|
9467
10171
|
"button",
|
|
9468
10172
|
{
|
|
9469
10173
|
onClick: () => {
|
|
@@ -9498,7 +10202,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9498
10202
|
},
|
|
9499
10203
|
children: label || "Connect"
|
|
9500
10204
|
}
|
|
9501
|
-
) }) : /* @__PURE__ */
|
|
10205
|
+
) }) : /* @__PURE__ */ jsx29(
|
|
9502
10206
|
"div",
|
|
9503
10207
|
{
|
|
9504
10208
|
className: `relative rounded-2xl p-4 shadow-lg cursor-pointer transition-all duration-200 hover:scale-105 hover:shadow-xl max-w-sm min-w-[280px] backdrop-blur`,
|
|
@@ -9509,51 +10213,51 @@ var init_ConnectWalletButton = __esm({
|
|
|
9509
10213
|
borderColor: config.ui.colors?.[isDark ? "dark" : "light"]?.connectedButtonBorder || (isDark ? "#374151" : "#e5e7eb")
|
|
9510
10214
|
},
|
|
9511
10215
|
onClick: () => setIsWalletMenuOpen(true),
|
|
9512
|
-
children: /* @__PURE__ */
|
|
9513
|
-
/* @__PURE__ */
|
|
10216
|
+
children: /* @__PURE__ */ jsxs21("div", { className: "flex items-center space-x-3", children: [
|
|
10217
|
+
/* @__PURE__ */ jsx29("div", { className: "w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 overflow-hidden bg-gradient-to-br from-purple-500 to-blue-600", children: avatar ? (
|
|
9514
10218
|
// eslint-disable-next-line @next/next/no-img-element
|
|
9515
|
-
/* @__PURE__ */
|
|
9516
|
-
) : /* @__PURE__ */
|
|
9517
|
-
/* @__PURE__ */
|
|
9518
|
-
/* @__PURE__ */
|
|
9519
|
-
/* @__PURE__ */
|
|
10219
|
+
/* @__PURE__ */ jsx29("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
10220
|
+
) : /* @__PURE__ */ jsx29("span", { className: "text-white font-bold text-sm", children: "LP" }) }),
|
|
10221
|
+
/* @__PURE__ */ jsxs21("div", { className: "text-left flex-1 min-w-0", children: [
|
|
10222
|
+
/* @__PURE__ */ jsx29("div", { className: `font-semibold text-base truncate ${theme.titleText}`, children: mode === "compact" && displayName ? displayName : formatAddress(address) }),
|
|
10223
|
+
/* @__PURE__ */ jsxs21("div", { className: `text-sm ${theme.mutedText}`, children: [
|
|
9520
10224
|
formatBalance(),
|
|
9521
10225
|
" LUMIA"
|
|
9522
10226
|
] })
|
|
9523
10227
|
] }),
|
|
9524
|
-
/* @__PURE__ */
|
|
9525
|
-
/* @__PURE__ */
|
|
9526
|
-
/* @__PURE__ */
|
|
10228
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex items-center space-x-1", children: [
|
|
10229
|
+
/* @__PURE__ */ jsxs21("div", { className: "group relative", children: [
|
|
10230
|
+
/* @__PURE__ */ jsx29(
|
|
9527
10231
|
Cloud3,
|
|
9528
10232
|
{
|
|
9529
10233
|
className: `w-3 h-3 ${indicators.server ? "text-green-500" : "text-orange-400"}`
|
|
9530
10234
|
}
|
|
9531
10235
|
),
|
|
9532
|
-
/* @__PURE__ */
|
|
10236
|
+
/* @__PURE__ */ jsxs21("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
9533
10237
|
"Server Keyshare: ",
|
|
9534
10238
|
indicators.server ? "Available" : "Missing"
|
|
9535
10239
|
] })
|
|
9536
10240
|
] }),
|
|
9537
|
-
/* @__PURE__ */
|
|
9538
|
-
/* @__PURE__ */
|
|
10241
|
+
/* @__PURE__ */ jsxs21("div", { className: "group relative", children: [
|
|
10242
|
+
/* @__PURE__ */ jsx29(
|
|
9539
10243
|
Laptop2,
|
|
9540
10244
|
{
|
|
9541
10245
|
className: `w-3 h-3 ${indicators.local ? "text-green-500" : "text-orange-400"}`
|
|
9542
10246
|
}
|
|
9543
10247
|
),
|
|
9544
|
-
/* @__PURE__ */
|
|
10248
|
+
/* @__PURE__ */ jsxs21("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
9545
10249
|
"Local Keyshare: ",
|
|
9546
10250
|
indicators.local ? "Available" : "Missing"
|
|
9547
10251
|
] })
|
|
9548
10252
|
] }),
|
|
9549
|
-
/* @__PURE__ */
|
|
9550
|
-
/* @__PURE__ */
|
|
10253
|
+
/* @__PURE__ */ jsxs21("div", { className: "group relative", children: [
|
|
10254
|
+
/* @__PURE__ */ jsx29(
|
|
9551
10255
|
Shield4,
|
|
9552
10256
|
{
|
|
9553
10257
|
className: `w-3 h-3 ${indicators.backup ? "text-green-500" : "text-orange-400"}`
|
|
9554
10258
|
}
|
|
9555
10259
|
),
|
|
9556
|
-
/* @__PURE__ */
|
|
10260
|
+
/* @__PURE__ */ jsxs21("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50", children: [
|
|
9557
10261
|
"Vault Backup: ",
|
|
9558
10262
|
indicators.backup ? "Available" : "Not Found"
|
|
9559
10263
|
] })
|
|
@@ -9562,62 +10266,62 @@ var init_ConnectWalletButton = __esm({
|
|
|
9562
10266
|
] })
|
|
9563
10267
|
}
|
|
9564
10268
|
) }),
|
|
9565
|
-
isWalletMenuOpen && address && /* @__PURE__ */
|
|
9566
|
-
/* @__PURE__ */
|
|
9567
|
-
/* @__PURE__ */
|
|
9568
|
-
/* @__PURE__ */
|
|
9569
|
-
/* @__PURE__ */
|
|
10269
|
+
isWalletMenuOpen && address && /* @__PURE__ */ jsx29("div", { className: "fixed inset-0 z-[60]", children: /* @__PURE__ */ jsx29(Dialog, { open: isWalletMenuOpen, onOpenChange: setIsWalletMenuOpen, children: /* @__PURE__ */ jsxs21(DialogContent, { className: `lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? "lumia-dark" : "lumia-light"}`, children: [
|
|
10270
|
+
/* @__PURE__ */ jsx29(VisuallyHidden, { children: /* @__PURE__ */ jsx29(DialogTitle, { children: "Wallet Menu" }) }),
|
|
10271
|
+
/* @__PURE__ */ jsx29(DialogDescription, { className: "sr-only", children: "Smart Account wallet actions and status" }),
|
|
10272
|
+
/* @__PURE__ */ jsx29("div", { className: `p-4 border-b ${theme.divider}`, children: /* @__PURE__ */ jsx29("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsxs21("div", { className: "flex items-center space-x-4", children: [
|
|
10273
|
+
/* @__PURE__ */ jsx29("div", { className: "w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center relative overflow-hidden", children: avatar ? (
|
|
9570
10274
|
// eslint-disable-next-line @next/next/no-img-element
|
|
9571
|
-
/* @__PURE__ */
|
|
9572
|
-
) : /* @__PURE__ */
|
|
9573
|
-
/* @__PURE__ */
|
|
9574
|
-
/* @__PURE__ */
|
|
9575
|
-
/* @__PURE__ */
|
|
9576
|
-
/* @__PURE__ */
|
|
9577
|
-
/* @__PURE__ */
|
|
10275
|
+
/* @__PURE__ */ jsx29("img", { src: avatar, alt: "User avatar", className: "w-full h-full object-cover" })
|
|
10276
|
+
) : /* @__PURE__ */ jsx29("span", { className: "text-white font-bold text-lg", children: "L" }) }),
|
|
10277
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex-1 min-w-0", children: [
|
|
10278
|
+
/* @__PURE__ */ jsx29("div", { className: `font-medium text-left text-lg ${theme.titleText}`, children: displayName || "Smart Account" }),
|
|
10279
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex items-center space-x-2", children: [
|
|
10280
|
+
/* @__PURE__ */ jsx29("div", { className: `text-sm ${theme.mutedText}`, children: formatAddress(address) }),
|
|
10281
|
+
/* @__PURE__ */ jsx29("button", { onClick: async () => {
|
|
9578
10282
|
try {
|
|
9579
10283
|
await navigator.clipboard.writeText(address);
|
|
9580
10284
|
setCopied(true);
|
|
9581
10285
|
setTimeout(() => setCopied(false), 1500);
|
|
9582
10286
|
} catch {
|
|
9583
10287
|
}
|
|
9584
|
-
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */
|
|
10288
|
+
}, title: "Copy address", className: `${theme.iconColor} hover:${theme.titleText} p-1`, children: copied ? /* @__PURE__ */ jsx29("span", { className: "text-green-500 text-sm", children: "\u2713" }) : /* @__PURE__ */ jsx29(Copy3, { className: "w-4 h-4" }) })
|
|
9585
10289
|
] })
|
|
9586
10290
|
] })
|
|
9587
10291
|
] }) }) }),
|
|
9588
|
-
/* @__PURE__ */
|
|
9589
|
-
/* @__PURE__ */
|
|
9590
|
-
/* @__PURE__ */
|
|
10292
|
+
/* @__PURE__ */ jsxs21("div", { className: "p-4", children: [
|
|
10293
|
+
/* @__PURE__ */ jsxs21("div", { className: "grid grid-cols-3 gap-2 mb-4", children: [
|
|
10294
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9591
10295
|
setIsWalletMenuOpen(false);
|
|
9592
10296
|
setIsSendOpen(true);
|
|
9593
10297
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-blue-400" : "bg-blue-50 hover:bg-blue-100 text-blue-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
9594
|
-
/* @__PURE__ */
|
|
9595
|
-
/* @__PURE__ */
|
|
10298
|
+
/* @__PURE__ */ jsx29(ArrowUp, { className: "w-5 h-5" }),
|
|
10299
|
+
/* @__PURE__ */ jsx29("span", { className: "text-sm font-medium", children: "Send" })
|
|
9596
10300
|
] }),
|
|
9597
|
-
/* @__PURE__ */
|
|
10301
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9598
10302
|
setIsWalletMenuOpen(false);
|
|
9599
10303
|
setIsReceiveOpen(true);
|
|
9600
10304
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-green-400" : "bg-green-50 hover:bg-green-100 text-green-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
9601
|
-
/* @__PURE__ */
|
|
9602
|
-
/* @__PURE__ */
|
|
10305
|
+
/* @__PURE__ */ jsx29(ArrowDown, { className: "w-5 h-5" }),
|
|
10306
|
+
/* @__PURE__ */ jsx29("span", { className: "text-sm font-medium", children: "Receive" })
|
|
9603
10307
|
] }),
|
|
9604
|
-
/* @__PURE__ */
|
|
10308
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9605
10309
|
setIsWalletMenuOpen(false);
|
|
9606
10310
|
setIsBuyOpen(true);
|
|
9607
10311
|
}, className: `${isDark ? "bg-slate-900 hover:bg-slate-800 text-purple-400" : "bg-purple-50 hover:bg-purple-100 text-purple-600"} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`, children: [
|
|
9608
|
-
/* @__PURE__ */
|
|
9609
|
-
/* @__PURE__ */
|
|
10312
|
+
/* @__PURE__ */ jsx29(Plus, { className: "w-5 h-5" }),
|
|
10313
|
+
/* @__PURE__ */ jsx29("span", { className: "text-sm font-medium", children: "Buy" })
|
|
9610
10314
|
] })
|
|
9611
10315
|
] }),
|
|
9612
|
-
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */
|
|
9613
|
-
/* @__PURE__ */
|
|
9614
|
-
/* @__PURE__ */
|
|
10316
|
+
config.warnings?.backupWarning && !hasServerVault && /* @__PURE__ */ jsx29("div", { className: `mb-4 p-4 rounded-xl animate-glow-warning ${isDark ? "bg-red-950/90 border-2 border-red-800/80" : "bg-red-50 border-2 border-red-300"}`, children: /* @__PURE__ */ jsx29("div", { className: "flex items-start space-x-3 text-center", children: /* @__PURE__ */ jsxs21("div", { className: "flex-1 min-w-0", children: [
|
|
10317
|
+
/* @__PURE__ */ jsx29("div", { className: `text-sm font-bold ${isDark ? "text-red-200" : "text-red-800"}`, children: "BACKUP NOT CREATED" }),
|
|
10318
|
+
/* @__PURE__ */ jsxs21("div", { className: `text-xs mt-1.5 font-medium ${isDark ? "text-red-300/95" : "text-red-700"}`, children: [
|
|
9615
10319
|
"Your wallet will be ",
|
|
9616
|
-
/* @__PURE__ */
|
|
10320
|
+
/* @__PURE__ */ jsx29("strong", { children: "PERMANENTLY LOST" }),
|
|
9617
10321
|
" if browser data is cleared."
|
|
9618
10322
|
] }),
|
|
9619
|
-
/* @__PURE__ */
|
|
9620
|
-
/* @__PURE__ */
|
|
10323
|
+
/* @__PURE__ */ jsx29("div", { className: `text-[11px] mt-1 ${isDark ? "text-red-400/80" : "text-red-600/90"}`, children: "\u26A0\uFE0F Lumia cannot recover your wallet without a backup!" }),
|
|
10324
|
+
/* @__PURE__ */ jsxs21(
|
|
9621
10325
|
"button",
|
|
9622
10326
|
{
|
|
9623
10327
|
onClick: () => {
|
|
@@ -9626,7 +10330,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9626
10330
|
},
|
|
9627
10331
|
className: `mt-3 px-4 py-2 text-xs font-bold rounded-lg transition-all hover:scale-105 ${isDark ? "bg-red-700/80 hover:bg-red-600/90 text-white shadow-lg" : "bg-red-600 hover:bg-red-700 text-white shadow-lg"}`,
|
|
9628
10332
|
children: [
|
|
9629
|
-
/* @__PURE__ */
|
|
10333
|
+
/* @__PURE__ */ jsx29(ShieldCheck2, { className: "w-3.5 h-3.5 inline mr-1.5" }),
|
|
9630
10334
|
"Create Backup Now"
|
|
9631
10335
|
]
|
|
9632
10336
|
}
|
|
@@ -9635,12 +10339,12 @@ var init_ConnectWalletButton = __esm({
|
|
|
9635
10339
|
(() => {
|
|
9636
10340
|
const providers = jwtTokenManager2.getProviders();
|
|
9637
10341
|
const hasEmail = providers.includes("email");
|
|
9638
|
-
return config.warnings?.emailNotConnectedWarning && !hasEmail && /* @__PURE__ */
|
|
9639
|
-
/* @__PURE__ */
|
|
9640
|
-
/* @__PURE__ */
|
|
9641
|
-
/* @__PURE__ */
|
|
9642
|
-
/* @__PURE__ */
|
|
9643
|
-
/* @__PURE__ */
|
|
10342
|
+
return config.warnings?.emailNotConnectedWarning && !hasEmail && /* @__PURE__ */ jsx29("div", { className: `mb-4 p-3 rounded-xl ${isDark ? "bg-blue-900/20 border border-blue-900/40" : "bg-blue-50 border border-blue-200"}`, children: /* @__PURE__ */ jsxs21("div", { className: "flex items-start space-x-3", children: [
|
|
10343
|
+
/* @__PURE__ */ jsx29(AlertTriangle5, { className: `w-5 h-5 ${isDark ? "text-blue-400" : "text-blue-500"} mt-0.5 flex-shrink-0` }),
|
|
10344
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex-1 min-w-0", children: [
|
|
10345
|
+
/* @__PURE__ */ jsx29("div", { className: `text-sm font-medium ${isDark ? "text-blue-300" : "text-blue-700"}`, children: "Email Not Connected" }),
|
|
10346
|
+
/* @__PURE__ */ jsx29("div", { className: `text-xs mt-1 ${isDark ? "text-blue-400/80" : "text-blue-600"}`, children: "Connect your email for easier account recovery and additional security." }),
|
|
10347
|
+
/* @__PURE__ */ jsxs21(
|
|
9644
10348
|
"button",
|
|
9645
10349
|
{
|
|
9646
10350
|
onClick: () => {
|
|
@@ -9649,7 +10353,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9649
10353
|
},
|
|
9650
10354
|
className: `mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${isDark ? "bg-blue-900/40 hover:bg-blue-900/60 text-blue-300" : "bg-blue-100 hover:bg-blue-200 text-blue-700"}`,
|
|
9651
10355
|
children: [
|
|
9652
|
-
/* @__PURE__ */
|
|
10356
|
+
/* @__PURE__ */ jsx29(ShieldCheck2, { className: "w-3 h-3 inline mr-1" }),
|
|
9653
10357
|
"Connect Email"
|
|
9654
10358
|
]
|
|
9655
10359
|
}
|
|
@@ -9657,84 +10361,84 @@ var init_ConnectWalletButton = __esm({
|
|
|
9657
10361
|
] })
|
|
9658
10362
|
] }) });
|
|
9659
10363
|
})(),
|
|
9660
|
-
/* @__PURE__ */
|
|
10364
|
+
/* @__PURE__ */ jsx29(
|
|
9661
10365
|
"button",
|
|
9662
10366
|
{
|
|
9663
10367
|
onClick: () => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, "_blank"),
|
|
9664
10368
|
className: `w-full ${isDark ? "bg-gray-800 hover:bg-gray-700" : "bg-gray-50 hover:bg-gray-100"} rounded-xl p-3 mb-3 transition-colors cursor-pointer text-left`,
|
|
9665
|
-
children: /* @__PURE__ */
|
|
9666
|
-
/* @__PURE__ */
|
|
9667
|
-
/* @__PURE__ */
|
|
9668
|
-
/* @__PURE__ */
|
|
9669
|
-
/* @__PURE__ */
|
|
9670
|
-
/* @__PURE__ */
|
|
10369
|
+
children: /* @__PURE__ */ jsxs21("div", { className: "flex items-center justify-between", children: [
|
|
10370
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex items-center space-x-3", children: [
|
|
10371
|
+
/* @__PURE__ */ jsx29("div", { className: "w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden", children: lumiaBeam.logoDataUri ? /* @__PURE__ */ jsx29("img", { src: lumiaBeam.logoDataUri, alt: "Chain logo", className: "w-full h-full object-cover" }) : lumiaBeam.logo === "lumia" ? /* @__PURE__ */ jsx29(LumiaLogo, { size: 32 }) : /* @__PURE__ */ jsx29("span", { className: "text-white text-xs font-bold", children: (lumiaBeam.name || "L").charAt(0) }) }),
|
|
10372
|
+
/* @__PURE__ */ jsxs21("div", { children: [
|
|
10373
|
+
/* @__PURE__ */ jsx29("div", { className: `${theme.titleText} font-medium`, children: lumiaBeam.name }),
|
|
10374
|
+
/* @__PURE__ */ jsxs21("div", { className: theme.mutedText + " text-sm", children: [
|
|
9671
10375
|
formatBalance(),
|
|
9672
10376
|
" LUMIA"
|
|
9673
10377
|
] })
|
|
9674
10378
|
] })
|
|
9675
10379
|
] }),
|
|
9676
|
-
/* @__PURE__ */
|
|
10380
|
+
/* @__PURE__ */ jsx29("div", { className: theme.iconColor, children: /* @__PURE__ */ jsx29(ArrowUpRight2, { className: "w-4 h-4" }) })
|
|
9677
10381
|
] })
|
|
9678
10382
|
}
|
|
9679
10383
|
),
|
|
9680
|
-
/* @__PURE__ */
|
|
9681
|
-
config.features?.kycNeeded && /* @__PURE__ */
|
|
10384
|
+
/* @__PURE__ */ jsxs21("div", { className: "space-y-1", children: [
|
|
10385
|
+
config.features?.kycNeeded && /* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9682
10386
|
setIsWalletMenuOpen(false);
|
|
9683
10387
|
setIsKycOpen(true);
|
|
9684
10388
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "bg-transparent hover:bg-gray-800" : "bg-transparent hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9685
|
-
/* @__PURE__ */
|
|
9686
|
-
/* @__PURE__ */
|
|
10389
|
+
/* @__PURE__ */ jsx29(ShieldCheck2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
10390
|
+
/* @__PURE__ */ jsx29("span", { className: theme.titleText, children: "KYC" })
|
|
9687
10391
|
] }),
|
|
9688
|
-
/* @__PURE__ */
|
|
10392
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9689
10393
|
setIsWalletMenuOpen(false);
|
|
9690
10394
|
setIsTransactionsOpen(true);
|
|
9691
10395
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "bg-transparent hover:bg-gray-800" : "bg-transparent hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9692
|
-
/* @__PURE__ */
|
|
9693
|
-
/* @__PURE__ */
|
|
10396
|
+
/* @__PURE__ */ jsx29(Activity2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
10397
|
+
/* @__PURE__ */ jsx29("span", { className: theme.titleText, children: "Transactions" })
|
|
9694
10398
|
] }),
|
|
9695
|
-
/* @__PURE__ */
|
|
10399
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9696
10400
|
setIsWalletMenuOpen(false);
|
|
9697
10401
|
setIsViewAssetsOpen(true);
|
|
9698
10402
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "bg-transparent hover:bg-gray-800" : "bg-transparent hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9699
|
-
/* @__PURE__ */
|
|
9700
|
-
/* @__PURE__ */
|
|
10403
|
+
/* @__PURE__ */ jsx29(Gem2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
10404
|
+
/* @__PURE__ */ jsx29("span", { className: theme.titleText, children: "View Assets" })
|
|
9701
10405
|
] }),
|
|
9702
|
-
/* @__PURE__ */
|
|
10406
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9703
10407
|
setIsWalletMenuOpen(false);
|
|
9704
10408
|
setIsManageWalletOpen(true);
|
|
9705
10409
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "bg-transparent hover:bg-gray-800" : "bg-transparent hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9706
|
-
/* @__PURE__ */
|
|
9707
|
-
/* @__PURE__ */
|
|
10410
|
+
/* @__PURE__ */ jsx29(CreditCard2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
10411
|
+
/* @__PURE__ */ jsx29("span", { className: theme.titleText, children: "Manage Wallet" })
|
|
9708
10412
|
] }),
|
|
9709
|
-
/* @__PURE__ */
|
|
10413
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9710
10414
|
setIsWalletMenuOpen(false);
|
|
9711
10415
|
setIsSecurityOpen(true);
|
|
9712
10416
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "bg-transparent hover:bg-gray-800" : "bg-transparent hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9713
|
-
/* @__PURE__ */
|
|
9714
|
-
/* @__PURE__ */
|
|
10417
|
+
/* @__PURE__ */ jsx29(Lock2, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
10418
|
+
/* @__PURE__ */ jsx29("span", { className: theme.titleText, children: "Security" })
|
|
9715
10419
|
] }),
|
|
9716
|
-
/* @__PURE__ */
|
|
10420
|
+
/* @__PURE__ */ jsxs21("button", { onClick: () => {
|
|
9717
10421
|
setIsWalletMenuOpen(false);
|
|
9718
10422
|
setIsBackupOpen(true);
|
|
9719
10423
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "bg-transparent hover:bg-gray-800" : "bg-transparent hover:bg-gray-100"} transition-colors flex items-center space-x-3`, children: [
|
|
9720
|
-
/* @__PURE__ */
|
|
9721
|
-
/* @__PURE__ */
|
|
10424
|
+
/* @__PURE__ */ jsx29(Shield4, { className: `w-5 h-5 ${theme.iconColor}` }),
|
|
10425
|
+
/* @__PURE__ */ jsx29("span", { className: theme.titleText, children: "Keyshare Backup" })
|
|
9722
10426
|
] }),
|
|
9723
|
-
/* @__PURE__ */
|
|
10427
|
+
/* @__PURE__ */ jsxs21("button", { onClick: async () => {
|
|
9724
10428
|
await handleDisconnect();
|
|
9725
10429
|
setIsWalletMenuOpen(false);
|
|
9726
10430
|
}, className: `w-full text-left p-2.5 rounded-xl ${isDark ? "bg-transparent hover:bg-red-900/20" : "bg-transparent hover:bg-red-50"} transition-colors flex items-center space-x-3`, children: [
|
|
9727
|
-
/* @__PURE__ */
|
|
9728
|
-
/* @__PURE__ */
|
|
10431
|
+
/* @__PURE__ */ jsx29(ArrowUpRight2, { className: "w-5 h-5 text-red-600" }),
|
|
10432
|
+
/* @__PURE__ */ jsx29("span", { className: "text-red-600", children: "Disconnect Wallet" })
|
|
9729
10433
|
] })
|
|
9730
10434
|
] }),
|
|
9731
|
-
/* @__PURE__ */
|
|
10435
|
+
/* @__PURE__ */ jsx29("div", { className: `mt-3 pt-3 border-t ${theme.divider} text-center`, children: /* @__PURE__ */ jsxs21("div", { className: `text-xs ${theme.mutedText}`, children: [
|
|
9732
10436
|
"Lumia Passport v",
|
|
9733
10437
|
package_default.version
|
|
9734
10438
|
] }) })
|
|
9735
10439
|
] })
|
|
9736
10440
|
] }) }) }),
|
|
9737
|
-
/* @__PURE__ */
|
|
10441
|
+
/* @__PURE__ */ jsx29(
|
|
9738
10442
|
ManageWallet,
|
|
9739
10443
|
{
|
|
9740
10444
|
open: isManageWalletOpen,
|
|
@@ -9745,7 +10449,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9745
10449
|
}
|
|
9746
10450
|
}
|
|
9747
10451
|
),
|
|
9748
|
-
/* @__PURE__ */
|
|
10452
|
+
/* @__PURE__ */ jsx29(
|
|
9749
10453
|
SecurityModal,
|
|
9750
10454
|
{
|
|
9751
10455
|
open: isSecurityOpen,
|
|
@@ -9756,12 +10460,12 @@ var init_ConnectWalletButton = __esm({
|
|
|
9756
10460
|
}
|
|
9757
10461
|
}
|
|
9758
10462
|
),
|
|
9759
|
-
isBackupOpen && session?.mpcUserId && /* @__PURE__ */
|
|
9760
|
-
/* @__PURE__ */
|
|
9761
|
-
/* @__PURE__ */
|
|
9762
|
-
/* @__PURE__ */
|
|
10463
|
+
isBackupOpen && session?.mpcUserId && /* @__PURE__ */ jsx29(Dialog, { open: isBackupOpen, onOpenChange: setIsBackupOpen, children: /* @__PURE__ */ jsxs21(DialogContent, { className: "max-w-[400px] p-0", children: [
|
|
10464
|
+
/* @__PURE__ */ jsxs21(VisuallyHidden, { children: [
|
|
10465
|
+
/* @__PURE__ */ jsx29(DialogTitle, { children: "Keyshare Backup" }),
|
|
10466
|
+
/* @__PURE__ */ jsx29(DialogDescription, { children: "Create and manage encrypted backups of your keyshare" })
|
|
9763
10467
|
] }),
|
|
9764
|
-
/* @__PURE__ */
|
|
10468
|
+
/* @__PURE__ */ jsx29(
|
|
9765
10469
|
KeyshareBackup,
|
|
9766
10470
|
{
|
|
9767
10471
|
userId: session.mpcUserId,
|
|
@@ -9775,7 +10479,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9775
10479
|
}
|
|
9776
10480
|
)
|
|
9777
10481
|
] }) }),
|
|
9778
|
-
/* @__PURE__ */
|
|
10482
|
+
/* @__PURE__ */ jsx29(
|
|
9779
10483
|
TransactionsModal,
|
|
9780
10484
|
{
|
|
9781
10485
|
open: isTransactionsOpen,
|
|
@@ -9786,7 +10490,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9786
10490
|
}
|
|
9787
10491
|
}
|
|
9788
10492
|
),
|
|
9789
|
-
/* @__PURE__ */
|
|
10493
|
+
/* @__PURE__ */ jsx29(
|
|
9790
10494
|
ViewAssetsModal,
|
|
9791
10495
|
{
|
|
9792
10496
|
open: isViewAssetsOpen,
|
|
@@ -9797,7 +10501,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9797
10501
|
}
|
|
9798
10502
|
}
|
|
9799
10503
|
),
|
|
9800
|
-
/* @__PURE__ */
|
|
10504
|
+
/* @__PURE__ */ jsx29(
|
|
9801
10505
|
SendModal,
|
|
9802
10506
|
{
|
|
9803
10507
|
open: isSendOpen,
|
|
@@ -9805,10 +10509,15 @@ var init_ConnectWalletButton = __esm({
|
|
|
9805
10509
|
onBack: () => {
|
|
9806
10510
|
setIsSendOpen(false);
|
|
9807
10511
|
setIsWalletMenuOpen(true);
|
|
10512
|
+
},
|
|
10513
|
+
onSuccess: () => {
|
|
10514
|
+
console.log("[ConnectWalletButton] SendModal onSuccess - opening Transaction History");
|
|
10515
|
+
setIsTransactionsOpen(true);
|
|
10516
|
+
console.log("[ConnectWalletButton] isTransactionsOpen set to true");
|
|
9808
10517
|
}
|
|
9809
10518
|
}
|
|
9810
10519
|
),
|
|
9811
|
-
/* @__PURE__ */
|
|
10520
|
+
/* @__PURE__ */ jsx29(
|
|
9812
10521
|
ReceiveModal,
|
|
9813
10522
|
{
|
|
9814
10523
|
open: isReceiveOpen,
|
|
@@ -9819,7 +10528,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9819
10528
|
}
|
|
9820
10529
|
}
|
|
9821
10530
|
),
|
|
9822
|
-
/* @__PURE__ */
|
|
10531
|
+
/* @__PURE__ */ jsx29(
|
|
9823
10532
|
BuyModal,
|
|
9824
10533
|
{
|
|
9825
10534
|
open: isBuyOpen,
|
|
@@ -9830,7 +10539,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9830
10539
|
}
|
|
9831
10540
|
}
|
|
9832
10541
|
),
|
|
9833
|
-
/* @__PURE__ */
|
|
10542
|
+
/* @__PURE__ */ jsx29(
|
|
9834
10543
|
KycModal,
|
|
9835
10544
|
{
|
|
9836
10545
|
open: isKycOpen,
|
|
@@ -9841,7 +10550,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9841
10550
|
}
|
|
9842
10551
|
}
|
|
9843
10552
|
),
|
|
9844
|
-
/* @__PURE__ */
|
|
10553
|
+
/* @__PURE__ */ jsx29(
|
|
9845
10554
|
AuthModal,
|
|
9846
10555
|
{
|
|
9847
10556
|
open: recoveryUserId ? isRecoveryModalOpen : isAuthModalOpen,
|
|
@@ -9905,7 +10614,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9905
10614
|
}
|
|
9906
10615
|
}
|
|
9907
10616
|
),
|
|
9908
|
-
/* @__PURE__ */
|
|
10617
|
+
/* @__PURE__ */ jsx29(
|
|
9909
10618
|
TssManagerWithRef,
|
|
9910
10619
|
{
|
|
9911
10620
|
ref: tssManagerRef,
|
|
@@ -9925,7 +10634,7 @@ var init_ConnectWalletButton = __esm({
|
|
|
9925
10634
|
});
|
|
9926
10635
|
|
|
9927
10636
|
// src/components/ThemeToggle.tsx
|
|
9928
|
-
import { jsx as
|
|
10637
|
+
import { jsx as jsx30, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
9929
10638
|
var ThemeToggle;
|
|
9930
10639
|
var init_ThemeToggle = __esm({
|
|
9931
10640
|
"src/components/ThemeToggle.tsx"() {
|
|
@@ -9974,7 +10683,7 @@ var init_ThemeToggle = __esm({
|
|
|
9974
10683
|
return "auto";
|
|
9975
10684
|
}
|
|
9976
10685
|
};
|
|
9977
|
-
return /* @__PURE__ */
|
|
10686
|
+
return /* @__PURE__ */ jsx30("div", { className: "lumia-scope", children: /* @__PURE__ */ jsxs22(
|
|
9978
10687
|
"button",
|
|
9979
10688
|
{
|
|
9980
10689
|
onClick: cycleTheme,
|
|
@@ -9992,22 +10701,22 @@ var init_ThemeToggle = __esm({
|
|
|
9992
10701
|
});
|
|
9993
10702
|
|
|
9994
10703
|
// src/components/LumiaLogo.tsx
|
|
9995
|
-
import { jsx as
|
|
10704
|
+
import { jsx as jsx31, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
9996
10705
|
var LumiaLogo2;
|
|
9997
10706
|
var init_LumiaLogo2 = __esm({
|
|
9998
10707
|
"src/components/LumiaLogo.tsx"() {
|
|
9999
10708
|
LumiaLogo2 = ({ size = 80, className = "" }) => {
|
|
10000
|
-
return /* @__PURE__ */
|
|
10709
|
+
return /* @__PURE__ */ jsx31(
|
|
10001
10710
|
"div",
|
|
10002
10711
|
{
|
|
10003
10712
|
className: `flex items-center justify-center ${className}`,
|
|
10004
10713
|
style: { width: size, height: size },
|
|
10005
|
-
children: /* @__PURE__ */
|
|
10006
|
-
/* @__PURE__ */
|
|
10007
|
-
/* @__PURE__ */
|
|
10008
|
-
/* @__PURE__ */
|
|
10009
|
-
/* @__PURE__ */
|
|
10010
|
-
/* @__PURE__ */
|
|
10714
|
+
children: /* @__PURE__ */ jsxs23("svg", { viewBox: "0 0 512 512", width: size, height: size, children: [
|
|
10715
|
+
/* @__PURE__ */ jsx31("circle", { cx: "256", cy: "256", r: "256", fill: "#060117", strokeWidth: "0" }),
|
|
10716
|
+
/* @__PURE__ */ jsx31("path", { d: "M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
10717
|
+
/* @__PURE__ */ jsx31("path", { d: "M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
10718
|
+
/* @__PURE__ */ jsx31("path", { d: "M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z", fill: "#fefdff", strokeWidth: "0" }),
|
|
10719
|
+
/* @__PURE__ */ jsx31("path", { d: "M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z", fill: "#fefdff", strokeWidth: "0" })
|
|
10011
10720
|
] })
|
|
10012
10721
|
}
|
|
10013
10722
|
);
|
|
@@ -10016,10 +10725,10 @@ var init_LumiaLogo2 = __esm({
|
|
|
10016
10725
|
});
|
|
10017
10726
|
|
|
10018
10727
|
// src/hooks/useTheme.ts
|
|
10019
|
-
import { useMemo as useMemo5, useState as
|
|
10728
|
+
import { useMemo as useMemo5, useState as useState13, useEffect as useEffect11 } from "react";
|
|
10020
10729
|
function useTheme2(configTheme) {
|
|
10021
|
-
const [systemTheme, setSystemTheme] =
|
|
10022
|
-
|
|
10730
|
+
const [systemTheme, setSystemTheme] = useState13("light");
|
|
10731
|
+
useEffect11(() => {
|
|
10023
10732
|
if (typeof window === "undefined" || !window.matchMedia) return;
|
|
10024
10733
|
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
10025
10734
|
const updateSystemTheme = () => {
|
|
@@ -10075,9 +10784,401 @@ var init_useTheme2 = __esm({
|
|
|
10075
10784
|
}
|
|
10076
10785
|
});
|
|
10077
10786
|
|
|
10787
|
+
// src/internal/utils/cn.ts
|
|
10788
|
+
import { clsx as clsx2 } from "clsx";
|
|
10789
|
+
import { twMerge as twMerge2 } from "tailwind-merge";
|
|
10790
|
+
function cn2(...inputs) {
|
|
10791
|
+
return twMerge2(clsx2(inputs));
|
|
10792
|
+
}
|
|
10793
|
+
var init_cn = __esm({
|
|
10794
|
+
"src/internal/utils/cn.ts"() {
|
|
10795
|
+
}
|
|
10796
|
+
});
|
|
10797
|
+
|
|
10798
|
+
// src/internal/components/ui/badge.tsx
|
|
10799
|
+
import { cva as cva2 } from "class-variance-authority";
|
|
10800
|
+
import { jsx as jsx32 } from "react/jsx-runtime";
|
|
10801
|
+
function Badge({ className, variant, ...props }) {
|
|
10802
|
+
return /* @__PURE__ */ jsx32("div", { className: cn2(badgeVariants({ variant }), className), ...props });
|
|
10803
|
+
}
|
|
10804
|
+
var badgeVariants;
|
|
10805
|
+
var init_badge = __esm({
|
|
10806
|
+
"src/internal/components/ui/badge.tsx"() {
|
|
10807
|
+
init_cn();
|
|
10808
|
+
badgeVariants = cva2(
|
|
10809
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
10810
|
+
{
|
|
10811
|
+
variants: {
|
|
10812
|
+
variant: {
|
|
10813
|
+
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
10814
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
10815
|
+
destructive: "border-transparent bg-red-600 text-white hover:bg-red-700 dark:bg-red-700 dark:hover:bg-red-600",
|
|
10816
|
+
outline: "text-foreground",
|
|
10817
|
+
success: "border-transparent bg-green-600 text-white hover:bg-green-700 dark:bg-green-700 dark:hover:bg-green-600",
|
|
10818
|
+
warning: "border-transparent bg-yellow-500 text-white hover:bg-yellow-600 dark:bg-yellow-600 dark:hover:bg-yellow-500"
|
|
10819
|
+
}
|
|
10820
|
+
},
|
|
10821
|
+
defaultVariants: {
|
|
10822
|
+
variant: "default"
|
|
10823
|
+
}
|
|
10824
|
+
}
|
|
10825
|
+
);
|
|
10826
|
+
}
|
|
10827
|
+
});
|
|
10828
|
+
|
|
10829
|
+
// src/internal/components/Address.tsx
|
|
10830
|
+
import * as React26 from "react";
|
|
10831
|
+
import { Copy as Copy4, ExternalLink as ExternalLink2 } from "lucide-react";
|
|
10832
|
+
import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
10833
|
+
function toExplorerAddressUrl(address, chain) {
|
|
10834
|
+
const base2 = chain?.blockExplorers?.default?.url;
|
|
10835
|
+
if (!base2) return null;
|
|
10836
|
+
return `${base2.replace(/\/$/, "")}/address/${address}`;
|
|
10837
|
+
}
|
|
10838
|
+
function short(addr) {
|
|
10839
|
+
if (addr.length <= 14) return addr;
|
|
10840
|
+
return `${addr.slice(0, 10)}...${addr.slice(-8)}`;
|
|
10841
|
+
}
|
|
10842
|
+
var Address;
|
|
10843
|
+
var init_Address = __esm({
|
|
10844
|
+
"src/internal/components/Address.tsx"() {
|
|
10845
|
+
init_button();
|
|
10846
|
+
init_cn();
|
|
10847
|
+
Address = ({
|
|
10848
|
+
address,
|
|
10849
|
+
chain,
|
|
10850
|
+
className,
|
|
10851
|
+
truncate = true,
|
|
10852
|
+
showCopy = true,
|
|
10853
|
+
showExplorer = true,
|
|
10854
|
+
label
|
|
10855
|
+
}) => {
|
|
10856
|
+
const addr = address || "";
|
|
10857
|
+
const explorer = toExplorerAddressUrl(addr, chain || void 0);
|
|
10858
|
+
const [copied, setCopied] = React26.useState(false);
|
|
10859
|
+
if (!addr) return /* @__PURE__ */ jsx33("span", { className: cn2("text-muted-foreground", className), children: "\u2014" });
|
|
10860
|
+
return /* @__PURE__ */ jsxs24("div", { className: cn2("flex items-center gap-2", className), style: { listStyle: "none" }, children: [
|
|
10861
|
+
label && /* @__PURE__ */ jsx33("span", { className: "text-sm font-medium", children: label }),
|
|
10862
|
+
/* @__PURE__ */ jsx33("code", { className: "text-xs bg-background px-2 py-1 rounded select-all", children: truncate ? short(addr) : addr }),
|
|
10863
|
+
showCopy && /* @__PURE__ */ jsx33(
|
|
10864
|
+
Button,
|
|
10865
|
+
{
|
|
10866
|
+
variant: "ghost",
|
|
10867
|
+
size: "sm",
|
|
10868
|
+
title: copied ? "Copied" : "Copy address",
|
|
10869
|
+
onClick: async () => {
|
|
10870
|
+
try {
|
|
10871
|
+
await navigator.clipboard.writeText(addr);
|
|
10872
|
+
setCopied(true);
|
|
10873
|
+
setTimeout(() => setCopied(false), 1200);
|
|
10874
|
+
} catch {
|
|
10875
|
+
}
|
|
10876
|
+
},
|
|
10877
|
+
children: /* @__PURE__ */ jsx33(Copy4, { className: "h-4 w-4" })
|
|
10878
|
+
}
|
|
10879
|
+
),
|
|
10880
|
+
showExplorer && explorer && /* @__PURE__ */ jsx33(
|
|
10881
|
+
"a",
|
|
10882
|
+
{
|
|
10883
|
+
href: explorer,
|
|
10884
|
+
target: "_blank",
|
|
10885
|
+
rel: "noreferrer noopener",
|
|
10886
|
+
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
10887
|
+
title: "Open in explorer",
|
|
10888
|
+
children: /* @__PURE__ */ jsx33(ExternalLink2, { className: "h-4 w-4" })
|
|
10889
|
+
}
|
|
10890
|
+
)
|
|
10891
|
+
] });
|
|
10892
|
+
};
|
|
10893
|
+
}
|
|
10894
|
+
});
|
|
10895
|
+
|
|
10896
|
+
// src/internal/components/UserOpStatus.tsx
|
|
10897
|
+
import * as React27 from "react";
|
|
10898
|
+
import { AlertCircle as AlertCircle4, CheckCircle2 as CheckCircle27, Clock as Clock2, Copy as Copy5, ExternalLink as ExternalLink3, RefreshCw as RefreshCw5 } from "lucide-react";
|
|
10899
|
+
import { jsx as jsx34, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
10900
|
+
var UserOpStatus;
|
|
10901
|
+
var init_UserOpStatus = __esm({
|
|
10902
|
+
"src/internal/components/UserOpStatus.tsx"() {
|
|
10903
|
+
init_button();
|
|
10904
|
+
init_badge();
|
|
10905
|
+
init_Address();
|
|
10906
|
+
init_cn();
|
|
10907
|
+
init_base();
|
|
10908
|
+
UserOpStatus = ({
|
|
10909
|
+
userOpHash,
|
|
10910
|
+
chain,
|
|
10911
|
+
className,
|
|
10912
|
+
pollMs = 1e3,
|
|
10913
|
+
maxPollTimeMs = 6e4,
|
|
10914
|
+
// Default 1 minute
|
|
10915
|
+
externalState
|
|
10916
|
+
}) => {
|
|
10917
|
+
const useExternalState = !!externalState;
|
|
10918
|
+
const [internalReceipt, setInternalReceipt] = React27.useState(null);
|
|
10919
|
+
const [internalMempool, setInternalMempool] = React27.useState(null);
|
|
10920
|
+
const [internalError, setInternalError] = React27.useState(null);
|
|
10921
|
+
const [attempt, setAttempt] = React27.useState(0);
|
|
10922
|
+
const [internalRefreshing, setInternalRefreshing] = React27.useState(false);
|
|
10923
|
+
const [timedOut, setTimedOut] = React27.useState(false);
|
|
10924
|
+
const [rejected, setRejected] = React27.useState(false);
|
|
10925
|
+
const intervalRef = React27.useRef(null);
|
|
10926
|
+
const startTimeRef = React27.useRef(Date.now());
|
|
10927
|
+
const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;
|
|
10928
|
+
const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;
|
|
10929
|
+
const error = useExternalState ? externalState.error ?? null : internalError;
|
|
10930
|
+
const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;
|
|
10931
|
+
const rpc = React27.useCallback(async (method, params) => {
|
|
10932
|
+
const body = { jsonrpc: "2.0", id: 1, method, params };
|
|
10933
|
+
const res = await fetch(getBundlerUrl(), {
|
|
10934
|
+
method: "POST",
|
|
10935
|
+
headers: { "content-type": "application/json" },
|
|
10936
|
+
body: JSON.stringify(body)
|
|
10937
|
+
});
|
|
10938
|
+
const json = await res.json();
|
|
10939
|
+
if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));
|
|
10940
|
+
return json.result;
|
|
10941
|
+
}, []);
|
|
10942
|
+
const extractMempoolInfo = React27.useCallback((m) => {
|
|
10943
|
+
if (!m) return null;
|
|
10944
|
+
const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;
|
|
10945
|
+
const sender = m.sender || m?.userOperation?.sender || null;
|
|
10946
|
+
if (!entryPoint && !sender) return null;
|
|
10947
|
+
return { entryPoint, sender };
|
|
10948
|
+
}, []);
|
|
10949
|
+
const tick = React27.useCallback(async () => {
|
|
10950
|
+
if (useExternalState) return;
|
|
10951
|
+
const elapsed = Date.now() - startTimeRef.current;
|
|
10952
|
+
if (elapsed > maxPollTimeMs) {
|
|
10953
|
+
setTimedOut(true);
|
|
10954
|
+
setInternalMempool(null);
|
|
10955
|
+
if (intervalRef.current) {
|
|
10956
|
+
clearInterval(intervalRef.current);
|
|
10957
|
+
intervalRef.current = null;
|
|
10958
|
+
}
|
|
10959
|
+
return;
|
|
10960
|
+
}
|
|
10961
|
+
try {
|
|
10962
|
+
setInternalRefreshing(true);
|
|
10963
|
+
setInternalError(null);
|
|
10964
|
+
const r = await rpc("eth_getUserOperationReceipt", [userOpHash]);
|
|
10965
|
+
if (r) {
|
|
10966
|
+
setInternalReceipt(r);
|
|
10967
|
+
setInternalMempool(null);
|
|
10968
|
+
if (intervalRef.current) {
|
|
10969
|
+
clearInterval(intervalRef.current);
|
|
10970
|
+
intervalRef.current = null;
|
|
10971
|
+
}
|
|
10972
|
+
return;
|
|
10973
|
+
}
|
|
10974
|
+
const m = await rpc("eth_getUserOperationByHash", [userOpHash]);
|
|
10975
|
+
if (m === null) {
|
|
10976
|
+
setRejected(true);
|
|
10977
|
+
setInternalMempool(null);
|
|
10978
|
+
if (intervalRef.current) {
|
|
10979
|
+
clearInterval(intervalRef.current);
|
|
10980
|
+
intervalRef.current = null;
|
|
10981
|
+
}
|
|
10982
|
+
return;
|
|
10983
|
+
}
|
|
10984
|
+
const info = extractMempoolInfo(m);
|
|
10985
|
+
setInternalMempool(info);
|
|
10986
|
+
} catch (e) {
|
|
10987
|
+
setInternalError(e?.message || String(e));
|
|
10988
|
+
} finally {
|
|
10989
|
+
setInternalRefreshing(false);
|
|
10990
|
+
setAttempt((x) => x + 1);
|
|
10991
|
+
}
|
|
10992
|
+
}, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);
|
|
10993
|
+
React27.useEffect(() => {
|
|
10994
|
+
if (useExternalState) return;
|
|
10995
|
+
console.log("[UserOpStatus] Initializing polling for UserOp hash:", userOpHash);
|
|
10996
|
+
startTimeRef.current = Date.now();
|
|
10997
|
+
setTimedOut(false);
|
|
10998
|
+
setRejected(false);
|
|
10999
|
+
setInternalReceipt(null);
|
|
11000
|
+
setInternalMempool(null);
|
|
11001
|
+
setInternalError(null);
|
|
11002
|
+
setAttempt(0);
|
|
11003
|
+
setInternalRefreshing(false);
|
|
11004
|
+
}, [userOpHash, useExternalState]);
|
|
11005
|
+
React27.useEffect(() => {
|
|
11006
|
+
if (useExternalState) {
|
|
11007
|
+
console.log("[UserOpStatus] Using external state, skipping internal polling");
|
|
11008
|
+
return;
|
|
11009
|
+
}
|
|
11010
|
+
if (receipt) {
|
|
11011
|
+
console.log("[UserOpStatus] Already have receipt, not starting polling");
|
|
11012
|
+
return;
|
|
11013
|
+
}
|
|
11014
|
+
let mounted = true;
|
|
11015
|
+
const startPolling = async () => {
|
|
11016
|
+
if (mounted) {
|
|
11017
|
+
console.log("[UserOpStatus] Starting polling for hash:", userOpHash, "pollMs:", pollMs);
|
|
11018
|
+
await tick();
|
|
11019
|
+
if (mounted && !receipt) {
|
|
11020
|
+
console.log("[UserOpStatus] Starting interval polling every", pollMs, "ms");
|
|
11021
|
+
intervalRef.current = setInterval(() => {
|
|
11022
|
+
if (mounted) tick();
|
|
11023
|
+
}, pollMs);
|
|
11024
|
+
}
|
|
11025
|
+
}
|
|
11026
|
+
};
|
|
11027
|
+
startPolling();
|
|
11028
|
+
return () => {
|
|
11029
|
+
mounted = false;
|
|
11030
|
+
if (intervalRef.current) {
|
|
11031
|
+
console.log("[UserOpStatus] Clearing interval in cleanup");
|
|
11032
|
+
clearInterval(intervalRef.current);
|
|
11033
|
+
intervalRef.current = null;
|
|
11034
|
+
}
|
|
11035
|
+
};
|
|
11036
|
+
}, [userOpHash, pollMs, useExternalState]);
|
|
11037
|
+
const stateBadge = () => {
|
|
11038
|
+
if (receipt) {
|
|
11039
|
+
const ok = !!receipt.success;
|
|
11040
|
+
return /* @__PURE__ */ jsxs25(Badge, { variant: ok ? "success" : "destructive", className: "gap-1", children: [
|
|
11041
|
+
ok ? /* @__PURE__ */ jsx34(CheckCircle27, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx34(AlertCircle4, { className: "h-3 w-3" }),
|
|
11042
|
+
ok ? "Included" : "Failed"
|
|
11043
|
+
] });
|
|
11044
|
+
}
|
|
11045
|
+
if (rejected) {
|
|
11046
|
+
return /* @__PURE__ */ jsxs25(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
11047
|
+
/* @__PURE__ */ jsx34(AlertCircle4, { className: "h-3 w-3" }),
|
|
11048
|
+
" Rejected by bundler"
|
|
11049
|
+
] });
|
|
11050
|
+
}
|
|
11051
|
+
if (timedOut) {
|
|
11052
|
+
return /* @__PURE__ */ jsxs25(Badge, { variant: "warning", className: "gap-1", children: [
|
|
11053
|
+
/* @__PURE__ */ jsx34(AlertCircle4, { className: "h-3 w-3" }),
|
|
11054
|
+
" Timeout - may be rejected"
|
|
11055
|
+
] });
|
|
11056
|
+
}
|
|
11057
|
+
if (mempool) {
|
|
11058
|
+
return /* @__PURE__ */ jsxs25(Badge, { variant: "outline", className: "gap-1", children: [
|
|
11059
|
+
/* @__PURE__ */ jsx34(Clock2, { className: "h-3 w-3" }),
|
|
11060
|
+
" Pending in bundler"
|
|
11061
|
+
] });
|
|
11062
|
+
}
|
|
11063
|
+
return /* @__PURE__ */ jsxs25(Badge, { variant: "secondary", className: "gap-1", children: [
|
|
11064
|
+
/* @__PURE__ */ jsx34(Clock2, { className: "h-3 w-3" }),
|
|
11065
|
+
" Waiting"
|
|
11066
|
+
] });
|
|
11067
|
+
};
|
|
11068
|
+
return /* @__PURE__ */ jsxs25(
|
|
11069
|
+
"div",
|
|
11070
|
+
{
|
|
11071
|
+
className: cn2("lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]", className),
|
|
11072
|
+
style: { textAlign: "left", listStyle: "none" },
|
|
11073
|
+
children: [
|
|
11074
|
+
/* @__PURE__ */ jsxs25("div", { className: "flex items-center justify-between mb-3", children: [
|
|
11075
|
+
/* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-2", children: [
|
|
11076
|
+
stateBadge(),
|
|
11077
|
+
/* @__PURE__ */ jsx34("span", { className: "text-xs text-muted-foreground", children: "This is a UserOperation hash (EIP-4337), not a L2 tx hash." })
|
|
11078
|
+
] }),
|
|
11079
|
+
/* @__PURE__ */ jsxs25(Button, { variant: "ghost", size: "sm", onClick: () => tick(), disabled: refreshing, className: "h-8", children: [
|
|
11080
|
+
/* @__PURE__ */ jsx34(RefreshCw5, { className: cn2("h-3.5 w-3.5 mr-1", refreshing && "animate-spin") }),
|
|
11081
|
+
/* @__PURE__ */ jsx34("span", { className: "text-xs", children: "Refresh" })
|
|
11082
|
+
] })
|
|
11083
|
+
] }),
|
|
11084
|
+
/* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
11085
|
+
/* @__PURE__ */ jsx34("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "UO Hash" }),
|
|
11086
|
+
/* @__PURE__ */ jsx34("code", { className: "text-xs font-mono flex-1 select-all", children: userOpHash }),
|
|
11087
|
+
/* @__PURE__ */ jsx34(
|
|
11088
|
+
Button,
|
|
11089
|
+
{
|
|
11090
|
+
variant: "ghost",
|
|
11091
|
+
size: "sm",
|
|
11092
|
+
className: "h-8 w-8 p-0",
|
|
11093
|
+
onClick: async () => {
|
|
11094
|
+
try {
|
|
11095
|
+
await navigator.clipboard.writeText(userOpHash);
|
|
11096
|
+
} catch {
|
|
11097
|
+
}
|
|
11098
|
+
},
|
|
11099
|
+
children: /* @__PURE__ */ jsx34(Copy5, { className: "h-3.5 w-3.5" })
|
|
11100
|
+
}
|
|
11101
|
+
)
|
|
11102
|
+
] }),
|
|
11103
|
+
receipt && receipt.receipt?.transactionHash && /* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
11104
|
+
/* @__PURE__ */ jsx34("span", { className: "text-sm font-medium min-w-16 shrink-0", children: "Tx Hash" }),
|
|
11105
|
+
/* @__PURE__ */ jsx34("code", { className: "text-xs font-mono flex-1 select-all", children: receipt.receipt.transactionHash }),
|
|
11106
|
+
/* @__PURE__ */ jsx34(
|
|
11107
|
+
Button,
|
|
11108
|
+
{
|
|
11109
|
+
variant: "ghost",
|
|
11110
|
+
size: "sm",
|
|
11111
|
+
className: "h-8 w-8 p-0",
|
|
11112
|
+
onClick: async () => {
|
|
11113
|
+
try {
|
|
11114
|
+
await navigator.clipboard.writeText(receipt.receipt.transactionHash);
|
|
11115
|
+
} catch {
|
|
11116
|
+
}
|
|
11117
|
+
},
|
|
11118
|
+
children: /* @__PURE__ */ jsx34(Copy5, { className: "h-3.5 w-3.5" })
|
|
11119
|
+
}
|
|
11120
|
+
),
|
|
11121
|
+
chain?.blockExplorers?.default?.url && /* @__PURE__ */ jsx34(
|
|
11122
|
+
"a",
|
|
11123
|
+
{
|
|
11124
|
+
href: `${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`,
|
|
11125
|
+
target: "_blank",
|
|
11126
|
+
rel: "noreferrer noopener",
|
|
11127
|
+
className: "inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground",
|
|
11128
|
+
title: "Open in explorer",
|
|
11129
|
+
children: /* @__PURE__ */ jsx34(ExternalLink3, { className: "h-3.5 w-3.5" })
|
|
11130
|
+
}
|
|
11131
|
+
)
|
|
11132
|
+
] }),
|
|
11133
|
+
receipt && /* @__PURE__ */ jsxs25("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
11134
|
+
"Block ",
|
|
11135
|
+
parseInt(receipt.receipt?.blockNumber || "0x0", 16),
|
|
11136
|
+
" \u2022 Gas Used",
|
|
11137
|
+
" ",
|
|
11138
|
+
parseInt(receipt.actualGasUsed || "0x0", 16),
|
|
11139
|
+
" \u2022 Success ",
|
|
11140
|
+
String(!!receipt.success)
|
|
11141
|
+
] }),
|
|
11142
|
+
/* @__PURE__ */ jsx34("div", { className: "text-xs text-muted-foreground", children: !receipt && !timedOut && !rejected && /* @__PURE__ */ jsxs25("span", { className: "ml-2", children: [
|
|
11143
|
+
"\u2022 Polling for ",
|
|
11144
|
+
Math.round((Date.now() - startTimeRef.current) / 1e3),
|
|
11145
|
+
"s"
|
|
11146
|
+
] }) }),
|
|
11147
|
+
mempool && /* @__PURE__ */ jsxs25("div", { className: "text-sm text-muted-foreground mt-2", style: { listStyle: "none" }, children: [
|
|
11148
|
+
/* @__PURE__ */ jsxs25("div", { children: [
|
|
11149
|
+
"Seen by bundler at ",
|
|
11150
|
+
/* @__PURE__ */ jsx34(Address, { address: mempool.entryPoint, chain, showExplorer: true, truncate: false })
|
|
11151
|
+
] }),
|
|
11152
|
+
/* @__PURE__ */ jsxs25("div", { children: [
|
|
11153
|
+
"sender ",
|
|
11154
|
+
/* @__PURE__ */ jsx34(Address, { address: mempool.sender, chain, truncate: false })
|
|
11155
|
+
] })
|
|
11156
|
+
] }),
|
|
11157
|
+
error && /* @__PURE__ */ jsxs25("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
11158
|
+
/* @__PURE__ */ jsx34(AlertCircle4, { className: "h-4 w-4" }),
|
|
11159
|
+
" ",
|
|
11160
|
+
error
|
|
11161
|
+
] }),
|
|
11162
|
+
rejected && /* @__PURE__ */ jsxs25("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
11163
|
+
/* @__PURE__ */ jsx34(AlertCircle4, { className: "h-4 w-4" }),
|
|
11164
|
+
"UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced."
|
|
11165
|
+
] }),
|
|
11166
|
+
timedOut && /* @__PURE__ */ jsxs25("div", { className: "text-sm text-destructive flex items-center gap-1 mt-4", children: [
|
|
11167
|
+
/* @__PURE__ */ jsx34(AlertCircle4, { className: "h-4 w-4" }),
|
|
11168
|
+
"Stopped polling after ",
|
|
11169
|
+
Math.round(maxPollTimeMs / 1e3),
|
|
11170
|
+
"s. UserOperation may have been rejected by the bundler."
|
|
11171
|
+
] })
|
|
11172
|
+
]
|
|
11173
|
+
}
|
|
11174
|
+
);
|
|
11175
|
+
};
|
|
11176
|
+
}
|
|
11177
|
+
});
|
|
11178
|
+
|
|
10078
11179
|
// src/internal/components/Hash.tsx
|
|
10079
11180
|
import * as React28 from "react";
|
|
10080
|
-
import { Copy as Copy6, ExternalLink as
|
|
11181
|
+
import { Copy as Copy6, ExternalLink as ExternalLink4 } from "lucide-react";
|
|
10081
11182
|
import { jsx as jsx35, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
10082
11183
|
function toExplorerUrl(kind, value, chain) {
|
|
10083
11184
|
const base2 = chain?.blockExplorers?.default?.url;
|
|
@@ -10136,7 +11237,7 @@ var init_Hash = __esm({
|
|
|
10136
11237
|
rel: "noreferrer noopener",
|
|
10137
11238
|
className: "inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground",
|
|
10138
11239
|
title: "Open in explorer",
|
|
10139
|
-
children: /* @__PURE__ */ jsx35(
|
|
11240
|
+
children: /* @__PURE__ */ jsx35(ExternalLink4, { className: "h-4 w-4" })
|
|
10140
11241
|
}
|
|
10141
11242
|
)
|
|
10142
11243
|
] });
|
|
@@ -10167,7 +11268,7 @@ var init_TransactionsList = __esm({
|
|
|
10167
11268
|
const baseUrl = explorerUrl.replace(/\/$/, "");
|
|
10168
11269
|
const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=${itemsCount}`;
|
|
10169
11270
|
console.log("[TransactionsList] Fetching from:", apiUrl);
|
|
10170
|
-
const response = await fetch(apiUrl
|
|
11271
|
+
const response = await fetch(apiUrl);
|
|
10171
11272
|
if (!response.ok) {
|
|
10172
11273
|
throw new Error(`Failed to fetch transactions: ${response.status}`);
|
|
10173
11274
|
}
|