diff options
| author | Nikhil M Warrier <nikhilmw.dev@gmail.com> | 2026-03-15 12:41:11 +0530 |
|---|---|---|
| committer | Nikhil M Warrier <nikhilmw.dev@gmail.com> | 2026-03-15 12:41:11 +0530 |
| commit | 3ff6f60638f0e535eecb259846ea9e405effcc82 (patch) | |
| tree | 2f273ad002432996f8638fb1e12d504794d314d9 /src/components/FormField.astro | |
| parent | d17de1c5bc58531a4d971f873f2577e5d1f92ffe (diff) | |
Add `select`, `radio`, `checkbox` to forms
Diffstat (limited to 'src/components/FormField.astro')
| -rw-r--r-- | src/components/FormField.astro | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/components/FormField.astro b/src/components/FormField.astro new file mode 100644 index 0000000..f03403d --- /dev/null +++ b/src/components/FormField.astro @@ -0,0 +1,76 @@ +--- +import type { CollectionEntry } from 'astro:content' + +interface Props { + field: CollectionEntry<'forms'>['data']['form']['fields'][number] +} + +const field = Astro.props.field +const fieldType = field.type as astroHTML.JSX.HTMLInputTypeAttribute +--- + +<div class="flex w-full flex-col gap-2"> + <label for={field.id} class="text-muted-foreground pl-1"> + {field.label} + </label> + + { + () => { + switch (field.type) { + case 'textarea': + return ( + <textarea + id={field.id} + name={field.id} + required={field.required} + rows="4" + class="border-border rounded-xl border px-4 py-2" + /> + ) + + case 'select': + return ( + <select + id={field.id} + name={field.id} + required={field.required} + class="border-border rounded-xl border px-4 py-2" + > + {field.options?.map((opt) => ( + <option value={opt}>{opt}</option> + ))} + </select> + ) + + case 'radio': + case 'checkbox': + return ( + <div class="flex flex-col gap-4 pl-1"> + {field.options?.map((opt, index) => ( + <label class="cursor-pointer"> + <input + type={fieldType} + name={field.id} + value={opt} + required={field.required && index === 0} + class="mr-2" + /> + {opt} + </label> + ))} + </div> + ) + default: + return ( + <input + type={fieldType || 'text'} + id={field.id} + name={field.id} + required={field.required} + class="border-border rounded-xl border px-4 py-2" + /> + ) + } + } + } +</div> |
