@humain/ui 2.1.62 → 2.1.65

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 (160) hide show
  1. package/dist/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
  2. package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
  3. package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
  4. package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
  5. package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
  6. package/dist/index.js +52 -52
  7. package/dist/index151.js +1 -1
  8. package/dist/index174.js +10 -333
  9. package/dist/index174.js.map +1 -1
  10. package/dist/index175.js +310 -137
  11. package/dist/index175.js.map +1 -1
  12. package/dist/index176.js +148 -174
  13. package/dist/index176.js.map +1 -1
  14. package/dist/index177.js +186 -78
  15. package/dist/index177.js.map +1 -1
  16. package/dist/index178.js +74 -124
  17. package/dist/index178.js.map +1 -1
  18. package/dist/index179.js +133 -1
  19. package/dist/index179.js.map +1 -0
  20. package/dist/index180.js +2 -201
  21. package/dist/index181.js +201 -0
  22. package/dist/{index180.js.map → index181.js.map} +1 -1
  23. package/dist/index183.js +130 -166
  24. package/dist/index183.js.map +1 -1
  25. package/dist/index184.js +195 -983
  26. package/dist/index184.js.map +1 -1
  27. package/dist/index185.js +1069 -369
  28. package/dist/index185.js.map +1 -1
  29. package/dist/index186.js +395 -197
  30. package/dist/index186.js.map +1 -1
  31. package/dist/index187.js +198 -243
  32. package/dist/index187.js.map +1 -1
  33. package/dist/index188.js +263 -3
  34. package/dist/index188.js.map +1 -1
  35. package/dist/index189.js +3 -209
  36. package/dist/index189.js.map +1 -1
  37. package/dist/index190.js +190 -777
  38. package/dist/index190.js.map +1 -1
  39. package/dist/index191.js +771 -252
  40. package/dist/index191.js.map +1 -1
  41. package/dist/index192.js +250 -65
  42. package/dist/index192.js.map +1 -1
  43. package/dist/index193.js +72 -523
  44. package/dist/index193.js.map +1 -1
  45. package/dist/index194.js +537 -144
  46. package/dist/index194.js.map +1 -1
  47. package/dist/index195.js +139 -720
  48. package/dist/index195.js.map +1 -1
  49. package/dist/index196.js +707 -167
  50. package/dist/index196.js.map +1 -1
  51. package/dist/index197.js +175 -151
  52. package/dist/index197.js.map +1 -1
  53. package/dist/index198.js +152 -487
  54. package/dist/index198.js.map +1 -1
  55. package/dist/index199.js +472 -225
  56. package/dist/index199.js.map +1 -1
  57. package/dist/index200.js +236 -260
  58. package/dist/index200.js.map +1 -1
  59. package/dist/index201.js +265 -215
  60. package/dist/index201.js.map +1 -1
  61. package/dist/index202.js +207 -307
  62. package/dist/index202.js.map +1 -1
  63. package/dist/index203.js +302 -135
  64. package/dist/index203.js.map +1 -1
  65. package/dist/index204.js +140 -271
  66. package/dist/index204.js.map +1 -1
  67. package/dist/index205.js +263 -253
  68. package/dist/index205.js.map +1 -1
  69. package/dist/index206.js +244 -137
  70. package/dist/index206.js.map +1 -1
  71. package/dist/index207.js +100 -238
  72. package/dist/index207.js.map +1 -1
  73. package/dist/index208.js +278 -74
  74. package/dist/index208.js.map +1 -1
  75. package/dist/index209.js +56 -97
  76. package/dist/index209.js.map +1 -1
  77. package/dist/index210.js +142 -47
  78. package/dist/index210.js.map +1 -1
  79. package/dist/index211.js +38 -84
  80. package/dist/index211.js.map +1 -1
  81. package/dist/index212.js +72 -252
  82. package/dist/index212.js.map +1 -1
  83. package/dist/index213.js +274 -26
  84. package/dist/index213.js.map +1 -1
  85. package/dist/index214.js +29 -94
  86. package/dist/index214.js.map +1 -1
  87. package/dist/index215.js +98 -25
  88. package/dist/index215.js.map +1 -1
  89. package/dist/index216.js +20 -565
  90. package/dist/index216.js.map +1 -1
  91. package/dist/index217.js +564 -17
  92. package/dist/index217.js.map +1 -1
  93. package/dist/index218.js +20 -23
  94. package/dist/index218.js.map +1 -1
  95. package/dist/index219.js +20 -95
  96. package/dist/index219.js.map +1 -1
  97. package/dist/index220.js +92 -88
  98. package/dist/index220.js.map +1 -1
  99. package/dist/index221.js +97 -29
  100. package/dist/index221.js.map +1 -1
  101. package/dist/index222.js +24 -470
  102. package/dist/index222.js.map +1 -1
  103. package/dist/index223.js +446 -196
  104. package/dist/index223.js.map +1 -1
  105. package/dist/index224.js +199 -729
  106. package/dist/index224.js.map +1 -1
  107. package/dist/index225.js +750 -61
  108. package/dist/index225.js.map +1 -1
  109. package/dist/index226.js +58 -181
  110. package/dist/index226.js.map +1 -1
  111. package/dist/index227.js +175 -259
  112. package/dist/index227.js.map +1 -1
  113. package/dist/index228.js +246 -172
  114. package/dist/index228.js.map +1 -1
  115. package/dist/index229.js +195 -32
  116. package/dist/index229.js.map +1 -1
  117. package/dist/index230.js +12 -40
  118. package/dist/index230.js.map +1 -1
  119. package/dist/index231.js +23 -26
  120. package/dist/index231.js.map +1 -1
  121. package/dist/index232.js +45 -22
  122. package/dist/index232.js.map +1 -1
  123. package/dist/index233.js +27 -48
  124. package/dist/index233.js.map +1 -1
  125. package/dist/index234.js +52 -26
  126. package/dist/index234.js.map +1 -1
  127. package/dist/index235.js +40 -225
  128. package/dist/index235.js.map +1 -1
  129. package/dist/index236.js +217 -39
  130. package/dist/index236.js.map +1 -1
  131. package/dist/index237.js +50 -0
  132. package/dist/index237.js.map +1 -0
  133. package/dist/styles.css +1 -1
  134. package/dist/wc/AIToolCall.js +218 -0
  135. package/dist/wc/AIToolCall.js.map +1 -0
  136. package/dist/wc/hf-ai-tool-call.js +34 -219
  137. package/dist/wc/hf-ai-tool-call.js.map +1 -1
  138. package/dist/wc/hf-ai-tool-run.js +673 -576
  139. package/dist/wc/hf-ai-tool-run.js.map +1 -1
  140. package/dist/wc/workflow-step-renderer.js +94 -86
  141. package/dist/wc/workflow-step-renderer.js.map +1 -1
  142. package/dist/wc-react/AIToolCall.js +218 -0
  143. package/dist/wc-react/AIToolCall.js.map +1 -0
  144. package/dist/wc-react/hf-ai-tool-call.js +32 -217
  145. package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
  146. package/dist/wc-react/hf-ai-tool-run.js +698 -601
  147. package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
  148. package/dist/wc-react/workflow-step-renderer.js +76 -68
  149. package/dist/wc-react/workflow-step-renderer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/skills/humain-ui/SKILL.md +1 -1
  152. package/skills/humain-ui-wc/SKILL.md +1 -1
  153. package/skills/humain-ui-wc.skill +0 -0
  154. package/skills/humain-ui.skill +0 -0
  155. package/dist/index182.js +0 -143
  156. package/dist/index182.js.map +0 -1
  157. package/dist/wc/wrench.js +0 -10
  158. package/dist/wc/wrench.js.map +0 -1
  159. package/dist/wc-react/wrench.js +0 -10
  160. package/dist/wc-react/wrench.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index232.js","names":[],"sources":["../src/components/pages/ResetPasswordPage/ResetPasswordPage.tsx"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport type { InputProps } from '@/components/atoms/forms/Input';\nimport {\n type AuthPageAction,\n type AuthPageAsideConfig,\n AuthPageLayout,\n type AuthPageLayoutProps,\n} from '@/components/templates/AuthPageLayout';\nimport {\n AuthForm,\n AuthGhostAction,\n AuthPasswordInput,\n AuthPrimaryButton,\n defaultResetPasswordAside,\n} from '../_auth';\n\nexport interface ResetPasswordPageProps\n extends Omit<\n AuthPageLayoutProps,\n 'title' | 'description' | 'children' | 'aside' | 'onSubmit'\n > {\n title?: React.ReactNode;\n description?: React.ReactNode;\n aside?: AuthPageAsideConfig | React.ReactNode;\n passwordInputProps?: InputProps;\n confirmPasswordInputProps?: InputProps;\n loginAction?: AuthPageAction;\n submitLabel?: React.ReactNode;\n isSubmitting?: boolean;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\nfunction ResetPasswordPage({\n title = 'Set new password',\n description = 'Must be at least 8 characters.',\n aside = defaultResetPasswordAside,\n passwordInputProps,\n confirmPasswordInputProps,\n loginAction = { label: 'Back to login' },\n submitLabel = 'Reset Password',\n isSubmitting,\n onSubmit,\n ...layoutProps\n}: ResetPasswordPageProps): React.ReactElement {\n return (\n <AuthPageLayout\n title={title}\n description={description}\n aside={aside}\n {...layoutProps}\n data-slot=\"auth-page-layout\"\n data-page-slot=\"reset-password-page\"\n >\n <AuthForm onSubmit={onSubmit}>\n <AuthPasswordInput\n autoComplete=\"new-password\"\n label=\"New password\"\n name=\"password\"\n placeholder=\"Enter new password\"\n required\n visibilityLabel=\"new password\"\n {...passwordInputProps}\n />\n <AuthPasswordInput\n autoComplete=\"new-password\"\n label=\"Confirm password\"\n name=\"confirmPassword\"\n placeholder=\"Confirm new password\"\n required\n visibilityLabel=\"confirm password\"\n {...confirmPasswordInputProps}\n />\n <AuthPrimaryButton loading={isSubmitting}>\n {submitLabel}\n </AuthPrimaryButton>\n <AuthGhostAction action={loginAction} />\n </AuthForm>\n </AuthPageLayout>\n );\n}\n\nResetPasswordPage.displayName = 'ResetPasswordPage';\n\nexport { ResetPasswordPage };\n"],"mappings":";;;;;AAkCA,SAAS,kBAAkB,EACzB,QAAQ,oBACR,cAAc,kCACd,QAAQ,2BACR,oBACA,2BACA,cAAc,EAAE,OAAO,gBAAgB,GACvC,cAAc,kBACd,cACA,UACA,GAAG,eAC0C;CAC7C,OACE,oBAAC,gBAAD;EACS;EACM;EACN;EACP,GAAI;EACJ,aAAU;EACV,kBAAe;YAEf,qBAAC,UAAD;GAAoB;aAApB;IACE,oBAAC,mBAAD;KACE,cAAa;KACb,OAAM;KACN,MAAK;KACL,aAAY;KACZ,UAAA;KACA,iBAAgB;KAChB,GAAI;IACL,CAAA;IACD,oBAAC,mBAAD;KACE,cAAa;KACb,OAAM;KACN,MAAK;KACL,aAAY;KACZ,UAAA;KACA,iBAAgB;KAChB,GAAI;IACL,CAAA;IACD,oBAAC,mBAAD;KAAmB,SAAS;eACzB;IACgB,CAAA;IACnB,oBAAC,iBAAD,EAAiB,QAAQ,YAAc,CAAA;GAC/B;;CACI,CAAA;AAEpB;AAEA,kBAAkB,cAAc"}
