@tanglemedia/svelte-starter-auth-shadcn 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/app.css +174 -0
  2. package/dist/app.html +0 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/lib/components/types.d.ts +13 -0
  6. package/dist/lib/components/types.js +1 -0
  7. package/dist/lib/components/ui/auth-layout/auth-layout-content-top.svelte +15 -0
  8. package/dist/lib/components/ui/auth-layout/auth-layout-content-top.svelte.d.ts +8 -0
  9. package/dist/lib/components/ui/auth-layout/auth-layout-content.svelte +15 -0
  10. package/dist/lib/components/ui/auth-layout/auth-layout-content.svelte.d.ts +8 -0
  11. package/dist/lib/components/ui/auth-layout/auth-layout-feature-info.svelte +45 -0
  12. package/dist/lib/components/ui/auth-layout/auth-layout-feature-info.svelte.d.ts +12 -0
  13. package/dist/lib/components/ui/auth-layout/auth-layout-feature.svelte +24 -0
  14. package/dist/lib/components/ui/auth-layout/auth-layout-feature.svelte.d.ts +8 -0
  15. package/dist/lib/components/ui/auth-layout/auth-layout-logo.svelte +99 -0
  16. package/dist/lib/components/ui/auth-layout/auth-layout-logo.svelte.d.ts +63 -0
  17. package/dist/lib/components/ui/auth-layout/auth-layout-main.svelte +17 -0
  18. package/dist/lib/components/ui/auth-layout/auth-layout-main.svelte.d.ts +8 -0
  19. package/dist/lib/components/ui/auth-layout/auth-layout.svelte +22 -88
  20. package/dist/lib/components/ui/auth-layout/auth-layout.svelte.d.ts +4 -12
  21. package/dist/lib/components/ui/auth-layout/index.d.ts +8 -2
  22. package/dist/lib/components/ui/auth-layout/index.js +10 -2
  23. package/dist/lib/components/ui/forgot-password/forgot-password-container.svelte +27 -0
  24. package/dist/lib/components/ui/forgot-password/forgot-password-container.svelte.d.ts +8 -0
  25. package/dist/lib/components/ui/forgot-password/forgot-password-form.svelte +70 -77
  26. package/dist/lib/components/ui/forgot-password/forgot-password-form.svelte.d.ts +12 -7
  27. package/dist/lib/components/ui/forgot-password/forgot-password-header.svelte +34 -0
  28. package/dist/lib/components/ui/forgot-password/forgot-password-header.svelte.d.ts +13 -0
  29. package/dist/lib/components/ui/forgot-password/forgot-password-login.svelte +19 -0
  30. package/dist/lib/components/ui/forgot-password/forgot-password-login.svelte.d.ts +9 -0
  31. package/dist/lib/components/ui/forgot-password/forgot-password-provider.svelte +13 -0
  32. package/dist/lib/components/ui/forgot-password/forgot-password-provider.svelte.d.ts +25 -0
  33. package/dist/lib/components/ui/forgot-password/forgot-password-submit.svelte +17 -0
  34. package/dist/lib/components/ui/forgot-password/forgot-password-submit.svelte.d.ts +7 -0
  35. package/dist/lib/components/ui/forgot-password/forgot-password-user-input.svelte +21 -0
  36. package/dist/lib/components/ui/forgot-password/forgot-password-user-input.svelte.d.ts +26 -0
  37. package/dist/lib/components/ui/forgot-password/forgot-password.schema.d.ts +5 -0
  38. package/dist/lib/components/ui/forgot-password/forgot-password.schema.js +4 -0
  39. package/dist/lib/components/ui/forgot-password/index.d.ts +9 -2
  40. package/dist/lib/components/ui/forgot-password/index.js +9 -2
  41. package/dist/lib/components/ui/index.d.ts +5 -5
  42. package/dist/lib/components/ui/index.js +6 -5
  43. package/dist/lib/components/ui/login-form/index.d.ts +11 -2
  44. package/dist/lib/components/ui/login-form/index.js +13 -2
  45. package/dist/lib/components/ui/login-form/login-container.svelte +27 -0
  46. package/dist/lib/components/ui/login-form/login-container.svelte.d.ts +8 -0
  47. package/dist/lib/components/ui/login-form/login-context.d.ts +2 -0
  48. package/dist/lib/components/ui/login-form/login-context.js +13 -0
  49. package/dist/lib/components/ui/login-form/login-forgot-password.svelte +19 -0
  50. package/dist/lib/components/ui/login-form/login-forgot-password.svelte.d.ts +9 -0
  51. package/dist/lib/components/ui/login-form/login-form.svelte +68 -107
  52. package/dist/lib/components/ui/login-form/login-form.svelte.d.ts +10 -7
  53. package/dist/lib/components/ui/login-form/login-header.svelte +34 -0
  54. package/dist/lib/components/ui/login-form/login-header.svelte.d.ts +13 -0
  55. package/dist/lib/components/ui/login-form/login-password-input.svelte +21 -0
  56. package/dist/lib/components/ui/login-form/login-password-input.svelte.d.ts +26 -0
  57. package/dist/lib/components/ui/login-form/login-provider.svelte +13 -0
  58. package/dist/lib/components/ui/login-form/login-provider.svelte.d.ts +25 -0
  59. package/dist/lib/components/ui/login-form/login-submit.svelte +17 -0
  60. package/dist/lib/components/ui/login-form/login-submit.svelte.d.ts +7 -0
  61. package/dist/lib/components/ui/login-form/login-user-input.svelte +21 -0
  62. package/dist/lib/components/ui/login-form/login-user-input.svelte.d.ts +26 -0
  63. package/dist/lib/components/ui/login-form/login.schema.d.ts +6 -0
  64. package/dist/lib/components/ui/login-form/login.schema.js +5 -0
  65. package/dist/lib/components/ui/register-form/index.d.ts +10 -2
  66. package/dist/lib/components/ui/register-form/index.js +10 -2
  67. package/dist/lib/components/ui/register-form/register-container.svelte +27 -0
  68. package/dist/lib/components/ui/register-form/register-container.svelte.d.ts +8 -0
  69. package/dist/lib/components/ui/register-form/register-form.svelte +67 -166
  70. package/dist/lib/components/ui/register-form/register-form.svelte.d.ts +10 -5
  71. package/dist/lib/components/ui/register-form/register-header.svelte +34 -0
  72. package/dist/lib/components/ui/register-form/register-header.svelte.d.ts +13 -0
  73. package/dist/lib/components/ui/register-form/register-name-input.svelte +21 -0
  74. package/dist/lib/components/ui/register-form/register-name-input.svelte.d.ts +26 -0
  75. package/dist/lib/components/ui/register-form/register-password-input.svelte +21 -0
  76. package/dist/lib/components/ui/register-form/register-password-input.svelte.d.ts +26 -0
  77. package/dist/lib/components/ui/register-form/register-provider.svelte +13 -0
  78. package/dist/lib/components/ui/register-form/register-provider.svelte.d.ts +25 -0
  79. package/dist/lib/components/ui/register-form/register-submit.svelte +17 -0
  80. package/dist/lib/components/ui/register-form/register-submit.svelte.d.ts +7 -0
  81. package/dist/lib/components/ui/register-form/register-user-input.svelte +21 -0
  82. package/dist/lib/components/ui/register-form/register-user-input.svelte.d.ts +26 -0
  83. package/dist/lib/components/ui/register-form/register.schema.d.ts +8 -0
  84. package/dist/lib/components/ui/register-form/register.schema.js +7 -0
  85. package/dist/lib/components/ui/reset-password/index.d.ts +8 -2
  86. package/dist/lib/components/ui/reset-password/index.js +8 -2
  87. package/dist/lib/components/ui/reset-password/reset-password-container.svelte +27 -0
  88. package/dist/lib/components/ui/reset-password/reset-password-container.svelte.d.ts +8 -0
  89. package/dist/lib/components/ui/reset-password/reset-password-form.svelte +91 -0
  90. package/dist/lib/components/ui/reset-password/reset-password-form.svelte.d.ts +20 -0
  91. package/dist/lib/components/ui/reset-password/reset-password-header.svelte +34 -0
  92. package/dist/lib/components/ui/reset-password/reset-password-header.svelte.d.ts +13 -0
  93. package/dist/lib/components/ui/reset-password/reset-password-password-input.svelte +21 -0
  94. package/dist/lib/components/ui/reset-password/reset-password-password-input.svelte.d.ts +26 -0
  95. package/dist/lib/components/ui/reset-password/reset-password-provider.svelte +13 -0
  96. package/dist/lib/components/ui/reset-password/reset-password-provider.svelte.d.ts +25 -0
  97. package/dist/lib/components/ui/reset-password/reset-password-submit.svelte +17 -0
  98. package/dist/lib/components/ui/reset-password/reset-password-submit.svelte.d.ts +7 -0
  99. package/dist/lib/components/ui/reset-password/reset-password.schema.d.ts +6 -0
  100. package/dist/lib/components/ui/reset-password/reset-password.schema.js +9 -0
  101. package/dist/lib/index.d.ts +2 -3
  102. package/dist/lib/index.js +3 -3
  103. package/dist/lib/utils.d.ts +10 -0
  104. package/package.json +39 -30
  105. package/src/app.css +174 -0
  106. package/src/app.html +0 -1
  107. package/src/index.ts +1 -1
  108. package/src/lib/components/types.ts +24 -0
  109. package/src/lib/components/ui/auth-layout/auth-layout-content-top.svelte +15 -0
  110. package/src/lib/components/ui/auth-layout/auth-layout-content.svelte +15 -0
  111. package/src/lib/components/ui/auth-layout/auth-layout-feature-info.svelte +45 -0
  112. package/src/lib/components/ui/auth-layout/auth-layout-feature.svelte +24 -0
  113. package/src/lib/components/ui/auth-layout/auth-layout-logo.svelte +99 -0
  114. package/src/lib/components/ui/auth-layout/auth-layout-main.svelte +17 -0
  115. package/src/lib/components/ui/auth-layout/auth-layout.svelte +22 -88
  116. package/src/lib/components/ui/auth-layout/index.ts +20 -2
  117. package/src/lib/components/ui/forgot-password/forgot-password-container.svelte +27 -0
  118. package/src/lib/components/ui/forgot-password/forgot-password-form.svelte +70 -77
  119. package/src/lib/components/ui/forgot-password/forgot-password-header.svelte +34 -0
  120. package/src/lib/components/ui/forgot-password/forgot-password-login.svelte +19 -0
  121. package/src/lib/components/ui/forgot-password/forgot-password-provider.svelte +13 -0
  122. package/src/lib/components/ui/forgot-password/forgot-password-submit.svelte +17 -0
  123. package/src/lib/components/ui/forgot-password/forgot-password-user-input.svelte +21 -0
  124. package/src/lib/components/ui/forgot-password/forgot-password.schema.ts +7 -0
  125. package/src/lib/components/ui/forgot-password/index.ts +19 -2
  126. package/src/lib/components/ui/index.ts +6 -5
  127. package/src/lib/components/ui/login-form/index.ts +26 -2
  128. package/src/lib/components/ui/login-form/login-container.svelte +27 -0
  129. package/src/lib/components/ui/login-form/login-context.ts +16 -0
  130. package/src/lib/components/ui/login-form/login-forgot-password.svelte +19 -0
  131. package/src/lib/components/ui/login-form/login-form.svelte +68 -107
  132. package/src/lib/components/ui/login-form/login-header.svelte +34 -0
  133. package/src/lib/components/ui/login-form/login-password-input.svelte +21 -0
  134. package/src/lib/components/ui/login-form/login-provider.svelte +13 -0
  135. package/src/lib/components/ui/login-form/login-submit.svelte +17 -0
  136. package/src/lib/components/ui/login-form/login-user-input.svelte +21 -0
  137. package/src/lib/components/ui/login-form/login.schema.ts +8 -0
  138. package/src/lib/components/ui/register-form/index.ts +21 -2
  139. package/src/lib/components/ui/register-form/register-container.svelte +27 -0
  140. package/src/lib/components/ui/register-form/register-form.svelte +67 -166
  141. package/src/lib/components/ui/register-form/register-header.svelte +34 -0
  142. package/src/lib/components/ui/register-form/register-name-input.svelte +21 -0
  143. package/src/lib/components/ui/register-form/register-password-input.svelte +21 -0
  144. package/src/lib/components/ui/register-form/register-provider.svelte +13 -0
  145. package/src/lib/components/ui/register-form/register-submit.svelte +17 -0
  146. package/src/lib/components/ui/register-form/register-user-input.svelte +21 -0
  147. package/src/lib/components/ui/register-form/register.schema.ts +10 -0
  148. package/src/lib/components/ui/reset-password/index.ts +17 -2
  149. package/src/lib/components/ui/reset-password/reset-password-container.svelte +27 -0
  150. package/src/lib/components/ui/reset-password/reset-password-form.svelte +91 -0
  151. package/src/lib/components/ui/reset-password/reset-password-header.svelte +34 -0
  152. package/src/lib/components/ui/reset-password/reset-password-password-input.svelte +21 -0
  153. package/src/lib/components/ui/reset-password/reset-password-provider.svelte +13 -0
  154. package/src/lib/components/ui/reset-password/reset-password-submit.svelte +17 -0
  155. package/src/lib/components/ui/reset-password/reset-password.schema.ts +12 -0
  156. package/src/lib/index.ts +3 -3
  157. package/src/lib/utils.ts +8 -1
  158. package/dist/lib/components/ui/reset-password/reset-form.svelte +0 -116
  159. package/dist/lib/components/ui/reset-password/reset-form.svelte.d.ts +0 -16
  160. package/src/lib/components/ui/reset-password/reset-form.svelte +0 -116
