diff --git a/web/src/lib/components/ui/Avatar.svelte b/web/src/lib/components/ui/Avatar.svelte
index 2bb3188ad..76d1aa8a4 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 000000000..f902e6a6e
--- /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 7c0c9cceb..7b68819d6 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 000000000..35ab0849b
--- /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 000000000..df5f120dc
--- /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 000000000..e297808f6
--- /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 000000000..4838bb14f
--- /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 000000000..7649ff3d6
--- /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 000000000..0cf875d70
--- /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 fa2eadbc0..4164cc290 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 1dadef390..af2a34078 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}
-