From 90e02075e87b90c6ad622d6b93e7f2a56dd8e2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Flor=C3=AAncio?= Date: Wed, 14 Jan 2026 02:17:16 +0000 Subject: [PATCH] feat: changed theme to shadcn nova - less paddings --- apps/packages/ui/src/tooltip.tsx | 6 +- apps/web/app/layout.tsx | 11 +- apps/web/components.json | 2 +- apps/web/components/connection-status.tsx | 27 +- apps/web/components/kanban-board.tsx | 6 +- apps/web/components/task-create-dialog.tsx | 10 +- apps/web/components/ui/accordion.tsx | 81 +++ apps/web/components/ui/alert-dialog.tsx | 184 ++++++ apps/web/components/ui/alert.tsx | 72 +++ apps/web/components/ui/aspect-ratio.tsx | 11 + apps/web/components/ui/avatar.tsx | 109 ++++ apps/web/components/ui/badge.tsx | 45 ++ apps/web/components/ui/breadcrumb.tsx | 123 ++++ apps/web/components/ui/button-group.tsx | 83 +++ apps/web/components/ui/button.tsx | 60 ++ apps/web/components/ui/calendar.tsx | 216 +++++++ apps/web/components/ui/card.tsx | 94 +++ apps/web/components/ui/carousel.tsx | 244 +++++++ apps/web/components/ui/chart.tsx | 356 +++++++++++ apps/web/components/ui/checkbox.tsx | 33 + apps/web/components/ui/collapsible.tsx | 33 + apps/web/components/ui/command.tsx | 186 ++++++ apps/web/components/ui/context-menu.tsx | 249 ++++++++ apps/web/components/ui/dialog.tsx | 155 +++++ apps/web/components/ui/drawer.tsx | 125 ++++ apps/web/components/ui/dropdown-menu.tsx | 255 ++++++++ apps/web/components/ui/empty.tsx | 104 +++ apps/web/components/ui/field.tsx | 227 +++++++ apps/web/components/ui/hover-card.tsx | 44 ++ apps/web/components/ui/input-group.tsx | 147 +++++ apps/web/components/ui/input-otp.tsx | 87 +++ apps/web/components/ui/input.tsx | 19 + apps/web/components/ui/item.tsx | 195 ++++++ apps/web/components/ui/kbd.tsx | 26 + apps/web/components/ui/label.tsx | 24 + apps/web/components/ui/menubar.tsx | 263 ++++++++ apps/web/components/ui/navigation-menu.tsx | 161 +++++ apps/web/components/ui/pagination.tsx | 132 ++++ apps/web/components/ui/popover.tsx | 89 +++ apps/web/components/ui/progress.tsx | 31 + apps/web/components/ui/radio-group.tsx | 45 ++ apps/web/components/ui/resizable.tsx | 53 ++ apps/web/components/ui/scroll-area.tsx | 55 ++ apps/web/components/ui/select.tsx | 185 ++++++ apps/web/components/ui/separator.tsx | 28 + apps/web/components/ui/sheet.tsx | 134 ++++ apps/web/components/ui/sidebar.tsx | 702 +++++++++++++++++++++ apps/web/components/ui/skeleton.tsx | 13 + apps/web/components/ui/slider.tsx | 59 ++ apps/web/components/ui/sonner.tsx | 49 ++ apps/web/components/ui/spinner.tsx | 10 + apps/web/components/ui/switch.tsx | 33 + apps/web/components/ui/table.tsx | 101 +++ apps/web/components/ui/tabs.tsx | 90 +++ apps/web/components/ui/textarea.tsx | 18 + apps/web/components/ui/toggle-group.tsx | 89 +++ apps/web/components/ui/toggle.tsx | 46 ++ apps/web/components/ui/tooltip.tsx | 57 ++ apps/web/lib/config.ts | 2 +- 59 files changed, 6059 insertions(+), 35 deletions(-) create mode 100644 apps/web/components/ui/accordion.tsx create mode 100644 apps/web/components/ui/alert-dialog.tsx create mode 100644 apps/web/components/ui/alert.tsx create mode 100644 apps/web/components/ui/aspect-ratio.tsx create mode 100644 apps/web/components/ui/avatar.tsx create mode 100644 apps/web/components/ui/badge.tsx create mode 100644 apps/web/components/ui/breadcrumb.tsx create mode 100644 apps/web/components/ui/button-group.tsx create mode 100644 apps/web/components/ui/button.tsx create mode 100644 apps/web/components/ui/calendar.tsx create mode 100644 apps/web/components/ui/card.tsx create mode 100644 apps/web/components/ui/carousel.tsx create mode 100644 apps/web/components/ui/chart.tsx create mode 100644 apps/web/components/ui/checkbox.tsx create mode 100644 apps/web/components/ui/collapsible.tsx create mode 100644 apps/web/components/ui/command.tsx create mode 100644 apps/web/components/ui/context-menu.tsx create mode 100644 apps/web/components/ui/dialog.tsx create mode 100644 apps/web/components/ui/drawer.tsx create mode 100644 apps/web/components/ui/dropdown-menu.tsx create mode 100644 apps/web/components/ui/empty.tsx create mode 100644 apps/web/components/ui/field.tsx create mode 100644 apps/web/components/ui/hover-card.tsx create mode 100644 apps/web/components/ui/input-group.tsx create mode 100644 apps/web/components/ui/input-otp.tsx create mode 100644 apps/web/components/ui/input.tsx create mode 100644 apps/web/components/ui/item.tsx create mode 100644 apps/web/components/ui/kbd.tsx create mode 100644 apps/web/components/ui/label.tsx create mode 100644 apps/web/components/ui/menubar.tsx create mode 100644 apps/web/components/ui/navigation-menu.tsx create mode 100644 apps/web/components/ui/pagination.tsx create mode 100644 apps/web/components/ui/popover.tsx create mode 100644 apps/web/components/ui/progress.tsx create mode 100644 apps/web/components/ui/radio-group.tsx create mode 100644 apps/web/components/ui/resizable.tsx create mode 100644 apps/web/components/ui/scroll-area.tsx create mode 100644 apps/web/components/ui/select.tsx create mode 100644 apps/web/components/ui/separator.tsx create mode 100644 apps/web/components/ui/sheet.tsx create mode 100644 apps/web/components/ui/sidebar.tsx create mode 100644 apps/web/components/ui/skeleton.tsx create mode 100644 apps/web/components/ui/slider.tsx create mode 100644 apps/web/components/ui/sonner.tsx create mode 100644 apps/web/components/ui/spinner.tsx create mode 100644 apps/web/components/ui/switch.tsx create mode 100644 apps/web/components/ui/table.tsx create mode 100644 apps/web/components/ui/tabs.tsx create mode 100644 apps/web/components/ui/textarea.tsx create mode 100644 apps/web/components/ui/toggle-group.tsx create mode 100644 apps/web/components/ui/toggle.tsx create mode 100644 apps/web/components/ui/tooltip.tsx diff --git a/apps/packages/ui/src/tooltip.tsx b/apps/packages/ui/src/tooltip.tsx index 3ccd9288ab..fbea5abc83 100644 --- a/apps/packages/ui/src/tooltip.tsx +++ b/apps/packages/ui/src/tooltip.tsx @@ -21,11 +21,7 @@ function TooltipProvider({ function Tooltip({ ...props }: React.ComponentProps) { - return ( - - - - ) + return } function TooltipTrigger({ diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 61cc59e059..5ec7f74d33 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -4,6 +4,7 @@ import { ThemeProvider } from "@/components/theme-provider"; import { StateProvider } from "@/components/state-provider"; import { WebSocketConnector } from "@/components/ws-connector"; import { ToastProvider } from "@/components/toast-provider"; +import { TooltipProvider } from "@kandev/ui/tooltip"; export const metadata: Metadata = { title: "Kandev - AI Kanban", @@ -20,10 +21,12 @@ export default function RootLayout({ - - - {children} - + + + + {children} + + diff --git a/apps/web/components.json b/apps/web/components.json index 06aee3674b..44e7b2aea9 100644 --- a/apps/web/components.json +++ b/apps/web/components.json @@ -1,6 +1,6 @@ { "$schema": "https://ui.shadcn.com/schema.json", - "style": "radix-mira", + "style": "radix-nova", "rsc": true, "tsx": true, "tailwind": { diff --git a/apps/web/components/connection-status.tsx b/apps/web/components/connection-status.tsx index d872c185ce..04e5f82af6 100644 --- a/apps/web/components/connection-status.tsx +++ b/apps/web/components/connection-status.tsx @@ -1,7 +1,6 @@ 'use client'; import { Badge } from '@kandev/ui/badge'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@kandev/ui/tooltip'; import { IconCircleFilled } from '@tabler/icons-react'; import { useAppStore } from '@/components/state-provider'; @@ -33,21 +32,15 @@ export function ConnectionStatus() { }; return ( - - - - - {config.text} - - - -

{getTooltipContent()}

-
-
+ + + {config.text} + ); } diff --git a/apps/web/components/kanban-board.tsx b/apps/web/components/kanban-board.tsx index 153fa0ca90..02df119047 100644 --- a/apps/web/components/kanban-board.tsx +++ b/apps/web/components/kanban-board.tsx @@ -219,8 +219,10 @@ export function KanbanBoard() { useEffect(() => { const workspaceId = workspaceState.activeId; if (!workspaceId) { - setBoards([]); - setActiveBoard(null); + if (boardsState.items.length || boardsState.activeId) { + setBoards([]); + setActiveBoard(null); + } return; } const workspaceBoards = boardsState.items.filter((board) => board.workspaceId === workspaceId); diff --git a/apps/web/components/task-create-dialog.tsx b/apps/web/components/task-create-dialog.tsx index 589539f9a0..9e40bfe43f 100644 --- a/apps/web/components/task-create-dialog.tsx +++ b/apps/web/components/task-create-dialog.tsx @@ -367,11 +367,11 @@ export function TaskCreateDialog({
{agentProfiles.length === 0 && !agentProfilesLoading ? ( -
- No agents found. - - Add agent - +
+ No agents found. + + Add agent +
) : ( ) { + return ( + + ) +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + + + + ) +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
+ {children} +
+
+ ) +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/apps/web/components/ui/alert-dialog.tsx b/apps/web/components/ui/alert-dialog.tsx new file mode 100644 index 0000000000..30e1e5430c --- /dev/null +++ b/apps/web/components/ui/alert-dialog.tsx @@ -0,0 +1,184 @@ +"use client" + +import * as React from "react" +import { AlertDialog as AlertDialogPrimitive } from "radix-ui" + +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui/button" + +function AlertDialog({ + ...props +}: React.ComponentProps) { + return +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogContent({ + className, + size = "default", + ...props +}: React.ComponentProps & { + size?: "default" | "sm" +}) { + return ( + + + + + ) +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogMedia({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogAction({ + className, + variant = "default", + size = "default", + ...props +}: React.ComponentProps & + Pick, "variant" | "size">) { + return ( + + ) +} + +function AlertDialogCancel({ + className, + variant = "outline", + size = "default", + ...props +}: React.ComponentProps & + Pick, "variant" | "size">) { + return ( + + ) +} + +export { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogMedia, + AlertDialogOverlay, + AlertDialogPortal, + AlertDialogTitle, + AlertDialogTrigger, +} diff --git a/apps/web/components/ui/alert.tsx b/apps/web/components/ui/alert.tsx new file mode 100644 index 0000000000..8a6575458c --- /dev/null +++ b/apps/web/components/ui/alert.tsx @@ -0,0 +1,72 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva("grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 w-full relative group/alert", { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: "text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current", + }, + }, + defaultVariants: { + variant: "default", + }, +}) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3", + className + )} + {...props} + /> + ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertAction({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription, AlertAction } diff --git a/apps/web/components/ui/aspect-ratio.tsx b/apps/web/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000000..57e38fa96f --- /dev/null +++ b/apps/web/components/ui/aspect-ratio.tsx @@ -0,0 +1,11 @@ +"use client" + +import { AspectRatio as AspectRatioPrimitive } from "radix-ui" + +function AspectRatio({ + ...props +}: React.ComponentProps) { + return +} + +export { AspectRatio } diff --git a/apps/web/components/ui/avatar.tsx b/apps/web/components/ui/avatar.tsx new file mode 100644 index 0000000000..5ef47cd7c2 --- /dev/null +++ b/apps/web/components/ui/avatar.tsx @@ -0,0 +1,109 @@ +"use client" + +import * as React from "react" +import { Avatar as AvatarPrimitive } from "radix-ui" + +import { cn } from "@/lib/utils" + +function Avatar({ + className, + size = "default", + ...props +}: React.ComponentProps & { + size?: "default" | "sm" | "lg" +}) { + return ( + + ) +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) { + return ( + svg]:hidden", + "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", + "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", + className + )} + {...props} + /> + ) +} + +function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AvatarGroupCount({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 ring-background relative flex shrink-0 items-center justify-center ring-2", className)} + {...props} + /> + ) +} + +export { + Avatar, + AvatarImage, + AvatarFallback, + AvatarGroup, + AvatarGroupCount, + AvatarBadge, +} diff --git a/apps/web/components/ui/badge.tsx b/apps/web/components/ui/badge.tsx new file mode 100644 index 0000000000..2e5b2cca4e --- /dev/null +++ b/apps/web/components/ui/badge.tsx @@ -0,0 +1,45 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" +import { Slot } from "radix-ui" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "h-5 gap-1 rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-3! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>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-colors overflow-hidden group/badge", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", + secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80", + destructive: "bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20", + outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground", + ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50", + link: "text-primary underline-offset-4 hover:underline", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant = "default", + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot.Root : "span" + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/apps/web/components/ui/breadcrumb.tsx b/apps/web/components/ui/breadcrumb.tsx new file mode 100644 index 0000000000..71bad761c8 --- /dev/null +++ b/apps/web/components/ui/breadcrumb.tsx @@ -0,0 +1,123 @@ +import * as React from "react" +import { Slot } from "radix-ui" + +import { cn } from "@/lib/utils" +import { IconChevronRight, IconDots } from "@tabler/icons-react" + +function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) { + return ( +