@seamless-auth/vue 0.1.0 → 0.2.1
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/CHANGELOG.md +25 -0
- package/README.md +2 -2
- package/dist/router/components/VerifyMagicLink.d.ts +2 -1
- package/dist/router.js +1 -1
- package/dist/router.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# @seamless-auth/vue
|
|
2
2
|
|
|
3
|
+
## 0.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [782583c]
|
|
8
|
+
- Updated dependencies [e3cf1f9]
|
|
9
|
+
- @seamless-auth/client@0.7.0
|
|
10
|
+
|
|
11
|
+
## 0.2.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- 59802e2: Add a confirmation step for magic links opened on another device.
|
|
16
|
+
|
|
17
|
+
A magic link opened on a device other than the one that asked for it now waits for the reader to approve it (auth API 0.19.0 and later). The bundled verify screens show which kind of device asked and when, and offer "Yes, sign in that device" or "No, this wasn't me". Approving signs in the requesting device and tells the reader to return to it; declining changes nothing.
|
|
18
|
+
|
|
19
|
+
`@seamless-auth/client` adds `client.confirmMagicLink(token)`, the `getMagicLinkConfirmation`, `isMagicLinkConfirmationRequired`, `describeMagicLinkDevice`, `magicLinkConfirmationPrompt` and `confirmMagicLinkSignIn` helpers, and the `MagicLinkConfirmation` and `MagicLinkDeviceClass` types. In bearer mode the verify call now sends the sign-in's ephemeral token when one is held. A custom verify screen that treats every failure as an invalid link should check `getMagicLinkConfirmation(error)` first.
|
|
20
|
+
|
|
21
|
+
The React Native README describes the new step for apps that handle magic links.
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [59802e2]
|
|
26
|
+
- @seamless-auth/client@0.6.0
|
|
27
|
+
|
|
3
28
|
## 0.1.0
|
|
4
29
|
|
|
5
30
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -164,8 +164,8 @@ it, so a single-use secret does not stay in history or travel in a `Referer`.
|
|
|
164
164
|
## Headless use
|
|
165
165
|
|
|
166
166
|
Every screen is a thin view over a flow in `@seamless-auth/client` (`beginSignIn`,
|
|
167
|
-
`registerWithEmail`, `verifyOtp`, `watchMagicLink`, `finishMagicLinkSignIn`,
|
|
168
|
-
`completeOAuthCallback`, `enrollPasskey`, and helpers). A custom screen calls the same flows with the
|
|
167
|
+
`registerWithEmail`, `verifyOtp`, `watchMagicLink`, `finishMagicLinkSignIn`,
|
|
168
|
+
`confirmMagicLinkSignIn`, `startOAuthSignIn`, `completeOAuthCallback`, `enrollPasskey`, and helpers). A custom screen calls the same flows with the
|
|
169
169
|
session as its actions:
|
|
170
170
|
|
|
171
171
|
```ts
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Where an emailed magic link lands. Verifies the link once, tells the tab that
|
|
3
3
|
* asked for it, and signs this tab in too when the link was opened in the same
|
|
4
|
-
* browser.
|
|
4
|
+
* browser. Opened on another device, the link is held and the screen asks
|
|
5
|
+
* whether to sign the requesting device in.
|
|
5
6
|
*/
|
|
6
7
|
export declare const SaVerifyMagicLink: import("vue").DefineComponent<{}, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
7
8
|
[key: string]: any;
|
package/dist/router.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineComponent as e,onMounted as a,h as n,computed as t,ref as s,watch as r,onBeforeUnmount as i}from"vue";import{u as o}from"./chunks/shared-C2_q4dvU.js";import{fallbackSignInOptions as l,hasFallbackSignInOption as u,startOAuthSignIn as c,isValidEmail as d,isValidPhoneNumber as p,registerWithEmail as m,beginSignIn as h,PASSKEY_SIGN_IN_FAILED as v,MAGIC_LINK_RESEND_COOLDOWN_SECONDS as g,watchMagicLink as f,completeOAuthCallback as y,isOtpCharacter as b,otpCharacters as k,hasNonPasskeyLoginMethod as w,enrollPasskey as S,safeReturnPath as x,finishMagicLinkSignIn as P,OTP_LIFETIME_SECONDS as L,formatCountdown as C,OTP_LENGTH as O,verifyOtp as R,requestOtp as A,otpResendFailedMessage as M}from"@seamless-auth/client";import{useRouter as E,useRoute as V}from"vue-router";const T="seamless-auth-styles";const I=e({name:"SaAuthLayout",props:{card:{type:Boolean,default:!0}},setup(e,{slots:t}){const{styles:s}=o();return a(()=>{s.inject&&function(e){if("undefined"==typeof document||document.getElementById(T))return;const a=document.createElement("style");a.id=T,e&&(a.nonce=e),a.textContent="/*\n * Styles for the bundled Seamless Auth screens of the Angular and Vue bindings\n * (and those that follow). One file, so the screens look the same in every\n * framework. Theme them with the same --seamless-* custom properties the React\n * screens read, or override the .sa-* classes. Every rule is scoped under\n * .sa-auth.\n */\n\n.sa-auth {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--seamless-text, white);\n font-family: inherit;\n}\n\n.sa-auth *,\n.sa-auth *::before,\n.sa-auth *::after {\n box-sizing: border-box;\n}\n\n.sa-auth .sa-card {\n background-color: var(--seamless-surface, #1f2937);\n padding: 2rem;\n border-radius: 0.5rem;\n box-shadow: 0 4px 6px var(--seamless-shadow, rgba(0, 0, 0, 0.1));\n width: 100%;\n max-width: 28rem;\n}\n\n.sa-auth .sa-heading {\n font-size: 1.5rem;\n font-weight: bold;\n margin: 0 0 1.5rem;\n text-align: center;\n color: var(--seamless-text, white);\n}\n\n.sa-auth .sa-subtitle,\n.sa-auth .sa-description {\n color: var(--seamless-text-muted, #d1d5db);\n text-align: center;\n margin: 0 0 1rem;\n}\n\n.sa-auth .sa-input-group {\n margin-bottom: 1rem;\n}\n\n.sa-auth .sa-label {\n display: block;\n color: var(--seamless-text-muted, #d1d5db);\n}\n\n.sa-auth .sa-input {\n width: 100%;\n padding: 0.5rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n margin-top: 0.25rem;\n}\n\n.sa-auth .sa-input:focus,\n.sa-auth .sa-otp-input:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-helper-text {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n}\n\n.sa-auth .sa-error {\n color: var(--seamless-danger, #f87171);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-success {\n color: var(--seamless-success, #68d391);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-button {\n width: 100%;\n border: none;\n background-color: var(--seamless-accent, #2563eb);\n color: var(--seamless-accent-contrast, white);\n padding: 0.5rem;\n border-radius: 0.375rem;\n transition:\n background-color 0.3s,\n opacity 0.3s;\n cursor: pointer;\n margin-top: 1rem;\n font: inherit;\n}\n\n.sa-auth .sa-button:hover:not(:disabled) {\n background-color: var(--seamless-accent-hover, #1d4ed8);\n}\n\n.sa-auth .sa-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-secondary {\n width: 100%;\n margin-top: 0.75rem;\n padding: 0.5rem;\n border-radius: 0.375rem;\n background: transparent;\n color: var(--seamless-text, white);\n border: 1px solid var(--seamless-border, #d1d5db);\n cursor: pointer;\n font: inherit;\n}\n\n.sa-auth .sa-submit-hint {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n text-align: center;\n}\n\n.sa-auth .sa-link {\n margin-top: 1rem;\n width: 100%;\n font-size: 0.875rem;\n color: var(--seamless-accent-soft, #60a5fa);\n text-align: center;\n background: none;\n border: none;\n cursor: pointer;\n font-family: inherit;\n}\n\n.sa-auth .sa-link:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-fallback {\n margin-top: 18px;\n padding: 18px;\n border-radius: 12px;\n background: var(--seamless-surface-raised, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.08));\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.sa-auth .sa-fallback-header {\n font-weight: 600;\n}\n\n.sa-auth .sa-fallback-description {\n margin: 0;\n font-size: 0.875rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-actions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 1rem;\n}\n\n.sa-auth .sa-action {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n width: 100%;\n padding: 12px 14px;\n border-radius: 10px;\n background: var(--seamless-surface, rgba(255, 255, 255, 0.02));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.12));\n color: var(--seamless-text, white);\n cursor: pointer;\n text-align: left;\n font: inherit;\n}\n\n.sa-auth .sa-action:hover {\n border-color: var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-action-title {\n font-weight: 600;\n}\n\n.sa-auth .sa-action-subtext {\n font-size: 0.8rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-otp {\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n margin: 0.75rem 0;\n}\n\n.sa-auth .sa-otp-input {\n width: 2.75rem;\n height: 3rem;\n text-align: center;\n font-size: 1.25rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n}\n\n.sa-auth .sa-timer {\n font-size: 0.75rem;\n color: var(--seamless-warning, #facc15);\n}\n\n.sa-auth .sa-identifier {\n margin: 0.75rem auto;\n padding: 0.25rem 0.75rem;\n width: fit-content;\n border-radius: 999px;\n background: var(--seamless-surface-raised, #4b5563);\n}\n\n.sa-auth .sa-center {\n text-align: center;\n}\n\n.sa-auth .sa-spinner {\n width: 2rem;\n height: 2rem;\n margin: 1rem auto;\n border: 3px solid var(--seamless-border, rgba(255, 255, 255, 0.2));\n border-top-color: var(--seamless-accent, #3b82f6);\n border-radius: 50%;\n animation: sa-spin 0.9s linear infinite;\n}\n\n@keyframes sa-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sa-auth .sa-spinner {\n animation: none;\n }\n}\n",document.head.prepend(a)}(s.nonce)}),()=>n("div",{class:"sa-auth"},[n("div",{class:e.card?"sa-card":"sa-center"},t.default?.())])}}),$=(e,a,t)=>n("button",{type:"button",class:"sa-action",onClick:t},[n("span",{class:"sa-action-title"},e),n("span",{class:"sa-action-subtext"},a)]),q=e({name:"SaFallbackOptions",props:{identifier:{type:String,required:!0},loginMethods:{type:Array,default:null},offerEmailOtp:{type:Boolean,default:!0},offerPasskeyRetry:{type:Boolean,default:!1}},emits:["magicLink","emailOtp","phoneOtp","passkeyRetry"],setup(e,{emit:a}){const s=t(()=>l(e.identifier,e.loginMethods,{emailOtp:e.offerEmailOtp,passkeyRetry:e.offerPasskeyRetry}));return()=>{const e=s.value;return u(e)?n("div",{class:"sa-fallback"},[n("div",{class:"sa-fallback-header"},"Choose a sign-in method"),n("p",{class:"sa-fallback-description"},"Choose another secure sign-in method."),n("div",{class:"sa-actions"},[e.magicLink&&$("Email Magic Link","Send a secure sign-in link to your email",()=>a("magicLink")),e.emailOtp&&$("Email Code","Receive a one-time code by email",()=>a("emailOtp")),e.phoneOtp&&$("Text Message Code","Receive a one-time code via SMS",()=>a("phoneOtp"))]),e.passkeyRetry&&n("button",{type:"button",class:"sa-link",onClick:()=>a("passkeyRetry")},"Try passkey anyway")]):null}}}),B={login:"login",passkeyLogin:"passkey-login",verifyPhoneOtp:"verify-phone-otp",verifyEmailOtp:"verify-email-otp",verifyMagicLink:"verify-magiclink",oauthCallback:"oauth/callback",registerPasskey:"register-passkey",magicLinkSent:"magic-link-sent"},z=e=>`seamless-auth-${e}`;function U(){const e=E(),a=o();return{toScreen:(a,n)=>e.push({name:z(a),state:n}),toApp:n=>e.push(n??a.signedInPath),toLocation:a=>{const n=e.options.history.base.replace(/\/+$/,""),t=n&&(a===n||a.startsWith(`${n}/`))?a.slice(n.length)||"/":a;return e.push(t)},state:()=>{const a=e.options.history.state;return a&&"object"==typeof a?a:{}},absoluteUrl:a=>new URL(e.resolve({name:z(a)}).href,window.location.origin).toString(),dropQuery:()=>e.replace({...e.currentRoute.value,query:{},hash:""})}}const D=e({name:"SaOAuthProviderButtons",props:{redirectUri:{type:String,default:void 0}},setup(e){const t=o(),r=U(),i=s([]),l=s("");a(async()=>{const{data:e}=await t.listOAuthProviders();i.value=e?.providers??[]});return()=>0===i.value.length?null:n("div",{class:"sa-actions"},[...i.value.map(a=>n("button",{key:a.id,type:"button",class:"sa-action",onClick:()=>(async a=>{l.value="";const n=await c({actions:t,oauthRedirect:t.ports.oauthRedirect},{providerId:a,redirectUri:e.redirectUri??r.absoluteUrl("oauthCallback")});n.error&&(l.value=n.error)})(a.id)},[n("span",{class:"sa-action-title"},`Continue with ${a.name}`)])),l.value&&n("p",{class:"sa-error"},l.value)])}}),F=e=>e.target.value,j=e({name:"SaLogin",setup(){const e=o(),i=U(),l=s(e.hasSignedInBefore.value?"login":"register");r(e.hasSignedInBefore,e=>{e&&(l.value="login")});const u=s(""),c=s(""),g=s(""),f=s(""),y=s(""),b=s(!1),k=s(null),w=s(!1),S=t(()=>"login"===l.value?d(u.value)||p(u.value):d(c.value)),x=t(()=>"login"===l.value?u.value?S.value?"Ready to continue.":"This does not look like a complete email or phone number yet.":"Enter your email or phone number to continue.":c.value?S.value?"Ready to continue.":"This does not look like a complete email address yet.":"Enter your email address to continue.");a(()=>{e.loadLoginMethods(),e.checkPasskeySupport()});const P=()=>{u.value&&(g.value=d(u.value)||p(u.value)?"":"Please enter a valid email or phone number")},L=()=>{c.value&&(f.value=d(c.value)?"":"Please enter a valid email")},C=async a=>{if(a.preventDefault(),S.value&&!w.value){y.value="",b.value=!1,w.value=!0;try{if("register"===l.value){const{error:a}=await m(e.client,c.value);return a?void(y.value=a):void await i.toScreen("verifyEmailOtp")}const[a,n]=await Promise.all([e.checkPasskeySupport(),e.loadLoginMethods()]),t=await h(e,{identifier:u.value,passkeySupported:a,configuredMethods:n});if("error"===t.kind)return void(y.value=t.message);if("signed_in"===t.kind)return void await i.toApp();k.value=t.loginMethods,b.value=!0,t.passkeyFailed&&(y.value=v)}catch{y.value="Failed to continue sign-in. Please try again."}finally{w.value=!1}}},O=async()=>{y.value="";const{error:a}=await e.handlePasskeyLogin();a?y.value=v:await i.toApp()},R=async()=>{const{error:a}=await e.client.requestMagicLink();a?y.value="Failed to send magic link.":await i.toScreen("magicLinkSent",{identifier:u.value})},A=async()=>{const{error:a}=await e.client.requestLoginEmailOtp();a?y.value="Failed to send email code.":await i.toScreen("verifyEmailOtp",{flow:"login"})},M=async()=>{const{error:a}=await e.client.requestLoginPhoneOtp();a?y.value="Failed to send OTP.":await i.toScreen("verifyPhoneOtp",{flow:"login"})};return()=>n(I,null,()=>[n("h2",{class:"sa-heading"},"login"===l.value?"Sign In":"Create Account"),n("form",{onSubmit:C},["login"===l.value?n("div",{class:"sa-input-group"},[n("label",{for:"identifier",class:"sa-label"},"Email Address / Phone Number"),n("input",{id:"identifier",type:"text",class:"sa-input",autocomplete:"off",placeholder:"Email or Phone Number",required:!0,value:u.value,onInput:e=>{u.value=F(e)},onBlur:P}),n("p",{class:"sa-helper-text"},"Phone numbers must include a country code e.g. +1"),b.value&&n(q,{identifier:u.value,loginMethods:k.value,offerPasskeyRetry:e.passkeySupported.value,onMagicLink:R,onEmailOtp:A,onPhoneOtp:M,onPasskeyRetry:O}),g.value&&n("p",{class:"sa-error"},g.value)]):n("div",{class:"sa-input-group"},[n("label",{for:"email",class:"sa-label"},"Email Address"),n("input",{id:"email",type:"email",class:"sa-input",autocomplete:"off",required:!0,value:c.value,onInput:e=>{c.value=F(e)},onBlur:L}),f.value&&n("p",{class:"sa-error"},f.value)]),n("button",{type:"submit",class:"sa-button",disabled:!S.value||w.value,"aria-describedby":"seamless-submit-hint"},"login"===l.value?"Login":"Register"),n("p",{id:"seamless-submit-hint",role:"status",class:"sa-submit-hint"},x.value),y.value&&n("p",{class:"sa-error"},y.value),n("button",{type:"button",class:"sa-link",onClick:()=>{l.value="login"===l.value?"register":"login"}},"login"===l.value?"Don't have an account? Create one":"Already have an account? Sign in")]),n(D)])}}),Y=e({name:"SaMagicLinkSent",setup(){const e=o(),t=U(),r=t.state().identifier,l=s(g);let u,c;a(()=>{u=setInterval(()=>{l.value=Math.max(0,l.value-1)},1e3),c=f({client:e.client,refreshSession:e.refreshSession,onSignedIn:()=>{t.toApp()}})}),i(()=>{clearInterval(u),c?.()});const d=async()=>{l.value>0||(await e.client.requestMagicLink(),l.value=g)};return()=>n(I,null,()=>[n("div",{class:"sa-center"},[n("h2",{class:"sa-heading"},"Check your email"),n("p",{class:"sa-description"},"If an account exists for this address, we sent a secure sign-in link."),r&&n("div",{class:"sa-identifier"},r),n("p",{class:"sa-helper-text"},"Open the email and click the link to finish signing in."),n("p",{class:"sa-helper-text"},"Didn't receive anything? Check your spam folder or try creating a new account.")]),n("div",{class:"sa-actions"},[n("button",{type:"button",class:"sa-secondary",disabled:l.value>0,onClick:d},"Resend link"),l.value>0&&n("div",{class:"sa-helper-text sa-center"},`Available in ${l.value}s`),n("button",{type:"button",class:"sa-link",onClick:()=>t.toScreen("login")},"Change email or phone")])])}}),N=e({name:"SaOAuthCallback",setup(){const e=o(),t=U(),r=V(),i=s("");return a(async()=>{const a=new URLSearchParams;for(const e of["code","state"]){const n=r.query[e];"string"==typeof n&&a.set(e,n)}t.dropQuery();const n=await y(e,a,window.location.origin);"error"!==n.kind?"enroll_passkey"!==n.kind?await t.toLocation(n.destination):await t.toScreen("registerPasskey",{returnTo:n.returnTo}):i.value=n.message}),()=>n(I,{card:!1},()=>[n("h2",{class:"sa-heading"},i.value?"Sign-in failed":"Completing sign-in..."),i.value&&[n("p",i.value),n("button",{type:"button",class:"sa-link",onClick:()=>t.toScreen("login")},"Back to login")]])}}),_=e({name:"SaOtpInput",props:{modelValue:{type:String,default:""},length:{type:Number,default:6},mode:{type:String,default:"numeric"},name:{type:String,default:"otp"}},emits:["update:modelValue"],setup(e,{emit:a}){const s=[],r=t(()=>Array.from({length:e.length},(a,n)=>e.modelValue[n]??"")),i=e=>s[e]?.focus(),o=e=>a("update:modelValue",e.join("")),l=(a,n)=>{const t=k(n,e.mode).slice(0,e.length),s=[...r.value];t.forEach((e,n)=>{a+n<s.length&&(s[a+n]=e)}),o(s),i(Math.min(a+t.length,e.length-1))},u=e=>{e.preventDefault(),l(0,e.clipboardData?.getData("text")??"")};return()=>n("div",{class:"sa-otp",role:"group","aria-label":"One-time password input",onPaste:u},r.value.map((a,t)=>n("input",{key:t,ref:e=>{s[t]=e},class:"sa-otp-input",type:"text",inputmode:"numeric"===e.mode?"numeric":"text",autocomplete:"one-time-code",name:`${e.name}-${t}`,maxlength:1,value:a,"aria-label":`Digit ${t+1}`,onInput:a=>((a,n)=>{const t=n.target,s=t.value;if(s.length>1)return void l(a,s);if(s&&!b(s,e.mode))return void(t.value=r.value[a]);const u=[...r.value];u[a]=s,o(u),s&&i(a+1)})(t,a),onKeydown:a=>((a,n)=>{if("Backspace"===n.key){n.preventDefault();const e=[...r.value];e[a]?(e[a]="",o(e)):a>0&&(e[a-1]="",o(e),i(a-1))}"ArrowLeft"===n.key&&a>0&&i(a-1),"ArrowRight"===n.key&&a<e.length-1&&i(a+1)})(t,a)})))}}),Q=e({name:"SaPasskeyLogin",setup(){const e=o(),a=U(),t=s(""),r=async()=>{t.value="";(await e.handlePasskeyLogin()).error?t.value="Passkey sign-in could not be completed. Try another sign-in method.":await a.toApp()};return()=>n(I,null,()=>[n("h2",{class:"sa-heading"},"Login with Passkey"),n("button",{type:"button",class:"sa-button",onClick:r},"Use Passkey"),t.value&&n("p",{class:"sa-error"},t.value)])}}),W=e({name:"SaRegisterPasskey",setup(){const e=o(),r=U(),i=r.state().returnTo,l=()=>void 0===i?r.toApp():r.toLocation(x(i)),u=s("idle"),c=s(""),d=t(()=>w(e.loginMethods.value));a(()=>{e.checkPasskeySupport(),e.loadLoginMethods()});const p=async a=>{u.value="loading";const{error:n}=await S({client:e.client,refreshSession:e.refreshSession},a);if(n)return u.value="error",void(c.value=n);u.value="success",c.value="Passkey registered successfully.",await l()},m=async()=>{await e.refreshSession(),await l()},h=()=>"loading"===u.value;return()=>n(I,null,()=>e.passkeySupportLoading.value||e.loginMethodsLoading.value?n("div",{class:"sa-center"},[n("div",{class:"sa-spinner","aria-hidden":"true"}),n("span","Checking for Passkey Support...")]):e.passkeySupported.value?[n("h2",{class:"sa-heading"},"Secure Your Account with a Passkey"),n("p",{class:"sa-description"},"Your device supports passkeys! Register one to skip passwords forever."),n("button",{type:"button",class:"sa-button",disabled:h(),onClick:()=>p()},h()?"Registering...":"Register Passkey"),n("button",{type:"button",class:"sa-secondary",disabled:h(),onClick:()=>p("cross-platform")},"Use a security key instead"),c.value&&n("p",{class:"success"===u.value?"sa-success":"sa-error",role:"status"},c.value),d.value&&n("button",{type:"button",class:"sa-link",disabled:h(),onClick:m},"Skip for now")]:[n("h2",{class:"sa-heading"},"Passkeys are not available here"),n("p",{class:"sa-description"},d.value?"This device does not support passkeys. You can continue without one and add a passkey later from a device that does.":"This device does not support passkeys, and this application requires one to sign in. Try again from a device or browser that supports them."),d.value&&n("button",{type:"button",class:"sa-button",onClick:m},"Continue")])}}),K=e({name:"SaVerifyMagicLink",setup(){const e=o(),t=U(),r=V().query.token,l="string"==typeof r?r:null,u=s(null),c=s("");let d,p=!0;return i(()=>{p=!1,clearTimeout(d)}),a(async()=>{if(!l)return void(c.value="Missing token for verification.");t.dropQuery();const a=await e.client.verifyMagicLink(l);if(!p)return;if(a.error)return void(c.value="Failed to verify token");const n=await P({client:e.client,refreshSession:e.refreshSession});p&&(u.value=n,"signed-in"===n&&(d=setTimeout(()=>{t.toApp()},900)))}),()=>n(I,null,()=>n("div",{class:"sa-center"},[n("h1",{class:"sa-heading"},"Verifying your login"),!u.value&&!c.value&&[n("div",{class:"sa-spinner","aria-hidden":"true"}),n("p",{class:"sa-helper-text"},"Please wait while we securely verify your sign-in link.")],"signed-in"===u.value&&n("p",{class:"sa-success",role:"status"},"Login verified. Redirecting..."),"elsewhere"===u.value&&n("p",{class:"sa-success",role:"status"},"Login verified. Return to the device where you requested this link to continue."),c.value&&n("p",{class:"sa-error",role:"alert"},c.value)]))}}),G={email:{title:"Verify Your Email",subtitle:"We sent you a verification email. Enter the code below.",label:"Email Verification Code",resend:"Resend code to email",resent:"Verification email has been resent."},phone:{title:"Verify Your Phone Number",subtitle:"Enter the code sent to your phone number.",label:"Phone Verification Code",resend:"Resend code to phone",resent:"Verification SMS has been resent."}},H=e({name:"SaVerifyOtp",props:{channel:{type:String,default:"email"}},setup(e){const r=o(),l=U(),u="login"===l.state().flow?"login":"register",c=t(()=>G[e.channel]),d=s(""),p=s(""),m=s(""),h=s(!1),v=s(L);let g;a(()=>{"email"===e.channel&&r.checkPasskeySupport(),g=setInterval(()=>{v.value=Math.max(0,v.value-1)},1e3)}),i(()=>clearInterval(g));const f=async()=>{p.value="",m.value="";(await A(r.client,e.channel,u)).error?p.value=M(e.channel):m.value=c.value.resent},y=async a=>{if(a.preventDefault(),!h.value){p.value="",h.value=!0;try{const a="email"===e.channel&&await r.checkPasskeySupport(),n=await R({client:r.client,refreshSession:r.refreshSession},{channel:e.channel,flow:u,code:d.value,passkeySupported:a});if(null!==n.error)return void(p.value=n.error);"register_passkey"===n.next?await l.toScreen("registerPasskey"):"verify_email"===n.next?await l.toScreen("verifyEmailOtp"):await l.toApp()}catch{p.value="Verification failed."}finally{h.value=!1}}};return()=>n(I,null,()=>[n("h2",{class:"sa-heading"},c.value.title),n("p",{class:"sa-subtitle"},c.value.subtitle),p.value&&n("p",{class:"sa-error"},p.value),m.value&&n("p",{class:"sa-success"},m.value),n("form",{onSubmit:y},[n("div",[n("span",{class:"sa-label"},[`${c.value.label} `,n("span",{class:"sa-timer"},`(code expires in ${C(v.value)})`)]),n(_,{modelValue:d.value,"onUpdate:modelValue":e=>{d.value=e},length:O,mode:"email"===e.channel?"text":"numeric"}),n("button",{type:"button",class:"sa-link",onClick:f},c.value.resend)]),n("button",{type:"submit",class:"sa-button",disabled:h.value},h.value?"Verifying...":"Verify & Continue"),n("button",{type:"button",class:"sa-link",onClick:()=>l.toScreen("login")},"Back to login")])])}});function J(e={}){return async()=>{const a=o(),n=await a.whenSettled();return n.loading||!n.isAuthenticated?e.redirectTo??a.loginPath:!(void 0!==e.roles&&!a.hasScopedRole(e.roles))||(e.forbiddenRedirectTo??!1)}}function X(e={}){return async()=>{const a=o(),n=await a.whenSettled();return!!n.loading||(!n.isAuthenticated||(e.redirectTo??a.signedInPath))}}const Z=J(),ee=X();function ae(e={}){const a=`/${(e.basePath??"/").replace(/^\/+|\/+$/g,"")}`,n=e=>`${"/"===a?"":a}/${B[e]}`,t=(e,a,t)=>({path:n(e),name:z(e),component:a,...t?{props:t}:{}});return[t("login",j),t("passkeyLogin",Q),t("verifyEmailOtp",H,{channel:"email"}),t("verifyPhoneOtp",H,{channel:"phone"}),t("magicLinkSent",Y),t("verifyMagicLink",K),t("oauthCallback",N),t("registerPasskey",W)]}export{I as SaAuthLayout,q as SaFallbackOptions,j as SaLogin,Y as SaMagicLinkSent,N as SaOAuthCallback,D as SaOAuthProviderButtons,_ as SaOtpInput,Q as SaPasskeyLogin,W as SaRegisterPasskey,K as SaVerifyMagicLink,H as SaVerifyOtp,Z as authGuard,z as authRouteName,B as authRoutePaths,ae as createSeamlessAuthRoutes,ee as guestGuard,J as requireAuth,X as requireGuest,U as useAuthNavigation};
|
|
1
|
+
import{defineComponent as e,onMounted as a,h as n,computed as t,ref as s,watch as i,onBeforeUnmount as r}from"vue";import{u as o}from"./chunks/shared-C2_q4dvU.js";import{fallbackSignInOptions as l,hasFallbackSignInOption as u,startOAuthSignIn as c,isValidEmail as d,isValidPhoneNumber as p,registerWithEmail as m,beginSignIn as v,PASSKEY_SIGN_IN_FAILED as h,MAGIC_LINK_RESEND_COOLDOWN_SECONDS as g,watchMagicLink as f,completeOAuthCallback as y,isOtpCharacter as b,otpCharacters as k,hasNonPasskeyLoginMethod as w,enrollPasskey as x,safeReturnPath as S,getMagicLinkConfirmation as P,magicLinkConfirmationPrompt as L,finishMagicLinkSignIn as C,confirmMagicLinkSignIn as O,OTP_LIFETIME_SECONDS as R,formatCountdown as A,OTP_LENGTH as M,verifyOtp as E,requestOtp as T,otpResendFailedMessage as V}from"@seamless-auth/client";import{useRouter as I,useRoute as $}from"vue-router";const q="seamless-auth-styles";const B=e({name:"SaAuthLayout",props:{card:{type:Boolean,default:!0}},setup(e,{slots:t}){const{styles:s}=o();return a(()=>{s.inject&&function(e){if("undefined"==typeof document||document.getElementById(q))return;const a=document.createElement("style");a.id=q,e&&(a.nonce=e),a.textContent="/*\n * Styles for the bundled Seamless Auth screens of the Angular and Vue bindings\n * (and those that follow). One file, so the screens look the same in every\n * framework. Theme them with the same --seamless-* custom properties the React\n * screens read, or override the .sa-* classes. Every rule is scoped under\n * .sa-auth.\n */\n\n.sa-auth {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--seamless-text, white);\n font-family: inherit;\n}\n\n.sa-auth *,\n.sa-auth *::before,\n.sa-auth *::after {\n box-sizing: border-box;\n}\n\n.sa-auth .sa-card {\n background-color: var(--seamless-surface, #1f2937);\n padding: 2rem;\n border-radius: 0.5rem;\n box-shadow: 0 4px 6px var(--seamless-shadow, rgba(0, 0, 0, 0.1));\n width: 100%;\n max-width: 28rem;\n}\n\n.sa-auth .sa-heading {\n font-size: 1.5rem;\n font-weight: bold;\n margin: 0 0 1.5rem;\n text-align: center;\n color: var(--seamless-text, white);\n}\n\n.sa-auth .sa-subtitle,\n.sa-auth .sa-description {\n color: var(--seamless-text-muted, #d1d5db);\n text-align: center;\n margin: 0 0 1rem;\n}\n\n.sa-auth .sa-input-group {\n margin-bottom: 1rem;\n}\n\n.sa-auth .sa-label {\n display: block;\n color: var(--seamless-text-muted, #d1d5db);\n}\n\n.sa-auth .sa-input {\n width: 100%;\n padding: 0.5rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n margin-top: 0.25rem;\n}\n\n.sa-auth .sa-input:focus,\n.sa-auth .sa-otp-input:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-helper-text {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n}\n\n.sa-auth .sa-error {\n color: var(--seamless-danger, #f87171);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-success {\n color: var(--seamless-success, #68d391);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-button {\n width: 100%;\n border: none;\n background-color: var(--seamless-accent, #2563eb);\n color: var(--seamless-accent-contrast, white);\n padding: 0.5rem;\n border-radius: 0.375rem;\n transition:\n background-color 0.3s,\n opacity 0.3s;\n cursor: pointer;\n margin-top: 1rem;\n font: inherit;\n}\n\n.sa-auth .sa-button:hover:not(:disabled) {\n background-color: var(--seamless-accent-hover, #1d4ed8);\n}\n\n.sa-auth .sa-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-secondary {\n width: 100%;\n margin-top: 0.75rem;\n padding: 0.5rem;\n border-radius: 0.375rem;\n background: transparent;\n color: var(--seamless-text, white);\n border: 1px solid var(--seamless-border, #d1d5db);\n cursor: pointer;\n font: inherit;\n}\n\n.sa-auth .sa-submit-hint {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n text-align: center;\n}\n\n.sa-auth .sa-link {\n margin-top: 1rem;\n width: 100%;\n font-size: 0.875rem;\n color: var(--seamless-accent-soft, #60a5fa);\n text-align: center;\n background: none;\n border: none;\n cursor: pointer;\n font-family: inherit;\n}\n\n.sa-auth .sa-link:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-fallback {\n margin-top: 18px;\n padding: 18px;\n border-radius: 12px;\n background: var(--seamless-surface-raised, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.08));\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.sa-auth .sa-fallback-header {\n font-weight: 600;\n}\n\n.sa-auth .sa-fallback-description {\n margin: 0;\n font-size: 0.875rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-actions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 1rem;\n}\n\n.sa-auth .sa-action {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n width: 100%;\n padding: 12px 14px;\n border-radius: 10px;\n background: var(--seamless-surface, rgba(255, 255, 255, 0.02));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.12));\n color: var(--seamless-text, white);\n cursor: pointer;\n text-align: left;\n font: inherit;\n}\n\n.sa-auth .sa-action:hover {\n border-color: var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-action-title {\n font-weight: 600;\n}\n\n.sa-auth .sa-action-subtext {\n font-size: 0.8rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-otp {\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n margin: 0.75rem 0;\n}\n\n.sa-auth .sa-otp-input {\n width: 2.75rem;\n height: 3rem;\n text-align: center;\n font-size: 1.25rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n}\n\n.sa-auth .sa-timer {\n font-size: 0.75rem;\n color: var(--seamless-warning, #facc15);\n}\n\n.sa-auth .sa-identifier {\n margin: 0.75rem auto;\n padding: 0.25rem 0.75rem;\n width: fit-content;\n border-radius: 999px;\n background: var(--seamless-surface-raised, #4b5563);\n}\n\n.sa-auth .sa-center {\n text-align: center;\n}\n\n.sa-auth .sa-spinner {\n width: 2rem;\n height: 2rem;\n margin: 1rem auto;\n border: 3px solid var(--seamless-border, rgba(255, 255, 255, 0.2));\n border-top-color: var(--seamless-accent, #3b82f6);\n border-radius: 50%;\n animation: sa-spin 0.9s linear infinite;\n}\n\n@keyframes sa-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sa-auth .sa-spinner {\n animation: none;\n }\n}\n",document.head.prepend(a)}(s.nonce)}),()=>n("div",{class:"sa-auth"},[n("div",{class:e.card?"sa-card":"sa-center"},t.default?.())])}}),z=(e,a,t)=>n("button",{type:"button",class:"sa-action",onClick:t},[n("span",{class:"sa-action-title"},e),n("span",{class:"sa-action-subtext"},a)]),U=e({name:"SaFallbackOptions",props:{identifier:{type:String,required:!0},loginMethods:{type:Array,default:null},offerEmailOtp:{type:Boolean,default:!0},offerPasskeyRetry:{type:Boolean,default:!1}},emits:["magicLink","emailOtp","phoneOtp","passkeyRetry"],setup(e,{emit:a}){const s=t(()=>l(e.identifier,e.loginMethods,{emailOtp:e.offerEmailOtp,passkeyRetry:e.offerPasskeyRetry}));return()=>{const e=s.value;return u(e)?n("div",{class:"sa-fallback"},[n("div",{class:"sa-fallback-header"},"Choose a sign-in method"),n("p",{class:"sa-fallback-description"},"Choose another secure sign-in method."),n("div",{class:"sa-actions"},[e.magicLink&&z("Email Magic Link","Send a secure sign-in link to your email",()=>a("magicLink")),e.emailOtp&&z("Email Code","Receive a one-time code by email",()=>a("emailOtp")),e.phoneOtp&&z("Text Message Code","Receive a one-time code via SMS",()=>a("phoneOtp"))]),e.passkeyRetry&&n("button",{type:"button",class:"sa-link",onClick:()=>a("passkeyRetry")},"Try passkey anyway")]):null}}}),D={login:"login",passkeyLogin:"passkey-login",verifyPhoneOtp:"verify-phone-otp",verifyEmailOtp:"verify-email-otp",verifyMagicLink:"verify-magiclink",oauthCallback:"oauth/callback",registerPasskey:"register-passkey",magicLinkSent:"magic-link-sent"},Y=e=>`seamless-auth-${e}`;function F(){const e=I(),a=o();return{toScreen:(a,n)=>e.push({name:Y(a),state:n}),toApp:n=>e.push(n??a.signedInPath),toLocation:a=>{const n=e.options.history.base.replace(/\/+$/,""),t=n&&(a===n||a.startsWith(`${n}/`))?a.slice(n.length)||"/":a;return e.push(t)},state:()=>{const a=e.options.history.state;return a&&"object"==typeof a?a:{}},absoluteUrl:a=>new URL(e.resolve({name:Y(a)}).href,window.location.origin).toString(),dropQuery:()=>e.replace({...e.currentRoute.value,query:{},hash:""})}}const j=e({name:"SaOAuthProviderButtons",props:{redirectUri:{type:String,default:void 0}},setup(e){const t=o(),i=F(),r=s([]),l=s("");a(async()=>{const{data:e}=await t.listOAuthProviders();r.value=e?.providers??[]});return()=>0===r.value.length?null:n("div",{class:"sa-actions"},[...r.value.map(a=>n("button",{key:a.id,type:"button",class:"sa-action",onClick:()=>(async a=>{l.value="";const n=await c({actions:t,oauthRedirect:t.ports.oauthRedirect},{providerId:a,redirectUri:e.redirectUri??i.absoluteUrl("oauthCallback")});n.error&&(l.value=n.error)})(a.id)},[n("span",{class:"sa-action-title"},`Continue with ${a.name}`)])),l.value&&n("p",{class:"sa-error"},l.value)])}}),N=e=>e.target.value,_=e({name:"SaLogin",setup(){const e=o(),r=F(),l=s(e.hasSignedInBefore.value?"login":"register");i(e.hasSignedInBefore,e=>{e&&(l.value="login")});const u=s(""),c=s(""),g=s(""),f=s(""),y=s(""),b=s(!1),k=s(null),w=s(!1),x=t(()=>"login"===l.value?d(u.value)||p(u.value):d(c.value)),S=t(()=>"login"===l.value?u.value?x.value?"Ready to continue.":"This does not look like a complete email or phone number yet.":"Enter your email or phone number to continue.":c.value?x.value?"Ready to continue.":"This does not look like a complete email address yet.":"Enter your email address to continue.");a(()=>{e.loadLoginMethods(),e.checkPasskeySupport()});const P=()=>{u.value&&(g.value=d(u.value)||p(u.value)?"":"Please enter a valid email or phone number")},L=()=>{c.value&&(f.value=d(c.value)?"":"Please enter a valid email")},C=async a=>{if(a.preventDefault(),x.value&&!w.value){y.value="",b.value=!1,w.value=!0;try{if("register"===l.value){const{error:a}=await m(e.client,c.value);return a?void(y.value=a):void await r.toScreen("verifyEmailOtp")}const[a,n]=await Promise.all([e.checkPasskeySupport(),e.loadLoginMethods()]),t=await v(e,{identifier:u.value,passkeySupported:a,configuredMethods:n});if("error"===t.kind)return void(y.value=t.message);if("signed_in"===t.kind)return void await r.toApp();k.value=t.loginMethods,b.value=!0,t.passkeyFailed&&(y.value=h)}catch{y.value="Failed to continue sign-in. Please try again."}finally{w.value=!1}}},O=async()=>{y.value="";const{error:a}=await e.handlePasskeyLogin();a?y.value=h:await r.toApp()},R=async()=>{const{error:a}=await e.client.requestMagicLink();a?y.value="Failed to send magic link.":await r.toScreen("magicLinkSent",{identifier:u.value})},A=async()=>{const{error:a}=await e.client.requestLoginEmailOtp();a?y.value="Failed to send email code.":await r.toScreen("verifyEmailOtp",{flow:"login"})},M=async()=>{const{error:a}=await e.client.requestLoginPhoneOtp();a?y.value="Failed to send OTP.":await r.toScreen("verifyPhoneOtp",{flow:"login"})};return()=>n(B,null,()=>[n("h2",{class:"sa-heading"},"login"===l.value?"Sign In":"Create Account"),n("form",{onSubmit:C},["login"===l.value?n("div",{class:"sa-input-group"},[n("label",{for:"identifier",class:"sa-label"},"Email Address / Phone Number"),n("input",{id:"identifier",type:"text",class:"sa-input",autocomplete:"off",placeholder:"Email or Phone Number",required:!0,value:u.value,onInput:e=>{u.value=N(e)},onBlur:P}),n("p",{class:"sa-helper-text"},"Phone numbers must include a country code e.g. +1"),b.value&&n(U,{identifier:u.value,loginMethods:k.value,offerPasskeyRetry:e.passkeySupported.value,onMagicLink:R,onEmailOtp:A,onPhoneOtp:M,onPasskeyRetry:O}),g.value&&n("p",{class:"sa-error"},g.value)]):n("div",{class:"sa-input-group"},[n("label",{for:"email",class:"sa-label"},"Email Address"),n("input",{id:"email",type:"email",class:"sa-input",autocomplete:"off",required:!0,value:c.value,onInput:e=>{c.value=N(e)},onBlur:L}),f.value&&n("p",{class:"sa-error"},f.value)]),n("button",{type:"submit",class:"sa-button",disabled:!x.value||w.value,"aria-describedby":"seamless-submit-hint"},"login"===l.value?"Login":"Register"),n("p",{id:"seamless-submit-hint",role:"status",class:"sa-submit-hint"},S.value),y.value&&n("p",{class:"sa-error"},y.value),n("button",{type:"button",class:"sa-link",onClick:()=>{l.value="login"===l.value?"register":"login"}},"login"===l.value?"Don't have an account? Create one":"Already have an account? Sign in")]),n(j)])}}),Q=e({name:"SaMagicLinkSent",setup(){const e=o(),t=F(),i=t.state().identifier,l=s(g);let u,c;a(()=>{u=setInterval(()=>{l.value=Math.max(0,l.value-1)},1e3),c=f({client:e.client,refreshSession:e.refreshSession,onSignedIn:()=>{t.toApp()}})}),r(()=>{clearInterval(u),c?.()});const d=async()=>{l.value>0||(await e.client.requestMagicLink(),l.value=g)};return()=>n(B,null,()=>[n("div",{class:"sa-center"},[n("h2",{class:"sa-heading"},"Check your email"),n("p",{class:"sa-description"},"If an account exists for this address, we sent a secure sign-in link."),i&&n("div",{class:"sa-identifier"},i),n("p",{class:"sa-helper-text"},"Open the email and click the link to finish signing in."),n("p",{class:"sa-helper-text"},"Didn't receive anything? Check your spam folder or try creating a new account.")]),n("div",{class:"sa-actions"},[n("button",{type:"button",class:"sa-secondary",disabled:l.value>0,onClick:d},"Resend link"),l.value>0&&n("div",{class:"sa-helper-text sa-center"},`Available in ${l.value}s`),n("button",{type:"button",class:"sa-link",onClick:()=>t.toScreen("login")},"Change email or phone")])])}}),W=e({name:"SaOAuthCallback",setup(){const e=o(),t=F(),i=$(),r=s("");return a(async()=>{const a=new URLSearchParams;for(const e of["code","state"]){const n=i.query[e];"string"==typeof n&&a.set(e,n)}t.dropQuery();const n=await y(e,a,window.location.origin);"error"!==n.kind?"enroll_passkey"!==n.kind?await t.toLocation(n.destination):await t.toScreen("registerPasskey",{returnTo:n.returnTo}):r.value=n.message}),()=>n(B,{card:!1},()=>[n("h2",{class:"sa-heading"},r.value?"Sign-in failed":"Completing sign-in..."),r.value&&[n("p",r.value),n("button",{type:"button",class:"sa-link",onClick:()=>t.toScreen("login")},"Back to login")]])}}),K=e({name:"SaOtpInput",props:{modelValue:{type:String,default:""},length:{type:Number,default:6},mode:{type:String,default:"numeric"},name:{type:String,default:"otp"}},emits:["update:modelValue"],setup(e,{emit:a}){const s=[],i=t(()=>Array.from({length:e.length},(a,n)=>e.modelValue[n]??"")),r=e=>s[e]?.focus(),o=e=>a("update:modelValue",e.join("")),l=(a,n)=>{const t=k(n,e.mode).slice(0,e.length),s=[...i.value];t.forEach((e,n)=>{a+n<s.length&&(s[a+n]=e)}),o(s),r(Math.min(a+t.length,e.length-1))},u=e=>{e.preventDefault(),l(0,e.clipboardData?.getData("text")??"")};return()=>n("div",{class:"sa-otp",role:"group","aria-label":"One-time password input",onPaste:u},i.value.map((a,t)=>n("input",{key:t,ref:e=>{s[t]=e},class:"sa-otp-input",type:"text",inputmode:"numeric"===e.mode?"numeric":"text",autocomplete:"one-time-code",name:`${e.name}-${t}`,maxlength:1,value:a,"aria-label":`Digit ${t+1}`,onInput:a=>((a,n)=>{const t=n.target,s=t.value;if(s.length>1)return void l(a,s);if(s&&!b(s,e.mode))return void(t.value=i.value[a]);const u=[...i.value];u[a]=s,o(u),s&&r(a+1)})(t,a),onKeydown:a=>((a,n)=>{if("Backspace"===n.key){n.preventDefault();const e=[...i.value];e[a]?(e[a]="",o(e)):a>0&&(e[a-1]="",o(e),r(a-1))}"ArrowLeft"===n.key&&a>0&&r(a-1),"ArrowRight"===n.key&&a<e.length-1&&r(a+1)})(t,a)})))}}),G=e({name:"SaPasskeyLogin",setup(){const e=o(),a=F(),t=s(""),i=async()=>{t.value="";(await e.handlePasskeyLogin()).error?t.value="Passkey sign-in could not be completed. Try another sign-in method.":await a.toApp()};return()=>n(B,null,()=>[n("h2",{class:"sa-heading"},"Login with Passkey"),n("button",{type:"button",class:"sa-button",onClick:i},"Use Passkey"),t.value&&n("p",{class:"sa-error"},t.value)])}}),H=e({name:"SaRegisterPasskey",setup(){const e=o(),i=F(),r=i.state().returnTo,l=()=>void 0===r?i.toApp():i.toLocation(S(r)),u=s("idle"),c=s(""),d=t(()=>w(e.loginMethods.value));a(()=>{e.checkPasskeySupport(),e.loadLoginMethods()});const p=async a=>{u.value="loading";const{error:n}=await x({client:e.client,refreshSession:e.refreshSession},a);if(n)return u.value="error",void(c.value=n);u.value="success",c.value="Passkey registered successfully.",await l()},m=async()=>{await e.refreshSession(),await l()},v=()=>"loading"===u.value;return()=>n(B,null,()=>e.passkeySupportLoading.value||e.loginMethodsLoading.value?n("div",{class:"sa-center"},[n("div",{class:"sa-spinner","aria-hidden":"true"}),n("span","Checking for Passkey Support...")]):e.passkeySupported.value?[n("h2",{class:"sa-heading"},"Secure Your Account with a Passkey"),n("p",{class:"sa-description"},"Your device supports passkeys! Register one to skip passwords forever."),n("button",{type:"button",class:"sa-button",disabled:v(),onClick:()=>p()},v()?"Registering...":"Register Passkey"),n("button",{type:"button",class:"sa-secondary",disabled:v(),onClick:()=>p("cross-platform")},"Use a security key instead"),c.value&&n("p",{class:"success"===u.value?"sa-success":"sa-error",role:"status"},c.value),d.value&&n("button",{type:"button",class:"sa-link",disabled:v(),onClick:m},"Skip for now")]:[n("h2",{class:"sa-heading"},"Passkeys are not available here"),n("p",{class:"sa-description"},d.value?"This device does not support passkeys. You can continue without one and add a passkey later from a device that does.":"This device does not support passkeys, and this application requires one to sign in. Try again from a device or browser that supports them."),d.value&&n("button",{type:"button",class:"sa-button",onClick:m},"Continue")])}}),J=e({name:"SaVerifyMagicLink",setup(){const e=o(),t=F(),i=$().query.token,l="string"==typeof i?i:null,u=s(null),c=s(""),d=s(""),p=s("pending"),m=s("");let v,h=!0;r(()=>{h=!1,clearTimeout(v)}),a(async()=>{if(!l)return void(c.value="Missing token for verification.");t.dropQuery();const a=await e.client.verifyMagicLink(l);if(!h)return;if(a.error){const e=P(a.error);return e?void(d.value=L(e)):void(c.value="Failed to verify token")}const n=await C({client:e.client,refreshSession:e.refreshSession});h&&(u.value=n,"signed-in"===n&&(v=setTimeout(()=>{t.toApp()},900)))});const g=()=>{const a="pending"===p.value||"confirming"===p.value;return[n("div",{class:"sa-center"},[n("h1",{class:"sa-heading"},"Confirm this sign-in"),a&&[n("p",{class:"sa-description"},d.value),n("p",{class:"sa-helper-text"},"This link was opened on a different device from the one that asked for it. Only continue if you made that request.")],"confirmed"===p.value&&n("p",{class:"sa-success",role:"status"},"Sign-in approved. You can return to your other device to continue."),"declined"===p.value&&n("p",{class:"sa-helper-text",role:"status"},"No one has been signed in. You can ignore the email and close this page.")]),a&&n("div",{class:"sa-actions"},[n("button",{type:"button",class:"sa-button",disabled:"confirming"===p.value,onClick:()=>{(async()=>{if(!l||"confirming"===p.value)return;p.value="confirming",m.value="";const a=await O({client:e.client,token:l});h&&(a.error?(p.value="pending",m.value="We could not confirm this sign-in. The link may have expired or already been used."):p.value="confirmed")})()}},"Yes, sign in that device"),n("button",{type:"button",class:"sa-secondary",disabled:"confirming"===p.value,onClick:()=>{p.value="declined"}},"No, this wasn't me")]),a&&m.value&&n("p",{class:"sa-error",role:"alert"},m.value)]};return()=>n(B,null,()=>d.value?g():n("div",{class:"sa-center"},[n("h1",{class:"sa-heading"},"Verifying your login"),!u.value&&!c.value&&[n("div",{class:"sa-spinner","aria-hidden":"true"}),n("p",{class:"sa-helper-text"},"Please wait while we securely verify your sign-in link.")],"signed-in"===u.value&&n("p",{class:"sa-success",role:"status"},"Login verified. Redirecting..."),"elsewhere"===u.value&&n("p",{class:"sa-success",role:"status"},"Login verified. Return to the device where you requested this link to continue."),c.value&&n("p",{class:"sa-error",role:"alert"},c.value)]))}}),X={email:{title:"Verify Your Email",subtitle:"We sent you a verification email. Enter the code below.",label:"Email Verification Code",resend:"Resend code to email",resent:"Verification email has been resent."},phone:{title:"Verify Your Phone Number",subtitle:"Enter the code sent to your phone number.",label:"Phone Verification Code",resend:"Resend code to phone",resent:"Verification SMS has been resent."}},Z=e({name:"SaVerifyOtp",props:{channel:{type:String,default:"email"}},setup(e){const i=o(),l=F(),u="login"===l.state().flow?"login":"register",c=t(()=>X[e.channel]),d=s(""),p=s(""),m=s(""),v=s(!1),h=s(R);let g;a(()=>{"email"===e.channel&&i.checkPasskeySupport(),g=setInterval(()=>{h.value=Math.max(0,h.value-1)},1e3)}),r(()=>clearInterval(g));const f=async()=>{p.value="",m.value="";(await T(i.client,e.channel,u)).error?p.value=V(e.channel):m.value=c.value.resent},y=async a=>{if(a.preventDefault(),!v.value){p.value="",v.value=!0;try{const a="email"===e.channel&&await i.checkPasskeySupport(),n=await E({client:i.client,refreshSession:i.refreshSession},{channel:e.channel,flow:u,code:d.value,passkeySupported:a});if(null!==n.error)return void(p.value=n.error);"register_passkey"===n.next?await l.toScreen("registerPasskey"):"verify_email"===n.next?await l.toScreen("verifyEmailOtp"):await l.toApp()}catch{p.value="Verification failed."}finally{v.value=!1}}};return()=>n(B,null,()=>[n("h2",{class:"sa-heading"},c.value.title),n("p",{class:"sa-subtitle"},c.value.subtitle),p.value&&n("p",{class:"sa-error"},p.value),m.value&&n("p",{class:"sa-success"},m.value),n("form",{onSubmit:y},[n("div",[n("span",{class:"sa-label"},[`${c.value.label} `,n("span",{class:"sa-timer"},`(code expires in ${A(h.value)})`)]),n(K,{modelValue:d.value,"onUpdate:modelValue":e=>{d.value=e},length:M,mode:"email"===e.channel?"text":"numeric"}),n("button",{type:"button",class:"sa-link",onClick:f},c.value.resend)]),n("button",{type:"submit",class:"sa-button",disabled:v.value},v.value?"Verifying...":"Verify & Continue"),n("button",{type:"button",class:"sa-link",onClick:()=>l.toScreen("login")},"Back to login")])])}});function ee(e={}){return async()=>{const a=o(),n=await a.whenSettled();return n.loading||!n.isAuthenticated?e.redirectTo??a.loginPath:!(void 0!==e.roles&&!a.hasScopedRole(e.roles))||(e.forbiddenRedirectTo??!1)}}function ae(e={}){return async()=>{const a=o(),n=await a.whenSettled();return!!n.loading||(!n.isAuthenticated||(e.redirectTo??a.signedInPath))}}const ne=ee(),te=ae();function se(e={}){const a=`/${(e.basePath??"/").replace(/^\/+|\/+$/g,"")}`,n=e=>`${"/"===a?"":a}/${D[e]}`,t=(e,a,t)=>({path:n(e),name:Y(e),component:a,...t?{props:t}:{}});return[t("login",_),t("passkeyLogin",G),t("verifyEmailOtp",Z,{channel:"email"}),t("verifyPhoneOtp",Z,{channel:"phone"}),t("magicLinkSent",Q),t("verifyMagicLink",J),t("oauthCallback",W),t("registerPasskey",H)]}export{B as SaAuthLayout,U as SaFallbackOptions,_ as SaLogin,Q as SaMagicLinkSent,W as SaOAuthCallback,j as SaOAuthProviderButtons,K as SaOtpInput,G as SaPasskeyLogin,H as SaRegisterPasskey,J as SaVerifyMagicLink,Z as SaVerifyOtp,ne as authGuard,Y as authRouteName,D as authRoutePaths,se as createSeamlessAuthRoutes,te as guestGuard,ee as requireAuth,ae as requireGuest,F as useAuthNavigation};
|
|
2
2
|
//# sourceMappingURL=router.js.map
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sources":["../src/router/components/AuthLayout.ts","../../../resources/styles/seamless-auth.css","../src/router/components/FallbackOptions.ts","../src/router/paths.ts","../src/router/navigation.ts","../src/router/components/OAuthProviderButtons.ts","../src/router/components/Login.ts","../src/router/components/MagicLinkSent.ts","../src/router/components/OAuthCallback.ts","../src/router/components/OtpInput.ts","../src/router/components/PasskeyLogin.ts","../src/router/components/RegisterPasskey.ts","../src/router/components/VerifyMagicLink.ts","../src/router/components/VerifyOtp.ts","../src/router/guards.ts","../src/router/routes.ts"],"sourcesContent":[null,"/*\n * Styles for the bundled Seamless Auth screens of the Angular and Vue bindings\n * (and those that follow). One file, so the screens look the same in every\n * framework. Theme them with the same --seamless-* custom properties the React\n * screens read, or override the .sa-* classes. Every rule is scoped under\n * .sa-auth.\n */\n\n.sa-auth {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--seamless-text, white);\n font-family: inherit;\n}\n\n.sa-auth *,\n.sa-auth *::before,\n.sa-auth *::after {\n box-sizing: border-box;\n}\n\n.sa-auth .sa-card {\n background-color: var(--seamless-surface, #1f2937);\n padding: 2rem;\n border-radius: 0.5rem;\n box-shadow: 0 4px 6px var(--seamless-shadow, rgba(0, 0, 0, 0.1));\n width: 100%;\n max-width: 28rem;\n}\n\n.sa-auth .sa-heading {\n font-size: 1.5rem;\n font-weight: bold;\n margin: 0 0 1.5rem;\n text-align: center;\n color: var(--seamless-text, white);\n}\n\n.sa-auth .sa-subtitle,\n.sa-auth .sa-description {\n color: var(--seamless-text-muted, #d1d5db);\n text-align: center;\n margin: 0 0 1rem;\n}\n\n.sa-auth .sa-input-group {\n margin-bottom: 1rem;\n}\n\n.sa-auth .sa-label {\n display: block;\n color: var(--seamless-text-muted, #d1d5db);\n}\n\n.sa-auth .sa-input {\n width: 100%;\n padding: 0.5rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n margin-top: 0.25rem;\n}\n\n.sa-auth .sa-input:focus,\n.sa-auth .sa-otp-input:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-helper-text {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n}\n\n.sa-auth .sa-error {\n color: var(--seamless-danger, #f87171);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-success {\n color: var(--seamless-success, #68d391);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-button {\n width: 100%;\n border: none;\n background-color: var(--seamless-accent, #2563eb);\n color: var(--seamless-accent-contrast, white);\n padding: 0.5rem;\n border-radius: 0.375rem;\n transition:\n background-color 0.3s,\n opacity 0.3s;\n cursor: pointer;\n margin-top: 1rem;\n font: inherit;\n}\n\n.sa-auth .sa-button:hover:not(:disabled) {\n background-color: var(--seamless-accent-hover, #1d4ed8);\n}\n\n.sa-auth .sa-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-secondary {\n width: 100%;\n margin-top: 0.75rem;\n padding: 0.5rem;\n border-radius: 0.375rem;\n background: transparent;\n color: var(--seamless-text, white);\n border: 1px solid var(--seamless-border, #d1d5db);\n cursor: pointer;\n font: inherit;\n}\n\n.sa-auth .sa-submit-hint {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n text-align: center;\n}\n\n.sa-auth .sa-link {\n margin-top: 1rem;\n width: 100%;\n font-size: 0.875rem;\n color: var(--seamless-accent-soft, #60a5fa);\n text-align: center;\n background: none;\n border: none;\n cursor: pointer;\n font-family: inherit;\n}\n\n.sa-auth .sa-link:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-fallback {\n margin-top: 18px;\n padding: 18px;\n border-radius: 12px;\n background: var(--seamless-surface-raised, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.08));\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.sa-auth .sa-fallback-header {\n font-weight: 600;\n}\n\n.sa-auth .sa-fallback-description {\n margin: 0;\n font-size: 0.875rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-actions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 1rem;\n}\n\n.sa-auth .sa-action {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n width: 100%;\n padding: 12px 14px;\n border-radius: 10px;\n background: var(--seamless-surface, rgba(255, 255, 255, 0.02));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.12));\n color: var(--seamless-text, white);\n cursor: pointer;\n text-align: left;\n font: inherit;\n}\n\n.sa-auth .sa-action:hover {\n border-color: var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-action-title {\n font-weight: 600;\n}\n\n.sa-auth .sa-action-subtext {\n font-size: 0.8rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-otp {\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n margin: 0.75rem 0;\n}\n\n.sa-auth .sa-otp-input {\n width: 2.75rem;\n height: 3rem;\n text-align: center;\n font-size: 1.25rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n}\n\n.sa-auth .sa-timer {\n font-size: 0.75rem;\n color: var(--seamless-warning, #facc15);\n}\n\n.sa-auth .sa-identifier {\n margin: 0.75rem auto;\n padding: 0.25rem 0.75rem;\n width: fit-content;\n border-radius: 999px;\n background: var(--seamless-surface-raised, #4b5563);\n}\n\n.sa-auth .sa-center {\n text-align: center;\n}\n\n.sa-auth .sa-spinner {\n width: 2rem;\n height: 2rem;\n margin: 1rem auto;\n border: 3px solid var(--seamless-border, rgba(255, 255, 255, 0.2));\n border-top-color: var(--seamless-accent, #3b82f6);\n border-radius: 50%;\n animation: sa-spin 0.9s linear infinite;\n}\n\n@keyframes sa-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sa-auth .sa-spinner {\n animation: none;\n }\n}\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["STYLE_ID","SaAuthLayout","defineComponent","name","props","card","type","Boolean","default","setup","slots","styles","options","useSeamlessAuth","onMounted","inject","nonce","document","getElementById","style","createElement","id","textContent","head","prepend","installStyles","h","class","action","title","subtext","onClick","SaFallbackOptions","identifier","String","required","loginMethods","Array","offerEmailOtp","offerPasskeyRetry","emits","emit","computed","fallbackSignInOptions","emailOtp","passkeyRetry","offered","value","hasFallbackSignInOption","magicLink","phoneOtp","authRoutePaths","login","passkeyLogin","verifyPhoneOtp","verifyEmailOtp","verifyMagicLink","oauthCallback","registerPasskey","magicLinkSent","authRouteName","screen","useAuthNavigation","router","useRouter","auth","toScreen","state","push","toApp","path","signedInPath","toLocation","browserPath","base","history","replace","inApp","startsWith","slice","length","absoluteUrl","URL","resolve","href","window","location","origin","toString","dropQuery","currentRoute","query","hash","SaOAuthProviderButtons","redirectUri","undefined","navigation","providers","ref","error","async","data","listOAuthProviders","map","provider","key","providerId","result","startOAuthSignIn","actions","oauthRedirect","ports","select","valueOf","event","target","SaLogin","mode","hasSignedInBefore","watch","seen","email","identifierError","emailError","formError","showFallbackOptions","submitting","canSubmit","isValidEmail","isValidPhoneNumber","submitHint","loadLoginMethods","checkPasskeySupport","validateIdentifier","validateEmail","submit","preventDefault","registerWithEmail","client","passkeySupported","configuredMethods","Promise","all","step","beginSignIn","kind","message","passkeyFailed","PASSKEY_SIGN_IN_FAILED","retryPasskey","handlePasskeyLogin","sendMagicLink","requestMagicLink","sendEmailOtp","requestLoginEmailOtp","flow","sendPhoneOtp","requestLoginPhoneOtp","onSubmit","for","autocomplete","placeholder","onInput","onBlur","onMagicLink","onEmailOtp","onPhoneOtp","onPasskeyRetry","disabled","role","SaMagicLinkSent","cooldown","MAGIC_LINK_RESEND_COOLDOWN_SECONDS","timer","stopWatching","setInterval","Math","max","watchMagicLink","refreshSession","onSignedIn","onBeforeUnmount","clearInterval","resend","SaOAuthCallback","route","useRoute","params","URLSearchParams","set","outcome","completeOAuthCallback","destination","returnTo","SaOtpInput","modelValue","Number","boxes","chars","from","_","i","focus","index","write","next","join","fill","input","incoming","otpCharacters","forEach","char","offset","min","onPaste","clipboardData","getData","el","inputmode","maxlength","box","typed","isOtpCharacter","onKeydown","SaPasskeyLogin","signIn","SaRegisterPasskey","finish","safeReturnPath","status","canSkip","hasNonPasskeyLoginMethod","register","attachment","enrollPasskey","finishWithoutPasskey","busy","passkeySupportLoading","loginMethodsLoading","SaVerifyMagicLink","tokenParam","token","redirect","active","clearTimeout","finishMagicLinkSignIn","setTimeout","COPY","subtitle","label","resent","phone","SaVerifyOtp","channel","copy","code","resendMessage","loading","secondsLeft","OTP_LIFETIME_SECONDS","requestOtp","otpResendFailedMessage","verifyOtp","formatCountdown","OTP_LENGTH","requireAuth","whenSettled","isAuthenticated","redirectTo","loginPath","roles","hasScopedRole","forbiddenRedirectTo","requireGuest","authGuard","guestGuard","createSeamlessAuthRoutes","basePath","pathOf","component"],"mappings":"+wBAWA,MAAMA,EAAW,uBAmBV,MAAMC,EAAeC,EAAgB,CAC1CC,KAAM,eACNC,MAAO,CACLC,KAAM,CAAEC,KAAMC,QAASC,SAAS,IAElC,KAAAC,CAAML,GAAOM,MAAEA,IACb,MAAQC,OAAQC,GAAYC,IAK5B,OAJAC,EAAU,KACJF,EAAQG,QAxBlB,SAAuBC,GACrB,GAAwB,oBAAbC,UAA4BA,SAASC,eAAelB,GAAW,OAE1E,MAAMmB,EAAQF,SAASG,cAAc,SACrCD,EAAME,GAAKrB,EACPgB,IAAOG,EAAMH,MAAQA,GACzBG,EAAMG,YCpBO,yhLDsBbL,SAASM,KAAKC,QAAQL,EACxB,CAe0BM,CAAcb,EAAQI,SAGrC,IACLU,EAAE,MAAO,CAAEC,MAAO,WAAa,CAC7BD,EAAE,MAAO,CAAEC,MAAOvB,EAAMC,KAAO,UAAY,aAAeK,EAAMF,cAEtE,IEhCIoB,EAAS,CAACC,EAAeC,EAAiBC,IAC9CL,EAAE,SAAU,CAAEpB,KAAM,SAAUqB,MAAO,YAAaI,WAAW,CAC3DL,EAAE,OAAQ,CAAEC,MAAO,mBAAqBE,GACxCH,EAAE,OAAQ,CAAEC,MAAO,qBAAuBG,KAIjCE,EAAoB9B,EAAgB,CAC/CC,KAAM,oBACNC,MAAO,CACL6B,WAAY,CAAE3B,KAAM4B,OAAQC,UAAU,GAEtCC,aAAc,CAAE9B,KAAM+B,MAAyC7B,QAAS,MACxE8B,cAAe,CAAEhC,KAAMC,QAASC,SAAS,GACzC+B,kBAAmB,CAAEjC,KAAMC,QAASC,SAAS,IAE/CgC,MAAO,CAAC,YAAa,WAAY,WAAY,gBAC7C,KAAA/B,CAAML,GAAOqC,KAAEA,IACb,MAAM7B,EAAU8B,EAAS,IACvBC,EAAsBvC,EAAM6B,WAAY7B,EAAMgC,aAAc,CAC1DQ,SAAUxC,EAAMkC,cAChBO,aAAczC,EAAMmC,qBAIxB,MAAO,KACL,MAAMO,EAAUlC,EAAQmC,MACxB,OAAKC,EAAwBF,GAEtBpB,EAAE,MAAO,CAAEC,MAAO,eAAiB,CACxCD,EAAE,MAAO,CAAEC,MAAO,sBAAwB,2BAC1CD,EACE,IACA,CAAEC,MAAO,2BACT,yCAEFD,EAAE,MAAO,CAAEC,MAAO,cAAgB,CAChCmB,EAAQG,WACNrB,EAAO,mBAAoB,2CAA4C,IACrEa,EAAK,cAETK,EAAQF,UACNhB,EAAO,aAAc,mCAAoC,IACvDa,EAAK,aAETK,EAAQI,UACNtB,EAAO,oBAAqB,kCAAmC,IAC7Da,EAAK,eAGXK,EAAQD,cACNnB,EACE,SACA,CAAEpB,KAAM,SAAUqB,MAAO,UAAWI,QAAS,IAAMU,EAAK,iBACxD,wBA3BwC,KA+BlD,ICzDWU,EAAiB,CAC5BC,MAAO,QACPC,aAAc,gBACdC,eAAgB,mBAChBC,eAAgB,mBAChBC,gBAAiB,mBACjBC,cAAe,iBACfC,gBAAiB,mBACjBC,cAAe,mBAKJC,EAAiBC,GAAuB,iBAAiBA,aCZtDC,IACd,MAAMC,EAASC,IACTC,EAAOpD,IAEb,MAAO,CAELqD,SAAU,CAACL,EAAoBM,IAC7BJ,EAAOK,KAAK,CAAEjE,KAAMyD,EAAcC,GAASM,UAE7CE,MAAQC,GAAkBP,EAAOK,KAAKE,GAAQL,EAAKM,cAMnDC,WAAaC,IACX,MAAMC,EAAOX,EAAOnD,QAAQ+D,QAAQD,KAAKE,QAAQ,OAAQ,IACnDC,EACJH,IAASD,IAAgBC,GAAQD,EAAYK,WAAW,GAAGJ,OACvDD,EAAYM,MAAML,EAAKM,SAAW,IAClCP,EACN,OAAOV,EAAOK,KAAKS,IAGrBV,MAAO,KAEL,MAAMA,EAAiBJ,EAAOnD,QAAQ+D,QAAQR,MAC9C,OAAOA,GAA0B,iBAAVA,EAAsBA,EAAuB,CAAA,GAGtEc,YAAcpB,GACZ,IAAIqB,IACFnB,EAAOoB,QAAQ,CAAEhF,KAAMyD,EAAcC,KAAWuB,KAChDC,OAAOC,SAASC,QAChBC,WAMJC,UAAW,IACT1B,EAAOa,QAAQ,IAAKb,EAAO2B,aAAa3C,MAAO4C,MAAO,CAAA,EAAIC,KAAM,KAEtE,CC7CO,MAAMC,EAAyB3F,EAAgB,CACpDC,KAAM,yBACNC,MAAO,CAKL0F,YAAa,CAAExF,KAAM4B,OAAQ1B,aAASuF,IAExC,KAAAtF,CAAML,GACJ,MAAM6D,EAAOpD,IACPmF,EAAalC,IACbmC,EAAYC,EAAqB,IACjCC,EAAQD,EAAI,IAElBpF,EAAUsF,UACR,MAAMC,KAAEA,SAAepC,EAAKqC,qBAC5BL,EAAUlD,MAAQsD,GAAMJ,WAAa,KAiBvC,MAAO,IACsB,IAA3BA,EAAUlD,MAAMiC,OACZ,KACAtD,EAAE,MAAO,CAAEC,MAAO,cAAgB,IAC7BsE,EAAUlD,MAAMwD,IAAIC,GACrB9E,EACE,SACA,CACE+E,IAAKD,EAASnF,GACdf,KAAM,SACNqB,MAAO,YACPI,QAAS,IAzBRqE,OAAOM,IACpBP,EAAMpD,MAAQ,GAEd,MAAM4D,QAAeC,EACnB,CAAEC,QAAS5C,EAAM6C,cAAe7C,EAAK8C,MAAMD,eAC3C,CACEJ,aACAZ,YAAa1F,EAAM0F,aAAeE,EAAWf,YAAY,mBAIzD0B,EAAOR,QAAOA,EAAMpD,MAAQ4D,EAAOR,QAcZa,CAAOR,EAASnF,KAEjC,CACEK,EACE,OACA,CAAEC,MAAO,mBACT,iBAAiB6E,EAASrG,WAKlCgG,EAAMpD,OAASrB,EAAE,IAAK,CAAEC,MAAO,YAAcwE,EAAMpD,QAE7D,ICjDIkE,EAAWC,GAAkBA,EAAMC,OAA4BpE,MAGxDqE,EAAUlH,EAAgB,CACrCC,KAAM,UACN,KAAAM,GACE,MAAMwD,EAAOpD,IACPmF,EAAalC,IAGbuD,EAAOnB,EACXjC,EAAKqD,kBAAkBvE,MAAQ,QAAU,YAE3CwE,EAAMtD,EAAKqD,kBAAmBE,IACxBA,IAAMH,EAAKtE,MAAQ,WAGzB,MAAMd,EAAaiE,EAAI,IACjBuB,EAAQvB,EAAI,IACZwB,EAAkBxB,EAAI,IACtByB,EAAazB,EAAI,IACjB0B,EAAY1B,EAAI,IAChB2B,EAAsB3B,GAAI,GAC1B9D,EAAe8D,EAA0B,MACzC4B,EAAa5B,GAAI,GAEjB6B,EAAYrF,EAAS,IACV,UAAf2E,EAAKtE,MACDiF,EAAa/F,EAAWc,QAAUkF,EAAmBhG,EAAWc,OAEhEiF,EAAaP,EAAM1E,QAKnBmF,EAAaxF,EAAS,IACP,UAAf2E,EAAKtE,MACFd,EAAWc,MACTgF,EAAUhF,MACb,qBACA,gEAH0B,gDAM3B0E,EAAM1E,MACJgF,EAAUhF,MACb,qBACA,wDAHqB,yCAM3BjC,EAAU,KACHmD,EAAKkE,mBACLlE,EAAKmE,wBAGZ,MAAMC,EAAqB,KACpBpG,EAAWc,QAChB2E,EAAgB3E,MACdiF,EAAa/F,EAAWc,QAAUkF,EAAmBhG,EAAWc,OAC5D,GACA,+CAGFuF,EAAgB,KACfb,EAAM1E,QACX4E,EAAW5E,MAAQiF,EAAaP,EAAM1E,OAAS,GAAK,+BAGhDwF,EAASnC,MAAOc,IAEpB,GADAA,EAAMsB,iBACDT,EAAUhF,QAAS+E,EAAW/E,MAAnC,CAEA6E,EAAU7E,MAAQ,GAClB8E,EAAoB9E,OAAQ,EAC5B+E,EAAW/E,OAAQ,EAEnB,IACE,GAAmB,aAAfsE,EAAKtE,MAAsB,CAC7B,MAAMoD,MAAEA,SAAgBsC,EAAkBxE,EAAKyE,OAAQjB,EAAM1E,OAE7D,OAAIoD,OACFyB,EAAU7E,MAAQoD,cAIdH,EAAW9B,SAAS,iBAE5B,CAIA,MAAOyE,EAAkBC,SAA2BC,QAAQC,IAAI,CAC9D7E,EAAKmE,sBACLnE,EAAKkE,qBAGDY,QAAaC,EAAY/E,EAAM,CACnChC,WAAYA,EAAWc,MACvB4F,mBACAC,sBAGF,GAAkB,UAAdG,EAAKE,KAEP,YADArB,EAAU7E,MAAQgG,EAAKG,SAIzB,GAAkB,cAAdH,EAAKE,KAEP,kBADMjD,EAAW3B,QAInBjC,EAAaW,MAAQgG,EAAK3G,aAC1ByF,EAAoB9E,OAAQ,EAExBgG,EAAKI,gBAAevB,EAAU7E,MAAQqG,EAC5C,CAAE,MAGAxB,EAAU7E,MAAQ,+CACpB,SACE+E,EAAW/E,OAAQ,CACrB,CApD0C,GAuDtCsG,EAAejD,UACnBwB,EAAU7E,MAAQ,GAClB,MAAMoD,MAAEA,SAAgBlC,EAAKqF,qBAEzBnD,EACFyB,EAAU7E,MAAQqG,QAIdpD,EAAW3B,SAGbkF,EAAgBnD,UACpB,MAAMD,MAAEA,SAAgBlC,EAAKyE,OAAOc,mBAEhCrD,EACFyB,EAAU7E,MAAQ,mCAIdiD,EAAW9B,SAAS,gBAAiB,CAAEjC,WAAYA,EAAWc,SAGhE0G,EAAerD,UACnB,MAAMD,MAAEA,SAAgBlC,EAAKyE,OAAOgB,uBAEhCvD,EACFyB,EAAU7E,MAAQ,mCAIdiD,EAAW9B,SAAS,iBAAkB,CAAEyF,KAAM,WAGhDC,EAAexD,UACnB,MAAMD,MAAEA,SAAgBlC,EAAKyE,OAAOmB,uBAEhC1D,EACFyB,EAAU7E,MAAQ,4BAIdiD,EAAW9B,SAAS,iBAAkB,CAAEyF,KAAM,WA2DtD,MAAO,IACLjI,EAAEzB,EAAc,KAAM,IAAM,CAC1ByB,EACE,KACA,CAAEC,MAAO,cACM,UAAf0F,EAAKtE,MAAoB,UAAY,kBAEvCrB,EAAE,OAAQ,CAAEoI,SAAUvB,GAAU,CACf,UAAflB,EAAKtE,MA/DTrB,EAAE,MAAO,CAAEC,MAAO,kBAAoB,CACpCD,EACE,QACA,CAAEqI,IAAK,aAAcpI,MAAO,YAC5B,gCAEFD,EAAE,QAAS,CACTL,GAAI,aACJf,KAAM,OACNqB,MAAO,WACPqI,aAAc,MACdC,YAAa,wBACb9H,UAAU,EACVY,MAAOd,EAAWc,MAClBmH,QAAUhD,IACRjF,EAAWc,MAAQkE,EAAQC,IAE7BiD,OAAQ9B,IAEV3G,EACE,IACA,CAAEC,MAAO,kBACT,qDAEFkG,EAAoB9E,OAClBrB,EAAEM,EAAmB,CACnBC,WAAYA,EAAWc,MACvBX,aAAcA,EAAaW,MAC3BR,kBAAmB0B,EAAK0E,iBAAiB5F,MACzCqH,YAAab,EACbc,WAAYZ,EACZa,WAAYV,EACZW,eAAgBlB,IAEpB3B,EAAgB3E,OAASrB,EAAE,IAAK,CAAEC,MAAO,YAAc+F,EAAgB3E,SAIzErB,EAAE,MAAO,CAAEC,MAAO,kBAAoB,CACpCD,EAAE,QAAS,CAAEqI,IAAK,QAASpI,MAAO,YAAc,iBAChDD,EAAE,QAAS,CACTL,GAAI,QACJf,KAAM,QACNqB,MAAO,WACPqI,aAAc,MACd7H,UAAU,EACVY,MAAO0E,EAAM1E,MACbmH,QAAUhD,IACRO,EAAM1E,MAAQkE,EAAQC,IAExBiD,OAAQ7B,IAEVX,EAAW5E,OAASrB,EAAE,IAAK,CAAEC,MAAO,YAAcgG,EAAW5E,SAY3DrB,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,YACP6I,UAAWzC,EAAUhF,OAAS+E,EAAW/E,MACzC,mBAAoB,wBAEP,UAAfsE,EAAKtE,MAAoB,QAAU,YAErCrB,EACE,IACA,CAAEL,GAAI,uBAAwBoJ,KAAM,SAAU9I,MAAO,kBACrDuG,EAAWnF,OAEb6E,EAAU7E,OAASrB,EAAE,IAAK,CAAEC,MAAO,YAAciG,EAAU7E,OAC3DrB,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,UACPI,QAAS,KACPsF,EAAKtE,MAAuB,UAAfsE,EAAKtE,MAAoB,WAAa,UAGxC,UAAfsE,EAAKtE,MACD,oCACA,sCAGRrB,EAAEmE,IAER,IC3QW6E,EAAkBxK,EAAgB,CAC7CC,KAAM,kBACN,KAAAM,GACE,MAAMwD,EAAOpD,IACPmF,EAAalC,IACb7B,EAAa+D,EAAW7B,QAAgClC,WACxD0I,EAAWzE,EAAI0E,GACrB,IAAIC,EACAC,EAGJhK,EAAU,KACR+J,EAAQE,YAAY,KAClBJ,EAAS5H,MAAQiI,KAAKC,IAAI,EAAGN,EAAS5H,MAAQ,IAC7C,KAEH+H,EAAeI,EAAe,CAC5BxC,OAAQzE,EAAKyE,OACbyC,eAAgBlH,EAAKkH,eACrBC,WAAY,KAAWpF,EAAW3B,aAItCgH,EAAgB,KACdC,cAAcT,GACdC,QAGF,MAAMS,EAASnF,UACTuE,EAAS5H,MAAQ,UACfkB,EAAKyE,OAAOc,mBAClBmB,EAAS5H,MAAQ6H,IAGnB,MAAO,IACLlJ,EAAEzB,EAAc,KAAM,IAAM,CAC1ByB,EAAE,MAAO,CAAEC,MAAO,aAAe,CAC/BD,EAAE,KAAM,CAAEC,MAAO,cAAgB,oBACjCD,EACE,IACA,CAAEC,MAAO,kBACT,yEAEFM,GAAcP,EAAE,MAAO,CAAEC,MAAO,iBAAmBM,GACnDP,EACE,IACA,CAAEC,MAAO,kBACT,2DAEFD,EACE,IACA,CAAEC,MAAO,kBACT,oFAGJD,EAAE,MAAO,CAAEC,MAAO,cAAgB,CAChCD,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,eACP6I,SAAUG,EAAS5H,MAAQ,EAC3BhB,QAASwJ,GAEX,eAEFZ,EAAS5H,MAAQ,GACfrB,EACE,MACA,CAAEC,MAAO,4BACT,gBAAgBgJ,EAAS5H,UAE7BrB,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,UACPI,QAAS,IAAMiE,EAAW9B,SAAS,UAErC,4BAIV,ICzFWsH,EAAkBtL,EAAgB,CAC7CC,KAAM,kBACN,KAAAM,GACE,MAAMwD,EAAOpD,IACPmF,EAAalC,IACb2H,EAAQC,IACRvF,EAAQD,EAAI,IA6BlB,OAzBApF,EAAUsF,UACR,MAAMuF,EAAS,IAAIC,gBACnB,IAAK,MAAMzL,IAAQ,CAAC,OAAQ,SAAU,CACpC,MAAM4C,EAAQ0I,EAAM9F,MAAMxF,GACL,iBAAV4C,GAAoB4I,EAAOE,IAAI1L,EAAM4C,EAClD,CAGKiD,EAAWP,YAEhB,MAAMqG,QAAgBC,EAAsB9H,EAAM0H,EAAQtG,OAAOC,SAASC,QAErD,UAAjBuG,EAAQ7C,KAKS,mBAAjB6C,EAAQ7C,WAKNjD,EAAWxB,WAAWsH,EAAQE,mBAJ5BhG,EAAW9B,SAAS,kBAAmB,CAAE+H,SAAUH,EAAQG,WALjE9F,EAAMpD,MAAQ+I,EAAQ5C,UAYnB,IACLxH,EAAEzB,EAAc,CAAEI,MAAM,GAAS,IAAM,CACrCqB,EACE,KACA,CAAEC,MAAO,cACTwE,EAAMpD,MAAQ,iBAAmB,yBAEnCoD,EAAMpD,OAAS,CACbrB,EAAE,IAAKyE,EAAMpD,OACbrB,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,UACPI,QAAS,IAAMiE,EAAW9B,SAAS,UAErC,mBAIV,IC5DWgI,EAAahM,EAAgB,CACxCC,KAAM,aACNC,MAAO,CACL+L,WAAY,CAAE7L,KAAM4B,OAAQ1B,QAAS,IACrCwE,OAAQ,CAAE1E,KAAM8L,OAAQ5L,QAAS,GACjC6G,KAAM,CAAE/G,KAAM4B,OAAkC1B,QAAS,WACzDL,KAAM,CAAEG,KAAM4B,OAAQ1B,QAAS,QAEjCgC,MAAO,CAAC,qBACR,KAAA/B,CAAML,GAAOqC,KAAEA,IACb,MAAM4J,EAAqC,GAErCC,EAAQ5J,EAAS,IACrBL,MAAMkK,KAAK,CAAEvH,OAAQ5E,EAAM4E,QAAU,CAACwH,EAAGC,IAAMrM,EAAM+L,WAAWM,IAAM,KAGlEC,EAASC,GAAkBN,EAAMM,IAAQD,QACzCE,EAASC,GAAmBpK,EAAK,oBAAqBoK,EAAKC,KAAK,KAEhEC,EAAO,CAACJ,EAAeK,KAC3B,MAAMC,EAAWC,EAAcF,EAAO5M,EAAMiH,MAAMtC,MAAM,EAAG3E,EAAM4E,QAC3D6H,EAAO,IAAIP,EAAMvJ,OAEvBkK,EAASE,QAAQ,CAACC,EAAMC,KAClBV,EAAQU,EAASR,EAAK7H,SAAQ6H,EAAKF,EAAQU,GAAUD,KAG3DR,EAAMC,GACNH,EAAM1B,KAAKsC,IAAIX,EAAQM,EAASjI,OAAQ5E,EAAM4E,OAAS,KA6CnDuI,EAAWrG,IACfA,EAAMsB,iBACNuE,EAAK,EAAG7F,EAAMsG,eAAeC,QAAQ,SAAW,KAGlD,MAAO,IACL/L,EACE,MACA,CACEC,MAAO,SACP8I,KAAM,QACN,aAAc,0BACd8C,WAEFjB,EAAMvJ,MAAMwD,IAAI,CAAC6G,EAAMX,IACrB/K,EAAE,QAAS,CACT+E,IAAKgG,EACLvG,IAAMwH,IACJrB,EAAMI,GAAKiB,GAEb/L,MAAO,eACPrB,KAAM,OACNqN,UAA0B,YAAfvN,EAAMiH,KAAqB,UAAY,OAClD2C,aAAc,gBACd7J,KAAM,GAAGC,EAAMD,QAAQsM,IACvBmB,UAAW,EACX7K,MAAOqK,EACP,aAAc,SAASX,EAAI,IAC3BvC,QAAUhD,GAtEF,EAACyF,EAAezF,KAC9B,MAAM2G,EAAM3G,EAAMC,OACZ2G,EAAQD,EAAI9K,MAElB,GAAI+K,EAAM9I,OAAS,EAEjB,YADA+H,EAAKJ,EAAOmB,GAId,GAAIA,IAAUC,EAAeD,EAAO1N,EAAMiH,MAIxC,YADAwG,EAAI9K,MAAQuJ,EAAMvJ,MAAM4J,IAI1B,MAAME,EAAO,IAAIP,EAAMvJ,OACvB8J,EAAKF,GAASmB,EACdlB,EAAMC,GAEFiB,GAAOpB,EAAMC,EAAQ,IAkDQzC,CAAQuC,EAAGvF,GACtC8G,UAAY9G,GAhDF,EAACyF,EAAezF,KAChC,GAAkB,cAAdA,EAAMT,IAAqB,CAC7BS,EAAMsB,iBACN,MAAMqE,EAAO,IAAIP,EAAMvJ,OAEnB8J,EAAKF,IACPE,EAAKF,GAAS,GACdC,EAAMC,IACGF,EAAQ,IACjBE,EAAKF,EAAQ,GAAK,GAClBC,EAAMC,GACNH,EAAMC,EAAQ,GAElB,CAEkB,cAAdzF,EAAMT,KAAuBkG,EAAQ,GAAGD,EAAMC,EAAQ,GACxC,eAAdzF,EAAMT,KAAwBkG,EAAQvM,EAAM4E,OAAS,GAAG0H,EAAMC,EAAQ,IAgC/BqB,CAAUvB,EAAGvF,MAI5D,ICvGW+G,EAAiB/N,EAAgB,CAC5CC,KAAM,iBACN,KAAAM,GACE,MAAMwD,EAAOpD,IACPmF,EAAalC,IACbqC,EAAQD,EAAI,IAEZgI,EAAS9H,UACbD,EAAMpD,MAAQ,UACOkB,EAAKqF,sBAEfnD,MACTA,EAAMpD,MACJ,4EAIEiD,EAAW3B,SAGnB,MAAO,IACL3C,EAAEzB,EAAc,KAAM,IAAM,CAC1ByB,EAAE,KAAM,CAAEC,MAAO,cAAgB,sBACjCD,EACE,SACA,CAAEpB,KAAM,SAAUqB,MAAO,YAAaI,QAASmM,GAC/C,eAEF/H,EAAMpD,OAASrB,EAAE,IAAK,CAAEC,MAAO,YAAcwE,EAAMpD,QAEzD,ICpBWoL,EAAoBjO,EAAgB,CAC/CC,KAAM,oBACN,KAAAM,GACE,MAAMwD,EAAOpD,IACPmF,EAAalC,IAGbmI,EAAWjG,EAAW7B,QAA+B8H,SACrDmC,EAAS,SACArI,IAAbkG,EACIjG,EAAW3B,QACX2B,EAAWxB,WAAW6J,EAAepC,IAErCqC,EAASpI,EAA8C,QACvDgD,EAAUhD,EAAI,IAIdqI,EAAU7L,EAAS,IAAM8L,EAAyBvK,EAAK7B,aAAaW,QAE1EjC,EAAU,KACHmD,EAAKmE,sBACLnE,EAAKkE,qBAGZ,MAAMsG,EAAWrI,MAAOsI,IACtBJ,EAAOvL,MAAQ,UAEf,MAAMoD,MAAEA,SAAgBwI,EACtB,CAAEjG,OAAQzE,EAAKyE,OAAQyC,eAAgBlH,EAAKkH,gBAC5CuD,GAGF,GAAIvI,EAGF,OAFAmI,EAAOvL,MAAQ,aACfmG,EAAQnG,MAAQoD,GAIlBmI,EAAOvL,MAAQ,UACfmG,EAAQnG,MAAQ,yCACVqL,KAGFQ,EAAuBxI,gBACrBnC,EAAKkH,uBACLiD,KAGFS,EAAO,IAAuB,YAAjBP,EAAOvL,MAoE1B,MAAO,IACLrB,EAAEzB,EAAc,KAAM,IACpBgE,EAAK6K,sBAAsB/L,OAASkB,EAAK8K,oBAAoBhM,MACzDrB,EAAE,MAAO,CAAEC,MAAO,aAAe,CAC/BD,EAAE,MAAO,CAAEC,MAAO,aAAc,cAAe,SAC/CD,EAAE,OAAQ,qCAEZuC,EAAK0E,iBAAiB5F,MAxDN,CACtBrB,EAAE,KAAM,CAAEC,MAAO,cAAgB,sCACjCD,EACE,IACA,CAAEC,MAAO,kBACT,0EAEFD,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,YACP6I,SAAUqE,IACV9M,QAAS,IAAM0M,KAEjBI,IAAS,iBAAmB,oBAE9BnN,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,eACP6I,SAAUqE,IACV9M,QAAS,IAAM0M,EAAS,mBAE1B,8BAEFvF,EAAQnG,OACNrB,EACE,IACA,CACEC,MAAwB,YAAjB2M,EAAOvL,MAAsB,aAAe,WACnD0H,KAAM,UAERvB,EAAQnG,OAEZwL,EAAQxL,OACNrB,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,UACP6I,SAAUqE,IACV9M,QAAS6M,GAEX,iBA9DoB,CACxBlN,EAAE,KAAM,CAAEC,MAAO,cAAgB,mCACjCD,EACE,IACA,CAAEC,MAAO,kBACT4M,EAAQxL,MACJ,uHACA,+IAENwL,EAAQxL,OACNrB,EACE,SACA,CAAEpB,KAAM,SAAUqB,MAAO,YAAaI,QAAS6M,GAC/C,aAgER,ICpIWI,EAAoB9O,EAAgB,CAC/CC,KAAM,oBACN,KAAAM,GACE,MAAMwD,EAAOpD,IACPmF,EAAalC,IACbmL,EAAavD,IAAW/F,MAAMuJ,MAC9BA,EAA8B,iBAAfD,EAA0BA,EAAa,KAEtDnD,EAAU5F,EAA6B,MACvCC,EAAQD,EAAI,IAClB,IACIiJ,EADAC,GAAS,EA2Cb,OAxCA/D,EAAgB,KACd+D,GAAS,EACTC,aAAaF,KAKfrO,EAAUsF,UACR,IAAK8I,EAEH,YADA/I,EAAMpD,MAAQ,mCAKXiD,EAAWP,YAGhB,MAAMkB,QAAe1C,EAAKyE,OAAOlF,gBAAgB0L,GAEjD,IAAKE,EAAQ,OAEb,GAAIzI,EAAOR,MAET,YADAA,EAAMpD,MAAQ,0BAIhB,MAAM8J,QAAayC,EAAsB,CACvC5G,OAAQzE,EAAKyE,OACbyC,eAAgBlH,EAAKkH,iBAGlBiE,IAELtD,EAAQ/I,MAAQ8J,EAEH,cAATA,IACFsC,EAAWI,WAAW,KAAWvJ,EAAW3B,SAAS,SAIlD,IACL3C,EAAEzB,EAAc,KAAM,IACpByB,EAAE,MAAO,CAAEC,MAAO,aAAe,CAC/BD,EAAE,KAAM,CAAEC,MAAO,cAAgB,yBAChCmK,EAAQ/I,QACNoD,EAAMpD,OAAS,CACdrB,EAAE,MAAO,CAAEC,MAAO,aAAc,cAAe,SAC/CD,EACE,IACA,CAAEC,MAAO,kBACT,4DAGY,cAAlBmK,EAAQ/I,OACNrB,EACE,IACA,CAAEC,MAAO,aAAc8I,KAAM,UAC7B,kCAEc,cAAlBqB,EAAQ/I,OACNrB,EACE,IACA,CAAEC,MAAO,aAAc8I,KAAM,UAC7B,mFAEJtE,EAAMpD,OAASrB,EAAE,IAAK,CAAEC,MAAO,WAAY8I,KAAM,SAAWtE,EAAMpD,SAG1E,ICtEIyM,EAAO,CACX/H,MAAO,CACL5F,MAAO,oBACP4N,SAAU,0DACVC,MAAO,0BACPnE,OAAQ,uBACRoE,OAAQ,uCAEVC,MAAO,CACL/N,MAAO,2BACP4N,SAAU,4CACVC,MAAO,0BACPnE,OAAQ,uBACRoE,OAAQ,sCASCE,EAAc3P,EAAgB,CACzCC,KAAM,cACNC,MAAO,CACL0P,QAAS,CAAExP,KAAM4B,OAAgC1B,QAAS,UAE5D,KAAAC,CAAML,GACJ,MAAM6D,EAAOpD,IACPmF,EAAalC,IACb6F,EAC0C,UAA9C3D,EAAW7B,QAA0BwF,KAAmB,QAAU,WAE9DoG,EAAOrN,EAAS,IAAM8M,EAAKpP,EAAM0P,UACjCE,EAAO9J,EAAI,IACXC,EAAQD,EAAI,IACZ+J,EAAgB/J,EAAI,IACpBgK,EAAUhK,GAAI,GACdiK,EAAcjK,EAAIkK,GACxB,IAAIvF,EAEJ/J,EAAU,KAEc,UAAlBV,EAAM0P,SAA0B7L,EAAKmE,sBAEzCyC,EAAQE,YAAY,KAClBoF,EAAYpN,MAAQiI,KAAKC,IAAI,EAAGkF,EAAYpN,MAAQ,IACnD,OAELsI,EAAgB,IAAMC,cAAcT,IAEpC,MAAMU,EAASnF,UACbD,EAAMpD,MAAQ,GACdkN,EAAclN,MAAQ,UAEDsN,EAAWpM,EAAKyE,OAAQtI,EAAM0P,QAASnG,IAEjDxD,MACTA,EAAMpD,MAAQuN,EAAuBlQ,EAAM0P,SAI7CG,EAAclN,MAAQgN,EAAKhN,MAAM4M,QAG7BpH,EAASnC,MAAOc,IAEpB,GADAA,EAAMsB,kBACF0H,EAAQnN,MAAZ,CACAoD,EAAMpD,MAAQ,GACdmN,EAAQnN,OAAQ,EAEhB,IACE,MAAM4F,EACc,UAAlBvI,EAAM0P,eAA4B7L,EAAKmE,sBAEnCzB,QAAe4J,EACnB,CAAE7H,OAAQzE,EAAKyE,OAAQyC,eAAgBlH,EAAKkH,gBAC5C,CAAE2E,QAAS1P,EAAM0P,QAASnG,OAAMqG,KAAMA,EAAKjN,MAAO4F,qBAGpD,GAAqB,OAAjBhC,EAAOR,MAET,YADAA,EAAMpD,MAAQ4D,EAAOR,OAIH,qBAAhBQ,EAAOkG,WACH7G,EAAW9B,SAAS,mBACH,iBAAhByC,EAAOkG,WACR7G,EAAW9B,SAAS,wBACjB8B,EAAW3B,OACxB,CAAE,MAEA8B,EAAMpD,MAAQ,sBAChB,SACEmN,EAAQnN,OAAQ,CAClB,CA5BmB,GA+BrB,MAAO,IACLrB,EAAEzB,EAAc,KAAM,IAAM,CAC1ByB,EAAE,KAAM,CAAEC,MAAO,cAAgBoO,EAAKhN,MAAMlB,OAC5CH,EAAE,IAAK,CAAEC,MAAO,eAAiBoO,EAAKhN,MAAM0M,UAC5CtJ,EAAMpD,OAASrB,EAAE,IAAK,CAAEC,MAAO,YAAcwE,EAAMpD,OACnDkN,EAAclN,OAASrB,EAAE,IAAK,CAAEC,MAAO,cAAgBsO,EAAclN,OACrErB,EAAE,OAAQ,CAAEoI,SAAUvB,GAAU,CAC9B7G,EAAE,MAAO,CACPA,EAAE,OAAQ,CAAEC,MAAO,YAAc,CAC/B,GAAGoO,EAAKhN,MAAM2M,SACdhO,EACE,OACA,CAAEC,MAAO,YACT,oBAAoB6O,EAAgBL,EAAYpN,aAGpDrB,EAAEwK,EAAY,CACZC,WAAY6D,EAAKjN,MACjB,sBAAwBA,IACtBiN,EAAKjN,MAAQA,GAEfiC,OAAQyL,EACRpJ,KAAwB,UAAlBjH,EAAM0P,QAAsB,OAAS,YAE7CpO,EACE,SACA,CAAEpB,KAAM,SAAUqB,MAAO,UAAWI,QAASwJ,GAC7CwE,EAAKhN,MAAMwI,UAGf7J,EACE,SACA,CAAEpB,KAAM,SAAUqB,MAAO,YAAa6I,SAAU0F,EAAQnN,OACxDmN,EAAQnN,MAAQ,eAAiB,qBAEnCrB,EACE,SACA,CACEpB,KAAM,SACNqB,MAAO,UACPI,QAAS,IAAMiE,EAAW9B,SAAS,UAErC,oBAIV,IChJI,SAAUwM,EAAY9P,EAA8B,IACxD,OAAOwF,UAEL,MAAMnC,EAAOpD,IACPsD,QAAcF,EAAK0M,cAKzB,OAAIxM,EAAM+L,UAAY/L,EAAMyM,gBACnBhQ,EAAQiQ,YAAc5M,EAAK6M,iBAGd/K,IAAlBnF,EAAQmQ,QAAwB9M,EAAK+M,cAAcpQ,EAAQmQ,UACtDnQ,EAAQqQ,sBAAuB,GAK5C,CAMM,SAAUC,EACdtQ,EAA6C,IAE7C,OAAOwF,UACL,MAAMnC,EAAOpD,IACPsD,QAAcF,EAAK0M,cAEzB,QAAIxM,EAAM+L,WAIH/L,EAAMyM,kBAAmBhQ,EAAQiQ,YAAc5M,EAAKM,eAE/D,CAGO,MAAM4M,EAA+BT,IAG/BU,GAAgCF,IC1CvC,SAAUG,GACdzQ,EAAqC,IAErC,MAAM8D,EAAO,KAAK9D,EAAQ0Q,UAAY,KAAK1M,QAAQ,aAAc,MAC3D2M,EAAU1N,GACd,GAAY,MAATa,EAAe,GAAKA,KAAQvB,EAAeU,KAC1C4H,EAAQ,CACZ5H,EACA2N,EACApR,KAA8B,CAE9BkE,KAAMiN,EAAO1N,GACb1D,KAAMyD,EAAcC,GACpB2N,eACIpR,EAAQ,CAAEA,SAAU,KAG1B,MAAO,CACLqL,EAAM,QAASrE,GACfqE,EAAM,eAAgBwC,GACtBxC,EAAM,iBAAkBoE,EAAa,CAAEC,QAAS,UAChDrE,EAAM,iBAAkBoE,EAAa,CAAEC,QAAS,UAChDrE,EAAM,gBAAiBf,GACvBe,EAAM,kBAAmBuD,GACzBvD,EAAM,gBAAiBD,GACvBC,EAAM,kBAAmB0C,GAE7B"}
|
|
1
|
+
{"version":3,"file":"router.js","sources":["../src/router/components/AuthLayout.ts","../../../resources/styles/seamless-auth.css","../src/router/components/FallbackOptions.ts","../src/router/paths.ts","../src/router/navigation.ts","../src/router/components/OAuthProviderButtons.ts","../src/router/components/Login.ts","../src/router/components/MagicLinkSent.ts","../src/router/components/OAuthCallback.ts","../src/router/components/OtpInput.ts","../src/router/components/PasskeyLogin.ts","../src/router/components/RegisterPasskey.ts","../src/router/components/VerifyMagicLink.ts","../src/router/components/VerifyOtp.ts","../src/router/guards.ts","../src/router/routes.ts"],"sourcesContent":[null,"/*\n * Styles for the bundled Seamless Auth screens of the Angular and Vue bindings\n * (and those that follow). One file, so the screens look the same in every\n * framework. Theme them with the same --seamless-* custom properties the React\n * screens read, or override the .sa-* classes. Every rule is scoped under\n * .sa-auth.\n */\n\n.sa-auth {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--seamless-text, white);\n font-family: inherit;\n}\n\n.sa-auth *,\n.sa-auth *::before,\n.sa-auth *::after {\n box-sizing: border-box;\n}\n\n.sa-auth .sa-card {\n background-color: var(--seamless-surface, #1f2937);\n padding: 2rem;\n border-radius: 0.5rem;\n box-shadow: 0 4px 6px var(--seamless-shadow, rgba(0, 0, 0, 0.1));\n width: 100%;\n max-width: 28rem;\n}\n\n.sa-auth .sa-heading {\n font-size: 1.5rem;\n font-weight: bold;\n margin: 0 0 1.5rem;\n text-align: center;\n color: var(--seamless-text, white);\n}\n\n.sa-auth .sa-subtitle,\n.sa-auth .sa-description {\n color: var(--seamless-text-muted, #d1d5db);\n text-align: center;\n margin: 0 0 1rem;\n}\n\n.sa-auth .sa-input-group {\n margin-bottom: 1rem;\n}\n\n.sa-auth .sa-label {\n display: block;\n color: var(--seamless-text-muted, #d1d5db);\n}\n\n.sa-auth .sa-input {\n width: 100%;\n padding: 0.5rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n margin-top: 0.25rem;\n}\n\n.sa-auth .sa-input:focus,\n.sa-auth .sa-otp-input:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-helper-text {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n}\n\n.sa-auth .sa-error {\n color: var(--seamless-danger, #f87171);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-success {\n color: var(--seamless-success, #68d391);\n font-size: 0.875rem;\n}\n\n.sa-auth .sa-button {\n width: 100%;\n border: none;\n background-color: var(--seamless-accent, #2563eb);\n color: var(--seamless-accent-contrast, white);\n padding: 0.5rem;\n border-radius: 0.375rem;\n transition:\n background-color 0.3s,\n opacity 0.3s;\n cursor: pointer;\n margin-top: 1rem;\n font: inherit;\n}\n\n.sa-auth .sa-button:hover:not(:disabled) {\n background-color: var(--seamless-accent-hover, #1d4ed8);\n}\n\n.sa-auth .sa-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-secondary {\n width: 100%;\n margin-top: 0.75rem;\n padding: 0.5rem;\n border-radius: 0.375rem;\n background: transparent;\n color: var(--seamless-text, white);\n border: 1px solid var(--seamless-border, #d1d5db);\n cursor: pointer;\n font: inherit;\n}\n\n.sa-auth .sa-submit-hint {\n font-size: 0.75rem;\n color: var(--seamless-text-muted, #9ca3af);\n margin-top: 0.5rem;\n text-align: center;\n}\n\n.sa-auth .sa-link {\n margin-top: 1rem;\n width: 100%;\n font-size: 0.875rem;\n color: var(--seamless-accent-soft, #60a5fa);\n text-align: center;\n background: none;\n border: none;\n cursor: pointer;\n font-family: inherit;\n}\n\n.sa-auth .sa-link:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sa-auth .sa-fallback {\n margin-top: 18px;\n padding: 18px;\n border-radius: 12px;\n background: var(--seamless-surface-raised, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.08));\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.sa-auth .sa-fallback-header {\n font-weight: 600;\n}\n\n.sa-auth .sa-fallback-description {\n margin: 0;\n font-size: 0.875rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-actions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 1rem;\n}\n\n.sa-auth .sa-action {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n width: 100%;\n padding: 12px 14px;\n border-radius: 10px;\n background: var(--seamless-surface, rgba(255, 255, 255, 0.02));\n border: 1px solid var(--seamless-border, rgba(255, 255, 255, 0.12));\n color: var(--seamless-text, white);\n cursor: pointer;\n text-align: left;\n font: inherit;\n}\n\n.sa-auth .sa-action:hover {\n border-color: var(--seamless-accent, #3b82f6);\n}\n\n.sa-auth .sa-action-title {\n font-weight: 600;\n}\n\n.sa-auth .sa-action-subtext {\n font-size: 0.8rem;\n color: var(--seamless-text-muted, #9ca3af);\n}\n\n.sa-auth .sa-otp {\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n margin: 0.75rem 0;\n}\n\n.sa-auth .sa-otp-input {\n width: 2.75rem;\n height: 3rem;\n text-align: center;\n font-size: 1.25rem;\n color: inherit;\n background-color: var(--seamless-surface-raised, #4b5563);\n border: 1px solid var(--seamless-border, #d1d5db);\n border-radius: 0.375rem;\n}\n\n.sa-auth .sa-timer {\n font-size: 0.75rem;\n color: var(--seamless-warning, #facc15);\n}\n\n.sa-auth .sa-identifier {\n margin: 0.75rem auto;\n padding: 0.25rem 0.75rem;\n width: fit-content;\n border-radius: 999px;\n background: var(--seamless-surface-raised, #4b5563);\n}\n\n.sa-auth .sa-center {\n text-align: center;\n}\n\n.sa-auth .sa-spinner {\n width: 2rem;\n height: 2rem;\n margin: 1rem auto;\n border: 3px solid var(--seamless-border, rgba(255, 255, 255, 0.2));\n border-top-color: var(--seamless-accent, #3b82f6);\n border-radius: 50%;\n animation: sa-spin 0.9s linear infinite;\n}\n\n@keyframes sa-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sa-auth .sa-spinner {\n animation: none;\n }\n}\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["STYLE_ID","SaAuthLayout","defineComponent","name","props","card","type","Boolean","default","setup","slots","styles","options","useSeamlessAuth","onMounted","inject","nonce","document","getElementById","style","createElement","id","textContent","head","prepend","installStyles","h","class","action","title","subtext","onClick","SaFallbackOptions","identifier","String","required","loginMethods","Array","offerEmailOtp","offerPasskeyRetry","emits","emit","computed","fallbackSignInOptions","emailOtp","passkeyRetry","offered","value","hasFallbackSignInOption","magicLink","phoneOtp","authRoutePaths","login","passkeyLogin","verifyPhoneOtp","verifyEmailOtp","verifyMagicLink","oauthCallback","registerPasskey","magicLinkSent","authRouteName","screen","useAuthNavigation","router","useRouter","auth","toScreen","state","push","toApp","path","signedInPath","toLocation","browserPath","base","history","replace","inApp","startsWith","slice","length","absoluteUrl","URL","resolve","href","window","location","origin","toString","dropQuery","currentRoute","query","hash","SaOAuthProviderButtons","redirectUri","undefined","navigation","providers","ref","error","async","data","listOAuthProviders","map","provider","key","providerId","result","startOAuthSignIn","actions","oauthRedirect","ports","select","valueOf","event","target","SaLogin","mode","hasSignedInBefore","watch","seen","email","identifierError","emailError","formError","showFallbackOptions","submitting","canSubmit","isValidEmail","isValidPhoneNumber","submitHint","loadLoginMethods","checkPasskeySupport","validateIdentifier","validateEmail","submit","preventDefault","registerWithEmail","client","passkeySupported","configuredMethods","Promise","all","step","beginSignIn","kind","message","passkeyFailed","PASSKEY_SIGN_IN_FAILED","retryPasskey","handlePasskeyLogin","sendMagicLink","requestMagicLink","sendEmailOtp","requestLoginEmailOtp","flow","sendPhoneOtp","requestLoginPhoneOtp","onSubmit","for","autocomplete","placeholder","onInput","onBlur","onMagicLink","onEmailOtp","onPhoneOtp","onPasskeyRetry","disabled","role","SaMagicLinkSent","cooldown","MAGIC_LINK_RESEND_COOLDOWN_SECONDS","timer","stopWatching","setInterval","Math","max","watchMagicLink","refreshSession","onSignedIn","onBeforeUnmount","clearInterval","resend","SaOAuthCallback","route","useRoute","params","URLSearchParams","set","outcome","completeOAuthCallback","destination","returnTo","SaOtpInput","modelValue","Number","boxes","chars","from","_","i","focus","index","write","next","join","fill","input","incoming","otpCharacters","forEach","char","offset","min","onPaste","clipboardData","getData","el","inputmode","maxlength","box","typed","isOtpCharacter","onKeydown","SaPasskeyLogin","signIn","SaRegisterPasskey","finish","safeReturnPath","status","canSkip","hasNonPasskeyLoginMethod","register","attachment","enrollPasskey","finishWithoutPasskey","busy","passkeySupportLoading","loginMethodsLoading","SaVerifyMagicLink","tokenParam","token","prompt","decision","confirmError","redirect","active","clearTimeout","held","getMagicLinkConfirmation","magicLinkConfirmationPrompt","finishMagicLinkSignIn","setTimeout","renderConfirmation","asking","confirmMagicLinkSignIn","confirm","COPY","subtitle","label","resent","phone","SaVerifyOtp","channel","copy","code","resendMessage","loading","secondsLeft","OTP_LIFETIME_SECONDS","requestOtp","otpResendFailedMessage","verifyOtp","formatCountdown","OTP_LENGTH","requireAuth","whenSettled","isAuthenticated","redirectTo","loginPath","roles","hasScopedRole","forbiddenRedirectTo","requireGuest","authGuard","guestGuard","createSeamlessAuthRoutes","basePath","pathOf","component"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seamless-auth/vue",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Vue bindings for Seamless Auth: a plugin and composable for session state, route guards, and optional sign-in screens.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@seamless-auth/client": "^0.
|
|
66
|
+
"@seamless-auth/client": "^0.7.0"
|
|
67
67
|
},
|
|
68
68
|
"sideEffects": [
|
|
69
69
|
"*.css"
|