@8wave/ai-elements 0.114.0-beta.30 → 0.114.0-beta.7
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/_chunks/Agent-DTLrWpzX.js +460 -0
- package/dist/_chunks/Agent-DTLrWpzX.js.map +1 -0
- package/dist/_chunks/Media-Cft7Pwrh.js +108 -0
- package/dist/_chunks/Media-Cft7Pwrh.js.map +1 -0
- package/dist/_chunks/{PkStreamingMarkdown-ZD0SROu1.js → PkStreamingMarkdown-C1sANAr5.js} +672 -688
- package/dist/_chunks/PkStreamingMarkdown-C1sANAr5.js.map +1 -0
- package/dist/_chunks/{PkToolRequestGeolocation-OF1PWhMw.js → PkToolRequestGeolocation-BbxYKt-9.js} +2 -2
- package/{dist-vue/_chunks/PkToolRequestGeolocation-BOVbaCzQ.js.map → dist/_chunks/PkToolRequestGeolocation-BbxYKt-9.js.map} +1 -1
- package/dist/_chunks/{PkToolRequestOAuthConnection-ChGMAKV7.js → PkToolRequestOAuthConnection-CTp2w60F.js} +2 -2
- package/dist/_chunks/{PkToolRequestOAuthConnection-ChGMAKV7.js.map → PkToolRequestOAuthConnection-CTp2w60F.js.map} +1 -1
- package/dist/_chunks/{PkToolShowArtifact-LEfO5zfg.js → PkToolShowArtifact-BfTjxGOT.js} +2 -2
- package/dist/_chunks/{PkToolShowArtifact-LEfO5zfg.js.map → PkToolShowArtifact-BfTjxGOT.js.map} +1 -1
- package/dist/_chunks/PkToolShowComparison-BJ7QBXtf.js +60 -0
- package/dist/_chunks/PkToolShowComparison-BJ7QBXtf.js.map +1 -0
- package/dist/_chunks/{PkToolShowContactForm-BO3JQfts.js → PkToolShowContactForm-PFpY9dIp.js} +2 -2
- package/dist/_chunks/{PkToolShowContactForm-BO3JQfts.js.map → PkToolShowContactForm-PFpY9dIp.js.map} +1 -1
- package/dist/_chunks/{PkToolShowForm-KW8MOL-j.js → PkToolShowForm-CMtSN0oX.js} +5 -5
- package/dist/_chunks/{PkToolShowForm-KW8MOL-j.js.map → PkToolShowForm-CMtSN0oX.js.map} +1 -1
- package/dist/_chunks/{PkToolShowSources-Bfx-Th_j.js → PkToolShowSources-C6cu66Ts.js} +3 -3
- package/dist/_chunks/{PkToolShowSources-Bfx-Th_j.js.map → PkToolShowSources-C6cu66Ts.js.map} +1 -1
- package/dist/_chunks/{PkToolShowSuggestedReply-Dl4x_nEJ.js → PkToolShowSuggestedReply-CFO8wV1b.js} +2 -2
- package/dist/_chunks/{PkToolShowSuggestedReply-Dl4x_nEJ.js.map → PkToolShowSuggestedReply-CFO8wV1b.js.map} +1 -1
- package/dist/_chunks/{markdown-BL7WANiX.js → markdown-BRD-hDrH.js} +12 -19
- package/dist/_chunks/markdown-BRD-hDrH.js.map +1 -0
- package/dist/ai-elements.es.js +2767 -3035
- package/dist/ai-elements.es.js.map +1 -1
- package/dist-vue/PkChatbot.js +1 -1
- package/dist-vue/PkChatbotAuth.js +1 -1
- package/dist-vue/PkChatbotEmptyState.js +1 -1
- package/dist-vue/PkChatbotInput.js +1 -1
- package/dist-vue/PkChatbotMessages.js +1 -1
- package/dist-vue/PkChatbotStepPayload.js +1 -1
- package/dist-vue/PkChatbotStepToolDetail.js +1 -1
- package/dist-vue/PkChatbotSteps.js +1 -1
- package/dist-vue/PkChatbotViewChat.js +1 -1
- package/dist-vue/PkChatbotViewConversations.js +1 -1
- package/dist-vue/PkChatbotViewFiles.js +1 -1
- package/dist-vue/PkChatbotViewProfile.js +1 -1
- package/dist-vue/_chunks/{Agent-tbKw8Mdt.js → Agent-BNlmK-uJ.js} +2 -2
- package/dist-vue/_chunks/{Agent-tbKw8Mdt.js.map → Agent-BNlmK-uJ.js.map} +1 -1
- package/dist-vue/_chunks/{Document-nCWwJC2h.js → Document-2X01-F4Z.js} +11 -18
- package/dist-vue/_chunks/Document-2X01-F4Z.js.map +1 -0
- package/dist-vue/_chunks/Media-_HfFLHGD.js.map +1 -1
- package/dist-vue/_chunks/{PkChatbot-CXQzBuxy.js → PkChatbot-HRayDr2d.js} +8 -8
- package/dist-vue/_chunks/{PkChatbot-CXQzBuxy.js.map → PkChatbot-HRayDr2d.js.map} +1 -1
- package/dist-vue/_chunks/PkChatbotAuth-Bi508F1u.js +349 -0
- package/dist-vue/_chunks/PkChatbotAuth-Bi508F1u.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotEmptyState-9mWiPd4B.js → PkChatbotEmptyState-CPOcfoRC.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotEmptyState-9mWiPd4B.js.map → PkChatbotEmptyState-CPOcfoRC.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotInput-BzaCyeFp.js → PkChatbotInput-pLJQIu7v.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotInput-BzaCyeFp.js.map → PkChatbotInput-pLJQIu7v.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotMessages-KH5RE8Dk.js → PkChatbotMessages-GZStJbx_.js} +256 -258
- package/dist-vue/_chunks/PkChatbotMessages-GZStJbx_.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotStepPayload-C36nXLW7.js → PkChatbotStepPayload-DU0W-eUp.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotStepPayload-C36nXLW7.js.map → PkChatbotStepPayload-DU0W-eUp.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotStepToolDetail-CBX-AQXv.js → PkChatbotStepToolDetail-etlBryOg.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotStepToolDetail-CBX-AQXv.js.map → PkChatbotStepToolDetail-etlBryOg.js.map} +1 -1
- package/dist-vue/_chunks/PkChatbotSteps-Cl4pVtPJ.js +190 -0
- package/dist-vue/_chunks/PkChatbotSteps-Cl4pVtPJ.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotViewChat-D5sfTMCW.js → PkChatbotViewChat-DIfBWFoG.js} +7 -7
- package/dist-vue/_chunks/{PkChatbotViewChat-D5sfTMCW.js.map → PkChatbotViewChat-DIfBWFoG.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewConversations-CHpN4vhm.js → PkChatbotViewConversations-BCdolW0R.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewConversations-CHpN4vhm.js.map → PkChatbotViewConversations-BCdolW0R.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewFiles-Bk9-K6Hw.js → PkChatbotViewFiles-Cudao8ew.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotViewFiles-Bk9-K6Hw.js.map → PkChatbotViewFiles-Cudao8ew.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewProfile-CosaHA-g.js → PkChatbotViewProfile-DDsKOkcC.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewProfile-CosaHA-g.js.map → PkChatbotViewProfile-DDsKOkcC.js.map} +1 -1
- package/dist-vue/_chunks/{PkStreamingMarkdown-BN7waklD.js → PkStreamingMarkdown-BloMJaIW.js} +205 -214
- package/dist-vue/_chunks/{PkStreamingMarkdown-BN7waklD.js.map → PkStreamingMarkdown-BloMJaIW.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolRequestGeolocation-BOVbaCzQ.js → PkToolRequestGeolocation-9vfYNaQo.js} +2 -2
- package/{dist/_chunks/PkToolRequestGeolocation-OF1PWhMw.js.map → dist-vue/_chunks/PkToolRequestGeolocation-9vfYNaQo.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolRequestOAuthConnection-DMvCGPuX.js → PkToolRequestOAuthConnection-BorR5NmZ.js} +2 -2
- package/dist-vue/_chunks/{PkToolRequestOAuthConnection-DMvCGPuX.js.map → PkToolRequestOAuthConnection-BorR5NmZ.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowArtifact-DrE_mK1z.js → PkToolShowArtifact-BuMY7GNj.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowArtifact-DrE_mK1z.js.map → PkToolShowArtifact-BuMY7GNj.js.map} +1 -1
- package/dist-vue/_chunks/PkToolShowComparison-BLn4pkno.js +61 -0
- package/dist-vue/_chunks/PkToolShowComparison-BLn4pkno.js.map +1 -0
- package/dist-vue/_chunks/{PkToolShowContactForm-BBTbrgt4.js → PkToolShowContactForm-0OQRqT8m.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowContactForm-BBTbrgt4.js.map → PkToolShowContactForm-0OQRqT8m.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowDiagram-CztnTdq2.js → PkToolShowDiagram-BGL27iHG.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowDiagram-CztnTdq2.js.map → PkToolShowDiagram-BGL27iHG.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowEmail-C30K5kJA.js → PkToolShowEmail-BJJpS69F.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowEmail-C30K5kJA.js.map → PkToolShowEmail-BJJpS69F.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowForm-C9N_SSm8.js → PkToolShowForm-DDcPpOZ8.js} +4 -4
- package/dist-vue/_chunks/{PkToolShowForm-C9N_SSm8.js.map → PkToolShowForm-DDcPpOZ8.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowMessage-DvkCRERv.js → PkToolShowMessage-BFGynf3p.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowMessage-DvkCRERv.js.map → PkToolShowMessage-BFGynf3p.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowProductList-cfjg3CmV.js → PkToolShowProductList-6t1Ir5CW.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowProductList-cfjg3CmV.js.map → PkToolShowProductList-6t1Ir5CW.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSources-CyR2GTiE.js → PkToolShowSources-cOF0ZxOj.js} +4 -4
- package/dist-vue/_chunks/{PkToolShowSources-CyR2GTiE.js.map → PkToolShowSources-cOF0ZxOj.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSuggestedReply-qAWdCUhr.js → PkToolShowSuggestedReply-DA4NEjHB.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowSuggestedReply-qAWdCUhr.js.map → PkToolShowSuggestedReply-DA4NEjHB.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowWebPages-CkQ2NhRj.js → PkToolShowWebPages-OgaT1vYJ.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowWebPages-CkQ2NhRj.js.map → PkToolShowWebPages-OgaT1vYJ.js.map} +1 -1
- package/dist-vue/_chunks/{PkUrl-BsD4Vby6.js → PkUrl-Cd69XP5z.js} +2 -2
- package/dist-vue/_chunks/{PkUrl-BsD4Vby6.js.map → PkUrl-Cd69XP5z.js.map} +1 -1
- package/dist-vue/_chunks/{createChatbotApiClient-BlWs282E.js → createChatbotApiClient-CaVLm5W9.js} +168 -137
- package/dist-vue/_chunks/createChatbotApiClient-CaVLm5W9.js.map +1 -0
- package/dist-vue/_chunks/{useChatbotStore-CMo47fnS.js → useChatbotStore-BwrBZJCq.js} +3 -3
- package/dist-vue/_chunks/{useChatbotStore-CMo47fnS.js.map → useChatbotStore-BwrBZJCq.js.map} +1 -1
- package/dist-vue/_chunks/utils-h4C7rRcu.js +177 -0
- package/dist-vue/_chunks/utils-h4C7rRcu.js.map +1 -0
- package/dist-vue/api.js +1 -1
- package/dist-vue/apps/web-component/src/components/EmbeddedChatWidget.ce.d.ts +4 -4
- package/dist-vue/apps/web-component/src/composables/useChatbotAuth.d.ts +8 -54
- package/dist-vue/apps/web-component/src/composables/useChatbotAuthForm.d.ts +0 -14
- package/dist-vue/composables.js +112 -436
- package/dist-vue/composables.js.map +1 -1
- package/dist-vue/index.js +3235 -3359
- package/dist-vue/index.js.map +1 -1
- package/dist-vue/locales.js +0 -42
- package/dist-vue/packages/ability/src/index.d.ts +14 -10
- package/dist-vue/packages/auth/src/social-redirect-plugin.d.ts +12 -18
- package/dist-vue/packages/components/src/chat/PkChatbotAuth.d.ts +0 -19
- package/dist-vue/packages/components/src/chat/PkChatbotMessages.d.ts +4 -8
- package/dist-vue/packages/components/src/chat/PkChatbotSteps.d.ts +0 -1
- package/dist-vue/packages/components/src/chat/utils.d.ts +0 -9
- package/dist-vue/packages/components/src/index.d.ts +1 -2
- package/dist-vue/packages/composable/src/chatbot/useChatbotStore.d.ts +0 -60
- package/dist-vue/packages/models/src/schema/Chat.d.ts +0 -42
- package/dist-vue/packages/models/src/schema/Document.d.ts +0 -17
- package/dist-vue/packages/models/src/schema/DocumentFolder.d.ts +0 -10
- package/dist-vue/packages/models/src/schema/DocumentSyncSource.d.ts +1 -71
- package/dist-vue/packages/models/src/schema/Media.d.ts +1 -0
- package/dist-vue/packages/models/src/schema/Member.d.ts +0 -3
- package/dist-vue/packages/models/src/schema/Notification.d.ts +0 -6
- package/dist-vue/packages/models/src/schema/Organization.d.ts +0 -1
- package/dist-vue/packages/models/src/schema/User.d.ts +0 -1
- package/dist-vue/style.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/Agent-DK76k05_.js +0 -566
- package/dist/_chunks/Agent-DK76k05_.js.map +0 -1
- package/dist/_chunks/PkStreamingMarkdown-ZD0SROu1.js.map +0 -1
- package/dist/_chunks/PkToolShowComparison-8d6fAhRp.js +0 -72
- package/dist/_chunks/PkToolShowComparison-8d6fAhRp.js.map +0 -1
- package/dist/_chunks/markdown-BL7WANiX.js.map +0 -1
- package/dist-vue/_chunks/Document-nCWwJC2h.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotAuth-jzoNJkmH.js +0 -421
- package/dist-vue/_chunks/PkChatbotAuth-jzoNJkmH.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotMessages-KH5RE8Dk.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotSteps-356rnZG5.js +0 -191
- package/dist-vue/_chunks/PkChatbotSteps-356rnZG5.js.map +0 -1
- package/dist-vue/_chunks/PkToolShowComparison-DQs3E6-k.js +0 -72
- package/dist-vue/_chunks/PkToolShowComparison-DQs3E6-k.js.map +0 -1
- package/dist-vue/_chunks/createChatbotApiClient-BlWs282E.js.map +0 -1
- package/dist-vue/_chunks/utils--8iNpBr_.js +0 -184
- package/dist-vue/_chunks/utils--8iNpBr_.js.map +0 -1
- package/dist-vue/packages/auth/src/additional-fields.d.ts +0 -48
- package/dist-vue/packages/auth/src/passkey-policy-client-plugin.d.ts +0 -31
- package/dist-vue/packages/auth/src/passkey-policy-plugin.d.ts +0 -22
- package/dist-vue/packages/auth/src/two-factor-policy-client-plugin.d.ts +0 -60
- package/dist-vue/packages/auth/src/two-factor-policy-plugin.d.ts +0 -65
- package/dist-vue/packages/components/src/PkQrCode.d.ts +0 -14
- package/dist-vue/packages/components/src/chat/PkTurnEvaluation.d.ts +0 -8
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
import { _ as e, b as t, n, o as r, u as i } from "./schemas-DxbHVg3r.js";
|
|
2
|
-
import { i as a, n as o } from "./Media-_HfFLHGD.js";
|
|
3
|
-
import { t as s } from "./useImageFallback-5vQIO0pC.js";
|
|
4
|
-
import { t as c } from "./index.es-D0EI_F6p.js";
|
|
5
|
-
import { VvAlert as ee, VvButton as te, VvButtonGroup as ne, VvIcon as re } from "@volverjs/ui-vue/components";
|
|
6
|
-
import { Fragment as l, Transition as ie, computed as u, createBlock as d, createCommentVNode as f, createElementBlock as p, createElementVNode as m, createTextVNode as h, createVNode as g, defineComponent as _, mergeModels as v, openBlock as y, ref as b, resolveDynamicComponent as ae, toDisplayString as x, unref as S, useModel as C, watch as w, withCtx as T } from "vue";
|
|
7
|
-
import { useI18n as oe } from "vue-i18n";
|
|
8
|
-
//#region ../../packages/models/src/schema/User.ts
|
|
9
|
-
var E = n(["user", "admin"]), D = t().min(8).max(64);
|
|
10
|
-
e({
|
|
11
|
-
id: t(),
|
|
12
|
-
name: t(),
|
|
13
|
-
email: t(),
|
|
14
|
-
emailVerified: r(),
|
|
15
|
-
image: t().nullable(),
|
|
16
|
-
media: o.optional().nullable(),
|
|
17
|
-
createdAt: a(),
|
|
18
|
-
updatedAt: a(),
|
|
19
|
-
banned: r().nullable(),
|
|
20
|
-
banReason: t().nullable(),
|
|
21
|
-
banExpires: a().nullable(),
|
|
22
|
-
isAnonymous: r().nullable(),
|
|
23
|
-
role: E,
|
|
24
|
-
twoFactorEnabled: r().optional()
|
|
25
|
-
}), e({
|
|
26
|
-
id: t(),
|
|
27
|
-
name: t(),
|
|
28
|
-
email: t().nullable(),
|
|
29
|
-
image: t().nullable(),
|
|
30
|
-
isAnonymous: r().nullable(),
|
|
31
|
-
banned: r().nullable()
|
|
32
|
-
});
|
|
33
|
-
var O = e({
|
|
34
|
-
password: D,
|
|
35
|
-
passwordConfirmation: D
|
|
36
|
-
}).refine((e) => e.password === e.passwordConfirmation, {
|
|
37
|
-
params: { i18n: "errors.passwordsDoNotMatch" },
|
|
38
|
-
path: ["passwordConfirmation"]
|
|
39
|
-
});
|
|
40
|
-
O.extend({ currentPassword: D }), O.extend({
|
|
41
|
-
name: t().min(1),
|
|
42
|
-
email: i(),
|
|
43
|
-
media: o.optional(),
|
|
44
|
-
role: E.optional().default("user")
|
|
45
|
-
}), e({
|
|
46
|
-
id: t(),
|
|
47
|
-
name: t(),
|
|
48
|
-
email: t(),
|
|
49
|
-
emailVerified: r().optional(),
|
|
50
|
-
image: t().nullish(),
|
|
51
|
-
role: E,
|
|
52
|
-
media: o.optional().nullable(),
|
|
53
|
-
banned: r().nullish(),
|
|
54
|
-
banReason: t().nullish(),
|
|
55
|
-
banExpires: t().nullish(),
|
|
56
|
-
isAnonymous: r().nullish()
|
|
57
|
-
});
|
|
58
|
-
var se = O.extend({
|
|
59
|
-
name: t().min(1),
|
|
60
|
-
email: i(),
|
|
61
|
-
rememberMe: r().optional()
|
|
62
|
-
}), ce = { class: "pk-chatbot-auth flex flex-col items-center justify-center w-full min-h-full p-lg overflow-y-auto" }, le = { class: "pk-chatbot-auth__flip w-full max-w-384 mx-auto my-auto" }, ue = { class: "pk-chatbot-auth__success-icon w-64 h-64 border border-surface-3 rounded-full bg-surface-0 flex items-center justify-center overflow-hidden bg-surface mx-auto mb-md" }, de = { class: "font-bold text-18 mb-xs" }, fe = { class: "mb-lg text-16 text-word-3" }, k = {
|
|
63
|
-
key: "form",
|
|
64
|
-
class: "pk-chatbot-auth__flip-card flex flex-col"
|
|
65
|
-
}, A = { class: "flex flex-col" }, j = {
|
|
66
|
-
key: 0,
|
|
67
|
-
class: "flex justify-center mb-md"
|
|
68
|
-
}, M = ["src", "alt"], N = { class: "text-center leading-normal mb-lg" }, P = {
|
|
69
|
-
key: 0,
|
|
70
|
-
class: "font-bold text-20 m-0"
|
|
71
|
-
}, F = { class: "text-14 text-word-3 text-center leading-normal mb-md" }, I = { class: "flex justify-center mt-md" }, L = { class: "mb-md" }, R = { class: "mb-md" }, z = { class: "mb-md" }, B = { class: "hr mt-xs" }, V = { class: "pt-lg text-center text-word-3" }, H = /* @__PURE__ */ _({
|
|
72
|
-
__name: "PkChatbotAuth",
|
|
73
|
-
props: /*@__PURE__*/ v({
|
|
74
|
-
branding: { default: void 0 },
|
|
75
|
-
authMethods: { default: void 0 },
|
|
76
|
-
loading: {
|
|
77
|
-
type: Boolean,
|
|
78
|
-
default: !1
|
|
79
|
-
},
|
|
80
|
-
twoFactorMethods: { default: void 0 }
|
|
81
|
-
}, {
|
|
82
|
-
errorMessage: { default: void 0 },
|
|
83
|
-
errorMessageModifiers: {},
|
|
84
|
-
success: { default: void 0 },
|
|
85
|
-
successModifiers: {}
|
|
86
|
-
}),
|
|
87
|
-
emits: /*@__PURE__*/ v([
|
|
88
|
-
"sign-in",
|
|
89
|
-
"sign-up",
|
|
90
|
-
"request-reset",
|
|
91
|
-
"social",
|
|
92
|
-
"verify-two-factor",
|
|
93
|
-
"send-two-factor-code",
|
|
94
|
-
"cancel-two-factor",
|
|
95
|
-
"update:errorMessage",
|
|
96
|
-
"update:success"
|
|
97
|
-
], ["update:errorMessage", "update:success"]),
|
|
98
|
-
setup(n, { emit: a }) {
|
|
99
|
-
let { t: o } = oe({ useScope: "global" }), _ = n, { canShowImage: v, onImageError: E } = s(), O = C(n, "errorMessage"), H = C(n, "success"), U = a, W = b("sign-in");
|
|
100
|
-
w(W, () => {
|
|
101
|
-
O.value = void 0, H.value = void 0;
|
|
102
|
-
});
|
|
103
|
-
function pe() {
|
|
104
|
-
H.value = void 0, W.value = "sign-in";
|
|
105
|
-
}
|
|
106
|
-
let me = u(() => _.authMethods?.google || _.authMethods?.microsoft), G = e({
|
|
107
|
-
email: i(),
|
|
108
|
-
password: D,
|
|
109
|
-
rememberMe: r().default(!1)
|
|
110
|
-
}), he = e({ email: i() }), { VvForm: ge, VvFormField: K } = c(G, { lazyLoad: !0 }), { VvForm: _e, VvFormField: q, clear: ve } = c(se, { lazyLoad: !0 }), { VvForm: ye, VvFormField: be, clear: xe } = c(he, { lazyLoad: !0 });
|
|
111
|
-
w(H, (e) => {
|
|
112
|
-
e && (ve(), xe());
|
|
113
|
-
});
|
|
114
|
-
let J = b();
|
|
115
|
-
function Se() {
|
|
116
|
-
H.value && J.value?.focus();
|
|
117
|
-
}
|
|
118
|
-
function Ce(e) {
|
|
119
|
-
U("sign-in", {
|
|
120
|
-
email: e.email,
|
|
121
|
-
password: e.password,
|
|
122
|
-
rememberMe: e.rememberMe ?? !1
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
function we(e) {
|
|
126
|
-
U("sign-up", {
|
|
127
|
-
name: e.name.trim(),
|
|
128
|
-
email: e.email,
|
|
129
|
-
password: e.password
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
function Te(e) {
|
|
133
|
-
U("request-reset", { email: e.email });
|
|
134
|
-
}
|
|
135
|
-
function Y(e) {
|
|
136
|
-
U("social", e);
|
|
137
|
-
}
|
|
138
|
-
let X = u(() => !!_.twoFactorMethods?.length), Z = b("totp"), { VvForm: Ee, VvFormField: De, clear: Q } = c(e({ code: t().trim().min(6).max(32) }), { lazyLoad: !0 });
|
|
139
|
-
w(() => _.twoFactorMethods, (e) => {
|
|
140
|
-
e?.length && (Z.value = e.includes("totp") ? "totp" : "otp", Q(), Z.value === "otp" && U("send-two-factor-code"));
|
|
141
|
-
}, { immediate: !0 });
|
|
142
|
-
function $(e) {
|
|
143
|
-
Z.value = e, O.value = void 0, Q();
|
|
144
|
-
}
|
|
145
|
-
let Oe = u(() => Z.value === "backup" ? o("twoFactor.challengeBackup") : Z.value === "otp" ? o("twoFactor.challengeEmailSent") : o("twoFactor.challengeApp"));
|
|
146
|
-
function ke(e) {
|
|
147
|
-
U("verify-two-factor", {
|
|
148
|
-
kind: Z.value,
|
|
149
|
-
code: e.code.trim()
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
return (e, t) => {
|
|
153
|
-
let r = re, i = te, a = ee, s = ne;
|
|
154
|
-
return y(), p("div", ce, [m("div", le, [g(ie, {
|
|
155
|
-
name: "pk-flip",
|
|
156
|
-
mode: "out-in",
|
|
157
|
-
onAfterEnter: Se
|
|
158
|
-
}, {
|
|
159
|
-
default: T(() => [H.value ? (y(), p("div", {
|
|
160
|
-
ref_key: "successCard",
|
|
161
|
-
ref: J,
|
|
162
|
-
key: "success",
|
|
163
|
-
tabindex: "-1",
|
|
164
|
-
class: "pk-chatbot-auth__flip-card outline-none flex flex-col text-center leading-normal"
|
|
165
|
-
}, [
|
|
166
|
-
m("div", ue, [g(r, {
|
|
167
|
-
name: "ri:mail-check-line",
|
|
168
|
-
"aria-hidden": "true",
|
|
169
|
-
class: "text-success w-32 h-32"
|
|
170
|
-
})]),
|
|
171
|
-
m("h1", de, x(H.value.title), 1),
|
|
172
|
-
m("p", fe, x(H.value.message), 1),
|
|
173
|
-
g(i, {
|
|
174
|
-
type: "button",
|
|
175
|
-
modifiers: "link",
|
|
176
|
-
icon: "chevron-left",
|
|
177
|
-
label: S(o)("action.backToSignIn"),
|
|
178
|
-
onClick: pe
|
|
179
|
-
}, null, 8, ["label"])
|
|
180
|
-
], 512)) : (y(), p("div", k, [m("div", A, [
|
|
181
|
-
S(v)(n.branding?.interface.logo) ? (y(), p("div", j, [m("img", {
|
|
182
|
-
src: n.branding?.interface.logo,
|
|
183
|
-
alt: n.branding?.name,
|
|
184
|
-
class: "w-64 h-64 border border-surface-3 rounded-full bg-surface-0 overflow-hidden bg-surface object-contain",
|
|
185
|
-
onError: t[0] ||= (e) => S(E)(n.branding?.interface.logo)
|
|
186
|
-
}, null, 40, M)])) : f("", !0),
|
|
187
|
-
m("div", N, [n.branding?.name ? (y(), p("h1", P, x(n.branding.name), 1)) : f("", !0), (y(), d(ae(n.branding?.name ? "h2" : "h1"), { class: "text-word-3 mb-0" }, {
|
|
188
|
-
default: T(() => [X.value ? (y(), p(l, { key: 0 }, [h(x(S(o)("twoFactor.challengeTitle")), 1)], 64)) : W.value === "sign-in" ? (y(), p(l, { key: 1 }, [h(x(S(o)("auth.signInTitle")), 1)], 64)) : W.value === "sign-up" ? (y(), p(l, { key: 2 }, [h(x(S(o)("auth.signUpTitle")), 1)], 64)) : W.value === "reset" ? (y(), p(l, { key: 3 }, [h(x(S(o)("auth.resetTitle")), 1)], 64)) : f("", !0)]),
|
|
189
|
-
_: 1
|
|
190
|
-
}))]),
|
|
191
|
-
O.value ? (y(), d(a, {
|
|
192
|
-
key: 1,
|
|
193
|
-
modifiers: "danger",
|
|
194
|
-
class: "mb-md",
|
|
195
|
-
content: O.value
|
|
196
|
-
}, null, 8, ["content"])) : f("", !0),
|
|
197
|
-
X.value ? (y(), p(l, { key: 2 }, [
|
|
198
|
-
m("p", F, x(Oe.value), 1),
|
|
199
|
-
g(S(Ee), {
|
|
200
|
-
class: "flex flex-col",
|
|
201
|
-
readonly: n.loading,
|
|
202
|
-
onSubmit: ke
|
|
203
|
-
}, {
|
|
204
|
-
default: T(() => [g(S(De), {
|
|
205
|
-
name: "code",
|
|
206
|
-
type: "text",
|
|
207
|
-
autocomplete: Z.value === "backup" ? "off" : "one-time-code",
|
|
208
|
-
label: Z.value === "backup" ? S(o)("twoFactor.backupCode") : S(o)("twoFactor.code"),
|
|
209
|
-
floating: ""
|
|
210
|
-
}, null, 8, ["autocomplete", "label"]), g(i, {
|
|
211
|
-
type: "submit",
|
|
212
|
-
modifiers: "primary",
|
|
213
|
-
loading: n.loading,
|
|
214
|
-
disabled: n.loading,
|
|
215
|
-
label: S(o)("twoFactor.verify")
|
|
216
|
-
}, null, 8, [
|
|
217
|
-
"loading",
|
|
218
|
-
"disabled",
|
|
219
|
-
"label"
|
|
220
|
-
])]),
|
|
221
|
-
_: 1
|
|
222
|
-
}, 8, ["readonly"]),
|
|
223
|
-
m("div", I, [Z.value === "totp" ? (y(), d(i, {
|
|
224
|
-
key: 0,
|
|
225
|
-
type: "button",
|
|
226
|
-
modifiers: "link",
|
|
227
|
-
label: S(o)("twoFactor.useBackupCode"),
|
|
228
|
-
onClick: t[1] ||= (e) => $("backup")
|
|
229
|
-
}, null, 8, ["label"])) : Z.value === "backup" ? (y(), d(i, {
|
|
230
|
-
key: 1,
|
|
231
|
-
type: "button",
|
|
232
|
-
modifiers: "link",
|
|
233
|
-
label: S(o)("twoFactor.useApp"),
|
|
234
|
-
onClick: t[2] ||= (e) => $("totp")
|
|
235
|
-
}, null, 8, ["label"])) : (y(), d(i, {
|
|
236
|
-
key: 2,
|
|
237
|
-
type: "button",
|
|
238
|
-
modifiers: "link",
|
|
239
|
-
disabled: n.loading,
|
|
240
|
-
label: S(o)("twoFactor.sendAgain"),
|
|
241
|
-
onClick: t[3] ||= (e) => U("send-two-factor-code")
|
|
242
|
-
}, null, 8, ["disabled", "label"]))])
|
|
243
|
-
], 64)) : W.value === "sign-in" ? (y(), d(S(ge), {
|
|
244
|
-
key: 3,
|
|
245
|
-
class: "flex flex-col",
|
|
246
|
-
readonly: n.loading,
|
|
247
|
-
onSubmit: Ce
|
|
248
|
-
}, {
|
|
249
|
-
default: T(() => [m("div", L, [
|
|
250
|
-
g(S(K), {
|
|
251
|
-
name: "email",
|
|
252
|
-
type: "email",
|
|
253
|
-
autocomplete: "username",
|
|
254
|
-
label: S(o)("label.email"),
|
|
255
|
-
floating: ""
|
|
256
|
-
}, null, 8, ["label"]),
|
|
257
|
-
g(S(K), {
|
|
258
|
-
name: "password",
|
|
259
|
-
type: "password",
|
|
260
|
-
autocomplete: "current-password",
|
|
261
|
-
label: S(o)("label.password"),
|
|
262
|
-
floating: ""
|
|
263
|
-
}, null, 8, ["label"]),
|
|
264
|
-
m("div", R, [g(i, {
|
|
265
|
-
type: "button",
|
|
266
|
-
modifiers: "link",
|
|
267
|
-
label: S(o)("action.forgetPassword"),
|
|
268
|
-
onClick: t[4] ||= (e) => W.value = "reset"
|
|
269
|
-
}, null, 8, ["label"])]),
|
|
270
|
-
g(S(K), {
|
|
271
|
-
name: "rememberMe",
|
|
272
|
-
type: "checkbox",
|
|
273
|
-
label: S(o)("label.rememberMe"),
|
|
274
|
-
switch: ""
|
|
275
|
-
}, null, 8, ["label"])
|
|
276
|
-
]), g(i, {
|
|
277
|
-
type: "submit",
|
|
278
|
-
modifiers: "primary",
|
|
279
|
-
loading: n.loading,
|
|
280
|
-
disabled: n.loading,
|
|
281
|
-
label: S(o)("action.signIn")
|
|
282
|
-
}, null, 8, [
|
|
283
|
-
"loading",
|
|
284
|
-
"disabled",
|
|
285
|
-
"label"
|
|
286
|
-
])]),
|
|
287
|
-
_: 1
|
|
288
|
-
}, 8, ["readonly"])) : W.value === "sign-up" ? (y(), d(S(_e), {
|
|
289
|
-
key: 4,
|
|
290
|
-
class: "flex flex-col",
|
|
291
|
-
readonly: n.loading,
|
|
292
|
-
onSubmit: we
|
|
293
|
-
}, {
|
|
294
|
-
default: T(() => [m("div", z, [
|
|
295
|
-
g(S(q), {
|
|
296
|
-
name: "name",
|
|
297
|
-
type: "text",
|
|
298
|
-
autocomplete: "name",
|
|
299
|
-
label: S(o)("label.name"),
|
|
300
|
-
floating: ""
|
|
301
|
-
}, null, 8, ["label"]),
|
|
302
|
-
g(S(q), {
|
|
303
|
-
name: "email",
|
|
304
|
-
type: "email",
|
|
305
|
-
autocomplete: "username",
|
|
306
|
-
label: S(o)("label.email"),
|
|
307
|
-
floating: ""
|
|
308
|
-
}, null, 8, ["label"]),
|
|
309
|
-
g(S(q), {
|
|
310
|
-
name: "password",
|
|
311
|
-
type: "password",
|
|
312
|
-
autocomplete: "new-password",
|
|
313
|
-
label: S(o)("label.password"),
|
|
314
|
-
floating: ""
|
|
315
|
-
}, null, 8, ["label"]),
|
|
316
|
-
g(S(q), {
|
|
317
|
-
name: "passwordConfirmation",
|
|
318
|
-
type: "password",
|
|
319
|
-
autocomplete: "new-password",
|
|
320
|
-
label: S(o)("label.confirmPassword"),
|
|
321
|
-
floating: ""
|
|
322
|
-
}, null, 8, ["label"])
|
|
323
|
-
]), g(i, {
|
|
324
|
-
type: "submit",
|
|
325
|
-
modifiers: "primary",
|
|
326
|
-
loading: n.loading,
|
|
327
|
-
disabled: n.loading,
|
|
328
|
-
label: S(o)("action.continue")
|
|
329
|
-
}, null, 8, [
|
|
330
|
-
"loading",
|
|
331
|
-
"disabled",
|
|
332
|
-
"label"
|
|
333
|
-
])]),
|
|
334
|
-
_: 1
|
|
335
|
-
}, 8, ["readonly"])) : W.value === "reset" ? (y(), d(S(ye), {
|
|
336
|
-
key: 5,
|
|
337
|
-
class: "flex flex-col",
|
|
338
|
-
readonly: n.loading,
|
|
339
|
-
onSubmit: Te
|
|
340
|
-
}, {
|
|
341
|
-
default: T(() => [g(S(be), {
|
|
342
|
-
name: "email",
|
|
343
|
-
type: "email",
|
|
344
|
-
autocomplete: "username",
|
|
345
|
-
label: S(o)("label.email"),
|
|
346
|
-
floating: ""
|
|
347
|
-
}, null, 8, ["label"]), g(s, { modifiers: "vertical" }, {
|
|
348
|
-
default: T(() => [g(i, {
|
|
349
|
-
type: "submit",
|
|
350
|
-
modifiers: "primary",
|
|
351
|
-
loading: n.loading,
|
|
352
|
-
disabled: n.loading,
|
|
353
|
-
label: S(o)("action.submit")
|
|
354
|
-
}, null, 8, [
|
|
355
|
-
"loading",
|
|
356
|
-
"disabled",
|
|
357
|
-
"label"
|
|
358
|
-
])]),
|
|
359
|
-
_: 1
|
|
360
|
-
})]),
|
|
361
|
-
_: 1
|
|
362
|
-
}, 8, ["readonly"])) : f("", !0),
|
|
363
|
-
!X.value && (W.value === "sign-in" || W.value === "sign-up") && me.value ? (y(), p(l, { key: 6 }, [m("div", B, [m("span", null, x(S(o)("label.or")), 1)]), g(s, {
|
|
364
|
-
modifiers: "vertical",
|
|
365
|
-
class: "gap-xs mt-xs"
|
|
366
|
-
}, {
|
|
367
|
-
default: T(() => [n.authMethods?.google ? (y(), d(i, {
|
|
368
|
-
key: 0,
|
|
369
|
-
type: "button",
|
|
370
|
-
modifiers: "secondary",
|
|
371
|
-
icon: "logos:google-icon",
|
|
372
|
-
disabled: n.loading,
|
|
373
|
-
label: S(o)("action.signInWithSocialProvider", { provider: "Google" }),
|
|
374
|
-
onClick: t[5] ||= (e) => Y("google")
|
|
375
|
-
}, null, 8, ["disabled", "label"])) : f("", !0), n.authMethods?.microsoft ? (y(), d(i, {
|
|
376
|
-
key: 1,
|
|
377
|
-
type: "button",
|
|
378
|
-
modifiers: "secondary",
|
|
379
|
-
icon: "logos:microsoft-icon",
|
|
380
|
-
disabled: n.loading,
|
|
381
|
-
label: S(o)("action.signInWithSocialProvider", { provider: "Microsoft" }),
|
|
382
|
-
onClick: t[6] ||= (e) => Y("microsoft")
|
|
383
|
-
}, null, 8, ["disabled", "label"])) : f("", !0)]),
|
|
384
|
-
_: 1
|
|
385
|
-
})], 64)) : f("", !0)
|
|
386
|
-
]), m("div", V, [X.value ? (y(), d(i, {
|
|
387
|
-
key: 0,
|
|
388
|
-
type: "button",
|
|
389
|
-
modifiers: "link",
|
|
390
|
-
icon: "chevron-left",
|
|
391
|
-
label: S(o)("action.backToSignIn"),
|
|
392
|
-
onClick: t[7] ||= (e) => U("cancel-two-factor")
|
|
393
|
-
}, null, 8, ["label"])) : W.value === "sign-in" ? (y(), p(l, { key: 1 }, [h(x(S(o)("auth.noAccount")) + " ", 1), g(i, {
|
|
394
|
-
type: "button",
|
|
395
|
-
modifiers: "link",
|
|
396
|
-
class: "font-semibold",
|
|
397
|
-
label: S(o)("action.signUp"),
|
|
398
|
-
onClick: t[8] ||= (e) => W.value = "sign-up"
|
|
399
|
-
}, null, 8, ["label"])], 64)) : W.value === "sign-up" ? (y(), p(l, { key: 2 }, [h(x(S(o)("auth.haveAccount")) + " ", 1), g(i, {
|
|
400
|
-
type: "button",
|
|
401
|
-
modifiers: "link",
|
|
402
|
-
class: "font-semibold",
|
|
403
|
-
label: S(o)("action.signIn"),
|
|
404
|
-
onClick: t[9] ||= (e) => W.value = "sign-in"
|
|
405
|
-
}, null, 8, ["label"])], 64)) : (y(), d(i, {
|
|
406
|
-
key: 3,
|
|
407
|
-
type: "button",
|
|
408
|
-
modifiers: "link",
|
|
409
|
-
icon: "chevron-left",
|
|
410
|
-
label: S(o)("action.backToSignIn"),
|
|
411
|
-
onClick: t[10] ||= (e) => W.value = "sign-in"
|
|
412
|
-
}, null, 8, ["label"]))])]))]),
|
|
413
|
-
_: 1
|
|
414
|
-
})])]);
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
});
|
|
418
|
-
//#endregion
|
|
419
|
-
export { H as t };
|
|
420
|
-
|
|
421
|
-
//# sourceMappingURL=PkChatbotAuth-jzoNJkmH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PkChatbotAuth-jzoNJkmH.js","names":[],"sources":["../../../../packages/models/src/schema/User.ts","../../../../packages/components/src/chat/PkChatbotAuth.vue","../../../../packages/components/src/chat/PkChatbotAuth.vue"],"sourcesContent":["import * as z from 'zod'\nimport { MediaSchema } from './Media'\n\nconst RoleSchema = z.enum(['user', 'admin'])\n\n/** Shortest password better-auth accepts, see `packages/auth`. */\nexport const PASSWORD_MIN_LENGTH = 8\n\n/**\n * Longest password better-auth accepts. Since better-auth 1.7.6 a longer one\n * is refused on sign-in too (`PASSWORD_TOO_LONG`), so every form checks it\n * before sending and shows the translated validation error instead.\n */\nexport const PASSWORD_MAX_LENGTH = 64\n\n/** A password as better-auth accepts it, for every form that sends one. */\nexport const PasswordSchema = z\n .string()\n .min(PASSWORD_MIN_LENGTH)\n .max(PASSWORD_MAX_LENGTH)\n\nexport const UserSchema = z.object({\n id: z.string(),\n name: z.string(),\n email: z.string(),\n emailVerified: z.boolean(),\n image: z.string().nullable(),\n media: MediaSchema.optional().nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n banned: z.boolean().nullable(),\n banReason: z.string().nullable(),\n banExpires: z.coerce.date().nullable(),\n isAnonymous: z.boolean().nullable(),\n role: RoleSchema,\n twoFactorEnabled: z.boolean().optional(),\n})\n\nexport type User = z.infer<typeof UserSchema>\n\n/**\n * Trimmed user shape for org-scoped lookups (avatars, chat logs, member\n * lists). Served by GET /:audience/users/:id, which only resolves users\n * visible to the caller's active organization.\n */\nexport const UserPreviewSchema = z.object({\n id: z.string(),\n name: z.string(),\n email: z.string().nullable(),\n image: z.string().nullable(),\n isAnonymous: z.boolean().nullable(),\n banned: z.boolean().nullable(),\n})\n\nexport type UserPreview = z.infer<typeof UserPreviewSchema>\n\nexport const PasswordChangeSchema = z\n .object({\n password: PasswordSchema,\n passwordConfirmation: PasswordSchema,\n })\n .refine((data) => data.password === data.passwordConfirmation, {\n params: {\n i18n: 'errors.passwordsDoNotMatch',\n },\n path: ['passwordConfirmation'],\n })\n\nexport type PasswordChange = z.infer<typeof PasswordChangeSchema>\n\nexport const PasswordChangeWithCurrentSchema = PasswordChangeSchema.extend({\n currentPassword: PasswordSchema,\n})\n\nexport type PasswordChangeWithCurrent = z.infer<\n typeof PasswordChangeWithCurrentSchema\n>\n\nexport const UserCreateSchema = PasswordChangeSchema.extend({\n name: z.string().min(1),\n email: z.email(),\n media: MediaSchema.optional(),\n role: RoleSchema.optional().default('user'),\n})\n\nexport type UserCreate = z.infer<typeof UserCreateSchema>\n\nexport const UserUpdateSchema = z.object({\n id: z.string(),\n name: z.string(),\n email: z.string(),\n emailVerified: z.boolean().optional(),\n image: z.string().nullish(),\n role: RoleSchema,\n media: MediaSchema.optional().nullable(),\n banned: z.boolean().nullish(),\n banReason: z.string().nullish(),\n banExpires: z.string().nullish(),\n isAnonymous: z.boolean().nullish(),\n})\n\nexport type UserUpdate = z.infer<typeof UserUpdateSchema>\n\nexport const SignUpSchema = PasswordChangeSchema.extend({\n name: z.string().min(1),\n email: z.email(),\n rememberMe: z.boolean().optional(),\n})\n\nexport type SignUp = z.infer<typeof SignUpSchema>\n","<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useForm } from '@volverjs/form-vue'\n import * as z from 'zod'\n import { PasswordSchema, SignUpSchema } from 'models'\n import type { AgentBranding, AuthMethods } from 'models'\n import { useImageFallback } from 'composables'\n\n const { t: $t } = useI18n({\n useScope: 'global',\n })\n\n const props = withDefaults(\n defineProps<{\n branding?: AgentBranding\n authMethods?: AuthMethods\n loading?: boolean\n /**\n * Set while an email sign-in waits for its second factor: the\n * methods the account has (`totp`, `otp`). The code step replaces\n * the forms until it is answered or cancelled.\n */\n twoFactorMethods?: string[]\n }>(),\n {\n branding: undefined,\n authMethods: undefined,\n loading: false,\n twoFactorMethods: undefined,\n },\n )\n\n // A deleted agent logo would leave a broken glyph above the sign-in form:\n // drop the whole block instead, the agent name below already identifies it.\n const { canShowImage, onImageError } = useImageFallback()\n\n const errorMessage = defineModel<string | undefined>('errorMessage', {\n default: undefined,\n })\n /**\n * Non-error feedback (e.g. \"check your inbox\" after sign-up / reset).\n * When set, a dedicated success screen replaces the form.\n */\n const success = defineModel<{ title: string; message: string } | undefined>(\n 'success',\n { default: undefined },\n )\n\n const emit = defineEmits<{\n (\n e: 'sign-in',\n payload: {\n email: string\n password: string\n rememberMe: boolean\n },\n ): void\n (\n e: 'sign-up',\n payload: { email: string; password: string; name: string },\n ): void\n (e: 'request-reset', payload: { email: string }): void\n (e: 'social', provider: 'google' | 'microsoft'): void\n (\n e: 'verify-two-factor',\n payload: { kind: 'totp' | 'otp' | 'backup'; code: string },\n ): void\n (e: 'send-two-factor-code'): void\n (e: 'cancel-two-factor'): void\n (e: 'update:errorMessage', message?: string): void\n (e: 'update:success', value?: { title: string; message: string }): void\n }>()\n\n type Mode = 'sign-in' | 'sign-up' | 'reset'\n const mode = ref<Mode>('sign-in')\n watch(mode, () => {\n errorMessage.value = undefined\n success.value = undefined\n })\n\n /** Returns to the sign-in form, clearing any success feedback. */\n function backToSignIn() {\n success.value = undefined\n mode.value = 'sign-in'\n }\n\n const showSocialButtons = computed(\n () => props.authMethods?.google || props.authMethods?.microsoft,\n )\n\n const signInSchema = z.object({\n email: z.email(),\n password: PasswordSchema,\n rememberMe: z.boolean().default(false),\n })\n\n const resetSchema = z.object({\n email: z.email(),\n })\n\n const { VvForm: VvSignInForm, VvFormField: VvSignInField } = useForm(\n signInSchema,\n { lazyLoad: true },\n )\n const {\n VvForm: VvSignUpForm,\n VvFormField: VvSignUpField,\n clear: clearSignUp,\n } = useForm(SignUpSchema, { lazyLoad: true })\n const {\n VvForm: VvResetForm,\n VvFormField: VvResetField,\n clear: clearReset,\n } = useForm(resetSchema, { lazyLoad: true })\n\n // Empty the sign-up / reset forms once their submission succeeds so a\n // later \"back to sign in\" doesn't reveal stale input.\n watch(success, (value) => {\n if (value) {\n clearSignUp()\n clearReset()\n }\n })\n\n // Move focus to the success card once the flip animation has finished\n // (the out-in transition mounts it only after the form leaves), so\n // screen-reader/keyboard users are announced the result.\n const successCard = ref<HTMLElement>()\n function focusSuccessCard() {\n if (success.value) {\n successCard.value?.focus()\n }\n }\n\n function onSignIn(data: {\n email: string\n password: string\n rememberMe?: boolean\n }) {\n emit('sign-in', {\n email: data.email,\n password: data.password,\n rememberMe: data.rememberMe ?? false,\n })\n }\n\n function onSignUp(data: { name: string; email: string; password: string }) {\n emit('sign-up', {\n name: data.name.trim(),\n email: data.email,\n password: data.password,\n })\n }\n\n function onReset(data: { email: string }) {\n emit('request-reset', { email: data.email })\n }\n\n function handleSocial(provider: 'google' | 'microsoft') {\n emit('social', provider)\n }\n\n // Two-step verification (docs/specs/two-factor-authentication.md)\n type TwoFactorKind = 'totp' | 'otp' | 'backup'\n const isTwoFactorStep = computed(() => !!props.twoFactorMethods?.length)\n const twoFactorKind = ref<TwoFactorKind>('totp')\n const {\n VvForm: VvTwoFactorForm,\n VvFormField: VvTwoFactorField,\n clear: clearTwoFactor,\n } = useForm(z.object({ code: z.string().trim().min(6).max(32) }), {\n lazyLoad: true,\n })\n // A new challenge starts from the factor the account has, and the email\n // one sends its code straight away.\n watch(\n () => props.twoFactorMethods,\n (methods) => {\n if (!methods?.length) {\n return\n }\n twoFactorKind.value = methods.includes('totp') ? 'totp' : 'otp'\n clearTwoFactor()\n if (twoFactorKind.value === 'otp') {\n emit('send-two-factor-code')\n }\n },\n { immediate: true },\n )\n function switchTwoFactorKind(kind: TwoFactorKind) {\n twoFactorKind.value = kind\n errorMessage.value = undefined\n clearTwoFactor()\n }\n const twoFactorDescription = computed(() => {\n if (twoFactorKind.value === 'backup') {\n return $t('twoFactor.challengeBackup')\n }\n return twoFactorKind.value === 'otp'\n ? $t('twoFactor.challengeEmailSent')\n : $t('twoFactor.challengeApp')\n })\n function onVerifyTwoFactor(data: { code: string }) {\n emit('verify-two-factor', {\n kind: twoFactorKind.value,\n code: data.code.trim(),\n })\n }\n</script>\n\n<template>\n <div\n class=\"pk-chatbot-auth flex flex-col items-center justify-center w-full min-h-full p-lg overflow-y-auto\">\n <div class=\"pk-chatbot-auth__flip w-full max-w-384 mx-auto my-auto\">\n <Transition\n name=\"pk-flip\"\n mode=\"out-in\"\n @after-enter=\"focusSuccessCard\">\n <!-- Success screen (sign-up / reset feedback) -->\n <div\n v-if=\"success\"\n ref=\"successCard\"\n key=\"success\"\n tabindex=\"-1\"\n class=\"pk-chatbot-auth__flip-card outline-none flex flex-col text-center leading-normal\">\n <div\n class=\"pk-chatbot-auth__success-icon w-64 h-64 border border-surface-3 rounded-full bg-surface-0 flex items-center justify-center overflow-hidden bg-surface mx-auto mb-md\">\n <VvIcon\n name=\"ri:mail-check-line\"\n aria-hidden=\"true\"\n class=\"text-success w-32 h-32\" />\n </div>\n <h1 class=\"font-bold text-18 mb-xs\">\n {{ success.title }}\n </h1>\n <p class=\"mb-lg text-16 text-word-3\">\n {{ success.message }}\n </p>\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n icon=\"chevron-left\"\n :label=\"$t('action.backToSignIn')\"\n @click=\"backToSignIn\" />\n </div>\n\n <!-- Sign-in / sign-up / reset forms -->\n <div\n v-else\n key=\"form\"\n class=\"pk-chatbot-auth__flip-card flex flex-col\">\n <!-- Form Container -->\n <div class=\"flex flex-col\">\n <!-- Relative Header Logo -->\n <div\n v-if=\"canShowImage(branding?.interface.logo)\"\n class=\"flex justify-center mb-md\">\n <img\n :src=\"branding?.interface.logo\"\n :alt=\"branding?.name\"\n class=\"w-64 h-64 border border-surface-3 rounded-full bg-surface-0 overflow-hidden bg-surface object-contain\"\n @error=\"\n onImageError(branding?.interface.logo)\n \" />\n </div>\n\n <div class=\"text-center leading-normal mb-lg\">\n <h1\n v-if=\"branding?.name\"\n class=\"font-bold text-20 m-0\">\n {{ branding.name }}\n </h1>\n <component\n :is=\"branding?.name ? 'h2' : 'h1'\"\n class=\"text-word-3 mb-0\">\n <template v-if=\"isTwoFactorStep\">\n {{ $t('twoFactor.challengeTitle') }}\n </template>\n <template v-else-if=\"mode === 'sign-in'\">\n {{ $t('auth.signInTitle') }}\n </template>\n <template v-else-if=\"mode === 'sign-up'\">\n {{ $t('auth.signUpTitle') }}\n </template>\n <template v-else-if=\"mode === 'reset'\">\n {{ $t('auth.resetTitle') }}\n </template>\n </component>\n </div>\n\n <!-- Error message -->\n <VvAlert\n v-if=\"errorMessage\"\n modifiers=\"danger\"\n class=\"mb-md\"\n :content=\"errorMessage\" />\n\n <!-- Two-step verification -->\n <template v-if=\"isTwoFactorStep\">\n <p\n class=\"text-14 text-word-3 text-center leading-normal mb-md\">\n {{ twoFactorDescription }}\n </p>\n <VvTwoFactorForm\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onVerifyTwoFactor\">\n <VvTwoFactorField\n name=\"code\"\n type=\"text\"\n :autocomplete=\"\n twoFactorKind === 'backup'\n ? 'off'\n : 'one-time-code'\n \"\n :label=\"\n twoFactorKind === 'backup'\n ? $t('twoFactor.backupCode')\n : $t('twoFactor.code')\n \"\n floating />\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('twoFactor.verify')\" />\n </VvTwoFactorForm>\n <div class=\"flex justify-center mt-md\">\n <VvButton\n v-if=\"twoFactorKind === 'totp'\"\n type=\"button\"\n modifiers=\"link\"\n :label=\"$t('twoFactor.useBackupCode')\"\n @click=\"switchTwoFactorKind('backup')\" />\n <VvButton\n v-else-if=\"twoFactorKind === 'backup'\"\n type=\"button\"\n modifiers=\"link\"\n :label=\"$t('twoFactor.useApp')\"\n @click=\"switchTwoFactorKind('totp')\" />\n <VvButton\n v-else\n type=\"button\"\n modifiers=\"link\"\n :disabled=\"loading\"\n :label=\"$t('twoFactor.sendAgain')\"\n @click=\"emit('send-two-factor-code')\" />\n </div>\n </template>\n\n <!-- Sign In -->\n <VvSignInForm\n v-else-if=\"mode === 'sign-in'\"\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onSignIn\">\n <div class=\"mb-md\">\n <VvSignInField\n name=\"email\"\n type=\"email\"\n autocomplete=\"username\"\n :label=\"$t('label.email')\"\n floating />\n <VvSignInField\n name=\"password\"\n type=\"password\"\n autocomplete=\"current-password\"\n :label=\"$t('label.password')\"\n floating />\n <div class=\"mb-md\">\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n :label=\"$t('action.forgetPassword')\"\n @click=\"mode = 'reset'\" />\n </div>\n <VvSignInField\n name=\"rememberMe\"\n type=\"checkbox\"\n :label=\"$t('label.rememberMe')\"\n switch />\n </div>\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('action.signIn')\" />\n </VvSignInForm>\n\n <!-- Sign Up -->\n <VvSignUpForm\n v-else-if=\"mode === 'sign-up'\"\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onSignUp\">\n <div class=\"mb-md\">\n <VvSignUpField\n name=\"name\"\n type=\"text\"\n autocomplete=\"name\"\n :label=\"$t('label.name')\"\n floating />\n <VvSignUpField\n name=\"email\"\n type=\"email\"\n autocomplete=\"username\"\n :label=\"$t('label.email')\"\n floating />\n <VvSignUpField\n name=\"password\"\n type=\"password\"\n autocomplete=\"new-password\"\n :label=\"$t('label.password')\"\n floating />\n <VvSignUpField\n name=\"passwordConfirmation\"\n type=\"password\"\n autocomplete=\"new-password\"\n :label=\"$t('label.confirmPassword')\"\n floating />\n </div>\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('action.continue')\" />\n </VvSignUpForm>\n\n <!-- Reset Password -->\n <VvResetForm\n v-else-if=\"mode === 'reset'\"\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onReset\">\n <VvResetField\n name=\"email\"\n type=\"email\"\n autocomplete=\"username\"\n :label=\"$t('label.email')\"\n floating />\n <VvButtonGroup modifiers=\"vertical\">\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('action.submit')\" />\n </VvButtonGroup>\n </VvResetForm>\n\n <!-- Social providers (shared by sign-in and sign-up) -->\n <template\n v-if=\"\n !isTwoFactorStep &&\n (mode === 'sign-in' || mode === 'sign-up') &&\n showSocialButtons\n \">\n <div class=\"hr mt-xs\">\n <span>{{ $t('label.or') }}</span>\n </div>\n <VvButtonGroup\n modifiers=\"vertical\"\n class=\"gap-xs mt-xs\">\n <VvButton\n v-if=\"authMethods?.google\"\n type=\"button\"\n modifiers=\"secondary\"\n icon=\"logos:google-icon\"\n :disabled=\"loading\"\n :label=\"\n $t('action.signInWithSocialProvider', {\n provider: 'Google',\n })\n \"\n @click=\"handleSocial('google')\" />\n <VvButton\n v-if=\"authMethods?.microsoft\"\n type=\"button\"\n modifiers=\"secondary\"\n icon=\"logos:microsoft-icon\"\n :disabled=\"loading\"\n :label=\"\n $t('action.signInWithSocialProvider', {\n provider: 'Microsoft',\n })\n \"\n @click=\"handleSocial('microsoft')\" />\n </VvButtonGroup>\n </template>\n </div>\n\n <!-- Footer below Form -->\n <div class=\"pt-lg text-center text-word-3\">\n <template v-if=\"isTwoFactorStep\">\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n icon=\"chevron-left\"\n :label=\"$t('action.backToSignIn')\"\n @click=\"emit('cancel-two-factor')\" />\n </template>\n <template v-else-if=\"mode === 'sign-in'\">\n {{ $t('auth.noAccount') }}\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n class=\"font-semibold\"\n :label=\"$t('action.signUp')\"\n @click=\"mode = 'sign-up'\" />\n </template>\n <template v-else-if=\"mode === 'sign-up'\">\n {{ $t('auth.haveAccount') }}\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n class=\"font-semibold\"\n :label=\"$t('action.signIn')\"\n @click=\"mode = 'sign-in'\" />\n </template>\n <template v-else>\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n icon=\"chevron-left\"\n :label=\"$t('action.backToSignIn')\"\n @click=\"mode = 'sign-in'\" />\n </template>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-auth {\n // Flip-card reveal between the form and the success screen, mirroring\n // the classic login in apps/frontend.\n &__flip {\n display: grid;\n transform-style: preserve-3d;\n perspective: 1000px;\n }\n\n &__flip-card {\n grid-area: 1 / 1;\n backface-visibility: hidden;\n transform-style: preserve-3d;\n }\n\n // Subtle pop on the success check icon once the card has flipped in.\n &__success-icon {\n animation: pk-chatbot-auth-check-pop 0.4s ease-out 0.3s backwards;\n }\n }\n\n .pk-flip-enter-active {\n animation: pk-chatbot-auth-flip-in 0.6s ease-out;\n }\n\n .pk-flip-leave-active {\n animation: pk-chatbot-auth-flip-out 0.6s ease-in;\n }\n\n @keyframes pk-chatbot-auth-flip-in {\n 0% {\n transform: rotateY(-180deg);\n opacity: 0;\n }\n\n 100% {\n transform: rotateY(0deg);\n opacity: 1;\n }\n }\n\n @keyframes pk-chatbot-auth-flip-out {\n 0% {\n transform: rotateY(0deg);\n opacity: 1;\n }\n\n 100% {\n transform: rotateY(180deg);\n opacity: 0;\n }\n }\n\n @keyframes pk-chatbot-auth-check-pop {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n\n 60% {\n transform: scale(1.15);\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n }\n</style>\n","<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useForm } from '@volverjs/form-vue'\n import * as z from 'zod'\n import { PasswordSchema, SignUpSchema } from 'models'\n import type { AgentBranding, AuthMethods } from 'models'\n import { useImageFallback } from 'composables'\n\n const { t: $t } = useI18n({\n useScope: 'global',\n })\n\n const props = withDefaults(\n defineProps<{\n branding?: AgentBranding\n authMethods?: AuthMethods\n loading?: boolean\n /**\n * Set while an email sign-in waits for its second factor: the\n * methods the account has (`totp`, `otp`). The code step replaces\n * the forms until it is answered or cancelled.\n */\n twoFactorMethods?: string[]\n }>(),\n {\n branding: undefined,\n authMethods: undefined,\n loading: false,\n twoFactorMethods: undefined,\n },\n )\n\n // A deleted agent logo would leave a broken glyph above the sign-in form:\n // drop the whole block instead, the agent name below already identifies it.\n const { canShowImage, onImageError } = useImageFallback()\n\n const errorMessage = defineModel<string | undefined>('errorMessage', {\n default: undefined,\n })\n /**\n * Non-error feedback (e.g. \"check your inbox\" after sign-up / reset).\n * When set, a dedicated success screen replaces the form.\n */\n const success = defineModel<{ title: string; message: string } | undefined>(\n 'success',\n { default: undefined },\n )\n\n const emit = defineEmits<{\n (\n e: 'sign-in',\n payload: {\n email: string\n password: string\n rememberMe: boolean\n },\n ): void\n (\n e: 'sign-up',\n payload: { email: string; password: string; name: string },\n ): void\n (e: 'request-reset', payload: { email: string }): void\n (e: 'social', provider: 'google' | 'microsoft'): void\n (\n e: 'verify-two-factor',\n payload: { kind: 'totp' | 'otp' | 'backup'; code: string },\n ): void\n (e: 'send-two-factor-code'): void\n (e: 'cancel-two-factor'): void\n (e: 'update:errorMessage', message?: string): void\n (e: 'update:success', value?: { title: string; message: string }): void\n }>()\n\n type Mode = 'sign-in' | 'sign-up' | 'reset'\n const mode = ref<Mode>('sign-in')\n watch(mode, () => {\n errorMessage.value = undefined\n success.value = undefined\n })\n\n /** Returns to the sign-in form, clearing any success feedback. */\n function backToSignIn() {\n success.value = undefined\n mode.value = 'sign-in'\n }\n\n const showSocialButtons = computed(\n () => props.authMethods?.google || props.authMethods?.microsoft,\n )\n\n const signInSchema = z.object({\n email: z.email(),\n password: PasswordSchema,\n rememberMe: z.boolean().default(false),\n })\n\n const resetSchema = z.object({\n email: z.email(),\n })\n\n const { VvForm: VvSignInForm, VvFormField: VvSignInField } = useForm(\n signInSchema,\n { lazyLoad: true },\n )\n const {\n VvForm: VvSignUpForm,\n VvFormField: VvSignUpField,\n clear: clearSignUp,\n } = useForm(SignUpSchema, { lazyLoad: true })\n const {\n VvForm: VvResetForm,\n VvFormField: VvResetField,\n clear: clearReset,\n } = useForm(resetSchema, { lazyLoad: true })\n\n // Empty the sign-up / reset forms once their submission succeeds so a\n // later \"back to sign in\" doesn't reveal stale input.\n watch(success, (value) => {\n if (value) {\n clearSignUp()\n clearReset()\n }\n })\n\n // Move focus to the success card once the flip animation has finished\n // (the out-in transition mounts it only after the form leaves), so\n // screen-reader/keyboard users are announced the result.\n const successCard = ref<HTMLElement>()\n function focusSuccessCard() {\n if (success.value) {\n successCard.value?.focus()\n }\n }\n\n function onSignIn(data: {\n email: string\n password: string\n rememberMe?: boolean\n }) {\n emit('sign-in', {\n email: data.email,\n password: data.password,\n rememberMe: data.rememberMe ?? false,\n })\n }\n\n function onSignUp(data: { name: string; email: string; password: string }) {\n emit('sign-up', {\n name: data.name.trim(),\n email: data.email,\n password: data.password,\n })\n }\n\n function onReset(data: { email: string }) {\n emit('request-reset', { email: data.email })\n }\n\n function handleSocial(provider: 'google' | 'microsoft') {\n emit('social', provider)\n }\n\n // Two-step verification (docs/specs/two-factor-authentication.md)\n type TwoFactorKind = 'totp' | 'otp' | 'backup'\n const isTwoFactorStep = computed(() => !!props.twoFactorMethods?.length)\n const twoFactorKind = ref<TwoFactorKind>('totp')\n const {\n VvForm: VvTwoFactorForm,\n VvFormField: VvTwoFactorField,\n clear: clearTwoFactor,\n } = useForm(z.object({ code: z.string().trim().min(6).max(32) }), {\n lazyLoad: true,\n })\n // A new challenge starts from the factor the account has, and the email\n // one sends its code straight away.\n watch(\n () => props.twoFactorMethods,\n (methods) => {\n if (!methods?.length) {\n return\n }\n twoFactorKind.value = methods.includes('totp') ? 'totp' : 'otp'\n clearTwoFactor()\n if (twoFactorKind.value === 'otp') {\n emit('send-two-factor-code')\n }\n },\n { immediate: true },\n )\n function switchTwoFactorKind(kind: TwoFactorKind) {\n twoFactorKind.value = kind\n errorMessage.value = undefined\n clearTwoFactor()\n }\n const twoFactorDescription = computed(() => {\n if (twoFactorKind.value === 'backup') {\n return $t('twoFactor.challengeBackup')\n }\n return twoFactorKind.value === 'otp'\n ? $t('twoFactor.challengeEmailSent')\n : $t('twoFactor.challengeApp')\n })\n function onVerifyTwoFactor(data: { code: string }) {\n emit('verify-two-factor', {\n kind: twoFactorKind.value,\n code: data.code.trim(),\n })\n }\n</script>\n\n<template>\n <div\n class=\"pk-chatbot-auth flex flex-col items-center justify-center w-full min-h-full p-lg overflow-y-auto\">\n <div class=\"pk-chatbot-auth__flip w-full max-w-384 mx-auto my-auto\">\n <Transition\n name=\"pk-flip\"\n mode=\"out-in\"\n @after-enter=\"focusSuccessCard\">\n <!-- Success screen (sign-up / reset feedback) -->\n <div\n v-if=\"success\"\n ref=\"successCard\"\n key=\"success\"\n tabindex=\"-1\"\n class=\"pk-chatbot-auth__flip-card outline-none flex flex-col text-center leading-normal\">\n <div\n class=\"pk-chatbot-auth__success-icon w-64 h-64 border border-surface-3 rounded-full bg-surface-0 flex items-center justify-center overflow-hidden bg-surface mx-auto mb-md\">\n <VvIcon\n name=\"ri:mail-check-line\"\n aria-hidden=\"true\"\n class=\"text-success w-32 h-32\" />\n </div>\n <h1 class=\"font-bold text-18 mb-xs\">\n {{ success.title }}\n </h1>\n <p class=\"mb-lg text-16 text-word-3\">\n {{ success.message }}\n </p>\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n icon=\"chevron-left\"\n :label=\"$t('action.backToSignIn')\"\n @click=\"backToSignIn\" />\n </div>\n\n <!-- Sign-in / sign-up / reset forms -->\n <div\n v-else\n key=\"form\"\n class=\"pk-chatbot-auth__flip-card flex flex-col\">\n <!-- Form Container -->\n <div class=\"flex flex-col\">\n <!-- Relative Header Logo -->\n <div\n v-if=\"canShowImage(branding?.interface.logo)\"\n class=\"flex justify-center mb-md\">\n <img\n :src=\"branding?.interface.logo\"\n :alt=\"branding?.name\"\n class=\"w-64 h-64 border border-surface-3 rounded-full bg-surface-0 overflow-hidden bg-surface object-contain\"\n @error=\"\n onImageError(branding?.interface.logo)\n \" />\n </div>\n\n <div class=\"text-center leading-normal mb-lg\">\n <h1\n v-if=\"branding?.name\"\n class=\"font-bold text-20 m-0\">\n {{ branding.name }}\n </h1>\n <component\n :is=\"branding?.name ? 'h2' : 'h1'\"\n class=\"text-word-3 mb-0\">\n <template v-if=\"isTwoFactorStep\">\n {{ $t('twoFactor.challengeTitle') }}\n </template>\n <template v-else-if=\"mode === 'sign-in'\">\n {{ $t('auth.signInTitle') }}\n </template>\n <template v-else-if=\"mode === 'sign-up'\">\n {{ $t('auth.signUpTitle') }}\n </template>\n <template v-else-if=\"mode === 'reset'\">\n {{ $t('auth.resetTitle') }}\n </template>\n </component>\n </div>\n\n <!-- Error message -->\n <VvAlert\n v-if=\"errorMessage\"\n modifiers=\"danger\"\n class=\"mb-md\"\n :content=\"errorMessage\" />\n\n <!-- Two-step verification -->\n <template v-if=\"isTwoFactorStep\">\n <p\n class=\"text-14 text-word-3 text-center leading-normal mb-md\">\n {{ twoFactorDescription }}\n </p>\n <VvTwoFactorForm\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onVerifyTwoFactor\">\n <VvTwoFactorField\n name=\"code\"\n type=\"text\"\n :autocomplete=\"\n twoFactorKind === 'backup'\n ? 'off'\n : 'one-time-code'\n \"\n :label=\"\n twoFactorKind === 'backup'\n ? $t('twoFactor.backupCode')\n : $t('twoFactor.code')\n \"\n floating />\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('twoFactor.verify')\" />\n </VvTwoFactorForm>\n <div class=\"flex justify-center mt-md\">\n <VvButton\n v-if=\"twoFactorKind === 'totp'\"\n type=\"button\"\n modifiers=\"link\"\n :label=\"$t('twoFactor.useBackupCode')\"\n @click=\"switchTwoFactorKind('backup')\" />\n <VvButton\n v-else-if=\"twoFactorKind === 'backup'\"\n type=\"button\"\n modifiers=\"link\"\n :label=\"$t('twoFactor.useApp')\"\n @click=\"switchTwoFactorKind('totp')\" />\n <VvButton\n v-else\n type=\"button\"\n modifiers=\"link\"\n :disabled=\"loading\"\n :label=\"$t('twoFactor.sendAgain')\"\n @click=\"emit('send-two-factor-code')\" />\n </div>\n </template>\n\n <!-- Sign In -->\n <VvSignInForm\n v-else-if=\"mode === 'sign-in'\"\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onSignIn\">\n <div class=\"mb-md\">\n <VvSignInField\n name=\"email\"\n type=\"email\"\n autocomplete=\"username\"\n :label=\"$t('label.email')\"\n floating />\n <VvSignInField\n name=\"password\"\n type=\"password\"\n autocomplete=\"current-password\"\n :label=\"$t('label.password')\"\n floating />\n <div class=\"mb-md\">\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n :label=\"$t('action.forgetPassword')\"\n @click=\"mode = 'reset'\" />\n </div>\n <VvSignInField\n name=\"rememberMe\"\n type=\"checkbox\"\n :label=\"$t('label.rememberMe')\"\n switch />\n </div>\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('action.signIn')\" />\n </VvSignInForm>\n\n <!-- Sign Up -->\n <VvSignUpForm\n v-else-if=\"mode === 'sign-up'\"\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onSignUp\">\n <div class=\"mb-md\">\n <VvSignUpField\n name=\"name\"\n type=\"text\"\n autocomplete=\"name\"\n :label=\"$t('label.name')\"\n floating />\n <VvSignUpField\n name=\"email\"\n type=\"email\"\n autocomplete=\"username\"\n :label=\"$t('label.email')\"\n floating />\n <VvSignUpField\n name=\"password\"\n type=\"password\"\n autocomplete=\"new-password\"\n :label=\"$t('label.password')\"\n floating />\n <VvSignUpField\n name=\"passwordConfirmation\"\n type=\"password\"\n autocomplete=\"new-password\"\n :label=\"$t('label.confirmPassword')\"\n floating />\n </div>\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('action.continue')\" />\n </VvSignUpForm>\n\n <!-- Reset Password -->\n <VvResetForm\n v-else-if=\"mode === 'reset'\"\n class=\"flex flex-col\"\n :readonly=\"loading\"\n @submit=\"onReset\">\n <VvResetField\n name=\"email\"\n type=\"email\"\n autocomplete=\"username\"\n :label=\"$t('label.email')\"\n floating />\n <VvButtonGroup modifiers=\"vertical\">\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :label=\"$t('action.submit')\" />\n </VvButtonGroup>\n </VvResetForm>\n\n <!-- Social providers (shared by sign-in and sign-up) -->\n <template\n v-if=\"\n !isTwoFactorStep &&\n (mode === 'sign-in' || mode === 'sign-up') &&\n showSocialButtons\n \">\n <div class=\"hr mt-xs\">\n <span>{{ $t('label.or') }}</span>\n </div>\n <VvButtonGroup\n modifiers=\"vertical\"\n class=\"gap-xs mt-xs\">\n <VvButton\n v-if=\"authMethods?.google\"\n type=\"button\"\n modifiers=\"secondary\"\n icon=\"logos:google-icon\"\n :disabled=\"loading\"\n :label=\"\n $t('action.signInWithSocialProvider', {\n provider: 'Google',\n })\n \"\n @click=\"handleSocial('google')\" />\n <VvButton\n v-if=\"authMethods?.microsoft\"\n type=\"button\"\n modifiers=\"secondary\"\n icon=\"logos:microsoft-icon\"\n :disabled=\"loading\"\n :label=\"\n $t('action.signInWithSocialProvider', {\n provider: 'Microsoft',\n })\n \"\n @click=\"handleSocial('microsoft')\" />\n </VvButtonGroup>\n </template>\n </div>\n\n <!-- Footer below Form -->\n <div class=\"pt-lg text-center text-word-3\">\n <template v-if=\"isTwoFactorStep\">\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n icon=\"chevron-left\"\n :label=\"$t('action.backToSignIn')\"\n @click=\"emit('cancel-two-factor')\" />\n </template>\n <template v-else-if=\"mode === 'sign-in'\">\n {{ $t('auth.noAccount') }}\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n class=\"font-semibold\"\n :label=\"$t('action.signUp')\"\n @click=\"mode = 'sign-up'\" />\n </template>\n <template v-else-if=\"mode === 'sign-up'\">\n {{ $t('auth.haveAccount') }}\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n class=\"font-semibold\"\n :label=\"$t('action.signIn')\"\n @click=\"mode = 'sign-in'\" />\n </template>\n <template v-else>\n <VvButton\n type=\"button\"\n modifiers=\"link\"\n icon=\"chevron-left\"\n :label=\"$t('action.backToSignIn')\"\n @click=\"mode = 'sign-in'\" />\n </template>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-auth {\n // Flip-card reveal between the form and the success screen, mirroring\n // the classic login in apps/frontend.\n &__flip {\n display: grid;\n transform-style: preserve-3d;\n perspective: 1000px;\n }\n\n &__flip-card {\n grid-area: 1 / 1;\n backface-visibility: hidden;\n transform-style: preserve-3d;\n }\n\n // Subtle pop on the success check icon once the card has flipped in.\n &__success-icon {\n animation: pk-chatbot-auth-check-pop 0.4s ease-out 0.3s backwards;\n }\n }\n\n .pk-flip-enter-active {\n animation: pk-chatbot-auth-flip-in 0.6s ease-out;\n }\n\n .pk-flip-leave-active {\n animation: pk-chatbot-auth-flip-out 0.6s ease-in;\n }\n\n @keyframes pk-chatbot-auth-flip-in {\n 0% {\n transform: rotateY(-180deg);\n opacity: 0;\n }\n\n 100% {\n transform: rotateY(0deg);\n opacity: 1;\n }\n }\n\n @keyframes pk-chatbot-auth-flip-out {\n 0% {\n transform: rotateY(0deg);\n opacity: 1;\n }\n\n 100% {\n transform: rotateY(180deg);\n opacity: 0;\n }\n }\n\n @keyframes pk-chatbot-auth-check-pop {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n\n 60% {\n transform: scale(1.15);\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n }\n</style>\n"],"mappings":"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"}
|