@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,193 +1,94 @@
1
1
  <script lang="ts">
2
- import { Button, Card, Input, Label, Form } from '@tanglemedia/svelte-starter-ui-shadcn';
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
+
13
+ import RegisterProvider from "./register-provider.svelte";
14
+ import RegisterContainer from "./register-container.svelte";
15
+ import RegisterHeader from "./register-header.svelte";
16
+ import RegisterSubmit from "./register-submit.svelte";
17
+ import RegisterUserInput from "./register-user-input.svelte";
18
+ import RegisterPasswordInput from "./register-password-input.svelte";
19
+ import RegisterNameInput from "./register-name-input.svelte";
20
+ import { registerSchema, type RegisterSchema } from "./register.schema.js";
21
+
22
+ import { ServerError } from "@tanglemedia/svelte-starter-form-shadcn";
23
+ // import { Field } from "@tanglemedia/svelte-starter-form-shadcn";
3
24
 
4
25
  interface Props {
5
- superform: any;
26
+ superform?: SuperForm<Infer<RegisterSchema>> | null;
6
27
  card?: boolean;
7
- cardClass?: string;
28
+ // cardClass?: string;
8
29
  title?: string;
9
30
  description?: string;
31
+ // forgotPassword?: boolean;
10
32
  login?: boolean;
11
33
  loginLink?: string;
12
- formTail?: Snippet;
13
- formHead?: Snippet;
34
+ lead?: Snippet;
35
+ tail?: Snippet;
14
36
  children?: Snippet;
37
+ form?: SuperValidated<Infer<RegisterSchema>>;
38
+ action?: string;
39
+
40
+ debug?: boolean;
15
41
  }
16
42
 