1
+ {"version":3,"file":"index232.js","names":[],"sources":["../src/components/pages/RegisterPage/RegisterPage.tsx"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport {\n Checkbox,\n type CheckboxProps,\n} from '@/components/atoms/forms/Checkbox';\nimport { Input, type InputProps } from '@/components/atoms/forms/Input';\nimport {\n type AuthPageAction,\n type AuthPageAsideConfig,\n AuthPageLayout,\n type AuthPageLayoutProps,\n} from '@/components/templates/AuthPageLayout';\nimport { cn } from '@/lib/utils';\nimport {\n AuthForm,\n AuthInlineAction,\n AuthPasswordInput,\n AuthPrimaryButton,\n AuthSocialDivider,\n AuthSsoActions,\n defaultRegisterAside,\n} from '../_auth';\n\nexport interface RegisterPageProps\n extends Omit<\n AuthPageLayoutProps,\n 'title' | 'description' | 'children' | 'aside' | 'onSubmit'\n > {\n title?: React.ReactNode;\n description?: React.ReactNode;\n aside?: AuthPageAsideConfig | React.ReactNode;\n nameInputProps?: InputProps;\n emailInputProps?: InputProps;\n passwordInputProps?: InputProps;\n termsProps?: Omit<CheckboxProps, 'ref'>;\n termsLabel?: string;\n ssoActions?: AuthPageAction[];\n ssoDividerLabel?: React.ReactNode;\n loginAction?: AuthPageAction;\n submitLabel?: React.ReactNode;\n isSubmitting?: boolean;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\nfunction RegisterPage({\n title = 'Create your account',\n description = \"Let's get started with your 30-day free trial\",\n aside = defaultRegisterAside,\n nameInputProps,\n emailInputProps,\n passwordInputProps,\n termsProps,\n termsLabel = 'I agree to all terms, privacy policy, and fees',\n ssoActions = [{ label: 'Login with SSO' }],\n ssoDividerLabel = 'Or',\n loginAction = { label: 'Log in' },\n submitLabel = 'Create account',\n isSubmitting,\n onSubmit,\n formClassName,\n ...layoutProps\n}: RegisterPageProps): React.ReactElement {\n const hasSsoActions = ssoActions.length > 0;\n const termsAriaLabel =\n typeof termsLabel === 'string' ? termsLabel : undefined;\n\n return (\n <AuthPageLayout\n title={title}\n description={description}\n aside={aside}\n formClassName={cn('lg:min-h-[608px]', formClassName)}\n {...layoutProps}\n data-slot=\"auth-page-layout\"\n data-page-slot=\"register-page\"\n >\n {hasSsoActions && (\n <>\n <AuthSsoActions actions={ssoActions} />\n <AuthSocialDivider label={ssoDividerLabel} />\n </>\n )}\n <AuthForm onSubmit={onSubmit}>\n <Input\n autoComplete=\"name\"\n label=\"Name\"\n name=\"name\"\n placeholder=\"Enter your name\"\n required\n {...nameInputProps}\n />\n <Input\n autoComplete=\"email\"\n label=\"Email\"\n name=\"email\"\n placeholder=\"Enter your email address\"\n required\n type=\"email\"\n {...emailInputProps}\n />\n <AuthPasswordInput\n autoComplete=\"new-password\"\n label=\"Password\"\n name=\"password\"\n placeholder=\"Enter your password\"\n required\n {...passwordInputProps}\n />\n <Checkbox\n aria-label={termsAriaLabel}\n label={termsLabel}\n name=\"terms\"\n required\n {...termsProps}\n />\n <AuthPrimaryButton loading={isSubmitting}>\n {submitLabel}\n </AuthPrimaryButton>\n <AuthInlineAction\n prefix=\"Already have an account?\"\n action={loginAction}\n />\n </AuthForm>\n </AuthPageLayout>\n );\n}\n\nRegisterPage.displayName = 'RegisterPage';\n\nexport { RegisterPage };\n"],"mappings":";;;;;;;;AA8CA,SAAS,aAAa,EACpB,QAAQ,uBACR,cAAc,iDACd,QAAQ,sBACR,gBACA,iBACA,oBACA,YACA,aAAa,kDACb,aAAa,CAAC,EAAE,OAAO,iBAAiB,CAAC,GACzC,kBAAkB,MAClB,cAAc,EAAE,OAAO,SAAS,GAChC,cAAc,kBACd,cACA,UACA,eACA,GAAG,eACqC;CACxC,MAAM,gBAAgB,WAAW,SAAS;CAC1C,MAAM,iBACJ,OAAO,eAAe,WAAW,aAAa,KAAA;CAEhD,OACE,qBAAC,gBAAD;EACS;EACM;EACN;EACP,eAAe,GAAG,oBAAoB,aAAa;EACnD,GAAI;EACJ,aAAU;EACV,kBAAe;YAPjB,CASG,iBACC,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,gBAAD,EAAgB,SAAS,WAAa,CAAA,GACtC,oBAAC,mBAAD,EAAmB,OAAO,gBAAkB,CAAA,CAC5C,EAAA,CAAA,GAEJ,qBAAC,UAAD;GAAoB;aAApB;IACE,oBAAC,OAAD;KACE,cAAa;KACb,OAAM;KACN,MAAK;KACL,aAAY;KACZ,UAAA;KACA,GAAI;IACL,CAAA;IACD,oBAAC,OAAD;KACE,cAAa;KACb,OAAM;KACN,MAAK;KACL,aAAY;KACZ,UAAA;KACA,MAAK;KACL,GAAI;IACL,CAAA;IACD,oBAAC,mBAAD;KACE,cAAa;KACb,OAAM;KACN,MAAK;KACL,aAAY;KACZ,UAAA;KACA,GAAI;IACL,CAAA;IACD,oBAAC,UAAD;KACE,cAAY;KACZ,OAAO;KACP,MAAK;KACL,UAAA;KACA,GAAI;IACL,CAAA;IACD,oBAAC,mBAAD;KAAmB,SAAS;eACzB;IACgB,CAAA;IACnB,oBAAC,kBAAD;KACE,QAAO;KACP,QAAQ;IACT,CAAA;GACO;IACI;;AAEpB;AAEA,aAAa,cAAc"}
package/dist/index233.js CHANGED
@@ -1,69 +1,48 @@
1
1
  "use client";
2
- import { cn } from "./index2.js";
3
- import { InputOTP, InputOTPSlot } from "./index126.js";
4
- import { AuthPageLayout, renderActionElement } from "./index226.js";
5
- import { AuthForm, AuthInlineAction, AuthPrimaryButton, defaultTwoFactorAside } from "./index228.js";
6
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
- //#region src/components/pages/TwoFactorAuthenticationPage/TwoFactorAuthenticationPage.tsx
8
- function getOtpSlots(otpLength) {
9
- return Array.from({ length: otpLength }, (_, index) => index);
10
- }
11
- function TwoFactorAuthenticationPage({ title = "Password reset", destination = "*******1234", description, aside = defaultTwoFactorAside, otpLength = 6, otpProps, recoveryCodeAction = { label: "Use a recovery code" }, resendAction = { label: "Resend" }, submitLabel = "Verify Code", isSubmitting, onSubmit, formMaxWidthClassName = "max-w-[430px]", formClassName, className, ...layoutProps }) {
12
- const { className: otpClassName, containerClassName: otpContainerClassName, ...resolvedOtpProps } = otpProps ?? {};
13
- const resolvedDescription = description ?? /* @__PURE__ */ jsxs(Fragment, { children: ["We sent a code to your mobile number ", /* @__PURE__ */ jsx("strong", { children: destination })] });
14
- const otpSlots = getOtpSlots(otpLength);
2
+ import { AuthPageLayout } from "./index227.js";
3
+ import { AuthForm, AuthGhostAction, AuthPasswordInput, AuthPrimaryButton, defaultResetPasswordAside } from "./index229.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/pages/ResetPasswordPage/ResetPasswordPage.tsx
6
+ function ResetPasswordPage({ title = "Set new password", description = "Must be at least 8 characters.", aside = defaultResetPasswordAside, passwordInputProps, confirmPasswordInputProps, loginAction = { label: "Back to login" }, submitLabel = "Reset Password", isSubmitting, onSubmit, ...layoutProps }) {
15
7
  return /* @__PURE__ */ jsx(AuthPageLayout, {
16
8
  title,
17
- description: resolvedDescription,
9
+ description,
18
10
  aside,
19
- formMaxWidthClassName,
20
- formClassName: cn("lg:min-h-[379px]", formClassName),
21
- className,
22
11
  ...layoutProps,
23
12
  "data-slot": "auth-page-layout",
24
- "data-page-slot": "two-factor-authentication-page",
13
+ "data-page-slot": "reset-password-page",
25
14
  children: /* @__PURE__ */ jsxs(AuthForm, {
26
15
  onSubmit,
27
16
  children: [
28
- /* @__PURE__ */ jsxs("div", {
29
- className: "flex flex-col gap-4",
30
- children: [/* @__PURE__ */ jsxs("div", {
31
- className: "flex items-center justify-between gap-4 text-md font-medium text-foreground",
32
- children: [/* @__PURE__ */ jsxs("span", { children: ["Code ", /* @__PURE__ */ jsx("span", {
33
- className: "text-destructive",
34
- children: "*"
35
- })] }), /* @__PURE__ */ jsx(AuthSmallAction, { action: recoveryCodeAction })]
36
- }), /* @__PURE__ */ jsx(InputOTP, {
37
- "aria-label": "One-time authentication code",
38
- maxLength: otpLength,
39
- name: "otp",
40
- required: true,
41
- ...resolvedOtpProps,
42
- className: otpClassName,
43
- containerClassName: cn("justify-center gap-4", otpContainerClassName),
44
- children: otpSlots.map((slotIndex) => /* @__PURE__ */ jsx(InputOTPSlot, {
45
- index: slotIndex,
46
- className: "size-9 rounded-md text-md"
47
- }, slotIndex))
48
- })]
17
+ /* @__PURE__ */ jsx(AuthPasswordInput, {
18
+ autoComplete: "new-password",
19
+ label: "New password",
20
+ name: "password",
21
+ placeholder: "Enter new password",
22
+ required: true,
23
+ visibilityLabel: "new password",
24
+ ...passwordInputProps
25
+ }),
26
+ /* @__PURE__ */ jsx(AuthPasswordInput, {
27
+ autoComplete: "new-password",
28
+ label: "Confirm password",
29
+ name: "confirmPassword",
30
+ placeholder: "Confirm new password",
31
+ required: true,
32
+ visibilityLabel: "confirm password",
33
+ ...confirmPasswordInputProps
49
34
  }),
50
35
  /* @__PURE__ */ jsx(AuthPrimaryButton, {
51
36
  loading: isSubmitting,
52
37
  children: submitLabel
53
38
  }),
54
- /* @__PURE__ */ jsx(AuthInlineAction, {
55
- prefix: "Didn't get the code?",
56
- action: resendAction
57
- })
39
+ /* @__PURE__ */ jsx(AuthGhostAction, { action: loginAction })
58
40
  ]
59
41
  })
60
42
  });
61
43
  }
62
- function AuthSmallAction({ action }) {
63
- return renderActionElement(action, cn("text-sm font-medium text-foreground transition-colors duration-150 ease-smooth hover:text-primary", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"));
64
- }
65
- TwoFactorAuthenticationPage.displayName = "TwoFactorAuthenticationPage";
44
+ ResetPasswordPage.displayName = "ResetPasswordPage";
66
45
  //#endregion
67
- export { TwoFactorAuthenticationPage };
46
+ export { ResetPasswordPage };
68
47
 
69
48
  //# sourceMappingURL=index233.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index233.js","names":[],"sources":["../src/components/pages/TwoFactorAuthenticationPage/TwoFactorAuthenticationPage.tsx"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport { InputOTP, InputOTPSlot } from '@/components/molecules/forms/InputOTP';\nimport {\n type AuthPageAction,\n type AuthPageAsideConfig,\n AuthPageLayout,\n type AuthPageLayoutProps,\n renderActionElement,\n} from '@/components/templates/AuthPageLayout';\nimport { cn } from '@/lib/utils';\nimport {\n AuthForm,\n AuthInlineAction,\n AuthPrimaryButton,\n defaultTwoFactorAside,\n} from '../_auth';\n\nexport interface TwoFactorAuthenticationPageProps\n extends Omit<\n AuthPageLayoutProps,\n 'title' | 'description' | 'children' | 'aside' | 'onSubmit'\n > {\n title?: React.ReactNode;\n destination?: React.ReactNode;\n description?: React.ReactNode;\n aside?: AuthPageAsideConfig | React.ReactNode;\n otpLength?: number;\n otpProps?: Omit<\n React.ComponentProps<typeof InputOTP>,\n 'children' | 'maxLength' | 'render'\n >;\n recoveryCodeAction?: AuthPageAction;\n resendAction?: AuthPageAction;\n submitLabel?: React.ReactNode;\n isSubmitting?: boolean;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\ninterface AuthSmallActionProps {\n action: AuthPageAction;\n}\n\nfunction getOtpSlots(otpLength: number): number[] {\n return Array.from({ length: otpLength }, (_, index) => index);\n}\n\nfunction TwoFactorAuthenticationPage({\n title = 'Password reset',\n destination = '*******1234',\n description,\n aside = defaultTwoFactorAside,\n otpLength = 6,\n otpProps,\n recoveryCodeAction = { label: 'Use a recovery code' },\n resendAction = { label: 'Resend' },\n submitLabel = 'Verify Code',\n isSubmitting,\n onSubmit,\n formMaxWidthClassName = 'max-w-[430px]',\n formClassName,\n className,\n ...layoutProps\n}: TwoFactorAuthenticationPageProps): React.ReactElement {\n const {\n className: otpClassName,\n containerClassName: otpContainerClassName,\n ...resolvedOtpProps\n } = otpProps ?? {};\n const resolvedDescription = description ?? (\n <>\n We sent a code to your mobile number <strong>{destination}</strong>\n </>\n );\n const otpSlots = getOtpSlots(otpLength);\n\n return (\n <AuthPageLayout\n title={title}\n description={resolvedDescription}\n aside={aside}\n formMaxWidthClassName={formMaxWidthClassName}\n formClassName={cn('lg:min-h-[379px]', formClassName)}\n className={className}\n {...layoutProps}\n data-slot=\"auth-page-layout\"\n data-page-slot=\"two-factor-authentication-page\"\n >\n <AuthForm onSubmit={onSubmit}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center justify-between gap-4 text-md font-medium text-foreground\">\n <span>\n Code <span className=\"text-destructive\">*</span>\n </span>\n <AuthSmallAction action={recoveryCodeAction} />\n </div>\n <InputOTP\n aria-label=\"One-time authentication code\"\n maxLength={otpLength}\n name=\"otp\"\n required\n {...resolvedOtpProps}\n className={otpClassName}\n containerClassName={cn(\n 'justify-center gap-4',\n otpContainerClassName,\n )}\n >\n {otpSlots.map((slotIndex) => (\n <InputOTPSlot\n key={slotIndex}\n index={slotIndex}\n className=\"size-9 rounded-md text-md\"\n />\n ))}\n </InputOTP>\n </div>\n <AuthPrimaryButton loading={isSubmitting}>\n {submitLabel}\n </AuthPrimaryButton>\n <AuthInlineAction prefix=\"Didn't get the code?\" action={resendAction} />\n </AuthForm>\n </AuthPageLayout>\n );\n}\n\nfunction AuthSmallAction({ action }: AuthSmallActionProps): React.ReactElement {\n const className = cn(\n 'text-sm font-medium text-foreground transition-colors duration-150 ease-smooth hover:text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n );\n\n return renderActionElement(action, className);\n}\n\nTwoFactorAuthenticationPage.displayName = 'TwoFactorAuthenticationPage';\n\nexport { TwoFactorAuthenticationPage };\n"],"mappings":";;;;;;;AA4CA,SAAS,YAAY,WAA6B;CAChD,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,IAAI,GAAG,UAAU,KAAK;AAC9D;AAEA,SAAS,4BAA4B,EACnC,QAAQ,kBACR,cAAc,eACd,aACA,QAAQ,uBACR,YAAY,GACZ,UACA,qBAAqB,EAAE,OAAO,sBAAsB,GACpD,eAAe,EAAE,OAAO,SAAS,GACjC,cAAc,eACd,cACA,UACA,wBAAwB,iBACxB,eACA,WACA,GAAG,eACoD;CACvD,MAAM,EACJ,WAAW,cACX,oBAAoB,uBACpB,GAAG,qBACD,YAAY,CAAC;CACjB,MAAM,sBAAsB,eAC1B,qBAAA,UAAA,EAAA,UAAA,CAAE,yCACqC,oBAAC,UAAD,EAAA,UAAS,YAAoB,CAAA,CAClE,EAAA,CAAA;CAEJ,MAAM,WAAW,YAAY,SAAS;CAEtC,OACE,oBAAC,gBAAD;EACS;EACP,aAAa;EACN;EACgB;EACvB,eAAe,GAAG,oBAAoB,aAAa;EACxC;EACX,GAAI;EACJ,aAAU;EACV,kBAAe;YAEf,qBAAC,UAAD;GAAoB;aAApB;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,qBAAC,QAAD,EAAA,UAAA,CAAM,SACC,oBAAC,QAAD;OAAM,WAAU;iBAAmB;MAAO,CAAA,CAC3C,EAAA,CAAA,GACN,oBAAC,iBAAD,EAAiB,QAAQ,mBAAqB,CAAA,CAC3C;SACL,oBAAC,UAAD;MACE,cAAW;MACX,WAAW;MACX,MAAK;MACL,UAAA;MACA,GAAI;MACJ,WAAW;MACX,oBAAoB,GAClB,wBACA,qBACF;gBAEC,SAAS,KAAK,cACb,oBAAC,cAAD;OAEE,OAAO;OACP,WAAU;MACX,GAHM,SAGN,CACF;KACO,CAAA,CACP;;IACL,oBAAC,mBAAD;KAAmB,SAAS;eACzB;IACgB,CAAA;IACnB,oBAAC,kBAAD;KAAkB,QAAO;KAAuB,QAAQ;IAAe,CAAA;GAC/D;;CACI,CAAA;AAEpB;AAEA,SAAS,gBAAgB,EAAE,UAAoD;CAM7E,OAAO,oBAAoB,QALT,GAChB,qGACA,0IAGiC,CAAS;AAC9C;AAEA,4BAA4B,cAAc"}
1
+ {"version":3,"file":"index233.js","names":[],"sources":["../src/components/pages/ResetPasswordPage/ResetPasswordPage.tsx"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport type { InputProps } from '@/components/atoms/forms/Input';\nimport {\n type AuthPageAction,\n type AuthPageAsideConfig,\n AuthPageLayout,\n type AuthPageLayoutProps,\n} from '@/components/templates/AuthPageLayout';\nimport {\n AuthForm,\n AuthGhostAction,\n AuthPasswordInput,\n AuthPrimaryButton,\n defaultResetPasswordAside,\n} from '../_auth';\n\nexport interface ResetPasswordPageProps\n extends Omit<\n AuthPageLayoutProps,\n 'title' | 'description' | 'children' | 'aside' | 'onSubmit'\n > {\n title?: React.ReactNode;\n description?: React.ReactNode;\n aside?: AuthPageAsideConfig | React.ReactNode;\n passwordInputProps?: InputProps;\n confirmPasswordInputProps?: InputProps;\n loginAction?: AuthPageAction;\n submitLabel?: React.ReactNode;\n isSubmitting?: boolean;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\nfunction ResetPasswordPage({\n title = 'Set new password',\n description = 'Must be at least 8 characters.',\n aside = defaultResetPasswordAside,\n passwordInputProps,\n confirmPasswordInputProps,\n loginAction = { label: 'Back to login' },\n submitLabel = 'Reset Password',\n isSubmitting,\n onSubmit,\n ...layoutProps\n}: ResetPasswordPageProps): React.ReactElement {\n return (\n <AuthPageLayout\n title={title}\n description={description}\n aside={aside}\n {...layoutProps}\n data-slot=\"auth-page-layout\"\n data-page-slot=\"reset-password-page\"\n >\n <AuthForm onSubmit={onSubmit}>\n <AuthPasswordInput\n autoComplete=\"new-password\"\n label=\"New password\"\n name=\"password\"\n placeholder=\"Enter new password\"\n required\n visibilityLabel=\"new password\"\n {...passwordInputProps}\n />\n <AuthPasswordInput\n autoComplete=\"new-password\"\n label=\"Confirm password\"\n name=\"confirmPassword\"\n placeholder=\"Confirm new password\"\n required\n visibilityLabel=\"confirm password\"\n {...confirmPasswordInputProps}\n />\n <AuthPrimaryButton loading={isSubmitting}>\n {submitLabel}\n </AuthPrimaryButton>\n <AuthGhostAction action={loginAction} />\n </AuthForm>\n </AuthPageLayout>\n );\n}\n\nResetPasswordPage.displayName = 'ResetPasswordPage';\n\nexport { ResetPasswordPage };\n"],"mappings":";;;;;AAkCA,SAAS,kBAAkB,EACzB,QAAQ,oBACR,cAAc,kCACd,QAAQ,2BACR,oBACA,2BACA,cAAc,EAAE,OAAO,gBAAgB,GACvC,cAAc,kBACd,cACA,UACA,GAAG,eAC0C;CAC7C,OACE,oBAAC,gBAAD;EACS;EACM;EACN;EACP,GAAI;EACJ,aAAU;EACV,kBAAe;YAEf,qBAAC,UAAD;GAAoB;aAApB;IACE,oBAAC,mBAAD;KACE,cAAa;KACb,OAAM;KACN,MAAK;KACL,aAAY;KACZ,UAAA;KACA,iBAAgB;KAChB,GAAI;IACL,CAAA;IACD,oBAAC,mBAAD;KACE,cAAa;KACb,OAAM;KACN,MAAK;KACL,aAAY;KACZ,UAAA;KACA,iBAAgB;KAChB,GAAI;IACL,CAAA;IACD,oBAAC,mBAAD;KAAmB,SAAS;eACzB;IACgB,CAAA;IACnB,oBAAC,iBAAD,EAAiB,QAAQ,YAAc,CAAA;GAC/B;;CACI,CAAA;AAEpB;AAEA,kBAAkB,cAAc"}
package/dist/index234.js CHANGED
@@ -1,43 +1,69 @@
1
1
  "use client";
2
2
  import { cn } from "./index2.js";
3
- import { AuthPageLayout } from "./index226.js";
4
- import { AuthForm, AuthInlineAction, AuthPrimaryActionButton, defaultVerifyEmailAside } from "./index228.js";
3
+ import { InputOTP, InputOTPSlot } from "./index126.js";
4
+ import { AuthPageLayout, renderActionElement } from "./index227.js";
5
+ import { AuthForm, AuthInlineAction, AuthPrimaryButton, defaultTwoFactorAside } from "./index229.js";
5
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
- //#region src/components/pages/VerifyEmailPage/VerifyEmailPage.tsx
7
- function VerifyEmailPage({ title = "Verify your email 📧", email = "johndoe@gmail.com", description, aside = defaultVerifyEmailAside, skipAction, resendAction = { label: "Resend" }, submitLabel = "Skip For Now", isSubmitting, onSubmit, formClassName, ...layoutProps }) {
8
- const resolvedDescription = description ?? /* @__PURE__ */ jsxs(Fragment, { children: [
9
- "Account activation link sent to your email address.",
10
- " ",
11
- /* @__PURE__ */ jsx("strong", {
12
- className: "font-semibold text-foreground",
13
- children: email
14
- }),
15
- ", please follow the link inside to continue."
16
- ] });
17
- const resolvedSkipAction = skipAction ?? { label: submitLabel };
18
- const skipActionCanSubmit = !resolvedSkipAction.href && !resolvedSkipAction.render;
7
+ //#region src/components/pages/TwoFactorAuthenticationPage/TwoFactorAuthenticationPage.tsx
8
+ function getOtpSlots(otpLength) {
9
+ return Array.from({ length: otpLength }, (_, index) => index);
10
+ }
11
+ function TwoFactorAuthenticationPage({ title = "Password reset", destination = "*******1234", description, aside = defaultTwoFactorAside, otpLength = 6, otpProps, recoveryCodeAction = { label: "Use a recovery code" }, resendAction = { label: "Resend" }, submitLabel = "Verify Code", isSubmitting, onSubmit, formMaxWidthClassName = "max-w-[430px]", formClassName, className, ...layoutProps }) {
12
+ const { className: otpClassName, containerClassName: otpContainerClassName, ...resolvedOtpProps } = otpProps ?? {};
13
+ const resolvedDescription = description ?? /* @__PURE__ */ jsxs(Fragment, { children: ["We sent a code to your mobile number ", /* @__PURE__ */ jsx("strong", { children: destination })] });
14
+ const otpSlots = getOtpSlots(otpLength);
19
15
  return /* @__PURE__ */ jsx(AuthPageLayout, {
20
16
  title,
21
17
  description: resolvedDescription,
22
18
  aside,
23
- formClassName: cn("lg:min-h-[268px]", formClassName),
19
+ formMaxWidthClassName,
20
+ formClassName: cn("lg:min-h-[379px]", formClassName),
21
+ className,
24
22
  ...layoutProps,
25
23
  "data-slot": "auth-page-layout",
26
- "data-page-slot": "verify-email-page",
24
+ "data-page-slot": "two-factor-authentication-page",
27
25
  children: /* @__PURE__ */ jsxs(AuthForm, {
28
26
  onSubmit,
29
- children: [/* @__PURE__ */ jsx(AuthPrimaryActionButton, {
30
- action: resolvedSkipAction,
31
- loading: skipActionCanSubmit ? isSubmitting : void 0
32
- }), /* @__PURE__ */ jsx(AuthInlineAction, {
33
- prefix: "Didn't get the mail?",
34
- action: resendAction
35
- })]
27
+ children: [
28
+ /* @__PURE__ */ jsxs("div", {
29
+ className: "flex flex-col gap-4",
30
+ children: [/* @__PURE__ */ jsxs("div", {
31
+ className: "flex items-center justify-between gap-4 text-md font-medium text-foreground",
32
+ children: [/* @__PURE__ */ jsxs("span", { children: ["Code ", /* @__PURE__ */ jsx("span", {
33
+ className: "text-destructive",
34
+ children: "*"
35
+ })] }), /* @__PURE__ */ jsx(AuthSmallAction, { action: recoveryCodeAction })]
36
+ }), /* @__PURE__ */ jsx(InputOTP, {
37
+ "aria-label": "One-time authentication code",
38
+ maxLength: otpLength,
39
+ name: "otp",
40
+ required: true,
41
+ ...resolvedOtpProps,
42
+ className: otpClassName,
43
+ containerClassName: cn("justify-center gap-4", otpContainerClassName),
44
+ children: otpSlots.map((slotIndex) => /* @__PURE__ */ jsx(InputOTPSlot, {
45
+ index: slotIndex,
46
+ className: "size-9 rounded-md text-md"
47
+ }, slotIndex))
48
+ })]
49
+ }),
50
+ /* @__PURE__ */ jsx(AuthPrimaryButton, {
51
+ loading: isSubmitting,
52
+ children: submitLabel
53
+ }),
54
+ /* @__PURE__ */ jsx(AuthInlineAction, {
55
+ prefix: "Didn't get the code?",
56
+ action: resendAction
57
+ })
58
+ ]
36
59
  })
37
60
  });
38
61
  }
39
- VerifyEmailPage.displayName = "VerifyEmailPage";
62
+ function AuthSmallAction({ action }) {
63
+ return renderActionElement(action, cn("text-sm font-medium text-foreground transition-colors duration-150 ease-smooth hover:text-primary", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"));
64
+ }
65
+ TwoFactorAuthenticationPage.displayName = "TwoFactorAuthenticationPage";
40
66
  //#endregion
41
- export { VerifyEmailPage as VerifyEmail, VerifyEmailPage };
67
+ export { TwoFactorAuthenticationPage };
42
68
 
43
69
  //# sourceMappingURL=index234.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index234.js","names":[],"sources":["../src/components/pages/VerifyEmailPage/VerifyEmailPage.tsx"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport {\n type AuthPageAction,\n type AuthPageAsideConfig,\n AuthPageLayout,\n type AuthPageLayoutProps,\n} from '@/components/templates/AuthPageLayout';\nimport { cn } from '@/lib/utils';\nimport {\n AuthForm,\n AuthInlineAction,\n AuthPrimaryActionButton,\n defaultVerifyEmailAside,\n} from '../_auth';\n\nexport interface VerifyEmailPageProps\n extends Omit<\n AuthPageLayoutProps,\n 'title' | 'description' | 'children' | 'aside' | 'onSubmit'\n > {\n title?: React.ReactNode;\n description?: React.ReactNode;\n email?: React.ReactNode;\n aside?: AuthPageAsideConfig | React.ReactNode;\n skipAction?: AuthPageAction;\n resendAction?: AuthPageAction;\n submitLabel?: React.ReactNode;\n isSubmitting?: boolean;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\nfunction VerifyEmailPage({\n title = 'Verify your email 📧',\n email = 'johndoe@gmail.com',\n description,\n aside = defaultVerifyEmailAside,\n skipAction,\n resendAction = { label: 'Resend' },\n submitLabel = 'Skip For Now',\n isSubmitting,\n onSubmit,\n formClassName,\n ...layoutProps\n}: VerifyEmailPageProps): React.ReactElement {\n const resolvedDescription = description ?? (\n <>\n Account activation link sent to your email address.{' '}\n <strong className=\"font-semibold text-foreground\">{email}</strong>, please\n follow the link inside to continue.\n </>\n );\n const resolvedSkipAction = skipAction ?? { label: submitLabel };\n const skipActionCanSubmit =\n !resolvedSkipAction.href && !resolvedSkipAction.render;\n\n return (\n <AuthPageLayout\n title={title}\n description={resolvedDescription}\n aside={aside}\n formClassName={cn('lg:min-h-[268px]', formClassName)}\n {...layoutProps}\n data-slot=\"auth-page-layout\"\n data-page-slot=\"verify-email-page\"\n >\n <AuthForm onSubmit={onSubmit}>\n <AuthPrimaryActionButton\n action={resolvedSkipAction}\n loading={skipActionCanSubmit ? isSubmitting : undefined}\n />\n <AuthInlineAction prefix=\"Didn't get the mail?\" action={resendAction} />\n </AuthForm>\n </AuthPageLayout>\n );\n}\n\nVerifyEmailPage.displayName = 'VerifyEmailPage';\n\nexport { VerifyEmailPage, VerifyEmailPage as VerifyEmail };\n"],"mappings":";;;;;;AAiCA,SAAS,gBAAgB,EACvB,QAAQ,wBACR,QAAQ,qBACR,aACA,QAAQ,yBACR,YACA,eAAe,EAAE,OAAO,SAAS,GACjC,cAAc,gBACd,cACA,UACA,eACA,GAAG,eACwC;CAC3C,MAAM,sBAAsB,eAC1B,qBAAA,UAAA,EAAA,UAAA;EAAE;EACoD;EACpD,oBAAC,UAAD;GAAQ,WAAU;aAAiC;EAAc,CAAA;EAAC;CAElE,EAAA,CAAA;CAEJ,MAAM,qBAAqB,cAAc,EAAE,OAAO,YAAY;CAC9D,MAAM,sBACJ,CAAC,mBAAmB,QAAQ,CAAC,mBAAmB;CAElD,OACE,oBAAC,gBAAD;EACS;EACP,aAAa;EACN;EACP,eAAe,GAAG,oBAAoB,aAAa;EACnD,GAAI;EACJ,aAAU;EACV,kBAAe;YAEf,qBAAC,UAAD;GAAoB;aAApB,CACE,oBAAC,yBAAD;IACE,QAAQ;IACR,SAAS,sBAAsB,eAAe,KAAA;GAC/C,CAAA,GACD,oBAAC,kBAAD;IAAkB,QAAO;IAAuB,QAAQ;GAAe,CAAA,CAC/D;;CACI,CAAA;AAEpB;AAEA,gBAAgB,cAAc"}
1
+ {"version":3,"file":"index234.js","names":[],"sources":["../src/components/pages/TwoFactorAuthenticationPage/TwoFactorAuthenticationPage.tsx"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport { InputOTP, InputOTPSlot } from '@/components/molecules/forms/InputOTP';\nimport {\n type AuthPageAction,\n type AuthPageAsideConfig,\n AuthPageLayout,\n type AuthPageLayoutProps,\n renderActionElement,\n} from '@/components/templates/AuthPageLayout';\nimport { cn } from '@/lib/utils';\nimport {\n AuthForm,\n AuthInlineAction,\n AuthPrimaryButton,\n defaultTwoFactorAside,\n} from '../_auth';\n\nexport interface TwoFactorAuthenticationPageProps\n extends Omit<\n AuthPageLayoutProps,\n 'title' | 'description' | 'children' | 'aside' | 'onSubmit'\n > {\n title?: React.ReactNode;\n destination?: React.ReactNode;\n description?: React.ReactNode;\n aside?: AuthPageAsideConfig | React.ReactNode;\n otpLength?: number;\n otpProps?: Omit<\n React.ComponentProps<typeof InputOTP>,\n 'children' | 'maxLength' | 'render'\n >;\n recoveryCodeAction?: AuthPageAction;\n resendAction?: AuthPageAction;\n submitLabel?: React.ReactNode;\n isSubmitting?: boolean;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\ninterface AuthSmallActionProps {\n action: AuthPageAction;\n}\n\nfunction getOtpSlots(otpLength: number): number[] {\n return Array.from({ length: otpLength }, (_, index) => index);\n}\n\nfunction TwoFactorAuthenticationPage({\n title = 'Password reset',\n destination = '*******1234',\n description,\n aside = defaultTwoFactorAside,\n otpLength = 6,\n otpProps,\n recoveryCodeAction = { label: 'Use a recovery code' },\n resendAction = { label: 'Resend' },\n submitLabel = 'Verify Code',\n isSubmitting,\n onSubmit,\n formMaxWidthClassName = 'max-w-[430px]',\n formClassName,\n className,\n ...layoutProps\n}: TwoFactorAuthenticationPageProps): React.ReactElement {\n const {\n className: otpClassName,\n containerClassName: otpContainerClassName,\n ...resolvedOtpProps\n } = otpProps ?? {};\n const resolvedDescription = description ?? (\n <>\n We sent a code to your mobile number <strong>{destination}</strong>\n </>\n );\n const otpSlots = getOtpSlots(otpLength);\n\n return (\n <AuthPageLayout\n title={title}\n description={resolvedDescription}\n aside={aside}\n formMaxWidthClassName={formMaxWidthClassName}\n formClassName={cn('lg:min-h-[379px]', formClassName)}\n className={className}\n {...layoutProps}\n data-slot=\"auth-page-layout\"\n data-page-slot=\"two-factor-authentication-page\"\n >\n <AuthForm onSubmit={onSubmit}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center justify-between gap-4 text-md font-medium text-foreground\">\n <span>\n Code <span className=\"text-destructive\">*</span>\n </span>\n <AuthSmallAction action={recoveryCodeAction} />\n </div>\n <InputOTP\n aria-label=\"One-time authentication code\"\n maxLength={otpLength}\n name=\"otp\"\n required\n {...resolvedOtpProps}\n className={otpClassName}\n containerClassName={cn(\n 'justify-center gap-4',\n otpContainerClassName,\n )}\n >\n {otpSlots.map((slotIndex) => (\n <InputOTPSlot\n key={slotIndex}\n index={slotIndex}\n className=\"size-9 rounded-md text-md\"\n />\n ))}\n </InputOTP>\n </div>\n <AuthPrimaryButton loading={isSubmitting}>\n {submitLabel}\n </AuthPrimaryButton>\n <AuthInlineAction prefix=\"Didn't get the code?\" action={resendAction} />\n </AuthForm>\n </AuthPageLayout>\n );\n}\n\nfunction AuthSmallAction({ action }: AuthSmallActionProps): React.ReactElement {\n const className = cn(\n 'text-sm font-medium text-foreground transition-colors duration-150 ease-smooth hover:text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n );\n\n return renderActionElement(action, className);\n}\n\nTwoFactorAuthenticationPage.displayName = 'TwoFactorAuthenticationPage';\n\nexport { TwoFactorAuthenticationPage };\n"],"mappings":";;;;;;;AA4CA,SAAS,YAAY,WAA6B;CAChD,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,IAAI,GAAG,UAAU,KAAK;AAC9D;AAEA,SAAS,4BAA4B,EACnC,QAAQ,kBACR,cAAc,eACd,aACA,QAAQ,uBACR,YAAY,GACZ,UACA,qBAAqB,EAAE,OAAO,sBAAsB,GACpD,eAAe,EAAE,OAAO,SAAS,GACjC,cAAc,eACd,cACA,UACA,wBAAwB,iBACxB,eACA,WACA,GAAG,eACoD;CACvD,MAAM,EACJ,WAAW,cACX,oBAAoB,uBACpB,GAAG,qBACD,YAAY,CAAC;CACjB,MAAM,sBAAsB,eAC1B,qBAAA,UAAA,EAAA,UAAA,CAAE,yCACqC,oBAAC,UAAD,EAAA,UAAS,YAAoB,CAAA,CAClE,EAAA,CAAA;CAEJ,MAAM,WAAW,YAAY,SAAS;CAEtC,OACE,oBAAC,gBAAD;EACS;EACP,aAAa;EACN;EACgB;EACvB,eAAe,GAAG,oBAAoB,aAAa;EACxC;EACX,GAAI;EACJ,aAAU;EACV,kBAAe;YAEf,qBAAC,UAAD;GAAoB;aAApB;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,qBAAC,QAAD,EAAA,UAAA,CAAM,SACC,oBAAC,QAAD;OAAM,WAAU;iBAAmB;MAAO,CAAA,CAC3C,EAAA,CAAA,GACN,oBAAC,iBAAD,EAAiB,QAAQ,mBAAqB,CAAA,CAC3C;SACL,oBAAC,UAAD;MACE,cAAW;MACX,WAAW;MACX,MAAK;MACL,UAAA;MACA,GAAI;MACJ,WAAW;MACX,oBAAoB,GAClB,wBACA,qBACF;gBAEC,SAAS,KAAK,cACb,oBAAC,cAAD;OAEE,OAAO;OACP,WAAU;MACX,GAHM,SAGN,CACF;KACO,CAAA,CACP;;IACL,oBAAC,mBAAD;KAAmB,SAAS;eACzB;IACgB,CAAA;IACnB,oBAAC,kBAAD;KAAkB,QAAO;KAAuB,QAAQ;IAAe,CAAA;GAC/D;;CACI,CAAA;AAEpB;AAEA,SAAS,gBAAgB,EAAE,UAAoD;CAM7E,OAAO,oBAAoB,QALT,GAChB,qGACA,0IAGiC,CAAS;AAC9C;AAEA,4BAA4B,cAAc"}
package/dist/index235.js CHANGED
@@ -1,228 +1,43 @@
1
- import { assertNever } from "./index2.js";
2
- //#region src/lib/ai-interaction-format.ts
3
- var UNEXPECTED_COMPONENT_TYPE_MESSAGE = "Unexpected AI interaction component type";
4
- /**
5
- * Normalize value to array
6
- */
7
- function normalizeToArray(value) {
8
- if (Array.isArray(value)) return value.map(String);
9
- if (value === null || value === void 0) return [];
10
- return [String(value)];
11
- }
12
- /**
13
- * Apply label mappings to values
14
- */
15
- function applyLabels(values, labels) {
16
- if (!labels) return values;
17
- return values.map((v) => labels[v] || v);
18
- }
19
- /**
20
- * Format timestamp for display
21
- */
22
- function formatTimestamp(timestamp) {
23
- return new Date(timestamp).toISOString();
24
- }
25
- function formatSelectNatural(event, options) {
26
- const values = normalizeToArray(event.value);
27
- if (values.length === 0) return "I cleared my selection";
28
- return `I selected: ${applyLabels(values, options?.labels).join(", ")}`;
29
- }
30
- function formatFormNatural(event) {
31
- const data = event.value;
32
- if (!data || Object.keys(data).length === 0) return `I submitted the ${event.componentId} form with no data`;
33
- const fields = Object.entries(data).map(([key, value]) => `\u2022 ${key}: ${value}`).join("\n");
34
- return `I submitted the ${event.componentId} form:\n${fields}`;
35
- }
36
- function formatTableNatural(event) {
37
- const rows = event.value?.selectedRows || [];
38
- if (rows.length === 0) return `I cleared row selection from ${event.componentId}`;
39
- return `I selected rows ${rows.join(", ")} from ${event.componentId}`;
40
- }
41
- function formatChartNatural(event) {
42
- const data = event.value;
43
- if (!data?.label) return `I clicked on ${event.componentId}`;
44
- return `I clicked on ${data.label} (value: ${data.value}) in ${event.componentId}`;
45
- }
46
- function formatComponentNatural(event) {
47
- if (event.action === "submit" || event.action === "start") return `I answered ${event.componentId}: ${JSON.stringify(event.value)}`;
48
- return `I ${event.action} ${event.componentId}: ${JSON.stringify(event.value)}`;
49
- }
50
- function formatNatural(event, options) {
51
- let result;
52
- switch (event.componentType) {
53
- case "select":
54
- result = formatSelectNatural(event, options);
55
- break;
56
- case "form":
57
- result = formatFormNatural(event);
58
- break;
59
- case "table":
60
- result = formatTableNatural(event);
61
- break;
62
- case "chart":
63
- result = formatChartNatural(event);
64
- break;
65
- case "component":
66
- result = formatComponentNatural(event);
67
- break;
68
- default: return assertNever(event, UNEXPECTED_COMPONENT_TYPE_MESSAGE);
69
- }
70
- if (options?.includeTimestamp) result = `[${formatTimestamp(event.timestamp)}] ${result}`;
71
- return result;
72
- }
73
- function formatSelectStructured(event, options) {
74
- const result = {
75
- type: "user_interaction",
76
- component: "select",
77
- id: event.componentId,
78
- action: event.action,
79
- selection: normalizeToArray(event.value)
80
- };
81
- if (options?.includeTimestamp) result.timestamp = event.timestamp;
82
- return result;
83
- }
84
- function formatFormStructured(event, options) {
85
- const result = {
86
- type: "user_interaction",
87
- component: "form",
88
- id: event.componentId,
89
- action: event.action,
90
- data: event.value || {}
91
- };
92
- if (options?.includeTimestamp) result.timestamp = event.timestamp;
93
- return result;
94
- }
95
- function formatTableStructured(event, options) {
96
- const data = event.value;
97
- const result = {
98
- type: "user_interaction",
99
- component: "table",
100
- id: event.componentId,
101
- action: event.action,
102
- selectedRows: data?.selectedRows || []
103
- };
104
- if (options?.includeTimestamp) result.timestamp = event.timestamp;
105
- return result;
106
- }
107
- function formatChartStructured(event, options) {
108
- const data = event.value;
109
- const result = {
110
- type: "user_interaction",
111
- component: "chart",
112
- id: event.componentId,
113
- action: event.action,
114
- dataPoint: data
115
- };
116
- if (options?.includeTimestamp) result.timestamp = event.timestamp;
117
- return result;
118
- }
119
- function formatComponentStructured(event, options) {
120
- const result = {
121
- type: "user_interaction",
122
- component: "component",
123
- id: event.componentId,
124
- action: event.action,
125
- value: event.value
126
- };
127
- if (options?.includeTimestamp) result.timestamp = event.timestamp;
128
- return result;
129
- }
130
- function formatStructured(event, options) {
131
- switch (event.componentType) {
132
- case "select": return formatSelectStructured(event, options);
133
- case "form": return formatFormStructured(event, options);
134
- case "table": return formatTableStructured(event, options);
135
- case "chart": return formatChartStructured(event, options);
136
- case "component": return formatComponentStructured(event, options);
137
- default: return assertNever(event, UNEXPECTED_COMPONENT_TYPE_MESSAGE);
138
- }
139
- }
140
- function formatSelectMarkdown(event, options) {
141
- const values = normalizeToArray(event.value);
142
- if (values.length === 0) return `**Selection (${event.componentId}):** _cleared_`;
143
- const formatted = applyLabels(values, options?.labels).map((v) => `\`${v}\``).join(", ");
144
- return `**Selection (${event.componentId}):** ${formatted}`;
145
- }
146
- function formatFormMarkdown(event) {
147
- const data = event.value;
148
- if (!data || Object.keys(data).length === 0) return `**Form Submission (${event.componentId}):** _empty_`;
149
- const fields = Object.entries(data).map(([key, value]) => `- **${key}:** ${value}`).join("\n");
150
- return `**Form Submission (${event.componentId}):**\n${fields}`;
151
- }
152
- function formatTableMarkdown(event) {
153
- const rows = event.value?.selectedRows || [];
154
- if (rows.length === 0) return `**Table Selection (${event.componentId}):** _none_`;
155
- const formatted = rows.map((r) => `\`${r}\``).join(", ");
156
- return `**Table Selection (${event.componentId}):** rows ${formatted}`;
157
- }
158
- function formatChartMarkdown(event) {
159
- const data = event.value;
160
- if (!data?.label) return `**Chart Click (${event.componentId}):** _no data_`;
161
- return `**Chart Click (${event.componentId}):** ${data.label} (value: \`${data.value}\`)`;
162
- }
163
- function formatComponentMarkdown(event) {
164
- return `**Component Interaction (${event.componentId}):** ${event.action} \`${JSON.stringify(event.value)}\``;
165
- }
166
- function formatMarkdown(event, options) {
167
- let result;
168
- switch (event.componentType) {
169
- case "select":
170
- result = formatSelectMarkdown(event, options);
171
- break;
172
- case "form":
173
- result = formatFormMarkdown(event);
174
- break;
175
- case "table":
176
- result = formatTableMarkdown(event);
177
- break;
178
- case "chart":
179
- result = formatChartMarkdown(event);
180
- break;
181
- case "component":
182
- result = formatComponentMarkdown(event);
183
- break;
184
- default: return assertNever(event, UNEXPECTED_COMPONENT_TYPE_MESSAGE);
185
- }
186
- if (options?.includeTimestamp) result = `${result} _at ${formatTimestamp(event.timestamp)}_`;
187
- return result;
188
- }
189
- /**
190
- * Format an AI interaction event for sending to an LLM.
191
- *
192
- * Supports three format modes:
193
- * - 'natural': Human-readable text (default)
194
- * - 'structured': JSON object structure
195
- * - 'markdown': Markdown formatted text
196
- *
197
- * @param event - The interaction event to format
198
- * @param options - Formatting options
199
- * @returns Formatted string or object depending on format mode
200
- *
201
- * @example
202
- * ```ts
203
- * // Natural format (default)
204
- * formatInteractionForLLM(event)
205
- * // => "I selected: Fast delivery, Premium quality"
206
- *
207
- * // Structured format
208
- * formatInteractionForLLM(event, { format: 'structured' })
209
- * // => { type: 'user_interaction', component: 'select', ... }
210
- *
211
- * // Markdown format
212
- * formatInteractionForLLM(event, { format: 'markdown' })
213
- * // => "**Selection (preferences):** `fast`, `quality`"
214
- * ```
215
- */
216
- function formatInteractionForLLM(event, options) {
217
- const format = options?.format || "natural";
218
- switch (format) {
219
- case "structured": return formatStructured(event, options);
220
- case "markdown": return formatMarkdown(event, options);
221
- case "natural": return formatNatural(event, options);
222
- default: return assertNever(format, "Unexpected AI interaction format");
223
- }
224
- }
1
+ "use client";
2
+ import { cn } from "./index2.js";
3
+ import { AuthPageLayout } from "./index227.js";
4
+ import { AuthForm, AuthInlineAction, AuthPrimaryActionButton, defaultVerifyEmailAside } from "./index229.js";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/pages/VerifyEmailPage/VerifyEmailPage.tsx
7
+ function VerifyEmailPage({ title = "Verify your email 📧", email = "johndoe@gmail.com", description, aside = defaultVerifyEmailAside, skipAction, resendAction = { label: "Resend" }, submitLabel = "Skip For Now", isSubmitting, onSubmit, formClassName, ...layoutProps }) {
8
+ const resolvedDescription = description ?? /* @__PURE__ */ jsxs(Fragment, { children: [
9
+ "Account activation link sent to your email address.",
10
+ " ",
11
+ /* @__PURE__ */ jsx("strong", {
12
+ className: "font-semibold text-foreground",
13
+ children: email
14
+ }),
15
+ ", please follow the link inside to continue."
16
+ ] });
17
+ const resolvedSkipAction = skipAction ?? { label: submitLabel };
18
+ const skipActionCanSubmit = !resolvedSkipAction.href && !resolvedSkipAction.render;
19
+ return /* @__PURE__ */ jsx(AuthPageLayout, {
20
+ title,
21
+ description: resolvedDescription,
22
+ aside,
23
+ formClassName: cn("lg:min-h-[268px]", formClassName),
24
+ ...layoutProps,
25
+ "data-slot": "auth-page-layout",
26
+ "data-page-slot": "verify-email-page",
27
+ children: /* @__PURE__ */ jsxs(AuthForm, {
28
+ onSubmit,
29
+ children: [/* @__PURE__ */ jsx(AuthPrimaryActionButton, {
30
+ action: resolvedSkipAction,
31
+ loading: skipActionCanSubmit ? isSubmitting : void 0
32
+ }), /* @__PURE__ */ jsx(AuthInlineAction, {
33
+ prefix: "Didn't get the mail?",
34
+ action: resendAction
35
+ })]
36
+ })
37
+ });
38
+ }
39
+ VerifyEmailPage.displayName = "VerifyEmailPage";
225
40
  //#endregion
226
- export { formatInteractionForLLM };
41
+ export { VerifyEmailPage as VerifyEmail, VerifyEmailPage };
227
42
 
228
43
  //# sourceMappingURL=index235.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index235.js","names":[],"sources":["../src/lib/ai-interaction-format.ts"],"sourcesContent":["import type { AIInteractionEvent } from '@/components/organisms/ai/_shared/interaction-context';\nimport { assertNever } from '@/lib/utils';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Format modes for LLM interaction formatting\n */\nexport type FormatMode = 'natural' | 'structured' | 'markdown';\n\n/**\n * Options for formatting interaction events\n */\nexport interface FormatOptions {\n /** Output format mode. Defaults to 'natural' */\n format?: FormatMode;\n /** Whether to include timestamp in the output */\n includeTimestamp?: boolean;\n /** Label mappings for values (e.g., { 'fast': 'Fast delivery' }) */\n labels?: Record<string, string>;\n}\n\ntype ChartInteractionValue = { label?: string; value?: number } | null;\n\nconst UNEXPECTED_COMPONENT_TYPE_MESSAGE =\n 'Unexpected AI interaction component type';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Normalize value to array\n */\nfunction normalizeToArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(String);\n }\n if (value === null || value === undefined) {\n return [];\n }\n return [String(value)];\n}\n\n/**\n * Apply label mappings to values\n */\nfunction applyLabels(\n values: string[],\n labels?: Record<string, string>,\n): string[] {\n if (!labels) return values;\n return values.map((v) => labels[v] || v);\n}\n\n/**\n * Format timestamp for display\n */\nfunction formatTimestamp(timestamp: number): string {\n return new Date(timestamp).toISOString();\n}\n\n// =============================================================================\n// Natural Format\n// =============================================================================\n\nfunction formatSelectNatural(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): string {\n const values = normalizeToArray(event.value);\n\n if (values.length === 0) {\n return 'I cleared my selection';\n }\n\n const labeledValues = applyLabels(values, options?.labels);\n return `I selected: ${labeledValues.join(', ')}`;\n}\n\nfunction formatFormNatural(event: AIInteractionEvent): string {\n const data = event.value as Record<string, unknown> | null;\n\n if (!data || Object.keys(data).length === 0) {\n return `I submitted the ${event.componentId} form with no data`;\n }\n\n const fields = Object.entries(data)\n .map(([key, value]) => `\\u2022 ${key}: ${value}`)\n .join('\\n');\n\n return `I submitted the ${event.componentId} form:\\n${fields}`;\n}\n\nfunction formatTableNatural(event: AIInteractionEvent): string {\n const data = event.value as { selectedRows?: string[] } | null;\n const rows = data?.selectedRows || [];\n\n if (rows.length === 0) {\n return `I cleared row selection from ${event.componentId}`;\n }\n\n return `I selected rows ${rows.join(', ')} from ${event.componentId}`;\n}\n\nfunction formatChartNatural(event: AIInteractionEvent): string {\n const data = event.value as ChartInteractionValue;\n\n if (!data?.label) {\n return `I clicked on ${event.componentId}`;\n }\n\n return `I clicked on ${data.label} (value: ${data.value}) in ${event.componentId}`;\n}\n\nfunction formatComponentNatural(event: AIInteractionEvent): string {\n if (event.action === 'submit' || event.action === 'start') {\n return `I answered ${event.componentId}: ${JSON.stringify(event.value)}`;\n }\n\n return `I ${event.action} ${event.componentId}: ${JSON.stringify(event.value)}`;\n}\n\nfunction formatNatural(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): string {\n let result: string;\n\n switch (event.componentType) {\n case 'select':\n result = formatSelectNatural(event, options);\n break;\n case 'form':\n result = formatFormNatural(event);\n break;\n case 'table':\n result = formatTableNatural(event);\n break;\n case 'chart':\n result = formatChartNatural(event);\n break;\n case 'component':\n result = formatComponentNatural(event);\n break;\n default:\n return assertNever(event, UNEXPECTED_COMPONENT_TYPE_MESSAGE);\n }\n\n if (options?.includeTimestamp) {\n result = `[${formatTimestamp(event.timestamp)}] ${result}`;\n }\n\n return result;\n}\n\n// =============================================================================\n// Structured Format\n// =============================================================================\n\ninterface StructuredSelectResult {\n type: 'user_interaction';\n component: 'select';\n id: string;\n action: string;\n selection: string[];\n timestamp?: number;\n}\n\ninterface StructuredFormResult {\n type: 'user_interaction';\n component: 'form';\n id: string;\n action: string;\n data: Record<string, unknown>;\n timestamp?: number;\n}\n\ninterface StructuredTableResult {\n type: 'user_interaction';\n component: 'table';\n id: string;\n action: string;\n selectedRows: string[];\n timestamp?: number;\n}\n\ninterface StructuredChartResult {\n type: 'user_interaction';\n component: 'chart';\n id: string;\n action: string;\n dataPoint: ChartInteractionValue;\n timestamp?: number;\n}\n\ninterface StructuredComponentResult {\n type: 'user_interaction';\n component: 'component';\n id: string;\n action: string;\n value: unknown;\n timestamp?: number;\n}\n\ntype StructuredResult =\n | StructuredSelectResult\n | StructuredFormResult\n | StructuredTableResult\n | StructuredChartResult\n | StructuredComponentResult;\n\nfunction formatSelectStructured(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): StructuredSelectResult {\n const result: StructuredSelectResult = {\n type: 'user_interaction',\n component: 'select',\n id: event.componentId,\n action: event.action,\n selection: normalizeToArray(event.value),\n };\n\n if (options?.includeTimestamp) {\n result.timestamp = event.timestamp;\n }\n\n return result;\n}\n\nfunction formatFormStructured(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): StructuredFormResult {\n const result: StructuredFormResult = {\n type: 'user_interaction',\n component: 'form',\n id: event.componentId,\n action: event.action,\n data: (event.value as Record<string, unknown>) || {},\n };\n\n if (options?.includeTimestamp) {\n result.timestamp = event.timestamp;\n }\n\n return result;\n}\n\nfunction formatTableStructured(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): StructuredTableResult {\n const data = event.value as { selectedRows?: string[] } | null;\n\n const result: StructuredTableResult = {\n type: 'user_interaction',\n component: 'table',\n id: event.componentId,\n action: event.action,\n selectedRows: data?.selectedRows || [],\n };\n\n if (options?.includeTimestamp) {\n result.timestamp = event.timestamp;\n }\n\n return result;\n}\n\nfunction formatChartStructured(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): StructuredChartResult {\n const data = event.value as ChartInteractionValue;\n\n const result: StructuredChartResult = {\n type: 'user_interaction',\n component: 'chart',\n id: event.componentId,\n action: event.action,\n dataPoint: data,\n };\n\n if (options?.includeTimestamp) {\n result.timestamp = event.timestamp;\n }\n\n return result;\n}\n\nfunction formatComponentStructured(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): StructuredComponentResult {\n const result: StructuredComponentResult = {\n type: 'user_interaction',\n component: 'component',\n id: event.componentId,\n action: event.action,\n value: event.value,\n };\n\n if (options?.includeTimestamp) {\n result.timestamp = event.timestamp;\n }\n\n return result;\n}\n\nfunction formatStructured(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): StructuredResult {\n switch (event.componentType) {\n case 'select':\n return formatSelectStructured(event, options);\n case 'form':\n return formatFormStructured(event, options);\n case 'table':\n return formatTableStructured(event, options);\n case 'chart':\n return formatChartStructured(event, options);\n case 'component':\n return formatComponentStructured(event, options);\n default:\n return assertNever(event, UNEXPECTED_COMPONENT_TYPE_MESSAGE);\n }\n}\n\n// =============================================================================\n// Markdown Format\n// =============================================================================\n\nfunction formatSelectMarkdown(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): string {\n const values = normalizeToArray(event.value);\n\n if (values.length === 0) {\n return `**Selection (${event.componentId}):** _cleared_`;\n }\n\n const labeledValues = applyLabels(values, options?.labels);\n const formatted = labeledValues.map((v) => `\\`${v}\\``).join(', ');\n\n return `**Selection (${event.componentId}):** ${formatted}`;\n}\n\nfunction formatFormMarkdown(event: AIInteractionEvent): string {\n const data = event.value as Record<string, unknown> | null;\n\n if (!data || Object.keys(data).length === 0) {\n return `**Form Submission (${event.componentId}):** _empty_`;\n }\n\n const fields = Object.entries(data)\n .map(([key, value]) => `- **${key}:** ${value}`)\n .join('\\n');\n\n return `**Form Submission (${event.componentId}):**\\n${fields}`;\n}\n\nfunction formatTableMarkdown(event: AIInteractionEvent): string {\n const data = event.value as { selectedRows?: string[] } | null;\n const rows = data?.selectedRows || [];\n\n if (rows.length === 0) {\n return `**Table Selection (${event.componentId}):** _none_`;\n }\n\n const formatted = rows.map((r) => `\\`${r}\\``).join(', ');\n return `**Table Selection (${event.componentId}):** rows ${formatted}`;\n}\n\nfunction formatChartMarkdown(event: AIInteractionEvent): string {\n const data = event.value as ChartInteractionValue;\n\n if (!data?.label) {\n return `**Chart Click (${event.componentId}):** _no data_`;\n }\n\n return `**Chart Click (${event.componentId}):** ${data.label} (value: \\`${data.value}\\`)`;\n}\n\nfunction formatComponentMarkdown(event: AIInteractionEvent): string {\n return `**Component Interaction (${event.componentId}):** ${event.action} \\`${JSON.stringify(event.value)}\\``;\n}\n\nfunction formatMarkdown(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): string {\n let result: string;\n\n switch (event.componentType) {\n case 'select':\n result = formatSelectMarkdown(event, options);\n break;\n case 'form':\n result = formatFormMarkdown(event);\n break;\n case 'table':\n result = formatTableMarkdown(event);\n break;\n case 'chart':\n result = formatChartMarkdown(event);\n break;\n case 'component':\n result = formatComponentMarkdown(event);\n break;\n default:\n return assertNever(event, UNEXPECTED_COMPONENT_TYPE_MESSAGE);\n }\n\n if (options?.includeTimestamp) {\n result = `${result} _at ${formatTimestamp(event.timestamp)}_`;\n }\n\n return result;\n}\n\n// =============================================================================\n// Main Export\n// =============================================================================\n\n/**\n * Format an AI interaction event for sending to an LLM.\n *\n * Supports three format modes:\n * - 'natural': Human-readable text (default)\n * - 'structured': JSON object structure\n * - 'markdown': Markdown formatted text\n *\n * @param event - The interaction event to format\n * @param options - Formatting options\n * @returns Formatted string or object depending on format mode\n *\n * @example\n * ```ts\n * // Natural format (default)\n * formatInteractionForLLM(event)\n * // => \"I selected: Fast delivery, Premium quality\"\n *\n * // Structured format\n * formatInteractionForLLM(event, { format: 'structured' })\n * // => { type: 'user_interaction', component: 'select', ... }\n *\n * // Markdown format\n * formatInteractionForLLM(event, { format: 'markdown' })\n * // => \"**Selection (preferences):** `fast`, `quality`\"\n * ```\n */\nexport function formatInteractionForLLM(\n event: AIInteractionEvent,\n options?: FormatOptions,\n): string | object {\n const format = options?.format || 'natural';\n\n switch (format) {\n case 'structured':\n return formatStructured(event, options);\n case 'markdown':\n return formatMarkdown(event, options);\n case 'natural':\n return formatNatural(event, options);\n default:\n return assertNever(format, 'Unexpected AI interaction format');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index235.js","names":[],"sources":["../src/components/pages/VerifyEmailPage/VerifyEmailPage.tsx"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport {\n type AuthPageAction,\n type AuthPageAsideConfig,\n AuthPageLayout,\n type AuthPageLayoutProps,\n} from '@/components/templates/AuthPageLayout';\nimport { cn } from '@/lib/utils';\nimport {\n AuthForm,\n AuthInlineAction,\n AuthPrimaryActionButton,\n defaultVerifyEmailAside,\n} from '../_auth';\n\nexport interface VerifyEmailPageProps\n extends Omit<\n AuthPageLayoutProps,\n 'title' | 'description' | 'children' | 'aside' | 'onSubmit'\n > {\n title?: React.ReactNode;\n description?: React.ReactNode;\n email?: React.ReactNode;\n aside?: AuthPageAsideConfig | React.ReactNode;\n skipAction?: AuthPageAction;\n resendAction?: AuthPageAction;\n submitLabel?: React.ReactNode;\n isSubmitting?: boolean;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\nfunction VerifyEmailPage({\n title = 'Verify your email 📧',\n email = 'johndoe@gmail.com',\n description,\n aside = defaultVerifyEmailAside,\n skipAction,\n resendAction = { label: 'Resend' },\n submitLabel = 'Skip For Now',\n isSubmitting,\n onSubmit,\n formClassName,\n ...layoutProps\n}: VerifyEmailPageProps): React.ReactElement {\n const resolvedDescription = description ?? (\n <>\n Account activation link sent to your email address.{' '}\n <strong className=\"font-semibold text-foreground\">{email}</strong>, please\n follow the link inside to continue.\n </>\n );\n const resolvedSkipAction = skipAction ?? { label: submitLabel };\n const skipActionCanSubmit =\n !resolvedSkipAction.href && !resolvedSkipAction.render;\n\n return (\n <AuthPageLayout\n title={title}\n description={resolvedDescription}\n aside={aside}\n formClassName={cn('lg:min-h-[268px]', formClassName)}\n {...layoutProps}\n data-slot=\"auth-page-layout\"\n data-page-slot=\"verify-email-page\"\n >\n <AuthForm onSubmit={onSubmit}>\n <AuthPrimaryActionButton\n action={resolvedSkipAction}\n loading={skipActionCanSubmit ? isSubmitting : undefined}\n />\n <AuthInlineAction prefix=\"Didn't get the mail?\" action={resendAction} />\n </AuthForm>\n </AuthPageLayout>\n );\n}\n\nVerifyEmailPage.displayName = 'VerifyEmailPage';\n\nexport { VerifyEmailPage, VerifyEmailPage as VerifyEmail };\n"],"mappings":";;;;;;AAiCA,SAAS,gBAAgB,EACvB,QAAQ,wBACR,QAAQ,qBACR,aACA,QAAQ,yBACR,YACA,eAAe,EAAE,OAAO,SAAS,GACjC,cAAc,gBACd,cACA,UACA,eACA,GAAG,eACwC;CAC3C,MAAM,sBAAsB,eAC1B,qBAAA,UAAA,EAAA,UAAA;EAAE;EACoD;EACpD,oBAAC,UAAD;GAAQ,WAAU;aAAiC;EAAc,CAAA;EAAC;CAElE,EAAA,CAAA;CAEJ,MAAM,qBAAqB,cAAc,EAAE,OAAO,YAAY;CAC9D,MAAM,sBACJ,CAAC,mBAAmB,QAAQ,CAAC,mBAAmB;CAElD,OACE,oBAAC,gBAAD;EACS;EACP,aAAa;EACN;EACP,eAAe,GAAG,oBAAoB,aAAa;EACnD,GAAI;EACJ,aAAU;EACV,kBAAe;YAEf,qBAAC,UAAD;GAAoB;aAApB,CACE,oBAAC,yBAAD;IACE,QAAQ;IACR,SAAS,sBAAsB,eAAe,KAAA;GAC/C,CAAA,GACD,oBAAC,kBAAD;IAAkB,QAAO;IAAuB,QAAQ;GAAe,CAAA,CAC/D;;CACI,CAAA;AAEpB;AAEA,gBAAgB,cAAc"}