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