17
- let {
18
- superform,
19
- card = false,
20
- cardClass = "mx-auto max-w-sm",
21
- title = "Register",
43
+ let {
44
+ debug = false,
45
+ form,
46
+ superform: superforms = $bindable(null),
47
+ card = true,
48
+ title = "Register",
22
49
  description = "Enter your information below to register a new account",
50
+ // forgotPassword = true,
23
51
  login = true,
24
52
  loginLink = "/login",
25
- formTail,
26
- formHead,
27
- children
53
+ lead,
54
+ tail,
55
+ action = "?/register",
28
56
  }: Props = $props();
29
57
 
30
- const { form: formData, enhance } = superform;
58
+ superforms = superforms || superForm(form || defaults(zod4(registerSchema)));
59
+
60
+ const { errors, message } = superforms;
31
61
  </script>
32
62
 
33
- {#if card}
34
- <Card.Root class={cardClass}>
35
- <Card.Header>
36
- <Card.Title class="text-2xl">{title}</Card.Title>
37
- <Card.Description>{description}</Card.Description>
38
- </Card.Header>
63
+ <RegisterProvider {superforms} {action}>
64
+ <RegisterContainer {card}>
65
+ <RegisterHeader text={title} desc={description} />
39
66
  <Card.Content>
40
- <form method="POST" use:enhance class="grid gap-4">
41
- {@render formHead?.()}
42
- {#if children}
43
- {@render children?.()}
44
- {:else}
45
- <div class="grid grid-cols-2 gap-4">
46
- <Form.Field form={superform} name="first_name">
47
- <Form.Control >
48
- {#snippet children({ props })}
49
- <Form.Label>
50
- First Name
51
- </Form.Label>
52
- <Input {...props} bind:value={$formData.first_name} />
53
- {/snippet}
54
- </Form.Control>
55
- <Form.FieldErrors />
56
- </Form.Field>
57
- <Form.Field form={superform} name="last_name">
58
- <Form.Control >
59
- {#snippet children({ props })}
60
- <Form.Label>
61
- Last Name
62
- </Form.Label>
63
- <Input {...props} bind:value={$formData.last_name} />
64
- {/snippet}
65
- </Form.Control>
66
- <Form.FieldErrors />
67
- </Form.Field>
68
- </div>
69
- <Form.Field form={superform} name="email">
70
- <Form.Control >
71
- {#snippet children({ props })}
72
- <Form.Label>
73
- Email
74
- </Form.Label>
75
- <Input {...props} bind:value={$formData.email} type="email" />
76
- {/snippet}
77
- </Form.Control>
78
- <Form.FieldErrors />
79
- </Form.Field>
80
- <Form.Field form={superform} name="password">
81
- <Form.Control >
82
- {#snippet children({ props })}
83
- <Form.Label>
84
- Password
85
- </Form.Label>
86
- <Input {...props} bind:value={$formData.password} type="password" />
87
- {/snippet}
88
- </Form.Control>
89
- <Form.FieldErrors />
90
- </Form.Field>
91
- <Form.Field form={superform} name="confirm_password">
92
- <Form.Control >
93
- {#snippet children({ props })}
94
- <Form.Label>
95
- Confirm Password
96
- </Form.Label>
97
- <Input {...props} bind:value={$formData.confirm_password} type="password" />
98
- {/snippet}
99
- </Form.Control>
100
- <Form.FieldErrors />
101
- </Form.Field>
102
- {/if}
103
- <Form.Button type="submit" class="w-full">Register</Form.Button>
104
- {@render formTail?.()}
105
- </form>
67
+ {@render lead?.()}
68
+ <ServerError class="mb-4" />
69
+ <div class="flex items-start gap-4 *:mb-0">
70
+ <RegisterNameInput name={"first_name"} label={"First Name"} />
71
+ <RegisterNameInput name={"last_name"} label={"Last Name"} />
72
+ </div>
73
+ <RegisterUserInput name={"username"} />
74
+ <RegisterPasswordInput name={"password"} label={"Password"} />
75
+ <RegisterSubmit />
106
76
  {#if login}
107
77
  <div class="mt-4 text-center text-sm">
108
78
  Already have an account?
109
79
  <a href={loginLink} class="underline"> Sign in </a>
110
80
  </div>
111
81
  {/if}
112
- </Card.Content>
113
- </Card.Root>
114
- {:else}
115
- <div class={cardClass}>
116
- <div class="flex flex-col space-y-1.5">
117
- <h3 class="font-semibold tracking-tight text-2xl">{title}</h3>
118
- <p class="text-muted-foreground text-sm">{description}</p>
119
- </div>
120
- <form method="POST" use:enhance class="grid gap-4">
121
- {@render formHead?.()}
122
- {#if children}
123
- {@render children?.()}
124
- {:else}
125
- <div class="grid grid-cols-2 gap-4">
126
- <Form.Field form={superform} name="first_name">
127
- <Form.Control >
128
- {#snippet children({ props })}
129
- <Form.Label>
130
- First Name
131
- </Form.Label>
132
- <Input {...props} bind:value={$formData.first_name} />
133
- {/snippet}
134
- </Form.Control>
135
- <Form.FieldErrors />
136
- </Form.Field>
137
- <Form.Field form={superform} name="last_name">
138
- <Form.Control >
139
- {#snippet children({ props })}
140
- <Form.Label>
141
- Last Name
142
- </Form.Label>
143
- <Input {...props} bind:value={$formData.last_name} />
144
- {/snippet}
145
- </Form.Control>
146
- <Form.FieldErrors />
147
- </Form.Field>
82
+ {@render tail?.()}
83
+
84
+ {#if debug}
85
+ <div class="mb-6">
86
+ <h4>Errors</h4>
87
+ <SuperDebug data={errors} />
148
88
  </div>
149
- <Form.Field form={superform} name="email">
150
- <Form.Control >
151
- {#snippet children({ props })}
152
- <Form.Label>
153
- Email
154
- </Form.Label>
155
- <Input {...props} bind:value={$formData.email} type="email" />
156
- {/snippet}
157
- </Form.Control>
158
- <Form.FieldErrors />
159
- </Form.Field>
160
- <Form.Field form={superform} name="password">
161
- <Form.Control >
162
- {#snippet children({ props })}
163
- <Form.Label>
164
- Password
165
- </Form.Label>
166
- <Input {...props} bind:value={$formData.password} type="password" />
167
- {/snippet}
168
- </Form.Control>
169
- <Form.FieldErrors />
170
- </Form.Field>
171
- <Form.Field form={superform} name="confirm_password">
172
- <Form.Control >
173
- {#snippet children({ props })}
174
- <Form.Label>
175
- Confirm Password
176
- </Form.Label>
177
- <Input {...props} bind:value={$formData.confirm_password} type="password" />
178
- {/snippet}
179
- </Form.Control>
180
- <Form.FieldErrors />
181
- </Form.Field>
89
+ <h4>Message</h4>
90
+ <SuperDebug data={$message} />
182
91
  {/if}
183
- <Form.Button type="submit" class="w-full">Register</Form.Button>
184
- {@render formTail?.()}
185
- </form>
186
- {#if login}
187
- <div class="mt-4 text-center text-sm">
188
- Already have an account?
189
- <a href={loginLink} class="underline"> Sign in </a>
190
- </div>
191
- {/if}
192
- </div>
193
- {/if}
92
+ </Card.Content>
93
+ </RegisterContainer>
94
+ </RegisterProvider>
@@ -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 InputFieldProps,
15
+ } from '@tanglemedia/svelte-starter-form-shadcn';
16
+
17
+ type LoginUserInputProps = InputFieldProps<T, U>;
18
+ const { name = 'first_name' as U, label, ...rest }: LoginUserInputProps = $props();
19
+ </script>
20
+
21
+ <Field.Input type={'text'} {name} label={label || 'Name'} {...rest}></Field.Input>
@@ -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
+ Register
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,10 @@
1
+ import { z } from "zod";
2
+
3
+ export const registerSchema = z.object({
4
+ first_name: z.string().min(1, { error: "First name is required" }),
5
+ last_name: z.string().min(1, { error: "Last name is required" }),
6
+ username: z.string().min(1, { error: "Username is required" }),
7
+ password: z.string().min(1, { error: "Password is required" }),
8
+ });
9
+
10
+ export type RegisterSchema = typeof registerSchema;
@@ -1,3 +1,18 @@
1
- import ResetPasswordForm from './reset-form.svelte';
1
+ import Form from './reset-password-form.svelte';
2
+ import Provider from './reset-password-provider.svelte';
3
+ import Header from './reset-password-header.svelte';
4
+ import { resetPasswordSchema as schema, type ResetPasswordSchema } from './reset-password.schema.ts';
5
+ import Container from './reset-password-container.svelte';
6
+ import Submit from './reset-password-submit.svelte';
7
+ import PasswordInput from './reset-password-password-input.svelte';
2
8
 
3
- export { ResetPasswordForm };
9
+ export {
10
+ Form,
11
+ Provider,
12
+ Header,
13
+ Container,
14
+ schema,
15
+ Submit,
16
+ PasswordInput,
17
+ type ResetPasswordSchema,
18
+ };
@@ -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,91 @@
1
+ <!-- title = "Reset Password",
2
+ description = "Enter your new password below to reset your password", -->
3
+
4
+ <script lang="ts">
5
+ import { Card } from "@tanglemedia/svelte-starter-ui-shadcn";
6
+ import type { Snippet } from "svelte";
7
+ import SuperDebug, {
8
+ defaults,
9
+ superForm,
10
+ type Infer,
11
+ type SuperForm,
12
+ type SuperValidated,
13
+ } from "sveltekit-superforms";
14
+ import { zod4 } from "sveltekit-superforms/adapters";
15
+
16
+ import ResetPasswordProvider from "./reset-password-provider.svelte";
17
+ import ResetPasswordContainer from "./reset-password-container.svelte";
18
+ import ResetPasswordHeader from "./reset-password-header.svelte";
19
+ import ResetPasswordSubmit from "./reset-password-submit.svelte";
20
+ import ResetPasswordPasswordInput from "./reset-password-password-input.svelte";
21
+ import { resetPasswordSchema, type ResetPasswordSchema } from "./reset-password.schema.js";
22
+
23
+ import { ServerError } from "@tanglemedia/svelte-starter-form-shadcn";
24
+ // import { Field } from "@tanglemedia/svelte-starter-form-shadcn";
25
+
26
+ interface Props {
27
+ superform?: SuperForm<Infer<ResetPasswordSchema>> | null;
28
+ card?: boolean;
29
+ // cardClass?: string;
30
+ title?: string;
31
+ description?: string;
32
+ // forgotPassword?: boolean;
33
+ login?: boolean;
34
+ loginLink?: string;
35
+ lead?: Snippet;
36
+ tail?: Snippet;
37
+ children?: Snippet;
38
+ form?: SuperValidated<Infer<ResetPasswordSchema>>;
39
+ action?: string;
40
+
41
+ debug?: boolean;
42
+ }
43
+
44
+ let {
45
+ debug = false,
46
+ form,
47
+ superform: superforms = $bindable(null),
48
+ card = true,
49
+ title = "Reset Password",
50
+ description = "Enter your new password below to reset your password",
51
+ // forgotPassword = true,
52
+ login = true,
53
+ loginLink = "/login",
54
+ lead,
55
+ tail,
56
+ action = "?/register",
57
+ }: Props = $props();
58
+
59
+ superforms = superforms || superForm(form || defaults(zod4(resetPasswordSchema)));
60
+
61
+ const { errors, message } = superforms;
62
+ </script>
63
+
64
+ <ResetPasswordProvider {superforms} {action}>
65
+ <ResetPasswordContainer {card}>
66
+ <ResetPasswordHeader text={title} desc={description} />
67
+ <Card.Content>
68
+ {@render lead?.()}
69
+ <ServerError class="mb-4" />
70
+ <ResetPasswordPasswordInput name={"password"} label={"New Password"} />
71
+ <ResetPasswordPasswordInput name={"confirm_password"} label={"Confirm Password"} />
72
+ <ResetPasswordSubmit />
73
+ {#if login}
74
+ <div class="mt-4 text-center text-sm">
75
+ Remembered your password?
76
+ <a href={loginLink} class="underline"> Sign in </a>
77
+ </div>
78
+ {/if}
79
+ {@render tail?.()}
80
+
81
+ {#if debug}
82
+ <div class="mb-6">
83
+ <h4>Errors</h4>
84
+ <SuperDebug data={errors} />
85
+ </div>
86
+ <h4>Message</h4>
87
+ <SuperDebug data={$message} />
88
+ {/if}
89
+ </Card.Content>
90
+ </ResetPasswordContainer>
91
+ </ResetPasswordProvider>
@@ -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
+ Reset
16
+ {/if}
17
+ </Form.Submit>
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+
3
+ export const resetPasswordSchema = z.object({
4
+ password: z.string().min(1, { error: "Password is required" }),
5
+ confirm_password: z
6
+ .string()
7
+ .min(1, { error: "Confirm password is required" })
8
+ }).refine((schema) => {
9
+ return schema.password === schema.confirm_password
10
+ }, "Passwords do not match")
11
+
12
+ export type ResetPasswordSchema = typeof resetPasswordSchema;
package/src/lib/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from './utils';
2
- export * from './hooks';
3
- export * from './components/ui';
1
+ // export * from './utils.ts';
2
+ export * from './hooks/index.ts';
3
+ export * from './components/ui/index.ts';