diff --git a/web/src/lib/components/ui/Avatar.svelte b/web/src/lib/components/ui/Avatar.svelte
index 2bb3188a..76d1aa8a 100644
--- a/web/src/lib/components/ui/Avatar.svelte
+++ b/web/src/lib/components/ui/Avatar.svelte
@@ -1,5 +1,5 @@
-{#if src}
+{#if src && !failed}
(failed = true)}
/>
{:else}
diff --git a/web/src/lib/components/ui/Button.stories.svelte b/web/src/lib/components/ui/Button.stories.svelte
new file mode 100644
index 00000000..f902e6a6
--- /dev/null
+++ b/web/src/lib/components/ui/Button.stories.svelte
@@ -0,0 +1,47 @@
+
+
+
+Button
+Save
+Cancel
+Delete
+Confirm
+Careful
+Saving
+Button
+Go home
+
+
+
+
+
+
+
+
diff --git a/web/src/lib/components/ui/Button.svelte b/web/src/lib/components/ui/Button.svelte
index 7c0c9cce..7b68819d 100644
--- a/web/src/lib/components/ui/Button.svelte
+++ b/web/src/lib/components/ui/Button.svelte
@@ -1,43 +1,48 @@
{#if href}
+
diff --git a/web/src/lib/components/ui/ButtonCard.stories.svelte b/web/src/lib/components/ui/ButtonCard.stories.svelte
new file mode 100644
index 00000000..35ab0849
--- /dev/null
+++ b/web/src/lib/components/ui/ButtonCard.stories.svelte
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/lib/components/ui/ButtonCard.svelte b/web/src/lib/components/ui/ButtonCard.svelte
new file mode 100644
index 00000000..df5f120d
--- /dev/null
+++ b/web/src/lib/components/ui/ButtonCard.svelte
@@ -0,0 +1,101 @@
+
+
+
+
+{#if href}
+
+
+ {#if Icon}
+
+ {/if}
+ {#if children}
+ {@render children()}
+ {:else}
+
+ {#if title}
+ {title}
+ {/if}
+ {#if description}
+ {description}
+ {/if}
+
+ {/if}
+
+{:else}
+
+{/if}
diff --git a/web/src/lib/components/ui/ButtonGroup.stories.svelte b/web/src/lib/components/ui/ButtonGroup.stories.svelte
new file mode 100644
index 00000000..e297808f
--- /dev/null
+++ b/web/src/lib/components/ui/ButtonGroup.stories.svelte
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/lib/components/ui/ButtonGroup.svelte b/web/src/lib/components/ui/ButtonGroup.svelte
new file mode 100644
index 00000000..4838bb14
--- /dev/null
+++ b/web/src/lib/components/ui/ButtonGroup.svelte
@@ -0,0 +1,37 @@
+
+
+
+
+
+ {@render children()}
+
diff --git a/web/src/lib/components/ui/Checkbox.stories.svelte b/web/src/lib/components/ui/Checkbox.stories.svelte
new file mode 100644
index 00000000..7649ff3d
--- /dev/null
+++ b/web/src/lib/components/ui/Checkbox.stories.svelte
@@ -0,0 +1,37 @@
+
+
+
+Item
+Item
+Item
+Item
+Item
+
+
+
+ Unchecked
+ Checked
+ Indeterminate
+ Disabled
+ Disabled checked
+
+
diff --git a/web/src/lib/components/ui/Checkbox.svelte b/web/src/lib/components/ui/Checkbox.svelte
new file mode 100644
index 00000000..0cf875d7
--- /dev/null
+++ b/web/src/lib/components/ui/Checkbox.svelte
@@ -0,0 +1,51 @@
+
+
+
diff --git a/web/src/lib/components/ui/Dropdown.svelte b/web/src/lib/components/ui/Dropdown.svelte
index fa2eadbc..4164cc29 100644
--- a/web/src/lib/components/ui/Dropdown.svelte
+++ b/web/src/lib/components/ui/Dropdown.svelte
@@ -1,21 +1,21 @@
- {#if variant === 'button'}
-
+ {#if variant === "button"}
+
+
+
{:else}
{/if}
-
diff --git a/web/src/lib/components/ui/DropdownItem.svelte b/web/src/lib/components/ui/DropdownItem.svelte
index 1dadef39..af2a3407 100644
--- a/web/src/lib/components/ui/DropdownItem.svelte
+++ b/web/src/lib/components/ui/DropdownItem.svelte
@@ -1,12 +1,12 @@
{#if href}
-
+
{#if icon}
{@const Glyph = icon}
@@ -50,7 +67,14 @@
{@render children()}
{:else}
-