From 80509c83ee0ce92b416286217c11f116d5b9fe2a Mon Sep 17 00:00:00 2001 From: Elias Schneider Date: Sat, 20 Jun 2026 23:57:34 +0200 Subject: [PATCH] feat: upgrade shadcn components --- frontend/components.json | 7 +- frontend/package.json | 1 + frontend/src/app.css | 23 +- .../form/auto-complete-input.svelte | 5 +- .../lib/components/form/date-picker.svelte | 8 +- .../alert-dialog/alert-dialog-content.svelte | 2 +- .../alert-dialog/alert-dialog-footer.svelte | 2 +- .../alert-dialog/alert-dialog-header.svelte | 2 +- .../ui/alert-dialog/alert-dialog-media.svelte | 2 +- .../alert-dialog/alert-dialog-overlay.svelte | 2 +- .../ui/alert-dialog/alert-dialog-title.svelte | 2 +- .../alert-action.svelte} | 21 +- .../ui/alert/alert-description.svelte | 7 +- .../components/ui/alert/alert-title.svelte | 5 +- .../src/lib/components/ui/alert/alert.svelte | 25 ++- frontend/src/lib/components/ui/alert/index.ts | 5 +- .../components/ui/avatar/avatar-badge.svelte | 26 +++ .../ui/avatar/avatar-fallback.svelte | 5 +- .../ui/avatar/avatar-group-count.svelte | 23 ++ .../components/ui/avatar/avatar-group.svelte | 23 ++ .../components/ui/avatar/avatar-image.svelte | 2 +- .../lib/components/ui/avatar/avatar.svelte | 13 +- .../src/lib/components/ui/avatar/index.ts | 11 +- .../src/lib/components/ui/badge/badge.svelte | 2 +- .../button-group-separator.svelte | 23 ++ .../ui/button-group/button-group-text.svelte | 31 +++ .../ui/button-group/button-group.svelte | 46 ++++ .../lib/components/ui/button-group/index.ts | 15 ++ .../lib/components/ui/button/button.svelte | 23 +- .../ui/calendar/calendar-caption.svelte | 76 +++++++ .../ui/calendar/calendar-cell.svelte | 2 +- .../ui/calendar/calendar-day.svelte | 25 ++- .../ui/calendar/calendar-grid.svelte | 2 +- .../ui/calendar/calendar-head-cell.svelte | 5 +- .../ui/calendar/calendar-header.svelte | 5 +- .../ui/calendar/calendar-heading.svelte | 6 +- .../ui/calendar/calendar-month-select.svelte | 48 +++++ .../ui/calendar/calendar-month.svelte | 15 ++ .../ui/calendar/calendar-months.svelte | 2 +- .../ui/calendar/calendar-nav.svelte | 19 ++ .../ui/calendar/calendar-next-button.svelte | 22 +- .../ui/calendar/calendar-prev-button.svelte | 22 +- .../ui/calendar/calendar-year-select.svelte | 47 ++++ .../components/ui/calendar/calendar.svelte | 200 ++++++++---------- .../src/lib/components/ui/calendar/index.ts | 10 + .../lib/components/ui/card/card-action.svelte | 5 +- .../components/ui/card/card-content.svelte | 7 +- .../ui/card/card-description.svelte | 2 +- .../lib/components/ui/card/card-footer.svelte | 5 +- .../lib/components/ui/card/card-header.svelte | 2 +- .../src/lib/components/ui/card/card.svelte | 6 +- .../components/ui/checkbox/checkbox.svelte | 10 +- .../ui/command/command-dialog.svelte | 22 +- .../ui/command/command-group.svelte | 5 +- .../ui/command/command-input.svelte | 34 +-- .../components/ui/command/command-item.svelte | 11 +- .../components/ui/command/command-list.svelte | 5 +- .../ui/command/command-loading.svelte | 7 + .../ui/command/command-separator.svelte | 2 +- .../ui/command/command-shortcut.svelte | 5 +- .../lib/components/ui/command/command.svelte | 12 +- .../src/lib/components/ui/command/index.ts | 5 +- .../components/ui/dialog/dialog-close.svelte | 8 +- .../ui/dialog/dialog-content.svelte | 36 +++- .../ui/dialog/dialog-description.svelte | 5 +- .../components/ui/dialog/dialog-footer.svelte | 16 +- .../components/ui/dialog/dialog-header.svelte | 2 +- .../ui/dialog/dialog-overlay.svelte | 2 +- .../components/ui/dialog/dialog-portal.svelte | 11 +- .../components/ui/dialog/dialog-title.svelte | 2 +- .../ui/dialog/dialog-trigger.svelte | 8 +- .../lib/components/ui/dialog/dialog.svelte | 7 + .../src/lib/components/ui/dialog/index.ts | 7 +- .../dropdown-button-content.svelte | 34 --- .../dropdown-button-item.svelte | 19 -- .../dropdown-button-main.svelte | 38 ---- .../dropdown-button-separator.svelte | 21 -- .../dropdown-button-trigger.svelte | 51 ----- .../components/ui/dropdown-button/index.ts | 30 --- .../dropdown-menu-checkbox-item.svelte | 2 +- .../dropdown-menu-content.svelte | 4 +- .../dropdown-menu/dropdown-menu-item.svelte | 2 +- .../dropdown-menu/dropdown-menu-label.svelte | 2 +- .../dropdown-menu-radio-item.svelte | 4 +- .../dropdown-menu-separator.svelte | 2 +- .../dropdown-menu-sub-content.svelte | 2 +- .../dropdown-menu-sub-trigger.svelte | 2 +- .../components/ui/field/field-content.svelte | 2 +- .../ui/field/field-description.svelte | 3 +- .../components/ui/field/field-error.svelte | 4 +- .../components/ui/field/field-group.svelte | 2 +- .../components/ui/field/field-label.svelte | 7 +- .../components/ui/field/field-legend.svelte | 4 +- .../ui/field/field-separator.svelte | 4 +- .../lib/components/ui/field/field-set.svelte | 3 +- .../components/ui/field/field-title.svelte | 4 +- .../src/lib/components/ui/field/field.svelte | 18 +- .../lib/components/ui/form/form-button.svelte | 6 +- .../ui/form/form-element-field.svelte | 9 +- .../lib/components/ui/form/form-field.svelte | 9 +- .../components/ui/form/form-fieldset.svelte | 9 +- .../lib/components/ui/input-group/index.ts | 22 ++ .../ui/input-group/input-group-addon.svelte | 53 +++++ .../ui/input-group/input-group-button.svelte | 49 +++++ .../ui/input-group/input-group-input.svelte | 23 ++ .../ui/input-group/input-group-text.svelte | 22 ++ .../input-group/input-group-textarea.svelte | 23 ++ .../ui/input-group/input-group.svelte | 24 +++ frontend/src/lib/components/ui/input/index.ts | 19 +- .../src/lib/components/ui/input/input.svelte | 13 +- .../components/ui/item/item-actions.svelte | 11 +- .../components/ui/item/item-content.svelte | 5 +- .../ui/item/item-description.svelte | 3 +- .../lib/components/ui/item/item-footer.svelte | 2 +- .../lib/components/ui/item/item-group.svelte | 5 +- .../lib/components/ui/item/item-header.svelte | 2 +- .../lib/components/ui/item/item-media.svelte | 8 +- .../components/ui/item/item-separator.svelte | 2 +- .../lib/components/ui/item/item-title.svelte | 7 +- .../src/lib/components/ui/item/item.svelte | 17 +- .../src/lib/components/ui/label/label.svelte | 14 +- .../src/lib/components/ui/pagination/index.ts | 16 +- .../ui/pagination/pagination-content.svelte | 2 +- .../ui/pagination/pagination-ellipsis.svelte | 11 +- .../ui/pagination/pagination-link.svelte | 29 +-- .../pagination/pagination-next-button.svelte | 23 +- .../ui/pagination/pagination-next.svelte | 22 ++ .../pagination/pagination-prev-button.svelte | 23 +- .../ui/pagination/pagination-previous.svelte | 22 ++ .../ui/pagination/pagination.svelte | 2 +- .../ui/popover/popover-content.svelte | 8 +- .../ui/popover/popover-header.svelte | 2 +- .../ui/popover/popover-title.svelte | 7 +- .../ui/radio-group/radio-group-item.svelte | 6 +- .../ui/radio-group/radio-group.svelte | 2 +- .../ui/select/select-content.svelte | 10 +- .../components/ui/select/select-group.svelte | 2 +- .../components/ui/select/select-item.svelte | 14 +- .../components/ui/select/select-label.svelte | 2 +- .../select/select-scroll-down-button.svelte | 2 +- .../ui/select/select-scroll-up-button.svelte | 2 +- .../ui/select/select-separator.svelte | 2 +- .../ui/select/select-trigger.svelte | 4 +- .../components/ui/skeleton/skeleton.svelte | 2 +- .../lib/components/ui/sonner/sonner.svelte | 25 ++- .../lib/components/ui/spinner/spinner.svelte | 20 +- .../lib/components/ui/switch/switch.svelte | 12 +- .../lib/components/ui/table/table-cell.svelte | 5 +- .../lib/components/ui/table/table-head.svelte | 2 +- .../lib/components/ui/table/table-row.svelte | 2 +- .../lib/components/ui/tabs/tabs-list.svelte | 2 +- .../components/ui/tabs/tabs-trigger.svelte | 5 +- .../src/lib/components/ui/textarea/index.ts | 7 + .../components/ui/textarea/textarea.svelte | 23 ++ .../lib/components/ui/toggle/toggle.svelte | 12 +- .../ui/tooltip/tooltip-content.svelte | 4 +- .../ui/tooltip/tooltip-trigger.svelte | 4 +- .../lib/components/ui/tooltip/tooltip.svelte | 4 +- frontend/src/lib/utils/style.ts | 8 +- .../settings/account/locale-picker.svelte | 2 +- .../routes/settings/admin/users/+page.svelte | 46 ++-- pnpm-lock.yaml | 28 +++ 162 files changed, 1427 insertions(+), 737 deletions(-) rename frontend/src/lib/components/ui/{dropdown-button/dropdown-button.svelte => alert/alert-action.svelte} (50%) create mode 100644 frontend/src/lib/components/ui/avatar/avatar-badge.svelte create mode 100644 frontend/src/lib/components/ui/avatar/avatar-group-count.svelte create mode 100644 frontend/src/lib/components/ui/avatar/avatar-group.svelte create mode 100644 frontend/src/lib/components/ui/button-group/button-group-separator.svelte create mode 100644 frontend/src/lib/components/ui/button-group/button-group-text.svelte create mode 100644 frontend/src/lib/components/ui/button-group/button-group.svelte create mode 100644 frontend/src/lib/components/ui/button-group/index.ts create mode 100644 frontend/src/lib/components/ui/calendar/calendar-caption.svelte create mode 100644 frontend/src/lib/components/ui/calendar/calendar-month-select.svelte create mode 100644 frontend/src/lib/components/ui/calendar/calendar-month.svelte create mode 100644 frontend/src/lib/components/ui/calendar/calendar-nav.svelte create mode 100644 frontend/src/lib/components/ui/calendar/calendar-year-select.svelte create mode 100644 frontend/src/lib/components/ui/command/command-loading.svelte create mode 100644 frontend/src/lib/components/ui/dialog/dialog.svelte delete mode 100644 frontend/src/lib/components/ui/dropdown-button/dropdown-button-content.svelte delete mode 100644 frontend/src/lib/components/ui/dropdown-button/dropdown-button-item.svelte delete mode 100644 frontend/src/lib/components/ui/dropdown-button/dropdown-button-main.svelte delete mode 100644 frontend/src/lib/components/ui/dropdown-button/dropdown-button-separator.svelte delete mode 100644 frontend/src/lib/components/ui/dropdown-button/dropdown-button-trigger.svelte delete mode 100644 frontend/src/lib/components/ui/dropdown-button/index.ts create mode 100644 frontend/src/lib/components/ui/input-group/index.ts create mode 100644 frontend/src/lib/components/ui/input-group/input-group-addon.svelte create mode 100644 frontend/src/lib/components/ui/input-group/input-group-button.svelte create mode 100644 frontend/src/lib/components/ui/input-group/input-group-input.svelte create mode 100644 frontend/src/lib/components/ui/input-group/input-group-text.svelte create mode 100644 frontend/src/lib/components/ui/input-group/input-group-textarea.svelte create mode 100644 frontend/src/lib/components/ui/input-group/input-group.svelte create mode 100644 frontend/src/lib/components/ui/pagination/pagination-next.svelte create mode 100644 frontend/src/lib/components/ui/pagination/pagination-previous.svelte create mode 100644 frontend/src/lib/components/ui/textarea/index.ts create mode 100644 frontend/src/lib/components/ui/textarea/textarea.svelte diff --git a/frontend/components.json b/frontend/components.json index c810da1a..cb523fda 100644 --- a/frontend/components.json +++ b/frontend/components.json @@ -1,6 +1,5 @@ { "$schema": "https://shadcn-svelte.com/schema.json", - "style": "default", "tailwind": { "css": "src/app.css", "baseColor": "neutral" @@ -13,5 +12,9 @@ "lib": "$lib" }, "typescript": true, - "registry": "https://shadcn-svelte.com/registry" + "registry": "https://shadcn-svelte.com/registry", + "style": "luma", + "iconLibrary": "lucide", + "menuColor": "default-translucent", + "menuAccent": "subtle" } diff --git a/frontend/package.json b/frontend/package.json index ee369664..7fd3a182 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -49,6 +49,7 @@ "prettier-plugin-svelte": "^3.5.2", "prettier-plugin-tailwindcss": "^0.8.0", "rollup": "^4.60.4", + "shadcn-svelte": "^1.3.0", "svelte": "^5.55.8", "svelte-check": "^4.4.8", "svelte-sonner": "^1.1.1", diff --git a/frontend/src/app.css b/frontend/src/app.css index 53e05029..5d05eee5 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -1,5 +1,6 @@ @import 'tailwindcss'; @import 'tw-animate-css'; +@import 'shadcn-svelte/tailwind.css'; @variant dark (&:where(.dark, .dark *)); @@ -7,7 +8,7 @@ The default border color has changed to `currentcolor` in Tailwind CSS v4, so we've added these compatibility styles to make sure everything still looks the same as it did with Tailwind CSS v3. - + If we ever want to remove these styles, we need to add an explicit border color utility to any element that depends on these defaults. */ @@ -19,10 +20,19 @@ ::file-selector-button { border-color: var(--color-gray-200, currentcolor); } + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } + html { + @apply font-sans; + } } :root { - --radius: 1rem; + --radius: 0.625rem; --background: oklch(1 0 0); --foreground: oklch(0.145 0 0); --card: oklch(1 0 0); @@ -135,6 +145,15 @@ /* Font */ --font-gloock: 'gloock', serif; + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --radius-2xl: calc(var(--radius) * 1.8); + --radius-3xl: calc(var(--radius) * 2.2); + --radius-4xl: calc(var(--radius) * 2.6); } @layer base { diff --git a/frontend/src/lib/components/form/auto-complete-input.svelte b/frontend/src/lib/components/form/auto-complete-input.svelte index 5781d509..4d72ca7f 100644 --- a/frontend/src/lib/components/form/auto-complete-input.svelte +++ b/frontend/src/lib/components/form/auto-complete-input.svelte @@ -42,6 +42,7 @@ case 'Enter': if (selectedIndex >= 0) { handleSuggestionClick(filteredSuggestions[selectedIndex]); + e.preventDefault(); } break; case 'Escape': @@ -80,8 +81,8 @@