From f1cc58a651c49067d067aa3ef4d942196960ea44 Mon Sep 17 00:00:00 2001 From: Markus Thielker Date: Thu, 28 Nov 2024 23:48:45 +0100 Subject: [PATCH] NORY-7: add dashboard application with basic authentication routing --- README.md | 9 + dashboard/.env.example | 8 + dashboard/.eslintrc.json | 3 + dashboard/.gitignore | 40 ++++ dashboard/Dockerfile | 49 +++++ dashboard/README.md | 9 + dashboard/bun.lockb | Bin 0 -> 233212 bytes dashboard/components.json | 17 ++ dashboard/next.config.mjs | 13 ++ dashboard/package.json | 59 ++++++ dashboard/postcss.config.js | 6 + dashboard/public/favicon.png | Bin 0 -> 6136 bytes dashboard/public/icon-128.png | Bin 0 -> 4860 bytes dashboard/public/icon-144.png | Bin 0 -> 5496 bytes dashboard/public/icon-192.png | Bin 0 -> 6515 bytes dashboard/public/icon-512.png | Bin 0 -> 14969 bytes dashboard/public/icon-72.png | Bin 0 -> 3655 bytes dashboard/public/manifest.json | 37 ++++ dashboard/public/mt-logo-orange.png | Bin 0 -> 7568 bytes dashboard/src/app/globals.css | 62 ++++++ dashboard/src/app/layout.tsx | 63 ++++++ dashboard/src/app/page.tsx | 53 +++++ dashboard/src/app/service-worker.ts | 18 ++ dashboard/src/components/themeProvider.tsx | 8 + dashboard/src/components/themeToggle.tsx | 43 ++++ dashboard/src/components/ui/alert-dialog.tsx | 141 ++++++++++++ dashboard/src/components/ui/alert.tsx | 59 ++++++ dashboard/src/components/ui/badge.tsx | 37 ++++ dashboard/src/components/ui/button.tsx | 56 +++++ dashboard/src/components/ui/card.tsx | 79 +++++++ dashboard/src/components/ui/checkbox.tsx | 30 +++ dashboard/src/components/ui/dropdown-menu.tsx | 200 ++++++++++++++++++ dashboard/src/components/ui/form.tsx | 169 +++++++++++++++ dashboard/src/components/ui/input.tsx | 26 +++ dashboard/src/components/ui/label.tsx | 26 +++ dashboard/src/components/ui/scroll-area.tsx | 48 +++++ dashboard/src/components/ui/separator.tsx | 31 +++ dashboard/src/components/ui/skeleton.tsx | 16 ++ dashboard/src/components/ui/sonner.tsx | 32 +++ dashboard/src/components/ui/tabs.tsx | 55 +++++ dashboard/src/lib/utils.ts | 6 + dashboard/src/ory/hooks.tsx | 43 ++++ dashboard/src/ory/index.ts | 2 + dashboard/src/ory/sdk/hydra/index.ts | 15 ++ dashboard/src/ory/sdk/kratos/index.ts | 14 ++ dashboard/tailwind.config.ts | 85 ++++++++ dashboard/tsconfig.json | 44 ++++ docker/ory-dev/ory/kratos/kratos.yaml | 2 + 48 files changed, 1713 insertions(+) create mode 100644 dashboard/.env.example create mode 100644 dashboard/.eslintrc.json create mode 100644 dashboard/.gitignore create mode 100644 dashboard/Dockerfile create mode 100644 dashboard/README.md create mode 100755 dashboard/bun.lockb create mode 100644 dashboard/components.json create mode 100644 dashboard/next.config.mjs create mode 100644 dashboard/package.json create mode 100644 dashboard/postcss.config.js create mode 100644 dashboard/public/favicon.png create mode 100644 dashboard/public/icon-128.png create mode 100644 dashboard/public/icon-144.png create mode 100644 dashboard/public/icon-192.png create mode 100644 dashboard/public/icon-512.png create mode 100644 dashboard/public/icon-72.png create mode 100644 dashboard/public/manifest.json create mode 100644 dashboard/public/mt-logo-orange.png create mode 100644 dashboard/src/app/globals.css create mode 100644 dashboard/src/app/layout.tsx create mode 100644 dashboard/src/app/page.tsx create mode 100644 dashboard/src/app/service-worker.ts create mode 100644 dashboard/src/components/themeProvider.tsx create mode 100644 dashboard/src/components/themeToggle.tsx create mode 100644 dashboard/src/components/ui/alert-dialog.tsx create mode 100644 dashboard/src/components/ui/alert.tsx create mode 100644 dashboard/src/components/ui/badge.tsx create mode 100644 dashboard/src/components/ui/button.tsx create mode 100644 dashboard/src/components/ui/card.tsx create mode 100644 dashboard/src/components/ui/checkbox.tsx create mode 100644 dashboard/src/components/ui/dropdown-menu.tsx create mode 100644 dashboard/src/components/ui/form.tsx create mode 100644 dashboard/src/components/ui/input.tsx create mode 100644 dashboard/src/components/ui/label.tsx create mode 100644 dashboard/src/components/ui/scroll-area.tsx create mode 100644 dashboard/src/components/ui/separator.tsx create mode 100644 dashboard/src/components/ui/skeleton.tsx create mode 100644 dashboard/src/components/ui/sonner.tsx create mode 100644 dashboard/src/components/ui/tabs.tsx create mode 100644 dashboard/src/lib/utils.ts create mode 100644 dashboard/src/ory/hooks.tsx create mode 100644 dashboard/src/ory/index.ts create mode 100644 dashboard/src/ory/sdk/hydra/index.ts create mode 100644 dashboard/src/ory/sdk/kratos/index.ts create mode 100644 dashboard/tailwind.config.ts create mode 100644 dashboard/tsconfig.json diff --git a/README.md b/README.md index 1b3b83f..6ccce62 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,15 @@ npm install npm run dev ``` +Inside another terminal session we can start the dashboard UI using npm: + +```bash +cd dashboard +cp .env.example .env +npm install +npm run dev +``` + ## Deployment *soon.* diff --git a/dashboard/.env.example b/dashboard/.env.example new file mode 100644 index 0000000..0890e33 --- /dev/null +++ b/dashboard/.env.example @@ -0,0 +1,8 @@ + +ORY_KRATOS_ADMIN_URL=http://localhost:4434 +ORY_HYDRA_ADMIN_URL=http://localhost:4445 + +NEXT_PUBLIC_ORY_KRATOS_URL=http://localhost:4433 + +NEXT_PUBLIC_AUTHENTICATION_NODE_URL=http://localhost:3000 +NEXT_PUBLIC_DASHBOARD_NODE_URL=http://localhost:4000 diff --git a/dashboard/.eslintrc.json b/dashboard/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/dashboard/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/dashboard/.gitignore b/dashboard/.gitignore new file mode 100644 index 0000000..16fb5e1 --- /dev/null +++ b/dashboard/.gitignore @@ -0,0 +1,40 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# serwist +public/sw.js diff --git a/dashboard/Dockerfile b/dashboard/Dockerfile new file mode 100644 index 0000000..fdd1557 --- /dev/null +++ b/dashboard/Dockerfile @@ -0,0 +1,49 @@ +FROM node:21-alpine AS base + +# Install dependencies only when needed +FROM base AS deps + +RUN apk add --no-cache libc6-compat +WORKDIR /app + +COPY package.json package-lock.json* ./ +RUN npm ci + + +# Rebuild the source code only when needed +FROM base AS builder + +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +ENV NEXT_TELEMETRY_DISABLED 1 +RUN npm run build + + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +RUN mkdir .next +RUN chown nextjs:nodejs .next + +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 +ENV HOSTNAME "0.0.0.0" + +CMD ["node", "server.js"] diff --git a/dashboard/README.md b/dashboard/README.md new file mode 100644 index 0000000..1d8021d --- /dev/null +++ b/dashboard/README.md @@ -0,0 +1,9 @@ +# Next-Ory - Dashboard + +This directory contains a NextJS 15 (app router) UI Node, implementing the admin dashboard to the ORY Kratos instance. + +## Stack + +- [NextJS](https://nextjs.org/) +- [TailwindCSS](https://tailwindcss.com/) +- [shadcn/ui](https://ui.shadcn.com/) diff --git a/dashboard/bun.lockb b/dashboard/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..6d3fd3c271cba9dbb9aa99d17e02d860ec42141f GIT binary patch literal 233212 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%0AwEH<^x=pt9l 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 literal 0 HcmV?d00001 diff --git a/dashboard/components.json b/dashboard/components.json new file mode 100644 index 0000000..8ecaf9e --- /dev/null +++ b/dashboard/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/dashboard/next.config.mjs b/dashboard/next.config.mjs new file mode 100644 index 0000000..7bfcddb --- /dev/null +++ b/dashboard/next.config.mjs @@ -0,0 +1,13 @@ +import withSerwistInit from '@serwist/next'; + +const withSerwist = withSerwistInit({ + swSrc: 'src/app/service-worker.ts', + swDest: 'public/sw.js', +}); + +export default withSerwist({ + output: 'standalone', + env: { + appVersion: process.env.npm_package_version, + }, +}); diff --git a/dashboard/package.json b/dashboard/package.json new file mode 100644 index 0000000..c16c4cb --- /dev/null +++ b/dashboard/package.json @@ -0,0 +1,59 @@ +{ + "name": "next-base-dashboard", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev -p 4000", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@hookform/resolvers": "^3.3.4", + "@ory/client": "^1.9.0", + "@ory/integrations": "^1.1.5", + "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-scroll-area": "^1.0.5", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-tabs": "^1.1.1", + "@serwist/next": "^9.0.0-preview.21", + "@serwist/precaching": "^9.0.0-preview.21", + "@serwist/sw": "^9.0.0-preview.21", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "lucide-react": "^0.460.0", + "next": "15.0.3", + "next-themes": "^0.4.3", + "oslo": "^1.1.3", + "react": "19.0.0-rc-66855b96-20241106", + "react-dom": "19.0.0-rc-66855b96-20241106", + "react-hook-form": "^7.51.0", + "sharp": "^0.33.4", + "sonner": "^1.4.3", + "tailwind-merge": "^2.2.1", + "tailwindcss-animate": "^1.0.7", + "ua-parser-js": "^2.0.0", + "usehooks-ts": "^3.1.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/node": "^22.9.3", + "@types/react": "npm:types-react@19.0.0-rc.1", + "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1", + "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "15.0.3", + "postcss": "^8", + "tailwindcss": "^3.3.0", + "ts-node": "^10.9.2", + "typescript": "^5.4.2" + }, + "overrides": { + "@types/react": "npm:types-react@19.0.0-rc.1", + "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1" + } +} diff --git a/dashboard/postcss.config.js b/dashboard/postcss.config.js new file mode 100644 index 0000000..67cdf1a --- /dev/null +++ b/dashboard/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/dashboard/public/favicon.png b/dashboard/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..fdace3be24731b22acfa0a834c8a3a829f361d2c GIT binary patch literal 6136 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 H>@NQYgpEx& literal 0 HcmV?d00001 diff --git a/dashboard/public/icon-144.png b/dashboard/public/icon-144.png new file mode 100644 index 0000000000000000000000000000000000000000..eb96684c6411754b8f0250b88a162b4a96e79c9f GIT binary patch literal 5496 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 Rcm6On&@n>Ne!Fz-e*kk2##jIV literal 0 HcmV?d00001 diff --git a/dashboard/public/icon-192.png b/dashboard/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8cc78e7996605046beefb2557f69e8b9700a00 GIT binary patch literal 6515 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 J|GN3z{{?WbJoEqn literal 0 HcmV?d00001 diff --git a/dashboard/public/icon-72.png b/dashboard/public/icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..48b11f66a8aa4098e491c2bd4d1bb636a6b2b1e6 GIT binary patch literal 3655 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 tkF8BV) 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 literal 0 HcmV?d00001 diff --git a/dashboard/src/app/globals.css b/dashboard/src/app/globals.css new file mode 100644 index 0000000..8827f47 --- /dev/null +++ b/dashboard/src/app/globals.css @@ -0,0 +1,62 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 20 14.3% 4.1%; + --card: 0 0% 100%; + --card-foreground: 20 14.3% 4.1%; + --popover: 0 0% 100%; + --popover-foreground: 20 14.3% 4.1%; + --primary: 24.6 95% 53.1%; + --primary-foreground: 60 9.1% 97.8%; + --secondary: 60 4.8% 95.9%; + --secondary-foreground: 24 9.8% 10%; + --muted: 60 4.8% 95.9%; + --muted-foreground: 25 5.3% 44.7%; + --accent: 60 4.8% 95.9%; + --accent-foreground: 24 9.8% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 60 9.1% 97.8%; + --border: 20 5.9% 90%; + --input: 20 5.9% 90%; + --ring: 24.6 95% 53.1%; + --radius: 0.5rem; + } + + .dark { + --background: 20 14.3% 4.1%; + --foreground: 60 9.1% 97.8%; + --card: 20 14.3% 4.1%; + --card-foreground: 60 9.1% 97.8%; + --popover: 20 14.3% 4.1%; + --popover-foreground: 60 9.1% 97.8%; + --primary: 20.5 90.2% 48.2%; + --primary-foreground: 60 9.1% 97.8%; + --secondary: 12 6.5% 15.1%; + --secondary-foreground: 60 9.1% 97.8%; + --muted: 12 6.5% 15.1%; + --muted-foreground: 24 5.4% 63.9%; + --accent: 12 6.5% 15.1%; + --accent-foreground: 60 9.1% 97.8%; + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 60 9.1% 97.8%; + --border: 12 6.5% 15.1%; + --input: 12 6.5% 15.1%; + --ring: 20.5 90.2% 48.2%; + } +} + + +@layer base { + * { + @apply border-border; + } + + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/dashboard/src/app/layout.tsx b/dashboard/src/app/layout.tsx new file mode 100644 index 0000000..9b81615 --- /dev/null +++ b/dashboard/src/app/layout.tsx @@ -0,0 +1,63 @@ +import type { Viewport } from 'next'; +import { Inter } from 'next/font/google'; +import './globals.css'; +import { cn } from '@/lib/utils'; +import { Toaster } from '@/components/ui/sonner'; +import React from 'react'; +import { ThemeProvider } from 'next-themes'; + +const inter = Inter({ subsets: ['latin'] }); + +const APP_NAME = 'Next Ory'; +const APP_DEFAULT_TITLE = 'Next Ory'; +const APP_TITLE_TEMPLATE = `%s | ${APP_DEFAULT_TITLE}`; +const APP_DESCRIPTION = 'Get started with ORY authentication quickly and easily.'; + +export const metadata = { + applicationName: APP_NAME, + title: { + default: APP_DEFAULT_TITLE, + template: APP_TITLE_TEMPLATE, + }, + description: APP_DESCRIPTION, + appleWebApp: { + capable: true, + statusBarStyle: 'default', + title: APP_DEFAULT_TITLE, + }, + formatDetection: { + telephone: false, + }, +}; + +export const viewport: Viewport = { + themeColor: '#0B0908', + width: 'device-width', +}; + +export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { + return ( + + + + + + +

+ + {children} + + +
+ + + ); +} diff --git a/dashboard/src/app/page.tsx b/dashboard/src/app/page.tsx new file mode 100644 index 0000000..8fbe383 --- /dev/null +++ b/dashboard/src/app/page.tsx @@ -0,0 +1,53 @@ +'use client'; + +import React, { useCallback, useEffect, useState } from 'react'; +import { kratos, LogoutLink } from '@/ory'; +import { useRouter } from 'next/navigation'; +import { ThemeToggle } from '@/components/themeToggle'; +import { Session } from '@ory/client'; +import { LogOut } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +export default function Page() { + + const router = useRouter(); + + const [session, setSession] = useState(); + const loadSession = useCallback(async () => { + console.log(kratos.toSession()); + return kratos.toSession(); + }, [router]); + + useEffect(() => { + + if (session) { + return; + } + + loadSession() + .then((response) => { + console.log(response.data); + response.data && setSession(response.data); + }) + .catch(() => { + const authentication_url = process.env.NEXT_PUBLIC_AUTHENTICATION_NODE_URL; + const dashboard_url = process.env.NEXT_PUBLIC_AUTHENTICATION_NODE_URL; + authentication_url && dashboard_url && + router.push(authentication_url + '/flow/login?return_to=' + dashboard_url); + }); + + }, [router, session]); + + const onLogout = LogoutLink(); + + return ( +
+
+ + +
+
+ ); +} diff --git a/dashboard/src/app/service-worker.ts b/dashboard/src/app/service-worker.ts new file mode 100644 index 0000000..0538ba3 --- /dev/null +++ b/dashboard/src/app/service-worker.ts @@ -0,0 +1,18 @@ +import type { PrecacheEntry } from '@serwist/precaching'; +import { installSerwist } from '@serwist/sw'; +import { defaultCache } from '@serwist/next/worker'; + +declare const self: ServiceWorkerGlobalScope & { + // Change this attribute's name to your `injectionPoint`. + // `injectionPoint` is an InjectManifest option. + // See https://serwist.pages.dev/docs/build/inject-manifest/configuring + __SW_MANIFEST: (PrecacheEntry | string)[] | undefined; +}; + +installSerwist({ + precacheEntries: self.__SW_MANIFEST, + skipWaiting: true, + clientsClaim: true, + navigationPreload: true, + runtimeCaching: defaultCache, +}); diff --git a/dashboard/src/components/themeProvider.tsx b/dashboard/src/components/themeProvider.tsx new file mode 100644 index 0000000..af4029a --- /dev/null +++ b/dashboard/src/components/themeProvider.tsx @@ -0,0 +1,8 @@ +'use client'; + +import * as React from 'react'; +import { ThemeProvider as NextThemesProvider, ThemeProviderProps } from 'next-themes'; + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children}; +} diff --git a/dashboard/src/components/themeToggle.tsx b/dashboard/src/components/themeToggle.tsx new file mode 100644 index 0000000..d8e00ae --- /dev/null +++ b/dashboard/src/components/themeToggle.tsx @@ -0,0 +1,43 @@ +'use client'; + +import * as React from 'react'; +import { Moon, Sun } from 'lucide-react'; +import { useTheme } from 'next-themes'; + +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; + +export function ThemeToggle() { + + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme('light')}> + Light + + setTheme('dark')}> + Dark + + setTheme('system')}> + System + + + + ); +} diff --git a/dashboard/src/components/ui/alert-dialog.tsx b/dashboard/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..d65d9d1 --- /dev/null +++ b/dashboard/src/components/ui/alert-dialog.tsx @@ -0,0 +1,141 @@ +'use client'; + +import * as React from 'react'; +import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'; + +import { cn } from '@/lib/utils'; +import { buttonVariants } from '@/components/ui/button'; + +const AlertDialog = AlertDialogPrimitive.Root; + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger; + +const AlertDialogPortal = AlertDialogPrimitive.Portal; + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)); +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; + +const AlertDialogHeader = ({ + className, + ...props + }: React.HTMLAttributes) => ( +
+); +AlertDialogHeader.displayName = 'AlertDialogHeader'; + +const AlertDialogFooter = ({ + className, + ...props + }: React.HTMLAttributes) => ( +
+); +AlertDialogFooter.displayName = 'AlertDialogFooter'; + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName; + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +}; diff --git a/dashboard/src/components/ui/alert.tsx b/dashboard/src/components/ui/alert.tsx new file mode 100644 index 0000000..0d93e7c --- /dev/null +++ b/dashboard/src/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; + +const alertVariants = cva( + 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', + { + variants: { + variant: { + default: 'bg-background text-foreground', + destructive: + 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +); + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)); +Alert.displayName = 'Alert'; + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +AlertTitle.displayName = 'AlertTitle'; + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +AlertDescription.displayName = 'AlertDescription'; + +export { Alert, AlertTitle, AlertDescription }; diff --git a/dashboard/src/components/ui/badge.tsx b/dashboard/src/components/ui/badge.tsx new file mode 100644 index 0000000..a59a355 --- /dev/null +++ b/dashboard/src/components/ui/badge.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; + +const badgeVariants = cva( + 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +); + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps { +} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ); +} + +export { Badge, badgeVariants }; diff --git a/dashboard/src/components/ui/button.tsx b/dashboard/src/components/ui/button.tsx new file mode 100644 index 0000000..0ae7431 --- /dev/null +++ b/dashboard/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import { Slot } from '@radix-ui/react-slot'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; + +const buttonVariants = cva( + 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/90', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + outline: + 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button'; + return ( + + ); + }, +); +Button.displayName = 'Button'; + +export { Button, buttonVariants }; diff --git a/dashboard/src/components/ui/card.tsx b/dashboard/src/components/ui/card.tsx new file mode 100644 index 0000000..3c69472 --- /dev/null +++ b/dashboard/src/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from 'react'; + +import { cn } from '@/lib/utils'; + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +Card.displayName = 'Card'; + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = 'CardHeader'; + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardTitle.displayName = 'CardTitle'; + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardDescription.displayName = 'CardDescription'; + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardContent.displayName = 'CardContent'; + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = 'CardFooter'; + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; diff --git a/dashboard/src/components/ui/checkbox.tsx b/dashboard/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..96c99d1 --- /dev/null +++ b/dashboard/src/components/ui/checkbox.tsx @@ -0,0 +1,30 @@ +'use client'; + +import * as React from 'react'; +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; +import { Check } from 'lucide-react'; + +import { cn } from '@/lib/utils'; + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; + +export { Checkbox }; diff --git a/dashboard/src/components/ui/dropdown-menu.tsx b/dashboard/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..f50a704 --- /dev/null +++ b/dashboard/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,200 @@ +'use client'; + +import * as React from 'react'; +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; +import { Check, ChevronRight, Circle } from 'lucide-react'; + +import { cn } from '@/lib/utils'; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean +} +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean +} +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean +} +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props + }: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = 'DropdownMenuShortcut'; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/dashboard/src/components/ui/form.tsx b/dashboard/src/components/ui/form.tsx new file mode 100644 index 0000000..6560780 --- /dev/null +++ b/dashboard/src/components/ui/form.tsx @@ -0,0 +1,169 @@ +import * as React from 'react'; +import * as LabelPrimitive from '@radix-ui/react-label'; +import { Slot } from '@radix-ui/react-slot'; +import { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext } from 'react-hook-form'; + +import { cn } from '@/lib/utils'; +import { Label } from '@/components/ui/label'; + +const Form = FormProvider; + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +> = { + name: TName +} + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue, +); + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +>({ + ...props + }: ControllerProps) => { + return ( + + + + ); +}; + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext); + const itemContext = React.useContext(FormItemContext); + const { getFieldState, formState } = useFormContext(); + + const fieldState = getFieldState(fieldContext.name, formState); + + if (!fieldContext) { + throw new Error('useFormField should be used within '); + } + + const { id } = itemContext; + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + }; +}; + +type FormItemContextValue = { + id: string +} + +const FormItemContext = React.createContext( + {} as FormItemContextValue, +); + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId(); + + return ( + +
+ + ); +}); +FormItem.displayName = 'FormItem'; + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField(); + + return ( +