Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v24.16.0
2 changes: 1 addition & 1 deletion biome.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"root": true,
"$schema": "https://biomejs.dev/schemas/2.3.15/schema.json",
"$schema": "https://biomejs.dev/schemas/2.4.16/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
Expand Down
4 changes: 2 additions & 2 deletions full-stack/biome.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.15/schema.json",
"$schema": "https://biomejs.dev/schemas/2.4.16/schema.json",
"root": false,
"extends": "//",
"files": {
Expand All @@ -9,7 +9,7 @@
"**/.storybook/**/*",
"**/.vscode/**/*",
"**/index.html",
"**/vite.config.js",
"**/vite*.config.*",
"!**/src/routeTree.gen.ts",
"!**/src/_generated/**/*",
"!**/src/components/ui/**/*"
Expand Down
3 changes: 2 additions & 1 deletion full-stack/components.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"prefix": ""
},
"iconLibrary": "lucide",
"rtl": false,
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
Expand All @@ -21,4 +22,4 @@
"menuColor": "default",
"menuAccent": "subtle",
"registries": {}
}
}
139 changes: 56 additions & 83 deletions full-stack/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,115 +17,88 @@
"build-storybook": "storybook build"
},
"dependencies": {
"@base-ui/react": "^1.2.0",
"@faker-js/faker": "^10.3.0",
"@fontsource-variable/geist": "^5.2.8",
"@hookform/resolvers": "^5.2.2",
"@modelcontextprotocol/sdk": "^1.26.0",
"@prisma/studio-core": "^0.14.0",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
"@radix-ui/react-avatar": "^1.1.11",
"@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-context-menu": "^2.2.16",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-hover-card": "^1.1.15",
"@radix-ui/react-label": "^2.1.8",
"@radix-ui/react-menubar": "^1.1.16",
"@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.8",
"@radix-ui/react-radio-group": "^1.3.8",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-separator": "^1.1.8",
"@radix-ui/react-slider": "^1.3.6",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-switch": "^1.2.6",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-toggle": "^1.1.10",
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-tooltip": "^1.2.8",
"@storybook/react-vite": "^10.2.8",
"@t3-oss/env-core": "^0.13.10",
"@tailwindcss/postcss": "^4.1.18",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/db": "^0.5.26",
"@base-ui/react": "^1.5.0",
"@faker-js/faker": "^10.4.0",
"@fontsource-variable/geist": "^5.2.9",
"@modelcontextprotocol/sdk": "^1.29.0",
"@prisma/studio-core": "^0.30.0",
"@storybook/react-vite": "^10.4.2",
"@t3-oss/env-core": "^0.13.11",
"@tailwindcss/postcss": "^4.3.0",
"@tailwindcss/vite": "^4.3.0",
"@tanstack/db": "^0.6.8",
"@tanstack/match-sorter-utils": "^8.19.4",
"@tanstack/query-db-collection": "^1.0.23",
"@tanstack/react-db": "^0.1.70",
"@tanstack/react-form": "^1.28.2",
"@tanstack/react-query": "^5.90.21",
"@tanstack/react-query-devtools": "^5.91.3",
"@tanstack/react-router": "^1.159.10",
"@tanstack/react-router-devtools": "^1.159.10",
"@tanstack/react-router-ssr-query": "^1.159.10",
"@tanstack/react-start": "^1.159.12",
"@tanstack/react-store": "^0.8.0",
"@tanstack/query-db-collection": "^1.0.39",
"@tanstack/react-db": "^0.1.86",
"@tanstack/react-form": "^1.33.0",
"@tanstack/react-query": "^5.101.0",
"@tanstack/react-query-devtools": "^5.101.0",
"@tanstack/react-router": "^1.170.15",
"@tanstack/react-router-devtools": "^1.167.0",
"@tanstack/react-router-ssr-query": "^1.167.1",
"@tanstack/react-start": "^1.168.25",
"@tanstack/react-store": "^0.11.0",
"@tanstack/react-table": "^8.21.3",
"@tanstack/router-plugin": "^1.159.12",
"@tanstack/store": "^0.8.0",
"@trpc/client": "^11.10.0",
"@trpc/server": "^11.10.0",
"@trpc/tanstack-react-query": "^11.10.0",
"@tanstack/router-plugin": "^1.168.18",
"@tanstack/store": "^0.11.0",
"@trpc/client": "^11.17.0",
"@trpc/server": "^11.17.0",
"@trpc/tanstack-react-query": "^11.17.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "^4.1.0",
"date-fns": "^4.4.0",
"embla-carousel-react": "^8.6.0",
"http-errors": "^2.0.1",
"input-otp": "^1.4.2",
"jsonwebtoken": "^9.0.3",
"lucide-react": "^0.564.0",
"lucide-react": "^1.17.0",
"next-themes": "^0.4.6",
"nitro": "latest",
"pg": "^8.18.0",
"postcss": "^8.5.6",
"radix-ui": "^1.4.3",
"react": "^19.2.4",
"react-day-picker": "^9.13.2",
"react-dom": "^19.2.4",
"react-hook-form": "^7.71.1",
"react-resizable-panels": "^4.6.4",
"recharts": "^2.15.4",
"pg": "^8.21.0",
"postcss": "^8.5.15",
"radix-ui": "^1.5.0",
"react": "^19.2.7",
"react-day-picker": "^10.0.1",
"react-dom": "^19.2.7",
"react-resizable-panels": "^4.11.2",
"recharts": "3.8.1",
"reflect-metadata": "^0.2.2",
"sonner": "^2.0.7",
"storybook": "^10.2.8",
"storybook": "^10.4.2",
"superjson": "^2.2.6",
"tailwind-merge": "^3.4.0",
"tailwindcss": "^4.1.18",
"tailwind-merge": "^3.6.0",
"tailwindcss": "^4.3.0",
"tsyringe": "^4.10.0",
"tw-animate-css": "^1.4.0",
"vaul": "^1.1.2",
"vite-tsconfig-paths": "^6.1.1",
"zod": "^4.3.6"
"zod": "^4.4.3"
},
"devDependencies": {
"@tanstack/devtools-event-client": "^0.4.0",
"@tanstack/devtools-vite": "^0.5.1",
"@tanstack/react-devtools": "^0.9.5",
"@rolldown/plugin-babel": "^0.2.3",
"@tailwindcss/typography": "^0.5.20",
"@tanstack/devtools-event-client": "^0.4.3",
"@tanstack/devtools-vite": "^0.7.0",
"@tanstack/react-devtools": "^0.10.5",
"@testing-library/dom": "^10.4.1",
"@testing-library/react": "^16.3.2",
"@types/http-errors": "^2.0.5",
"@types/jsonwebtoken": "^9.0.10",
"@types/node": "^22.19.11",
"@types/pg": "^8.16.0",
"@types/react": "^19.2.14",
"@types/node": "^25.9.2",
"@types/pg": "^8.20.0",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.4",
"@vitest/coverage-v8": "^4.0.18",
"@vitejs/plugin-react": "^6.0.2",
"@vitest/coverage-v8": "^4.1.8",
"babel-plugin-react-compiler": "^1.0.0",
"dotenv-cli": "^11.0.0",
"jsdom": "^28.0.0",
"react-doctor": "^0.0.28",
"shadcn": "^3.8.4",
"jsdom": "^29.1.1",
"react-doctor": "^0.4.2",
"shadcn": "^4.11.0",
"ts-node": "^10.9.2",
"typescript": "^5.9.3",
"vite": "^7.3.1",
"vitest": "^4.0.18",
"web-vitals": "^5.1.0"
"typescript": "^6.0.3",
"vite": "^8.0.16",
"vitest": "^4.1.8",
"web-vitals": "^5.3.0"
}
}
13 changes: 8 additions & 5 deletions full-stack/src/components/ui/accordion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ function Accordion({
return (
<AccordionPrimitive.Root
data-slot="accordion"
className={cn("overflow-hidden rounded-2xl border flex w-full flex-col", className)}
className={cn(
"flex w-full flex-col overflow-hidden rounded-2xl border",
className
)}
{...props}
/>
)
Expand All @@ -24,7 +27,7 @@ function AccordionItem({
return (
<AccordionPrimitive.Item
data-slot="accordion-item"
className={cn("data-open:bg-muted/50 not-last:border-b", className)}
className={cn("not-last:border-b data-open:bg-muted/50", className)}
{...props}
/>
)
Expand All @@ -40,7 +43,7 @@ function AccordionTrigger({
<AccordionPrimitive.Trigger
data-slot="accordion-trigger"
className={cn(
"**:data-[slot=accordion-trigger-icon]:text-muted-foreground gap-6 p-4 text-left text-sm font-medium hover:underline **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 group/accordion-trigger relative flex flex-1 items-start justify-between border border-transparent transition-all outline-none disabled:pointer-events-none disabled:opacity-50",
"group/accordion-trigger relative flex flex-1 items-start justify-between gap-6 border border-transparent p-4 text-left text-sm font-medium transition-all outline-none hover:underline disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",
className
)}
{...props}
Expand All @@ -61,12 +64,12 @@ function AccordionContent({
return (
<AccordionPrimitive.Content
data-slot="accordion-content"
className="data-open:animate-accordion-down data-closed:animate-accordion-up px-4 text-sm overflow-hidden"
className="overflow-hidden px-4 text-sm data-open:animate-accordion-down data-closed:animate-accordion-up"
{...props}
>
<div
className={cn(
"pt-0 pb-4 [&_a]:hover:text-foreground h-(--radix-accordion-content-height) [&_a]:underline [&_a]:underline-offset-3 [&_p:not(:last-child)]:mb-4",
"h-(--radix-accordion-content-height) pt-0 pb-4 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
className
)}
>
Expand Down
27 changes: 21 additions & 6 deletions full-stack/src/components/ui/alert-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ function AlertDialogOverlay({
return (
<AlertDialogPrimitive.Overlay
data-slot="alert-dialog-overlay"
className={cn("data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50", className)}
className={cn(
"fixed inset-0 z-50 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
className
)}
{...props}
/>
)
Expand All @@ -53,7 +56,7 @@ function AlertDialogContent({
data-slot="alert-dialog-content"
data-size={size}
className={cn(
"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 bg-background ring-foreground/5 gap-6 rounded-4xl p-6 ring-1 duration-100 data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-md group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 outline-none",
"group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-popover-foreground ring-1 ring-foreground/5 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-md data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
className
)}
{...props}
Expand All @@ -69,7 +72,10 @@ function AlertDialogHeader({
return (
<div
data-slot="alert-dialog-header"
className={cn("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", className)}
className={cn(
"grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",
className
)}
{...props}
/>
)
Expand Down Expand Up @@ -98,7 +104,10 @@ function AlertDialogMedia({
return (
<div
data-slot="alert-dialog-media"
className={cn("bg-muted mb-2 inline-flex size-16 items-center justify-center rounded-full sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8", className)}
className={cn(
"mb-2 inline-flex size-16 items-center justify-center rounded-full bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8",
className
)}
{...props}
/>
)
Expand All @@ -111,7 +120,10 @@ function AlertDialogTitle({
return (
<AlertDialogPrimitive.Title
data-slot="alert-dialog-title"
className={cn("text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", className)}
className={cn(
"font-heading text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",
className
)}
{...props}
/>
)
Expand All @@ -124,7 +136,10 @@ function AlertDialogDescription({
return (
<AlertDialogPrimitive.Description
data-slot="alert-dialog-description"
className={cn("text-muted-foreground *:[a]:hover:text-foreground text-sm text-balance md:text-pretty *:[a]:underline *:[a]:underline-offset-3", className)}
className={cn(
"text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
className
)}
{...props}
/>
)
Expand Down
28 changes: 16 additions & 12 deletions full-stack/src/components/ui/alert.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,21 @@ import { cva, type VariantProps } from "class-variance-authority"

import { cn } from "@/lib/utils"

const alertVariants = cva("grid gap-0.5 rounded-lg border px-4 py-3 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.5 *:[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",
const alertVariants = cva(
"group/alert relative grid w-full gap-0.5 rounded-lg border px-4 py-3 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.5 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
default: "bg-card text-card-foreground",
destructive:
"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
},
},
},
defaultVariants: {
variant: "default",
},
})
defaultVariants: {
variant: "default",
},
}
)

function Alert({
className,
Expand All @@ -35,7 +39,7 @@ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
<div
data-slot="alert-title"
className={cn(
"font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
"font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
className
)}
{...props}
Expand All @@ -51,7 +55,7 @@ function AlertDescription({
<div
data-slot="alert-description"
className={cn(
"text-muted-foreground text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
"text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
className
)}
{...props}
Expand Down
Loading
Loading