@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.
Files changed (155) hide show
  1. package/dist/_chunks/Agent-DTLrWpzX.js +460 -0
  2. package/dist/_chunks/Agent-DTLrWpzX.js.map +1 -0
  3. package/dist/_chunks/Media-Cft7Pwrh.js +108 -0
  4. package/dist/_chunks/Media-Cft7Pwrh.js.map +1 -0
  5. package/dist/_chunks/{PkStreamingMarkdown-ZD0SROu1.js → PkStreamingMarkdown-C1sANAr5.js} +672 -688
  6. package/dist/_chunks/PkStreamingMarkdown-C1sANAr5.js.map +1 -0
  7. package/dist/_chunks/{PkToolRequestGeolocation-OF1PWhMw.js → PkToolRequestGeolocation-BbxYKt-9.js} +2 -2
  8. package/{dist-vue/_chunks/PkToolRequestGeolocation-BOVbaCzQ.js.map → dist/_chunks/PkToolRequestGeolocation-BbxYKt-9.js.map} +1 -1
  9. package/dist/_chunks/{PkToolRequestOAuthConnection-ChGMAKV7.js → PkToolRequestOAuthConnection-CTp2w60F.js} +2 -2
  10. package/dist/_chunks/{PkToolRequestOAuthConnection-ChGMAKV7.js.map → PkToolRequestOAuthConnection-CTp2w60F.js.map} +1 -1
  11. package/dist/_chunks/{PkToolShowArtifact-LEfO5zfg.js → PkToolShowArtifact-BfTjxGOT.js} +2 -2
  12. package/dist/_chunks/{PkToolShowArtifact-LEfO5zfg.js.map → PkToolShowArtifact-BfTjxGOT.js.map} +1 -1
  13. package/dist/_chunks/PkToolShowComparison-BJ7QBXtf.js +60 -0
  14. package/dist/_chunks/PkToolShowComparison-BJ7QBXtf.js.map +1 -0
  15. package/dist/_chunks/{PkToolShowContactForm-BO3JQfts.js → PkToolShowContactForm-PFpY9dIp.js} +2 -2
  16. package/dist/_chunks/{PkToolShowContactForm-BO3JQfts.js.map → PkToolShowContactForm-PFpY9dIp.js.map} +1 -1
  17. package/dist/_chunks/{PkToolShowForm-KW8MOL-j.js → PkToolShowForm-CMtSN0oX.js} +5 -5
  18. package/dist/_chunks/{PkToolShowForm-KW8MOL-j.js.map → PkToolShowForm-CMtSN0oX.js.map} +1 -1
  19. package/dist/_chunks/{PkToolShowSources-Bfx-Th_j.js → PkToolShowSources-C6cu66Ts.js} +3 -3
  20. package/dist/_chunks/{PkToolShowSources-Bfx-Th_j.js.map → PkToolShowSources-C6cu66Ts.js.map} +1 -1
  21. package/dist/_chunks/{PkToolShowSuggestedReply-Dl4x_nEJ.js → PkToolShowSuggestedReply-CFO8wV1b.js} +2 -2
  22. package/dist/_chunks/{PkToolShowSuggestedReply-Dl4x_nEJ.js.map → PkToolShowSuggestedReply-CFO8wV1b.js.map} +1 -1
  23. package/dist/_chunks/{markdown-BL7WANiX.js → markdown-BRD-hDrH.js} +12 -19
  24. package/dist/_chunks/markdown-BRD-hDrH.js.map +1 -0
  25. package/dist/ai-elements.es.js +2767 -3035
  26. package/dist/ai-elements.es.js.map +1 -1
  27. package/dist-vue/PkChatbot.js +1 -1
  28. package/dist-vue/PkChatbotAuth.js +1 -1
  29. package/dist-vue/PkChatbotEmptyState.js +1 -1
  30. package/dist-vue/PkChatbotInput.js +1 -1
  31. package/dist-vue/PkChatbotMessages.js +1 -1
  32. package/dist-vue/PkChatbotStepPayload.js +1 -1
  33. package/dist-vue/PkChatbotStepToolDetail.js +1 -1
  34. package/dist-vue/PkChatbotSteps.js +1 -1
  35. package/dist-vue/PkChatbotViewChat.js +1 -1
  36. package/dist-vue/PkChatbotViewConversations.js +1 -1
  37. package/dist-vue/PkChatbotViewFiles.js +1 -1
  38. package/dist-vue/PkChatbotViewProfile.js +1 -1
  39. package/dist-vue/_chunks/{Agent-tbKw8Mdt.js → Agent-BNlmK-uJ.js} +2 -2
  40. package/dist-vue/_chunks/{Agent-tbKw8Mdt.js.map → Agent-BNlmK-uJ.js.map} +1 -1
  41. package/dist-vue/_chunks/{Document-nCWwJC2h.js → Document-2X01-F4Z.js} +11 -18
  42. package/dist-vue/_chunks/Document-2X01-F4Z.js.map +1 -0
  43. package/dist-vue/_chunks/Media-_HfFLHGD.js.map +1 -1
  44. package/dist-vue/_chunks/{PkChatbot-CXQzBuxy.js → PkChatbot-HRayDr2d.js} +8 -8
  45. package/dist-vue/_chunks/{PkChatbot-CXQzBuxy.js.map → PkChatbot-HRayDr2d.js.map} +1 -1
  46. package/dist-vue/_chunks/PkChatbotAuth-Bi508F1u.js +349 -0
  47. package/dist-vue/_chunks/PkChatbotAuth-Bi508F1u.js.map +1 -0
  48. package/dist-vue/_chunks/{PkChatbotEmptyState-9mWiPd4B.js → PkChatbotEmptyState-CPOcfoRC.js} +2 -2
  49. package/dist-vue/_chunks/{PkChatbotEmptyState-9mWiPd4B.js.map → PkChatbotEmptyState-CPOcfoRC.js.map} +1 -1
  50. package/dist-vue/_chunks/{PkChatbotInput-BzaCyeFp.js → PkChatbotInput-pLJQIu7v.js} +2 -2
  51. package/dist-vue/_chunks/{PkChatbotInput-BzaCyeFp.js.map → PkChatbotInput-pLJQIu7v.js.map} +1 -1
  52. package/dist-vue/_chunks/{PkChatbotMessages-KH5RE8Dk.js → PkChatbotMessages-GZStJbx_.js} +256 -258
  53. package/dist-vue/_chunks/PkChatbotMessages-GZStJbx_.js.map +1 -0
  54. package/dist-vue/_chunks/{PkChatbotStepPayload-C36nXLW7.js → PkChatbotStepPayload-DU0W-eUp.js} +2 -2
  55. package/dist-vue/_chunks/{PkChatbotStepPayload-C36nXLW7.js.map → PkChatbotStepPayload-DU0W-eUp.js.map} +1 -1
  56. package/dist-vue/_chunks/{PkChatbotStepToolDetail-CBX-AQXv.js → PkChatbotStepToolDetail-etlBryOg.js} +3 -3
  57. package/dist-vue/_chunks/{PkChatbotStepToolDetail-CBX-AQXv.js.map → PkChatbotStepToolDetail-etlBryOg.js.map} +1 -1
  58. package/dist-vue/_chunks/PkChatbotSteps-Cl4pVtPJ.js +190 -0
  59. package/dist-vue/_chunks/PkChatbotSteps-Cl4pVtPJ.js.map +1 -0
  60. package/dist-vue/_chunks/{PkChatbotViewChat-D5sfTMCW.js → PkChatbotViewChat-DIfBWFoG.js} +7 -7
  61. package/dist-vue/_chunks/{PkChatbotViewChat-D5sfTMCW.js.map → PkChatbotViewChat-DIfBWFoG.js.map} +1 -1
  62. package/dist-vue/_chunks/{PkChatbotViewConversations-CHpN4vhm.js → PkChatbotViewConversations-BCdolW0R.js} +2 -2
  63. package/dist-vue/_chunks/{PkChatbotViewConversations-CHpN4vhm.js.map → PkChatbotViewConversations-BCdolW0R.js.map} +1 -1
  64. package/dist-vue/_chunks/{PkChatbotViewFiles-Bk9-K6Hw.js → PkChatbotViewFiles-Cudao8ew.js} +3 -3
  65. package/dist-vue/_chunks/{PkChatbotViewFiles-Bk9-K6Hw.js.map → PkChatbotViewFiles-Cudao8ew.js.map} +1 -1
  66. package/dist-vue/_chunks/{PkChatbotViewProfile-CosaHA-g.js → PkChatbotViewProfile-DDsKOkcC.js} +2 -2
  67. package/dist-vue/_chunks/{PkChatbotViewProfile-CosaHA-g.js.map → PkChatbotViewProfile-DDsKOkcC.js.map} +1 -1
  68. package/dist-vue/_chunks/{PkStreamingMarkdown-BN7waklD.js → PkStreamingMarkdown-BloMJaIW.js} +205 -214
  69. package/dist-vue/_chunks/{PkStreamingMarkdown-BN7waklD.js.map → PkStreamingMarkdown-BloMJaIW.js.map} +1 -1
  70. package/dist-vue/_chunks/{PkToolRequestGeolocation-BOVbaCzQ.js → PkToolRequestGeolocation-9vfYNaQo.js} +2 -2
  71. package/{dist/_chunks/PkToolRequestGeolocation-OF1PWhMw.js.map → dist-vue/_chunks/PkToolRequestGeolocation-9vfYNaQo.js.map} +1 -1
  72. package/dist-vue/_chunks/{PkToolRequestOAuthConnection-DMvCGPuX.js → PkToolRequestOAuthConnection-BorR5NmZ.js} +2 -2
  73. package/dist-vue/_chunks/{PkToolRequestOAuthConnection-DMvCGPuX.js.map → PkToolRequestOAuthConnection-BorR5NmZ.js.map} +1 -1
  74. package/dist-vue/_chunks/{PkToolShowArtifact-DrE_mK1z.js → PkToolShowArtifact-BuMY7GNj.js} +2 -2
  75. package/dist-vue/_chunks/{PkToolShowArtifact-DrE_mK1z.js.map → PkToolShowArtifact-BuMY7GNj.js.map} +1 -1
  76. package/dist-vue/_chunks/PkToolShowComparison-BLn4pkno.js +61 -0
  77. package/dist-vue/_chunks/PkToolShowComparison-BLn4pkno.js.map +1 -0
  78. package/dist-vue/_chunks/{PkToolShowContactForm-BBTbrgt4.js → PkToolShowContactForm-0OQRqT8m.js} +2 -2
  79. package/dist-vue/_chunks/{PkToolShowContactForm-BBTbrgt4.js.map → PkToolShowContactForm-0OQRqT8m.js.map} +1 -1
  80. package/dist-vue/_chunks/{PkToolShowDiagram-CztnTdq2.js → PkToolShowDiagram-BGL27iHG.js} +2 -2
  81. package/dist-vue/_chunks/{PkToolShowDiagram-CztnTdq2.js.map → PkToolShowDiagram-BGL27iHG.js.map} +1 -1
  82. package/dist-vue/_chunks/{PkToolShowEmail-C30K5kJA.js → PkToolShowEmail-BJJpS69F.js} +2 -2
  83. package/dist-vue/_chunks/{PkToolShowEmail-C30K5kJA.js.map → PkToolShowEmail-BJJpS69F.js.map} +1 -1
  84. package/dist-vue/_chunks/{PkToolShowForm-C9N_SSm8.js → PkToolShowForm-DDcPpOZ8.js} +4 -4
  85. package/dist-vue/_chunks/{PkToolShowForm-C9N_SSm8.js.map → PkToolShowForm-DDcPpOZ8.js.map} +1 -1
  86. package/dist-vue/_chunks/{PkToolShowMessage-DvkCRERv.js → PkToolShowMessage-BFGynf3p.js} +2 -2
  87. package/dist-vue/_chunks/{PkToolShowMessage-DvkCRERv.js.map → PkToolShowMessage-BFGynf3p.js.map} +1 -1
  88. package/dist-vue/_chunks/{PkToolShowProductList-cfjg3CmV.js → PkToolShowProductList-6t1Ir5CW.js} +2 -2
  89. package/dist-vue/_chunks/{PkToolShowProductList-cfjg3CmV.js.map → PkToolShowProductList-6t1Ir5CW.js.map} +1 -1
  90. package/dist-vue/_chunks/{PkToolShowSources-CyR2GTiE.js → PkToolShowSources-cOF0ZxOj.js} +4 -4
  91. package/dist-vue/_chunks/{PkToolShowSources-CyR2GTiE.js.map → PkToolShowSources-cOF0ZxOj.js.map} +1 -1
  92. package/dist-vue/_chunks/{PkToolShowSuggestedReply-qAWdCUhr.js → PkToolShowSuggestedReply-DA4NEjHB.js} +2 -2
  93. package/dist-vue/_chunks/{PkToolShowSuggestedReply-qAWdCUhr.js.map → PkToolShowSuggestedReply-DA4NEjHB.js.map} +1 -1
  94. package/dist-vue/_chunks/{PkToolShowWebPages-CkQ2NhRj.js → PkToolShowWebPages-OgaT1vYJ.js} +2 -2
  95. package/dist-vue/_chunks/{PkToolShowWebPages-CkQ2NhRj.js.map → PkToolShowWebPages-OgaT1vYJ.js.map} +1 -1
  96. package/dist-vue/_chunks/{PkUrl-BsD4Vby6.js → PkUrl-Cd69XP5z.js} +2 -2
  97. package/dist-vue/_chunks/{PkUrl-BsD4Vby6.js.map → PkUrl-Cd69XP5z.js.map} +1 -1
  98. package/dist-vue/_chunks/{createChatbotApiClient-BlWs282E.js → createChatbotApiClient-CaVLm5W9.js} +168 -137
  99. package/dist-vue/_chunks/createChatbotApiClient-CaVLm5W9.js.map +1 -0
  100. package/dist-vue/_chunks/{useChatbotStore-CMo47fnS.js → useChatbotStore-BwrBZJCq.js} +3 -3
  101. package/dist-vue/_chunks/{useChatbotStore-CMo47fnS.js.map → useChatbotStore-BwrBZJCq.js.map} +1 -1
  102. package/dist-vue/_chunks/utils-h4C7rRcu.js +177 -0
  103. package/dist-vue/_chunks/utils-h4C7rRcu.js.map +1 -0
  104. package/dist-vue/api.js +1 -1
  105. package/dist-vue/apps/web-component/src/components/EmbeddedChatWidget.ce.d.ts +4 -4
  106. package/dist-vue/apps/web-component/src/composables/useChatbotAuth.d.ts +8 -54
  107. package/dist-vue/apps/web-component/src/composables/useChatbotAuthForm.d.ts +0 -14
  108. package/dist-vue/composables.js +112 -436
  109. package/dist-vue/composables.js.map +1 -1
  110. package/dist-vue/index.js +3235 -3359
  111. package/dist-vue/index.js.map +1 -1
  112. package/dist-vue/locales.js +0 -42
  113. package/dist-vue/packages/ability/src/index.d.ts +14 -10
  114. package/dist-vue/packages/auth/src/social-redirect-plugin.d.ts +12 -18
  115. package/dist-vue/packages/components/src/chat/PkChatbotAuth.d.ts +0 -19
  116. package/dist-vue/packages/components/src/chat/PkChatbotMessages.d.ts +4 -8
  117. package/dist-vue/packages/components/src/chat/PkChatbotSteps.d.ts +0 -1
  118. package/dist-vue/packages/components/src/chat/utils.d.ts +0 -9
  119. package/dist-vue/packages/components/src/index.d.ts +1 -2
  120. package/dist-vue/packages/composable/src/chatbot/useChatbotStore.d.ts +0 -60
  121. package/dist-vue/packages/models/src/schema/Chat.d.ts +0 -42
  122. package/dist-vue/packages/models/src/schema/Document.d.ts +0 -17
  123. package/dist-vue/packages/models/src/schema/DocumentFolder.d.ts +0 -10
  124. package/dist-vue/packages/models/src/schema/DocumentSyncSource.d.ts +1 -71
  125. package/dist-vue/packages/models/src/schema/Media.d.ts +1 -0
  126. package/dist-vue/packages/models/src/schema/Member.d.ts +0 -3
  127. package/dist-vue/packages/models/src/schema/Notification.d.ts +0 -6
  128. package/dist-vue/packages/models/src/schema/Organization.d.ts +0 -1
  129. package/dist-vue/packages/models/src/schema/User.d.ts +0 -1
  130. package/dist-vue/style.css +1 -1
  131. package/package.json +1 -1
  132. package/dist/_chunks/Agent-DK76k05_.js +0 -566
  133. package/dist/_chunks/Agent-DK76k05_.js.map +0 -1
  134. package/dist/_chunks/PkStreamingMarkdown-ZD0SROu1.js.map +0 -1
  135. package/dist/_chunks/PkToolShowComparison-8d6fAhRp.js +0 -72
  136. package/dist/_chunks/PkToolShowComparison-8d6fAhRp.js.map +0 -1
  137. package/dist/_chunks/markdown-BL7WANiX.js.map +0 -1
  138. package/dist-vue/_chunks/Document-nCWwJC2h.js.map +0 -1
  139. package/dist-vue/_chunks/PkChatbotAuth-jzoNJkmH.js +0 -421
  140. package/dist-vue/_chunks/PkChatbotAuth-jzoNJkmH.js.map +0 -1
  141. package/dist-vue/_chunks/PkChatbotMessages-KH5RE8Dk.js.map +0 -1
  142. package/dist-vue/_chunks/PkChatbotSteps-356rnZG5.js +0 -191
  143. package/dist-vue/_chunks/PkChatbotSteps-356rnZG5.js.map +0 -1
  144. package/dist-vue/_chunks/PkToolShowComparison-DQs3E6-k.js +0 -72
  145. package/dist-vue/_chunks/PkToolShowComparison-DQs3E6-k.js.map +0 -1
  146. package/dist-vue/_chunks/createChatbotApiClient-BlWs282E.js.map +0 -1
  147. package/dist-vue/_chunks/utils--8iNpBr_.js +0 -184
  148. package/dist-vue/_chunks/utils--8iNpBr_.js.map +0 -1
  149. package/dist-vue/packages/auth/src/additional-fields.d.ts +0 -48
  150. package/dist-vue/packages/auth/src/passkey-policy-client-plugin.d.ts +0 -31
  151. package/dist-vue/packages/auth/src/passkey-policy-plugin.d.ts +0 -22
  152. package/dist-vue/packages/auth/src/two-factor-policy-client-plugin.d.ts +0 -60
  153. package/dist-vue/packages/auth/src/two-factor-policy-plugin.d.ts +0 -65
  154. package/dist-vue/packages/components/src/PkQrCode.d.ts +0 -14
  155. 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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"}