From 477c68122fdc185483458c209f0cf98af0577f9f Mon Sep 17 00:00:00 2001 From: neon <18559658+neonsolstice@users.noreply.github.com> Date: Tue, 13 Jan 2026 08:23:05 -0600 Subject: [PATCH] feat(auth): add OIDC/SSO support with RP-initiated logout and settings --- client/src/components/RadiusPicker.vue | 2 +- client/src/components/ui/badge/Badge.vue | 32 ++- client/src/components/ui/badge/index.ts | 21 +- client/src/components/ui/button/Button.vue | 20 +- client/src/components/ui/button/index.ts | 37 ++- .../ui/dropdown-menu/DropdownMenu.vue | 10 +- .../DropdownMenuCheckboxItem.vue | 30 +-- .../ui/dropdown-menu/DropdownMenuContent.vue | 32 ++- .../ui/dropdown-menu/DropdownMenuGroup.vue | 9 +- .../ui/dropdown-menu/DropdownMenuItem.vue | 38 ++- .../ui/dropdown-menu/DropdownMenuLabel.vue | 14 +- .../dropdown-menu/DropdownMenuRadioGroup.vue | 12 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 30 +-- .../dropdown-menu/DropdownMenuSeparator.vue | 28 +- .../ui/dropdown-menu/DropdownMenuShortcut.vue | 11 +- .../ui/dropdown-menu/DropdownMenuSub.vue | 7 +- .../dropdown-menu/DropdownMenuSubContent.vue | 24 +- .../dropdown-menu/DropdownMenuSubTrigger.vue | 29 +- .../ui/dropdown-menu/DropdownMenuTrigger.vue | 9 +- .../src/components/ui/dropdown-menu/index.ts | 30 +-- client/src/components/ui/input/Input.vue | 28 +- client/src/components/ui/input/index.ts | 2 +- client/src/components/ui/popover/Popover.vue | 10 +- .../components/ui/popover/PopoverAnchor.vue | 9 +- .../components/ui/popover/PopoverContent.vue | 27 +- .../components/ui/popover/PopoverTrigger.vue | 9 +- client/src/components/ui/popover/index.ts | 8 +- .../src/components/ui/separator/Separator.vue | 18 +- client/src/components/ui/separator/index.ts | 2 +- client/src/components/ui/sheet/Sheet.vue | 10 +- client/src/components/ui/sheet/SheetClose.vue | 9 +- .../src/components/ui/sheet/SheetContent.vue | 50 ++-- .../components/ui/sheet/SheetDescription.vue | 20 +- .../src/components/ui/sheet/SheetFooter.vue | 12 +- .../src/components/ui/sheet/SheetHeader.vue | 11 +- .../src/components/ui/sheet/SheetOverlay.vue | 21 +- client/src/components/ui/sheet/SheetTitle.vue | 20 +- .../src/components/ui/sheet/SheetTrigger.vue | 9 +- client/src/components/ui/sheet/index.ts | 16 +- client/src/components/ui/sidebar/Sidebar.vue | 54 ++-- .../components/ui/sidebar/SidebarContent.vue | 6 +- .../components/ui/sidebar/SidebarFooter.vue | 12 +- .../components/ui/sidebar/SidebarGroup.vue | 12 +- .../ui/sidebar/SidebarGroupAction.vue | 30 ++- .../ui/sidebar/SidebarGroupContent.vue | 12 +- .../ui/sidebar/SidebarGroupLabel.vue | 27 +- .../components/ui/sidebar/SidebarHeader.vue | 12 +- .../components/ui/sidebar/SidebarInput.vue | 15 +- .../components/ui/sidebar/SidebarInset.vue | 18 +- .../src/components/ui/sidebar/SidebarMenu.vue | 12 +- .../ui/sidebar/SidebarMenuAction.vue | 49 ++-- .../ui/sidebar/SidebarMenuBadge.vue | 26 +- .../ui/sidebar/SidebarMenuButton.vue | 37 +-- .../ui/sidebar/SidebarMenuButtonChild.vue | 24 +- .../components/ui/sidebar/SidebarMenuItem.vue | 12 +- .../ui/sidebar/SidebarMenuSkeleton.vue | 26 +- .../components/ui/sidebar/SidebarMenuSub.vue | 18 +- .../ui/sidebar/SidebarMenuSubButton.vue | 47 ++-- .../ui/sidebar/SidebarMenuSubItem.vue | 12 +- .../components/ui/sidebar/SidebarProvider.vue | 48 ++-- .../src/components/ui/sidebar/SidebarRail.vue | 28 +- .../ui/sidebar/SidebarSeparator.vue | 12 +- .../components/ui/sidebar/SidebarTrigger.vue | 19 +- client/src/components/ui/sidebar/index.ts | 78 +++--- client/src/components/ui/sidebar/utils.ts | 18 +- .../src/components/ui/skeleton/Skeleton.vue | 11 +- client/src/components/ui/skeleton/index.ts | 2 +- client/src/components/ui/tooltip/Tooltip.vue | 10 +- .../components/ui/tooltip/TooltipContent.vue | 21 +- .../components/ui/tooltip/TooltipProvider.vue | 4 +- .../components/ui/tooltip/TooltipTrigger.vue | 9 +- client/src/components/ui/tooltip/index.ts | 8 +- client/src/features/admin/RoleFormDrawer.vue | 3 +- client/src/features/admin/RolesPage.vue | 4 +- client/src/features/auth/LoginPage.vue | 44 +++- client/src/features/auth/OidcCallbackPage.vue | 62 +++++ .../src/features/auth/composables/useAuth.ts | 15 +- .../src/features/auth/composables/useOidc.ts | 111 ++++++++ client/src/features/settings/OidcSettings.vue | 248 ++++++++++++++++++ .../src/features/settings/SettingsDrawer.vue | 14 +- client/src/router/index.ts | 6 + packages/types/src/auth.ts | 10 + server/.env.example | 3 + server/package.json | 4 +- .../common/filters/http-exception.filter.ts | 3 +- server/src/common/guards/permission.guard.ts | 4 + server/src/common/types/request-user.ts | 2 + ...it_schema.sql => 0000_add_oidc_schema.sql} | 30 ++- .../src/db/migrations/meta/0000_snapshot.json | 216 ++++++++++++++- server/src/db/migrations/meta/_journal.json | 4 +- server/src/db/schema/auth.ts | 4 + server/src/db/schema/index.ts | 1 + server/src/db/schema/oidc.ts | 31 +++ server/src/db/schema/reader.ts | 17 +- .../app-settings/app-settings.controller.ts | 46 +++- .../app-settings/app-settings.module.ts | 1 + .../app-settings/app-settings.service.ts | 59 +++++ .../dto/update-oidc-config.dto.ts | 65 +++++ server/src/modules/auth/auth.controller.ts | 32 ++- server/src/modules/auth/auth.module.ts | 25 +- server/src/modules/auth/auth.service.ts | 51 +++- .../src/modules/auth/dto/oidc-callback.dto.ts | 23 ++ .../auth/oidc/backchannel-logout.service.ts | 95 +++++++ .../auth/oidc/oidc-claim-extractor.service.ts | 36 +++ .../auth/oidc/oidc-discovery.service.ts | 56 ++++ .../auth/oidc/oidc-group-mapping.service.ts | 32 +++ .../auth/oidc/oidc-session.repository.ts | 52 ++++ .../modules/auth/oidc/oidc-state.service.ts | 27 ++ .../auth/oidc/oidc-token-client.service.ts | 63 +++++ .../auth/oidc/oidc-token-validator.service.ts | 75 ++++++ server/src/modules/auth/oidc/oidc.service.ts | 138 ++++++++++ server/src/modules/seed/seed.service.ts | 14 + server/src/modules/user/user.module.ts | 2 +- server/src/modules/user/user.repository.ts | 39 ++- server/src/modules/user/user.service.ts | 16 ++ 115 files changed, 2425 insertions(+), 803 deletions(-) create mode 100644 client/src/features/auth/OidcCallbackPage.vue create mode 100644 client/src/features/auth/composables/useOidc.ts create mode 100644 client/src/features/settings/OidcSettings.vue rename server/src/db/migrations/{0000_init_schema.sql => 0000_add_oidc_schema.sql} (89%) create mode 100644 server/src/db/schema/oidc.ts create mode 100644 server/src/modules/app-settings/dto/update-oidc-config.dto.ts create mode 100644 server/src/modules/auth/dto/oidc-callback.dto.ts create mode 100644 server/src/modules/auth/oidc/backchannel-logout.service.ts create mode 100644 server/src/modules/auth/oidc/oidc-claim-extractor.service.ts create mode 100644 server/src/modules/auth/oidc/oidc-discovery.service.ts create mode 100644 server/src/modules/auth/oidc/oidc-group-mapping.service.ts create mode 100644 server/src/modules/auth/oidc/oidc-session.repository.ts create mode 100644 server/src/modules/auth/oidc/oidc-state.service.ts create mode 100644 server/src/modules/auth/oidc/oidc-token-client.service.ts create mode 100644 server/src/modules/auth/oidc/oidc-token-validator.service.ts create mode 100644 server/src/modules/auth/oidc/oidc.service.ts diff --git a/client/src/components/RadiusPicker.vue b/client/src/components/RadiusPicker.vue index 11077b937..083e2fb2b 100644 --- a/client/src/components/RadiusPicker.vue +++ b/client/src/components/RadiusPicker.vue @@ -4,7 +4,7 @@ import { useThemeStore } from '@/stores/theme' const themeStore = useThemeStore() const shapes = [ - { id: 'sharp' as const, rx: '1' }, + { id: 'sharp' as const, rx: '1' }, { id: 'default' as const, rx: '4' }, { id: 'rounded' as const, rx: '9' }, ] diff --git a/client/src/components/ui/badge/Badge.vue b/client/src/components/ui/badge/Badge.vue index d894dfe08..eea882cd7 100644 --- a/client/src/components/ui/badge/Badge.vue +++ b/client/src/components/ui/badge/Badge.vue @@ -1,26 +1,24 @@ diff --git a/client/src/components/ui/badge/index.ts b/client/src/components/ui/badge/index.ts index bbc0dfa3b..f604c5a00 100644 --- a/client/src/components/ui/badge/index.ts +++ b/client/src/components/ui/badge/index.ts @@ -1,25 +1,22 @@ -import type { VariantProps } from "class-variance-authority" -import { cva } from "class-variance-authority" +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' -export { default as Badge } from "./Badge.vue" +export { default as Badge } from './Badge.vue' export const badgeVariants = cva( - "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + 'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', { variants: { variant: { - default: - "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", - secondary: - "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90', + secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90', destructive: - "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", - outline: - "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground', }, }, defaultVariants: { - variant: "default", + variant: 'default', }, }, ) diff --git a/client/src/components/ui/button/Button.vue b/client/src/components/ui/button/Button.vue index 3763470a1..1b6a51205 100644 --- a/client/src/components/ui/button/Button.vue +++ b/client/src/components/ui/button/Button.vue @@ -1,19 +1,19 @@ diff --git a/client/src/components/ui/button/index.ts b/client/src/components/ui/button/index.ts index 26e2c559c..4a3d4f7ed 100644 --- a/client/src/components/ui/button/index.ts +++ b/client/src/components/ui/button/index.ts @@ -1,37 +1,34 @@ -import type { VariantProps } from "class-variance-authority" -import { cva } from "class-variance-authority" +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' -export { default as Button } from "./Button.vue" +export { default as Button } from './Button.vue' export const buttonVariants = cva( "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { - default: - "bg-primary text-primary-foreground hover:bg-primary/90", + default: 'bg-primary text-primary-foreground hover:bg-primary/90', destructive: - "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', outline: - "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", - secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", - ghost: - "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", - link: "text-primary underline-offset-4 hover:underline", + 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', + secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + link: 'text-primary underline-offset-4 hover:underline', }, size: { - "default": "h-9 px-4 py-2 has-[>svg]:px-3", - "sm": "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", - "lg": "h-10 rounded-md px-6 has-[>svg]:px-4", - "icon": "size-9", - "icon-sm": "size-8", - "icon-lg": "size-10", + default: 'h-9 px-4 py-2 has-[>svg]:px-3', + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + icon: 'size-9', + 'icon-sm': 'size-8', + 'icon-lg': 'size-10', }, }, defaultVariants: { - variant: "default", - size: "default", + variant: 'default', + size: 'default', }, }, ) diff --git a/client/src/components/ui/dropdown-menu/DropdownMenu.vue b/client/src/components/ui/dropdown-menu/DropdownMenu.vue index e1c9ee304..19c2339f8 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenu.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenu.vue @@ -1,6 +1,6 @@ diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/client/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue index 1253078dc..97cb4fec6 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -1,19 +1,15 @@ @@ -22,10 +18,12 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits) diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuContent.vue b/client/src/components/ui/dropdown-menu/DropdownMenuContent.vue index 7c4301413..833df45d0 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuContent.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -1,27 +1,20 @@ @@ -31,7 +24,12 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits) diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuGroup.vue b/client/src/components/ui/dropdown-menu/DropdownMenuGroup.vue index da634ec09..33184b8d3 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -1,15 +1,12 @@ diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuItem.vue b/client/src/components/ui/dropdown-menu/DropdownMenuItem.vue index f56cae3e7..291031e32 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuItem.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -1,19 +1,24 @@ @@ -24,7 +29,12 @@ const forwardedProps = useForwardProps(delegatedProps) :data-inset="inset ? '' : undefined" :data-variant="variant" v-bind="forwardedProps" - :class="cn('focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*=\'text-\'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4', props.class)" + :class=" + cn( + 'focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*=\'text-\'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4', + props.class, + ) + " > diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuLabel.vue b/client/src/components/ui/dropdown-menu/DropdownMenuLabel.vue index 8bca83c43..493324cac 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -1,13 +1,13 @@ diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/client/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue index fe82cadd7..8f67ecfc0 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -1,9 +1,6 @@ diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/client/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue index e03c40c5a..afbf61734 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -1,20 +1,16 @@ @@ -23,10 +19,12 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits) diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/client/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue index 1b936c392..48030f5d6 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -1,23 +1,19 @@ diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/client/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue index 60be75cc9..b8e8c12ad 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -1,17 +1,14 @@ diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuSub.vue b/client/src/components/ui/dropdown-menu/DropdownMenuSub.vue index 7472e77f5..3d6207522 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuSub.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -1,9 +1,6 @@ @@ -20,7 +17,12 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits) diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/client/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue index 090649116..807ffbf0e 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -1,17 +1,14 @@ @@ -20,10 +17,12 @@ const forwardedProps = useForwardProps(delegatedProps) data-slot="dropdown-menu-sub-trigger" v-bind="forwardedProps" :data-inset="inset ? '' : undefined" - :class="cn( - 'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4 data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*=\'text-\'])]:text-muted-foreground', - props.class, - )" + :class=" + cn( + 'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4 data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*=\'text-\'])]:text-muted-foreground', + props.class, + ) + " > diff --git a/client/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/client/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue index 75cd7472c..3c58c78cc 100644 --- a/client/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +++ b/client/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -1,6 +1,6 @@ diff --git a/client/src/components/ui/dropdown-menu/index.ts b/client/src/components/ui/dropdown-menu/index.ts index 955fe3aa0..f488d3965 100644 --- a/client/src/components/ui/dropdown-menu/index.ts +++ b/client/src/components/ui/dropdown-menu/index.ts @@ -1,16 +1,16 @@ -export { default as DropdownMenu } from "./DropdownMenu.vue" +export { default as DropdownMenu } from './DropdownMenu.vue' -export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue" -export { default as DropdownMenuContent } from "./DropdownMenuContent.vue" -export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue" -export { default as DropdownMenuItem } from "./DropdownMenuItem.vue" -export { default as DropdownMenuLabel } from "./DropdownMenuLabel.vue" -export { default as DropdownMenuRadioGroup } from "./DropdownMenuRadioGroup.vue" -export { default as DropdownMenuRadioItem } from "./DropdownMenuRadioItem.vue" -export { default as DropdownMenuSeparator } from "./DropdownMenuSeparator.vue" -export { default as DropdownMenuShortcut } from "./DropdownMenuShortcut.vue" -export { default as DropdownMenuSub } from "./DropdownMenuSub.vue" -export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue" -export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue" -export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue" -export { DropdownMenuPortal } from "reka-ui" +export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' +export { default as DropdownMenuContent } from './DropdownMenuContent.vue' +export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' +export { default as DropdownMenuItem } from './DropdownMenuItem.vue' +export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' +export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' +export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' +export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' +export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' +export { default as DropdownMenuSub } from './DropdownMenuSub.vue' +export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' +export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' +export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' +export { DropdownMenuPortal } from 'reka-ui' diff --git a/client/src/components/ui/input/Input.vue b/client/src/components/ui/input/Input.vue index e5135c143..e12fe9dd1 100644 --- a/client/src/components/ui/input/Input.vue +++ b/client/src/components/ui/input/Input.vue @@ -1,19 +1,19 @@ diff --git a/client/src/components/ui/popover/PopoverAnchor.vue b/client/src/components/ui/popover/PopoverAnchor.vue index 49e01dbc5..17090ef1a 100644 --- a/client/src/components/ui/popover/PopoverAnchor.vue +++ b/client/src/components/ui/popover/PopoverAnchor.vue @@ -1,15 +1,12 @@ diff --git a/client/src/components/ui/popover/PopoverContent.vue b/client/src/components/ui/popover/PopoverContent.vue index cf1e55c50..841dcac90 100644 --- a/client/src/components/ui/popover/PopoverContent.vue +++ b/client/src/components/ui/popover/PopoverContent.vue @@ -1,28 +1,21 @@ diff --git a/client/src/components/ui/popover/PopoverTrigger.vue b/client/src/components/ui/popover/PopoverTrigger.vue index fd3b4974d..1f3431315 100644 --- a/client/src/components/ui/popover/PopoverTrigger.vue +++ b/client/src/components/ui/popover/PopoverTrigger.vue @@ -1,15 +1,12 @@ diff --git a/client/src/components/ui/popover/index.ts b/client/src/components/ui/popover/index.ts index 66edf89f6..d724e785f 100644 --- a/client/src/components/ui/popover/index.ts +++ b/client/src/components/ui/popover/index.ts @@ -1,4 +1,4 @@ -export { default as Popover } from "./Popover.vue" -export { default as PopoverAnchor } from "./PopoverAnchor.vue" -export { default as PopoverContent } from "./PopoverContent.vue" -export { default as PopoverTrigger } from "./PopoverTrigger.vue" +export { default as Popover } from './Popover.vue' +export { default as PopoverAnchor } from './PopoverAnchor.vue' +export { default as PopoverContent } from './PopoverContent.vue' +export { default as PopoverTrigger } from './PopoverTrigger.vue' diff --git a/client/src/components/ui/separator/Separator.vue b/client/src/components/ui/separator/Separator.vue index 78d60eca1..e9665caee 100644 --- a/client/src/components/ui/separator/Separator.vue +++ b/client/src/components/ui/separator/Separator.vue @@ -1,18 +1,16 @@