@@ -1,5 +1,6 @@
1
- export * from './auth-layout';
2
- export * from './login-form';
3
- export * from './register-form';
4
- export * from './reset-password';
5
- export * from './forgot-password';
1
+ export * as Auth from './auth-layout/index.ts';
2
+ export * as Login from './login-form/index.ts';
3
+ export * as ForgotPassword from './forgot-password/index.ts';
4
+ export * as Register from './register-form/index.ts';
5
+ export * as ResetPassword from './reset-password/index.ts';
6
+ // export * from './forgot-password/index.ts';
@@ -1,3 +1,27 @@
1
- import LoginForm from './login-form.svelte';
1
+ import Form from './login-form.svelte';
2
+ import Provider from './login-provider.svelte';
3
+ import Header from './login-header.svelte';
4
+ import { loginSchema as schema, type LoginSchema } from './login.schema.ts';
5
+ import Container from './login-container.svelte';
6
+ import ForgotPasswordLink from './login-forgot-password.svelte';
7
+ import Submit from './login-submit.svelte';
8
+ import UserInput from './login-user-input.svelte';
9
+ import PasswordInput from './login-password-input.svelte';
10
+ // import { Field } from '@tanglemedia/svelte-starter-form-shadcn';
2
11
 
3
- export { LoginForm };
12
+ export * from './login-context.ts';
13
+
14
+ // const PasswordField = Field.PasswordField;
15
+
16
+ export {
17
+ Form,
18
+ Provider,
19
+ Header,
20
+ Container,
21
+ schema,
22
+ ForgotPasswordLink,
23
+ Submit,
24
+ UserInput,
25
+ PasswordInput,
26
+ type LoginSchema,
27
+ };
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { Card } from '@tanglemedia/svelte-starter-ui-shadcn';
3
+ import type { WithChild } from 'svelte-toolbelt';
4
+ import { cn } from '../../../utils.js';
5
+
6
+ type LoginContainerProps = Omit<WithChild, 'child'> & {
7
+ class?: string;
8
+ card?: boolean;
9
+ };
10
+
11
+ const {
12
+ children,
13
+ class: cls,
14
+ card = true,
15
+ ...rest
16
+ }: LoginContainerProps = $props();
17
+ </script>
18
+
19
+ {#if !card}
20
+ <div class={cn('mx-auto max-w-sm', cls)} {...rest}>
21
+ {@render children?.()}
22
+ </div>
23
+ {:else}
24
+ <Card.Root class={cn('mx-auto max-w-sm', cls)} {...rest}>
25
+ {@render children?.()}
26
+ </Card.Root>
27
+ {/if}
@@ -0,0 +1,16 @@
1
+ import { useForm } from '@tanglemedia/svelte-starter-form-shadcn';
2
+ export { useForm };
3
+ // import { getContext, setContext } from 'svelte';
4
+ // import type { SuperForm } from 'sveltekit-superforms';
5
+
6
+ // const ctx = '--auth-superform';
7
+
8
+ // export function setForm<T extends Record<string, unknown>>(
9
+ // superform: SuperForm<T>
10
+ // ) {
11
+ // setContext(ctx, superform);
12
+ // }
13
+
14
+ // export function useForm<T extends Record<string, unknown>>() {
15
+ // return getContext<SuperForm<T>>(ctx);
16
+ // }
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import { cn } from "$lib/utils.js";
3
+ import type { Snippet } from "svelte";
4
+
5
+ type LoginForgotPasswordProps = {
6
+ href: string;
7
+ class?: string;
8
+ children?: Snippet;
9
+ };
10
+ const { href, class: cls, children }: LoginForgotPasswordProps = $props();
11
+ </script>
12
+
13
+ <a {href} class={cn("ml-auto inline-block text-sm underline", cls)}>
14
+ {#if children}
15
+ {@render children?.()}
16
+ {:else}
17
+ Forgot your password?
18
+ {/if}
19
+ </a>
@@ -1,134 +1,95 @@
1
1
  <script lang="ts">
2
- import { Button, Card, Input, Label, Form } from '@tanglemedia/svelte-starter-ui-shadcn';
3
- import type { Snippet } from 'svelte';
2
+ import { Card } from "@tanglemedia/svelte-starter-ui-shadcn";
3
+ import type { Snippet } from "svelte";
4
+ import SuperDebug, {
5
+ defaults,
6
+ superForm,
7
+ type Infer,
8
+ type SuperForm,
9
+ type SuperValidated,
10
+ } from "sveltekit-superforms";
11
+ import { zod4 } from "sveltekit-superforms/adapters";
12
+ import LoginContainer from "./login-container.svelte";
13
+ import LoginForgotPassword from "./login-forgot-password.svelte";
14
+ import LoginHeader from "./login-header.svelte";
15
+ import LoginPasswordInput from "./login-password-input.svelte";
16
+ import LoginProvider from "./login-provider.svelte";
17
+ import LoginSubmit from "./login-submit.svelte";
18
+ import LoginUserInput from "./login-user-input.svelte";
19
+ import { loginSchema, type LoginSchema } from "./login.schema.js";
20
+ import { ServerError } from "@tanglemedia/svelte-starter-form-shadcn";
21
+ // import { Field } from "@tanglemedia/svelte-starter-form-shadcn";
4
22
 
5
23
  interface Props {
6
- superform: any;
24
+ superform?: SuperForm<Infer<LoginSchema>> | null;
7
25
  card?: boolean;
8
- cardClass?: string;
26
+ // cardClass?: string;
9
27
  title?: string;
10
28
  description?: string;
11
- forgotPassword?: boolean;
29
+ // forgotPassword?: boolean;
12
30
  forgotPasswordLink?: string;
13
31
  register?: boolean;
14
32
  registerLink?: string;
15
- formTail?: Snippet;
16
- formHead?: Snippet;
33
+ lead?: Snippet;
34
+ tail?: Snippet;
17
35
  children?: Snippet;
36
+ form?: SuperValidated<Infer<LoginSchema>>;
37
+ action?: string;
38
+
39
+ debug?: boolean;
18
40
  }
19
41
 
20
- let {
21
- superform,
22
- card = false,
23
- cardClass = "mx-auto max-w-sm",
24
- title = "Login",
25
- description = "Enter your information below to register a new account",
26
- forgotPassword = true,
42
+ let {
43
+ debug = false,
44
+ form,
45
+ superform: superforms = $bindable(null),
46
+ card = true,
47
+ title = "Login",
48
+ description = "Enter your credentails below",
49
+ // forgotPassword = true,
27
50
  forgotPasswordLink = "/forgot-password",
28
51
  register = true,
29
52
  registerLink = "/register",
30
- formTail,
31
- formHead,
32
- children
53
+ lead,
54
+ tail,
55
+ action = "?/login",
33
56
  }: Props = $props();
34
57
 
35
- const { form: formData, enhance } = superform;
58
+ // https://github.com/ciscoheat/sveltekit-superforms/issues/630
59
+ superforms = superforms || superForm(form || defaults(zod4(loginSchema)));
60
+
61
+ const { errors, message } = superforms;
36
62
  </script>
37
63
 
38
- {#if card}
39
- <Card.Root class={cardClass}>
40
- <Card.Header>
41
- <Card.Title class="text-2xl">{title}</Card.Title>
42
- <Card.Description>{description}</Card.Description>
43
- </Card.Header>
64
+ <LoginProvider {superforms} {action}>
65
+ <LoginContainer {card}>
66
+ <LoginHeader text={title} desc={description} />
44
67
  <Card.Content>
45
- <form method="POST" use:enhance class="grid gap-4">
46
- {@render formHead?.()}
47
- {#if children}
48
- {@render children?.()}
49
- {:else}
50
- <Form.Field form={superform} name="email">
51
- <Form.Control>
52
- {#snippet children({ props })}
53
- <Form.Label>Email</Form.Label>
54
- <Input {...props} bind:value={$formData.email} type="email" required />
55
- {/snippet}
56
- </Form.Control>
57
- <Form.FieldErrors />
58
- </Form.Field>
59
- <Form.Field form={superform} name="password">
60
- <Form.Control>
61
- {#snippet children({ props })}
62
- <div class="flex items-center">
63
- <Form.Label>Password</Form.Label>
64
- {#if forgotPassword}
65
- <a href={forgotPasswordLink} class="ml-auto inline-block text-sm underline">
66
- Forgot your password?
67
- </a>
68
- {/if}
69
- </div>
70
- <Input {...props} bind:value={$formData.password} type="password" required />
71
- {/snippet}
72
- </Form.Control>
73
- <Form.FieldErrors />
74
- </Form.Field>
75
- {/if}
76
- <Form.Button type="submit" class="w-full">Login</Form.Button>
77
- {@render formTail?.()}
78
- </form>
68
+ {@render lead?.()}
69
+ <ServerError class="mb-4" />
70
+ <LoginUserInput autocomplete="username" name={"username"} />
71
+ <LoginPasswordInput name={"password"} label={"Password"}>
72
+ {#snippet asideLabel()}
73
+ <LoginForgotPassword href={forgotPasswordLink} />
74
+ {/snippet}
75
+ </LoginPasswordInput>
76
+ <LoginSubmit />
79
77
  {#if register}
80
78
  <div class="mt-4 text-center text-sm">
81
79
  Don't have an account?
82
80
  <a href={registerLink} class="underline"> Sign up </a>
83
81
  </div>
84
82
  {/if}
85
- </Card.Content>
86
- </Card.Root>
87
- {:else}
88
- <div class={cardClass}>
89
- <div class="flex flex-col space-y-1.5 p-6 pb-0">
90
- <h3 class="font-semibold tracking-tight text-2xl">{title}</h3>
91
- <p class="text-muted-foreground text-sm">{description}</p>
92
- </div>
93
- <form method="POST" use:enhance class="grid gap-4 p-6">
94
- {@render formHead?.()}
95
- {#if children}
96
- {@render children?.()}
97
- {:else}
98
- <Form.Field form={superform} name="email">
99
- <Form.Control>
100
- {#snippet children({ props })}
101
- <Form.Label>Email</Form.Label>
102
- <Input {...props} bind:value={$formData.email} type="email" required />
103
- {/snippet}
104
- </Form.Control>
105
- <Form.FieldErrors />
106
- </Form.Field>
107
- <Form.Field form={superform} name="password">
108
- <Form.Control>
109
- {#snippet children({ props })}
110
- <div class="flex items-center">
111
- <Form.Label>Password</Form.Label>
112
- {#if forgotPassword}
113
- <a href={forgotPasswordLink} class="ml-auto inline-block text-sm underline">
114
- Forgot your password?
115
- </a>
116
- {/if}
117
- </div>
118
- <Input {...props} bind:value={$formData.password} type="password" required />
119
- {/snippet}
120
- </Form.Control>
121
- <Form.FieldErrors />
122
- </Form.Field>
83
+ {@render tail?.()}
84
+
85
+ {#if debug}
86
+ <div class="mb-6">
87
+ <h4>Errors</h4>
88
+ <SuperDebug data={errors} />
89
+ </div>
90
+ <h4>Message</h4>
91
+ <SuperDebug data={$message} />
123
92
  {/if}
124
- <Form.Button type="submit" class="w-full">Login</Form.Button>
125
- {@render formTail?.()}
126
- </form>
127
- {#if register}
128
- <div class="mt-4 text-center text-sm">
129
- Don't have an account?
130
- <a href={registerLink} class="underline"> Sign up </a>
131
- </div>
132
- {/if}
133
- </div>
134
- {/if}
93
+ </Card.Content>
94
+ </LoginContainer>
95
+ </LoginProvider>
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import { Card } from '@tanglemedia/svelte-starter-ui-shadcn';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ type LoginHeaderAttr = {
6
+ text?: string;
7
+ desc?: string;
8
+ };
9
+
10
+ type LoginHeaderProps = LoginHeaderAttr & {
11
+ title?: Snippet<[LoginHeaderAttr]>;
12
+ description?: Snippet<[LoginHeaderAttr]>;
13
+ children?: Snippet<[LoginHeaderAttr]>;
14
+ };
15
+
16
+ let { title, children, description, ...restProps }: LoginHeaderProps = $props();
17
+ </script>
18
+
19
+ <Card.Header>
20
+ <Card.Title class="text-2xl">
21
+ {#if title}
22
+ {@render title(restProps)}
23
+ {:else if children}
24
+ {@render children?.(restProps)}
25
+ {:else}
26
+ {restProps.text}
27
+ {/if}
28
+ </Card.Title>
29
+ {#if description}
30
+ <Card.Description>{@render description(restProps)}</Card.Description>
31
+ {:else if restProps.desc}
32
+ <Card.Description>{restProps.desc}</Card.Description>
33
+ {/if}
34
+ </Card.Header>
@@ -0,0 +1,21 @@
1
+ <script lang="ts" module>
2
+ import { type FormPathLeaves as _FormPathLeaves } from 'sveltekit-superforms';
3
+
4
+ type T = Record<string, unknown>;
5
+ type U = _FormPathLeaves<T, any>;
6
+ </script>
7
+
8
+ <script
9
+ lang="ts"
10
+ generics="T extends Record<string, unknown>, U extends _FormPathLeaves<T, any>"
11
+ >
12
+ import {
13
+ Field,
14
+ type PasswordFieldProps,
15
+ } from '@tanglemedia/svelte-starter-form-shadcn';
16
+
17
+ type LoginPasswordInputProps = PasswordFieldProps<T, U>;
18
+ const { name = 'password' as U, ...rest }: LoginPasswordInputProps = $props();
19
+ </script>
20
+
21
+ <Field.Password {name} {...rest}></Field.Password>
@@ -0,0 +1,13 @@
1
+ <script lang="ts" module>
2
+ type T = Record<string, unknown>;
3
+ </script>
4
+
5
+ <script lang="ts" generics="T extends Record<string, unknown>">
6
+ import {
7
+ Form,
8
+ type FormProviderProps,
9
+ } from "@tanglemedia/svelte-starter-form-shadcn";
10
+ let rest: FormProviderProps<T> = $props();
11
+ </script>
12
+
13
+ <Form.Provider {...rest} />
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { Form } from "@tanglemedia/svelte-starter-form-shadcn";
3
+ import type { Snippet } from "svelte";
4
+
5
+ type LoginSubmitProps = {
6
+ children?: Snippet;
7
+ };
8
+ const { children }: LoginSubmitProps = $props();
9
+ </script>
10
+
11
+ <Form.Submit class="w-full">
12
+ {#if children}
13
+ {@render children?.()}
14
+ {:else}
15
+ Login
16
+ {/if}
17
+ </Form.Submit>
@@ -0,0 +1,21 @@
1
+ <script lang="ts" module>
2
+ import { type FormPathLeaves as _FormPathLeaves } from 'sveltekit-superforms';
3
+
4
+ type T = Record<string, unknown>;
5
+ type U = _FormPathLeaves<T, any>;
6
+ </script>
7
+
8
+ <script
9
+ lang="ts"
10
+ generics="T extends Record<string, unknown>, U extends _FormPathLeaves<T, any>"
11
+ >
12
+ import {
13
+ Field,
14
+ type InputFieldProps,
15
+ } from '@tanglemedia/svelte-starter-form-shadcn';
16
+
17
+ type LoginUserInputProps = InputFieldProps<T, U>;
18
+ const { name = 'username' as U, label, ...rest }: LoginUserInputProps = $props();
19
+ </script>
20
+
21
+ <Field.Input type={'email'} {name} label={label || 'Username'} {...rest}></Field.Input>
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+
3
+ export const loginSchema = z.object({
4
+ username: z.string().min(1, { error: "Username is required" }),
5
+ password: z.string().min(1, { error: "Password is required" }),
6
+ });
7
+
8
+ export type LoginSchema = typeof loginSchema;
@@ -1,3 +1,22 @@
1
- import RegisterForm from './register-form.svelte';
1
+ import Form from './register-form.svelte';
2
+ import Provider from './register-provider.svelte';
3
+ import Header from './register-header.svelte';
4
+ import { registerSchema as schema, type RegisterSchema } from './register.schema.ts';
5
+ import Container from './register-container.svelte';
6
+ import Submit from './register-submit.svelte';
7
+ import UserInput from './register-user-input.svelte';
8
+ import PasswordInput from './register-password-input.svelte';
9
+ import NameInput from './register-name-input.svelte';
2
10
 
3
- export { RegisterForm };
11
+ export {
12
+ Form,
13
+ Provider,
14
+ Header,
15
+ Container,
16
+ schema,
17
+ Submit,
18
+ UserInput,
19
+ PasswordInput,
20
+ NameInput,
21
+ type RegisterSchema,
22
+ };
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { Card } from '@tanglemedia/svelte-starter-ui-shadcn';
3
+ import type { WithChild } from 'svelte-toolbelt';
4
+ import { cn } from '../../../utils.js';
5
+
6
+ type LoginContainerProps = Omit<WithChild, 'child'> & {
7
+ class?: string;
8
+ card?: boolean;
9
+ };
10
+
11
+ const {
12
+ children,
13
+ class: cls,
14
+ card = true,
15
+ ...rest
16
+ }: LoginContainerProps = $props();
17
+ </script>
18
+
19
+ {#if !card}
20
+ <div class={cn('mx-auto max-w-sm', cls)} {...rest}>
21
+ {@render children?.()}
22
+ </div>
23
+ {:else}
24
+ <Card.Root class={cn('mx-auto max-w-sm', cls)} {...rest}>
25
+ {@render children?.()}
26
+ </Card.Root>
27
+ {/if}