diff --git a/src/lib/components/ui/form/form-button.svelte b/src/lib/components/ui/form/form-button.svelte
new file mode 100644
index 0000000..06e3377
--- /dev/null
+++ b/src/lib/components/ui/form/form-button.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/lib/components/ui/form/form-description.svelte b/src/lib/components/ui/form/form-description.svelte
new file mode 100644
index 0000000..1ea70fb
--- /dev/null
+++ b/src/lib/components/ui/form/form-description.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/ui/form/form-element-field.svelte b/src/lib/components/ui/form/form-element-field.svelte
new file mode 100644
index 0000000..fdc7b11
--- /dev/null
+++ b/src/lib/components/ui/form/form-element-field.svelte
@@ -0,0 +1,30 @@
+
+
+
+
+
+ {#snippet children({ constraints, errors, tainted, value })}
+
+ {@render childrenProp?.({ constraints, errors, tainted, value: value as T[U] })}
+
+ {/snippet}
+
diff --git a/src/lib/components/ui/form/form-field-errors.svelte b/src/lib/components/ui/form/form-field-errors.svelte
new file mode 100644
index 0000000..73f7541
--- /dev/null
+++ b/src/lib/components/ui/form/form-field-errors.svelte
@@ -0,0 +1,30 @@
+
+
+
+ {#snippet children({ errors, errorProps })}
+ {#if childrenProp}
+ {@render childrenProp({ errors, errorProps })}
+ {:else}
+ {#each errors as error}
+ {error}
+ {/each}
+ {/if}
+ {/snippet}
+
diff --git a/src/lib/components/ui/form/form-field.svelte b/src/lib/components/ui/form/form-field.svelte
new file mode 100644
index 0000000..b72ef80
--- /dev/null
+++ b/src/lib/components/ui/form/form-field.svelte
@@ -0,0 +1,30 @@
+
+
+
+
+
+ {#snippet children({ constraints, errors, tainted, value })}
+
+ {@render childrenProp?.({ constraints, errors, tainted, value: value as T[U] })}
+
+ {/snippet}
+
diff --git a/src/lib/components/ui/form/form-fieldset.svelte b/src/lib/components/ui/form/form-fieldset.svelte
new file mode 100644
index 0000000..bc40a2a
--- /dev/null
+++ b/src/lib/components/ui/form/form-fieldset.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/src/lib/components/ui/form/form-label.svelte b/src/lib/components/ui/form/form-label.svelte
new file mode 100644
index 0000000..dd252f4
--- /dev/null
+++ b/src/lib/components/ui/form/form-label.svelte
@@ -0,0 +1,21 @@
+
+
+
+ {#snippet child({ props })}
+
+ {/snippet}
+
diff --git a/src/lib/components/ui/form/form-legend.svelte b/src/lib/components/ui/form/form-legend.svelte
new file mode 100644
index 0000000..392139e
--- /dev/null
+++ b/src/lib/components/ui/form/form-legend.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/ui/form/index.ts b/src/lib/components/ui/form/index.ts
new file mode 100644
index 0000000..63f4e90
--- /dev/null
+++ b/src/lib/components/ui/form/index.ts
@@ -0,0 +1,33 @@
+import * as FormPrimitive from "formsnap";
+import Description from "./form-description.svelte";
+import Label from "./form-label.svelte";
+import FieldErrors from "./form-field-errors.svelte";
+import Field from "./form-field.svelte";
+import Button from "./form-button.svelte";
+import Fieldset from "./form-fieldset.svelte";
+import Legend from "./form-legend.svelte";
+import ElementField from "./form-element-field.svelte";
+
+const Control = FormPrimitive.Control as typeof FormPrimitive.Control;
+
+export {
+ Field,
+ Control,
+ Label,
+ FieldErrors,
+ Description,
+ Fieldset,
+ Legend,
+ ElementField,
+ Button,
+ //
+ Field as FormField,
+ Control as FormControl,
+ Description as FormDescription,
+ Label as FormLabel,
+ FieldErrors as FormFieldErrors,
+ Fieldset as FormFieldset,
+ Legend as FormLegend,
+ ElementField as FormElementField,
+ Button as FormButton,
+};
diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts
new file mode 100644
index 0000000..f47b6d3
--- /dev/null
+++ b/src/lib/components/ui/input/index.ts
@@ -0,0 +1,7 @@
+import Root from "./input.svelte";
+
+export {
+ Root,
+ //
+ Root as Input,
+};
diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte
new file mode 100644
index 0000000..eda0e7d
--- /dev/null
+++ b/src/lib/components/ui/input/input.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts
new file mode 100644
index 0000000..8bfca0b
--- /dev/null
+++ b/src/lib/components/ui/label/index.ts
@@ -0,0 +1,7 @@
+import Root from "./label.svelte";
+
+export {
+ Root,
+ //
+ Root as Label,
+};
diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte
new file mode 100644
index 0000000..247d23c
--- /dev/null
+++ b/src/lib/components/ui/label/label.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/src/lib/components/ui/pagination/index.ts b/src/lib/components/ui/pagination/index.ts
new file mode 100644
index 0000000..5641d52
--- /dev/null
+++ b/src/lib/components/ui/pagination/index.ts
@@ -0,0 +1,24 @@
+import Root from "./pagination.svelte";
+import Content from "./pagination-content.svelte";
+import Item from "./pagination-item.svelte";
+import Link from "./pagination-link.svelte";
+import PrevButton from "./pagination-prev-button.svelte";
+import NextButton from "./pagination-next-button.svelte";
+import Ellipsis from "./pagination-ellipsis.svelte";
+export {
+ Root,
+ Content,
+ Item,
+ Link,
+ PrevButton,
+ NextButton,
+ Ellipsis,
+ //
+ Root as Pagination,
+ Content as PaginationContent,
+ Item as PaginationItem,
+ Link as PaginationLink,
+ PrevButton as PaginationPrevButton,
+ NextButton as PaginationNextButton,
+ Ellipsis as PaginationEllipsis,
+};
diff --git a/src/lib/components/ui/pagination/pagination-content.svelte b/src/lib/components/ui/pagination/pagination-content.svelte
new file mode 100644
index 0000000..6ba3cd3
--- /dev/null
+++ b/src/lib/components/ui/pagination/pagination-content.svelte
@@ -0,0 +1,16 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/lib/components/ui/pagination/pagination-ellipsis.svelte b/src/lib/components/ui/pagination/pagination-ellipsis.svelte
new file mode 100644
index 0000000..7cb7fb1
--- /dev/null
+++ b/src/lib/components/ui/pagination/pagination-ellipsis.svelte
@@ -0,0 +1,22 @@
+
+
+
+
+ More pages
+
diff --git a/src/lib/components/ui/pagination/pagination-item.svelte b/src/lib/components/ui/pagination/pagination-item.svelte
new file mode 100644
index 0000000..09c1076
--- /dev/null
+++ b/src/lib/components/ui/pagination/pagination-item.svelte
@@ -0,0 +1,14 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/lib/components/ui/pagination/pagination-link.svelte b/src/lib/components/ui/pagination/pagination-link.svelte
new file mode 100644
index 0000000..f9abab3
--- /dev/null
+++ b/src/lib/components/ui/pagination/pagination-link.svelte
@@ -0,0 +1,41 @@
+
+
+{#snippet Fallback()}
+ {page.value}
+{/snippet}
+
+
diff --git a/src/lib/components/ui/pagination/pagination-next-button.svelte b/src/lib/components/ui/pagination/pagination-next-button.svelte
new file mode 100644
index 0000000..116d7ed
--- /dev/null
+++ b/src/lib/components/ui/pagination/pagination-next-button.svelte
@@ -0,0 +1,25 @@
+
+
+{#snippet Fallback()}
+ Next
+
+{/snippet}
+
+
diff --git a/src/lib/components/ui/pagination/pagination-prev-button.svelte b/src/lib/components/ui/pagination/pagination-prev-button.svelte
new file mode 100644
index 0000000..e783268
--- /dev/null
+++ b/src/lib/components/ui/pagination/pagination-prev-button.svelte
@@ -0,0 +1,25 @@
+
+
+{#snippet Fallback()}
+ Previous
+
+{/snippet}
+
+
diff --git a/src/lib/components/ui/pagination/pagination.svelte b/src/lib/components/ui/pagination/pagination.svelte
new file mode 100644
index 0000000..e263380
--- /dev/null
+++ b/src/lib/components/ui/pagination/pagination.svelte
@@ -0,0 +1,24 @@
+
+
+
diff --git a/src/lib/components/ui/sonner/index.ts b/src/lib/components/ui/sonner/index.ts
new file mode 100644
index 0000000..1ad9f4a
--- /dev/null
+++ b/src/lib/components/ui/sonner/index.ts
@@ -0,0 +1 @@
+export { default as Toaster } from "./sonner.svelte";
diff --git a/src/lib/components/ui/sonner/sonner.svelte b/src/lib/components/ui/sonner/sonner.svelte
new file mode 100644
index 0000000..8050e04
--- /dev/null
+++ b/src/lib/components/ui/sonner/sonner.svelte
@@ -0,0 +1,20 @@
+
+
+