From 97be3666a05090dacf927a531eca7ebdb1bd8058 Mon Sep 17 00:00:00 2001 From: Amirhossein Mohammadi Date: Wed, 18 Dec 2024 21:54:26 +0330 Subject: [PATCH] initial commit --- .eslintrc.json | 9 + .gitignore | 40 + .prettierrc | 11 + .vscode/settings.json | 3 + README.md | 66 ++ app/(auth)/(signin)/page.tsx | 19 + app/(auth)/_components/google-auth-button.tsx | 20 + app/api/auth/[...nextauth]/route.ts | 2 + app/app/layout.tsx | 19 + app/app/loading.tsx | 13 + app/app/overview/page.tsx | 23 + app/app/page.tsx | 12 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 115 +++ app/layout.tsx | 70 ++ app/manifest.json | 26 + app/not-found.tsx | 32 + app/sw.ts | 25 + auth.config.ts | 16 + auth.ts | 4 + bun.lockb | Bin 0 -> 298960 bytes components.json | 16 + components/breadcrumbs.tsx | 41 + components/date-range-picker.tsx | 63 ++ components/file-uploader.tsx | 315 ++++++++ components/form-card-skeleton.tsx | 52 ++ components/icons.tsx | 107 +++ .../layout/ThemeToggle/theme-provider.tsx | 11 + .../layout/ThemeToggle/theme-toggle.tsx | 37 + components/layout/auth-info.tsx | 43 + components/layout/header.tsx | 25 + components/layout/page-container.tsx | 22 + components/layout/providers.tsx | 20 + components/modals/alert-modal.tsx | 46 ++ components/mode-toggle.tsx | 37 + components/nav-main.tsx | 73 ++ components/nav-projects.tsx | 89 ++ components/providers/theme-provider.tsx | 9 + components/search-input.tsx | 24 + components/team-switcher.tsx | 89 ++ components/ui/accordion.tsx | 57 ++ components/ui/alert-dialog.tsx | 145 ++++ components/ui/alert.tsx | 59 ++ components/ui/avatar.tsx | 50 ++ components/ui/background-beams.tsx | 141 ++++ components/ui/badge.tsx | 36 + components/ui/breadcrumb.tsx | 115 +++ components/ui/button.tsx | 57 ++ components/ui/calendar.tsx | 71 ++ components/ui/card.tsx | 83 ++ components/ui/chart.tsx | 364 +++++++++ components/ui/chat/chat-bubble.tsx | 202 +++++ components/ui/chat/chat-input.tsx | 23 + components/ui/chat/chat-message-list.tsx | 23 + components/ui/chat/expandable-chat.tsx | 153 ++++ components/ui/chat/message-loading.tsx | 45 ++ components/ui/checkbox.tsx | 30 + components/ui/collapsible.tsx | 11 + components/ui/command.tsx | 155 ++++ components/ui/data-table.tsx | 118 +++ components/ui/dialog.tsx | 122 +++ components/ui/dropdown-menu.tsx | 207 +++++ components/ui/form.tsx | 181 +++++ components/ui/heading.tsx | 13 + components/ui/input-otp.tsx | 70 ++ components/ui/input.tsx | 25 + components/ui/label.tsx | 26 + components/ui/loader.tsx | 20 + components/ui/modal.tsx | 42 + components/ui/popover.tsx | 31 + components/ui/progress.tsx | 28 + components/ui/radio-group.tsx | 44 + components/ui/rainbow-button.tsx | 33 + components/ui/scroll-area.tsx | 48 ++ components/ui/select.tsx | 162 ++++ components/ui/separator.tsx | 31 + components/ui/sheet.tsx | 140 ++++ components/ui/sidebar.tsx | 763 ++++++++++++++++++ components/ui/skeleton.tsx | 15 + components/ui/slider.tsx | 28 + components/ui/sonner.tsx | 31 + components/ui/switch.tsx | 29 + components/ui/table.tsx | 117 +++ components/ui/table/data-table-filter-box.tsx | 157 ++++ .../ui/table/data-table-reset-filter.tsx | 22 + components/ui/table/data-table-search.tsx | 42 + components/ui/table/data-table-skeleton.tsx | 91 +++ components/ui/table/data-table.tsx | 239 ++++++ components/ui/tabs.tsx | 55 ++ components/ui/textarea.tsx | 24 + components/ui/tooltip.tsx | 30 + constants/data.ts | 11 + hooks/use-breadcrumbs.tsx | 46 ++ hooks/use-breakpoints.tsx | 33 + hooks/use-callback-ref.tsx | 27 + hooks/use-controllable-state.tsx | 67 ++ hooks/use-debounce.tsx | 19 + hooks/use-mobile.tsx | 21 + hooks/use-multistep-form.tsx | 28 + lib/form-schema.ts | 11 + lib/menu-list.ts | 95 +++ lib/searchparams.ts | 17 + lib/serial.ts | 42 + lib/utils.ts | 24 + middleware.ts | 17 + next.config.js | 22 + package.json | 99 +++ postcss.config.js | 6 + public/.well-known/assetlinks.json | 17 + public/icons/192.png | Bin 0 -> 46763 bytes public/icons/512.png | Bin 0 -> 275453 bytes public/icons/700.png | Bin 0 -> 442371 bytes public/icons/icon-192x192.png | Bin 0 -> 74556 bytes public/next.svg | 1 + public/vercel.svg | 1 + tailwind.config.js | 149 ++++ tsconfig.json | 28 + types/index.ts | 35 + types/next-auth.d.ts | 8 + 119 files changed, 7272 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 app/(auth)/(signin)/page.tsx create mode 100644 app/(auth)/_components/google-auth-button.tsx create mode 100644 app/api/auth/[...nextauth]/route.ts create mode 100644 app/app/layout.tsx create mode 100644 app/app/loading.tsx create mode 100644 app/app/overview/page.tsx create mode 100644 app/app/page.tsx create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/manifest.json create mode 100644 app/not-found.tsx create mode 100644 app/sw.ts create mode 100644 auth.config.ts create mode 100644 auth.ts create mode 100644 bun.lockb create mode 100644 components.json create mode 100644 components/breadcrumbs.tsx create mode 100644 components/date-range-picker.tsx create mode 100644 components/file-uploader.tsx create mode 100644 components/form-card-skeleton.tsx create mode 100644 components/icons.tsx create mode 100644 components/layout/ThemeToggle/theme-provider.tsx create mode 100644 components/layout/ThemeToggle/theme-toggle.tsx create mode 100644 components/layout/auth-info.tsx create mode 100644 components/layout/header.tsx create mode 100644 components/layout/page-container.tsx create mode 100644 components/layout/providers.tsx create mode 100644 components/modals/alert-modal.tsx create mode 100644 components/mode-toggle.tsx create mode 100644 components/nav-main.tsx create mode 100644 components/nav-projects.tsx create mode 100644 components/providers/theme-provider.tsx create mode 100644 components/search-input.tsx create mode 100644 components/team-switcher.tsx create mode 100644 components/ui/accordion.tsx create mode 100644 components/ui/alert-dialog.tsx create mode 100644 components/ui/alert.tsx create mode 100644 components/ui/avatar.tsx create mode 100644 components/ui/background-beams.tsx create mode 100644 components/ui/badge.tsx create mode 100644 components/ui/breadcrumb.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/calendar.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/chart.tsx create mode 100644 components/ui/chat/chat-bubble.tsx create mode 100644 components/ui/chat/chat-input.tsx create mode 100644 components/ui/chat/chat-message-list.tsx create mode 100644 components/ui/chat/expandable-chat.tsx create mode 100644 components/ui/chat/message-loading.tsx create mode 100644 components/ui/checkbox.tsx create mode 100644 components/ui/collapsible.tsx create mode 100644 components/ui/command.tsx create mode 100644 components/ui/data-table.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/dropdown-menu.tsx create mode 100644 components/ui/form.tsx create mode 100644 components/ui/heading.tsx create mode 100644 components/ui/input-otp.tsx create mode 100644 components/ui/input.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/loader.tsx create mode 100644 components/ui/modal.tsx create mode 100644 components/ui/popover.tsx create mode 100644 components/ui/progress.tsx create mode 100644 components/ui/radio-group.tsx create mode 100644 components/ui/rainbow-button.tsx create mode 100644 components/ui/scroll-area.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/separator.tsx create mode 100644 components/ui/sheet.tsx create mode 100644 components/ui/sidebar.tsx create mode 100644 components/ui/skeleton.tsx create mode 100644 components/ui/slider.tsx create mode 100644 components/ui/sonner.tsx create mode 100644 components/ui/switch.tsx create mode 100644 components/ui/table.tsx create mode 100644 components/ui/table/data-table-filter-box.tsx create mode 100644 components/ui/table/data-table-reset-filter.tsx create mode 100644 components/ui/table/data-table-search.tsx create mode 100644 components/ui/table/data-table-skeleton.tsx create mode 100644 components/ui/table/data-table.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 components/ui/textarea.tsx create mode 100644 components/ui/tooltip.tsx create mode 100644 constants/data.ts create mode 100644 hooks/use-breadcrumbs.tsx create mode 100644 hooks/use-breakpoints.tsx create mode 100644 hooks/use-callback-ref.tsx create mode 100644 hooks/use-controllable-state.tsx create mode 100644 hooks/use-debounce.tsx create mode 100644 hooks/use-mobile.tsx create mode 100644 hooks/use-multistep-form.tsx create mode 100644 lib/form-schema.ts create mode 100644 lib/menu-list.ts create mode 100644 lib/searchparams.ts create mode 100644 lib/serial.ts create mode 100644 lib/utils.ts create mode 100644 middleware.ts create mode 100644 next.config.js create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/.well-known/assetlinks.json create mode 100644 public/icons/192.png create mode 100644 public/icons/512.png create mode 100644 public/icons/700.png create mode 100644 public/icons/icon-192x192.png create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 types/index.ts create mode 100644 types/next-auth.d.ts diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..1023c19 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,9 @@ +{ + "extends": "next/core-web-vitals", + "plugins": ["@typescript-eslint"], + "rules": { + "@typescript-eslint/no-unused-vars": "off", + "import/no-unresolved": "error", + "import/named": "off" + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e9365e --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# 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*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# Serwist +public/sw* +public/swe-worker* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f395ecb --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "semi": true, + "useTabs": false, + "trailingComma": "none", + "singleQuote": true, + "tabWidth": 2, + "endOfLine": "lf", + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c55ca90 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cSpell.words": ["cuid"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..73702d7 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ + + + + + +
Next.js 14 Admin Dashboard Starter Template With Shadcn-ui
+
Built with the Next.js App Router
+
+
+View Demo + +
+ +## Overview + +This is a starter template using the following stack: + +- Framework - [Next.js 14](https://nextjs.org/13) +- Language - [TypeScript](https://www.typescriptlang.org) +- Styling - [Tailwind CSS](https://tailwindcss.com) +- Components - [Shadcn-ui](https://ui.shadcn.com) +- Schema Validations - [Zod](https://zod.dev) +- State Management - [Zustand](https://zustand-demo.pmnd.rs) +- Search params state manager - [Nuqs](https://nuqs.47ng.com/) +- Auth - [Auth.js](https://authjs.dev/) +- Tables - [Tanstack Tables](https://ui.shadcn.com/docs/components/data-table) +- Forms - [React Hook Form](https://ui.shadcn.com/docs/components/form) +- Command+k interface - [kbar](https://kbar.vercel.app/) +- Linting - [ESLint](https://eslint.org) +- Pre-commit Hooks - [Husky](https://typicode.github.io/husky/) +- Formatting - [Prettier](https://prettier.io) + +_If you are looking for a React admin dashboard starter, here is the [repo](https://github.com/Kiranism/react-shadcn-dashboard-starter)._ + +## Pages + +| Pages | Specifications | +| :-------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | +| [Signup](https://next-shadcn-dashboard-starter.vercel.app/) | Authentication with **NextAuth** supports Social logins and email logins (Enter dummy email for demo). | +| [Dashboard](https://next-shadcn-dashboard-starter.vercel.app/app) | Cards with recharts graphs for analytics. | +| [Employee](https://next-shadcn-dashboard-starter.vercel.app/app/employee) | Tanstack tables with server side searching, filter, pagination by Nuqs which is a Type-safe search params state manager in nextjs). | +| [Employee/new](https://next-shadcn-dashboard-starter.vercel.app/app/employee/new) | A Employee Form with shadcn form (react-hook-form + zod). | +| [Product](https://next-shadcn-dashboard-starter.vercel.app/app/product) | Tanstack tables with server side searching, filter, pagination by Nuqs which is a Type-safe search params state manager in nextjs | +| [Product/new](https://next-shadcn-dashboard-starter.vercel.app/app/product/new) | A Product Form with shadcn form (react-hook-form + zod). | +| [Profile](https://next-shadcn-dashboard-starter.vercel.app/app/profile) | Mutistep dynamic forms using react-hook-form and zod for form validation. | +| [Kanban Board](https://next-shadcn-dashboard-starter.vercel.app/app/kanban) | A Drag n Drop task management board with dnd-kit and zustand to persist state locally. | +| [Not Found](https://next-shadcn-dashboard-starter.vercel.app/app/notfound) | Not Found Page Added in the root level | +| - | - | + +## Getting Started + +Follow these steps to clone the repository and start the development server: + +- `git clone https://github.com/Kiranism/next-shadcn-dashboard-starter.git` +- `npm install` +- Create a `.env.local` file by copying the example environment file: + `cp env.example.txt .env.local` +- Add the required environment variables to the `.env.local` file. +- `npm run dev` + +You should now be able to access the application at http://localhost:3000. + +> [!WARNING] +> After cloning or forking the repository, be cautious when pulling or syncing with the latest changes, as this may result in breaking conflicts. + +Cheers! 🥂 diff --git a/app/(auth)/(signin)/page.tsx b/app/(auth)/(signin)/page.tsx new file mode 100644 index 0000000..3a659f6 --- /dev/null +++ b/app/(auth)/(signin)/page.tsx @@ -0,0 +1,19 @@ +import { Metadata } from 'next'; +import GoogleSignInButton from '../_components/google-auth-button'; + +export const metadata: Metadata = { + title: 'Sign-in', + description: 'Sign-in with Google' +}; + +export default function SignInViewPage() { + return ( +
+
+
+ +
+
+
+ ); +} diff --git a/app/(auth)/_components/google-auth-button.tsx b/app/(auth)/_components/google-auth-button.tsx new file mode 100644 index 0000000..35e6ee5 --- /dev/null +++ b/app/(auth)/_components/google-auth-button.tsx @@ -0,0 +1,20 @@ +'use client'; +import { useSearchParams } from 'next/navigation'; +import { signIn } from 'next-auth/react'; +import { Button } from '@/components/ui/button'; +import { DrumIcon } from 'lucide-react'; +import { Icons } from '@/components/icons'; +import { RainbowButton } from '@/components/ui/rainbow-button'; + +export default function GoogleSignInButton() { + const searchParams = useSearchParams(); + const callbackUrl = searchParams.get('callbackUrl'); + return ( + signIn('google', { callbackUrl: callbackUrl ?? '/app' })} + > + + Sign-in with Google + + ); +} diff --git a/app/api/auth/[...nextauth]/route.ts b/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..0aa1cd7 --- /dev/null +++ b/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,2 @@ +import { handlers } from '@/auth'; +export const { GET, POST } = handlers; diff --git a/app/app/layout.tsx b/app/app/layout.tsx new file mode 100644 index 0000000..717e027 --- /dev/null +++ b/app/app/layout.tsx @@ -0,0 +1,19 @@ +import type { Metadata } from 'next'; +import { cookies } from 'next/headers'; + +export const metadata: Metadata = { + title: 'Next-Shadcn-TWA', + description: + 'Trusted Web Activities Template built with Next.js, TailwindCSS and Shad-CN' +}; + +export default function DashboardLayout({ + children +}: { + children: React.ReactNode; +}) { + // Persisting the sidebar state in the cookie. + const cookieStore = cookies(); + const defaultOpen = cookieStore.get('sidebar:state')?.value === 'true'; + return <>{children}; +} diff --git a/app/app/loading.tsx b/app/app/loading.tsx new file mode 100644 index 0000000..91b45d0 --- /dev/null +++ b/app/app/loading.tsx @@ -0,0 +1,13 @@ +'use client'; + +import { Loader } from '@/components/ui/loader'; + +export default function Loading() { + return ( +
+
+ +
+
+ ); +} diff --git a/app/app/overview/page.tsx b/app/app/overview/page.tsx new file mode 100644 index 0000000..049ff8c --- /dev/null +++ b/app/app/overview/page.tsx @@ -0,0 +1,23 @@ +import PageContainer from '@/components/layout/page-container'; + +import { auth } from '@/auth'; +import { redirect } from 'next/navigation'; +import AuthInfo from '@/components/layout/auth-info'; + +export default async function OverViewPage() { + const session = await auth(); + + if (!session?.user) { + redirect('/signin'); + } + + return ( +
+
+
+ +
+
+
+ ); +} diff --git a/app/app/page.tsx b/app/app/page.tsx new file mode 100644 index 0000000..018e297 --- /dev/null +++ b/app/app/page.tsx @@ -0,0 +1,12 @@ +import { auth } from '@/auth'; +import { redirect } from 'next/navigation'; + +export default async function Dashboard() { + const session = await auth(); + + if (!session?.user) { + return redirect('/'); + } else { + redirect('/app/overview'); + } +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..bc15b7b --- /dev/null +++ b/app/globals.css @@ -0,0 +1,115 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 99%; + --foreground: 20 51% 4%; + --muted: 67 60% 90%; + --muted-foreground: 20 7% 25%; + --popover: 20 66% 98%; + --popover-foreground: 20 51% 3%; + --card: 0 0% 100%; + --card-foreground: 20 51% 3%; + --border: 20 15% 94%; + --input: 20 15% 94%; + --primary: 67 94% 54%; + --primary-foreground: 0 0% 12%; + --secondary: 20 12% 92%; + --secondary-foreground: 20 100% 32%; + --accent: 67 94% 54%; + --accent-foreground: 0 0% 5%; + --destructive: 0 80% 50%; + --destructive-foreground: 0 0% 100%; + --ring: 67 94% 54%; + --radius: 0.5rem; + --chart-1: 67 94% 44%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --sidebar-background: 0 0% 100%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 0 0% 0%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 67 94% 54%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + --color-1: 0 100% 63%; + --color-2: 270 100% 63%; + --color-3: 210 100% 63%; + --color-4: 195 100% 63%; + --color-5: 90 100% 63%; + } + + .dark { + --background: 0 0% 3%; + --foreground: 253 31% 98%; + --muted: 253 7% 13%; + --muted-foreground: 253 0% 63%; + --popover: 0 0% 1%; + --popover-foreground: 253 31% 98%; + --card: 0 0% 1%; + --card-foreground: 253 31% 99%; + --border: 0 0% 15%; + --input: 0 0% 15%; + --primary: 67 94% 54%; + --primary-foreground: 0 0% 1%; + --secondary: 0 0% 9%; + --secondary-foreground: 253 7% 69%; + --accent: 67 94% 54%; + --accent-foreground: 0 0% 0%; + --destructive: 339.2 90.36% 51.18%; + --destructive-foreground: 0 0% 100%; + --ring: 67 94% 54%; + --chart-1: 67 94% 54; + --chart-2: 253 13% 74%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + --sidebar-background: 0 0% 0%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 67 94% 54%; + --sidebar-primary-foreground: 0 0% 0%; + --sidebar-accent: 67 94% 54%; + --sidebar-accent-foreground: 0 0% 0%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 253 91% 58%%; + --color-1: 0 100% 63%; + --color-2: 270 100% 63%; + --color-3: 210 100% 63%; + --color-4: 195 100% 63%; + --color-5: 90 100% 63%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply box-border bg-background text-foreground; + } +} + +@layer utilities { + .min-h-screen { + min-height: 100vh; /* Fallback */ + min-height: 100dvh; + } + .h-screen { + height: 100vh; /* Fallback */ + height: 100dvh; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..bef2093 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,70 @@ +import { auth } from '@/auth'; +import Providers from '@/components/layout/providers'; +import { Toaster } from '@/components/ui/sonner'; +import NextTopLoader from 'nextjs-toploader'; +import './globals.css'; + +import type { Metadata, Viewport } from 'next'; + +const APP_NAME = 'Next-Shadcn-TWA'; +const APP_DEFAULT_TITLE = 'Next-Shadcn-TWA'; +const APP_TITLE_TEMPLATE = '%s - Next-Shadcn-TWA'; +const APP_DESCRIPTION = 'Next-Shadcn-TWA'; + +export const metadata: 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 + // startUpImage: [], + }, + formatDetection: { + telephone: false + }, + openGraph: { + type: 'website', + siteName: APP_NAME, + title: { + default: APP_DEFAULT_TITLE, + template: APP_TITLE_TEMPLATE + }, + description: APP_DESCRIPTION + }, + twitter: { + card: 'summary', + title: { + default: APP_DEFAULT_TITLE, + template: APP_TITLE_TEMPLATE + }, + description: APP_DESCRIPTION + } +}; + +export const viewport: Viewport = { + themeColor: '#FFFFFF' +}; + +export default async function RootLayout({ + children +}: { + children: React.ReactNode; +}) { + const session = await auth(); + return ( + + + + + + {children} + + + + ); +} diff --git a/app/manifest.json b/app/manifest.json new file mode 100644 index 0000000..b43c8d8 --- /dev/null +++ b/app/manifest.json @@ -0,0 +1,26 @@ +{ + "name": "Next-Shadcn-TWA", + "short_name": "Next-Shadcn-TWA", + "description": "Trusted Web Activity Template built with Next.js, TailwindCSS and Shad-CN", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#DEF81B", + "icons": [ + { + "src": "/icons/192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icons/512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "/icons/700.png", + "sizes": "700x700", + "type": "image/png" + } + ] +} diff --git a/app/not-found.tsx b/app/not-found.tsx new file mode 100644 index 0000000..9738cc6 --- /dev/null +++ b/app/not-found.tsx @@ -0,0 +1,32 @@ +'use client'; + +import { useRouter } from 'next/navigation'; + +import { Button } from '@/components/ui/button'; + +export default function NotFound() { + const router = useRouter(); + + return ( +
+ + 404 + +

+ Something's missing +

+

+ Sorry, the page you are looking for doesn't exist or has been + moved. +

+
+ + +
+
+ ); +} diff --git a/app/sw.ts b/app/sw.ts new file mode 100644 index 0000000..a03b9b9 --- /dev/null +++ b/app/sw.ts @@ -0,0 +1,25 @@ +import { defaultCache } from '@serwist/next/worker'; +import type { PrecacheEntry, SerwistGlobalConfig } from 'serwist'; +import { Serwist } from 'serwist'; + +// This declares the value of `injectionPoint` to TypeScript. +// `injectionPoint` is the string that will be replaced by the +// actual precache manifest. By default, this string is set to +// `"self.__SW_MANIFEST"`. +declare global { + interface WorkerGlobalScope extends SerwistGlobalConfig { + __SW_MANIFEST: (PrecacheEntry | string)[] | undefined; + } +} + +declare const self: ServiceWorkerGlobalScope; + +const serwist = new Serwist({ + precacheEntries: self.__SW_MANIFEST, + skipWaiting: true, + clientsClaim: true, + navigationPreload: true, + runtimeCaching: defaultCache +}); + +serwist.addEventListeners(); diff --git a/auth.config.ts b/auth.config.ts new file mode 100644 index 0000000..69718b0 --- /dev/null +++ b/auth.config.ts @@ -0,0 +1,16 @@ +import { NextAuthConfig } from 'next-auth'; +import GoogleProvider from 'next-auth/providers/google'; + +const authConfig = { + providers: [ + GoogleProvider({ + clientId: process.env.GOOGLE_CLIENT_ID ?? '', + clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? '' + }) + ], + pages: { + signIn: '/' //sigin page + } +} satisfies NextAuthConfig; + +export default authConfig; diff --git a/auth.ts b/auth.ts new file mode 100644 index 0000000..f428227 --- /dev/null +++ b/auth.ts @@ -0,0 +1,4 @@ +import NextAuth from 'next-auth'; +import authConfig from './auth.config'; + +export const { auth, handlers, signOut, signIn } = NextAuth(authConfig); diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..e3ab63dbb28e05f37dcc4729abde007a1598e721 GIT binary patch literal 298960 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 O0pH>T@sI!0zyASe->^Xd literal 0 HcmV?d00001 diff --git a/components.json b/components.json new file mode 100644 index 0000000..5045fe9 --- /dev/null +++ b/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "app/globals.css", + "baseColor": "zinc", + "cssVariables": true + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/components/breadcrumbs.tsx b/components/breadcrumbs.tsx new file mode 100644 index 0000000..3148339 --- /dev/null +++ b/components/breadcrumbs.tsx @@ -0,0 +1,41 @@ +'use client'; +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator +} from '@/components/ui/breadcrumb'; +import { useBreadcrumbs } from '@/hooks/use-breadcrumbs'; +import { Slash } from 'lucide-react'; +import { Fragment } from 'react'; + +export function Breadcrumbs() { + const items = useBreadcrumbs(); + if (items.length === 0) return null; + + return ( + + + {items.map((item, index) => ( + + {index !== items.length - 1 && ( + + {item.title} + + )} + {index < items.length - 1 && ( + + + + )} + {index === items.length - 1 && ( + {item.title} + )} + + ))} + + + ); +} diff --git a/components/date-range-picker.tsx b/components/date-range-picker.tsx new file mode 100644 index 0000000..823eeb6 --- /dev/null +++ b/components/date-range-picker.tsx @@ -0,0 +1,63 @@ +'use client'; +import { Button } from '@/components/ui/button'; +import { Calendar } from '@/components/ui/calendar'; +import { + Popover, + PopoverContent, + PopoverTrigger +} from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { CalendarIcon } from '@radix-ui/react-icons'; +import { addDays, format } from 'date-fns'; +import * as React from 'react'; +import { DateRange } from 'react-day-picker'; + +export function CalendarDateRangePicker({ + className +}: React.HTMLAttributes) { + const [date, setDate] = React.useState({ + from: new Date(2023, 0, 20), + to: addDays(new Date(2023, 0, 20), 20) + }); + + return ( +
+ + + + + + + + +
+ ); +} diff --git a/components/file-uploader.tsx b/components/file-uploader.tsx new file mode 100644 index 0000000..1d17af5 --- /dev/null +++ b/components/file-uploader.tsx @@ -0,0 +1,315 @@ +'use client'; + +import { CrossIcon, UploadIcon } from 'lucide-react'; +import Image from 'next/image'; +import * as React from 'react'; +import Dropzone, { + type DropzoneProps, + type FileRejection +} from 'react-dropzone'; +import { toast } from 'sonner'; + +import { Button } from '@/components/ui/button'; +import { Progress } from '@/components/ui/progress'; +import { ScrollArea } from '@/components/ui/scroll-area'; +import { useControllableState } from '@/hooks/use-controllable-state'; +import { cn, formatBytes } from '@/lib/utils'; + +interface FileUploaderProps extends React.HTMLAttributes { + /** + * Value of the uploader. + * @type File[] + * @default undefined + * @example value={files} + */ + value?: File[]; + + /** + * Function to be called when the value changes. + * @type React.Dispatch> + * @default undefined + * @example onValueChange={(files) => setFiles(files)} + */ + onValueChange?: React.Dispatch>; + + /** + * Function to be called when files are uploaded. + * @type (files: File[]) => Promise + * @default undefined + * @example onUpload={(files) => uploadFiles(files)} + */ + onUpload?: (files: File[]) => Promise; + + /** + * Progress of the uploaded files. + * @type Record | undefined + * @default undefined + * @example progresses={{ "file1.png": 50 }} + */ + progresses?: Record; + + /** + * Accepted file types for the uploader. + * @type { [key: string]: string[]} + * @default + * ```ts + * { "image/*": [] } + * ``` + * @example accept={["image/png", "image/jpeg"]} + */ + accept?: DropzoneProps['accept']; + + /** + * Maximum file size for the uploader. + * @type number | undefined + * @default 1024 * 1024 * 2 // 2MB + * @example maxSize={1024 * 1024 * 2} // 2MB + */ + maxSize?: DropzoneProps['maxSize']; + + /** + * Maximum number of files for the uploader. + * @type number | undefined + * @default 1 + * @example maxFiles={5} + */ + maxFiles?: DropzoneProps['maxFiles']; + + /** + * Whether the uploader should accept multiple files. + * @type boolean + * @default false + * @example multiple + */ + multiple?: boolean; + + /** + * Whether the uploader is disabled. + * @type boolean + * @default false + * @example disabled + */ + disabled?: boolean; +} + +export function FileUploader(props: FileUploaderProps) { + const { + value: valueProp, + onValueChange, + onUpload, + progresses, + accept = { 'image/*': [] }, + maxSize = 1024 * 1024 * 2, + maxFiles = 1, + multiple = false, + disabled = false, + className, + ...dropzoneProps + } = props; + + const [files, setFiles] = useControllableState({ + prop: valueProp, + onChange: onValueChange + }); + + const onDrop = React.useCallback( + (acceptedFiles: File[], rejectedFiles: FileRejection[]) => { + if (!multiple && maxFiles === 1 && acceptedFiles.length > 1) { + toast.error('Cannot upload more than 1 file at a time'); + return; + } + + if ((files?.length ?? 0) + acceptedFiles.length > maxFiles) { + toast.error(`Cannot upload more than ${maxFiles} files`); + return; + } + + const newFiles = acceptedFiles.map((file) => + Object.assign(file, { + preview: URL.createObjectURL(file) + }) + ); + + const updatedFiles = files ? [...files, ...newFiles] : newFiles; + + setFiles(updatedFiles); + + if (rejectedFiles.length > 0) { + rejectedFiles.forEach(({ file }) => { + toast.error(`File ${file.name} was rejected`); + }); + } + + if ( + onUpload && + updatedFiles.length > 0 && + updatedFiles.length <= maxFiles + ) { + const target = + updatedFiles.length > 0 ? `${updatedFiles.length} files` : `file`; + + toast.promise(onUpload(updatedFiles), { + loading: `Uploading ${target}...`, + success: () => { + setFiles([]); + return `${target} uploaded`; + }, + error: `Failed to upload ${target}` + }); + } + }, + + [files, maxFiles, multiple, onUpload, setFiles] + ); + + function onRemove(index: number) { + if (!files) return; + const newFiles = files.filter((_, i) => i !== index); + setFiles(newFiles); + onValueChange?.(newFiles); + } + + // Revoke preview url when component unmounts + React.useEffect(() => { + return () => { + if (!files) return; + files.forEach((file) => { + if (isFileWithPreview(file)) { + URL.revokeObjectURL(file.preview); + } + }); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const isDisabled = disabled || (files?.length ?? 0) >= maxFiles; + + return ( +
+ 1 || multiple} + disabled={isDisabled} + > + {({ getRootProps, getInputProps, isDragActive }) => ( +
+ + {isDragActive ? ( +
+
+
+

+ Drop the files here +

+
+ ) : ( +
+
+
+
+

+ Drag {`'n'`} drop files here, or click to select files +

+

+ You can upload + {maxFiles > 1 + ? ` ${maxFiles === Infinity ? 'multiple' : maxFiles} + files (up to ${formatBytes(maxSize)} each)` + : ` a file with ${formatBytes(maxSize)}`} +

+
+
+ )} +
+ )} +
+ {files?.length ? ( + +
+ {files?.map((file, index) => ( + onRemove(index)} + progress={progresses?.[file.name]} + /> + ))} +
+
+ ) : null} +
+ ); +} + +interface FileCardProps { + file: File; + onRemove: () => void; + progress?: number; +} + +function FileCard({ file, progress, onRemove }: FileCardProps) { + return ( +
+
+ {isFileWithPreview(file) ? ( + {file.name} + ) : null} +
+
+

+ {file.name} +

+

+ {formatBytes(file.size)} +

+
+ {progress ? : null} +
+
+
+ +
+
+ ); +} + +function isFileWithPreview(file: File): file is File & { preview: string } { + return 'preview' in file && typeof file.preview === 'string'; +} diff --git a/components/form-card-skeleton.tsx b/components/form-card-skeleton.tsx new file mode 100644 index 0000000..4de0ce5 --- /dev/null +++ b/components/form-card-skeleton.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { Card, CardContent, CardHeader } from './ui/card'; +import { Skeleton } from './ui/skeleton'; + +export default function FormCardSkeleton() { + return ( + + + {/* Title */} + + +
+ {/* Image upload area skeleton */} +
+ {/* Label */} + {/* Upload area */} +
+ + {/* Grid layout for form fields */} +
+ {/* Product Name field */} +
+ {/* Label */} + {/* Input */} +
+ + {/* Category field */} +
+ {/* Label */} + {/* Select */} +
+ + {/* Price field */} +
+ {/* Label */} + {/* Input */} +
+
+ + {/* Description field */} +
+ {/* Label */} + {/* Textarea */} +
+ + {/* Submit button */} + +
+
+
+ ); +} diff --git a/components/icons.tsx b/components/icons.tsx new file mode 100644 index 0000000..c1c3fae --- /dev/null +++ b/components/icons.tsx @@ -0,0 +1,107 @@ +import { + AlertTriangle, + ArrowRight, + Check, + ChevronLeft, + ChevronRight, + CircuitBoardIcon, + Command, + CreditCard, + File, + FileText, + HelpCircle, + Image, + Laptop, + LayoutDashboardIcon, + Loader2, + LogIn, + LucideIcon, + LucideProps, + LucideShoppingBag, + Moon, + MoreVertical, + Pizza, + Plus, + Settings, + SunMedium, + Trash, + Twitter, + User, + UserCircle2Icon, + UserPen, + UserX2Icon, + X +} from 'lucide-react'; + +export type Icon = LucideIcon; + +export const Icons = { + dashboard: LayoutDashboardIcon, + logo: Command, + login: LogIn, + close: X, + product: LucideShoppingBag, + spinner: Loader2, + kanban: CircuitBoardIcon, + chevronLeft: ChevronLeft, + chevronRight: ChevronRight, + trash: Trash, + employee: UserX2Icon, + post: FileText, + page: File, + userPen: UserPen, + user2: UserCircle2Icon, + media: Image, + settings: Settings, + billing: CreditCard, + ellipsis: MoreVertical, + add: Plus, + warning: AlertTriangle, + user: User, + arrowRight: ArrowRight, + help: HelpCircle, + pizza: Pizza, + sun: SunMedium, + moon: Moon, + laptop: Laptop, + gitHub: ({ ...props }: LucideProps) => ( + + ), + google: ({ ...props }: LucideProps) => ( + + + + + + + + ), + twitter: Twitter, + check: Check +}; diff --git a/components/layout/ThemeToggle/theme-provider.tsx b/components/layout/ThemeToggle/theme-provider.tsx new file mode 100644 index 0000000..04f313a --- /dev/null +++ b/components/layout/ThemeToggle/theme-provider.tsx @@ -0,0 +1,11 @@ +'use client'; + +import { ThemeProvider as NextThemesProvider } from 'next-themes'; +import { type ThemeProviderProps } from 'next-themes/dist/types'; + +export default function ThemeProvider({ + children, + ...props +}: ThemeProviderProps) { + return {children}; +} diff --git a/components/layout/ThemeToggle/theme-toggle.tsx b/components/layout/ThemeToggle/theme-toggle.tsx new file mode 100644 index 0000000..b232ac5 --- /dev/null +++ b/components/layout/ThemeToggle/theme-toggle.tsx @@ -0,0 +1,37 @@ +'use client'; +import { MoonIcon, SunIcon } from '@radix-ui/react-icons'; +import { useTheme } from 'next-themes'; + +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger +} from '@/components/ui/dropdown-menu'; +type CompProps = {}; +export default function ThemeToggle({}: CompProps) { + const { setTheme } = useTheme(); + return ( + + + + + + setTheme('light')}> + حالت روشن + + setTheme('dark')}> + حالت تیره + + setTheme('system')}> + حالت سیستم + + + + ); +} diff --git a/components/layout/auth-info.tsx b/components/layout/auth-info.tsx new file mode 100644 index 0000000..7c9ecb8 --- /dev/null +++ b/components/layout/auth-info.tsx @@ -0,0 +1,43 @@ +'use client'; +import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; + +import { + BadgeCheck, + Bell, + ChevronRight, + ChevronsUpDown, + CreditCard, + GalleryVerticalEnd, + LogOut +} from 'lucide-react'; +import { signOut, useSession } from 'next-auth/react'; +import { usePathname } from 'next/navigation'; +import * as React from 'react'; +import { Button } from '../ui/button'; + +export default function AuthInfo() { + const { data: session } = useSession(); + const pathname = usePathname(); + + return ( + + ); +} diff --git a/components/layout/header.tsx b/components/layout/header.tsx new file mode 100644 index 0000000..e6f26c5 --- /dev/null +++ b/components/layout/header.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { SidebarTrigger } from '../ui/sidebar'; +import { Separator } from '../ui/separator'; +import { Breadcrumbs } from '../breadcrumbs'; +import SearchInput from '../search-input'; +import ThemeToggle from './ThemeToggle/theme-toggle'; + +export default function Header() { + return ( +
+
+ + + +
+ +
+
+ +
+ +
+
+ ); +} diff --git a/components/layout/page-container.tsx b/components/layout/page-container.tsx new file mode 100644 index 0000000..ead51da --- /dev/null +++ b/components/layout/page-container.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { ScrollArea } from '@/components/ui/scroll-area'; + +export default function PageContainer({ + children, + scrollable = true +}: { + children: React.ReactNode; + scrollable?: boolean; +}) { + return ( + <> + {scrollable ? ( + +
{children}
+
+ ) : ( +
{children}
+ )} + + ); +} diff --git a/components/layout/providers.tsx b/components/layout/providers.tsx new file mode 100644 index 0000000..2560313 --- /dev/null +++ b/components/layout/providers.tsx @@ -0,0 +1,20 @@ +'use client'; +import React from 'react'; +import ThemeProvider from './ThemeToggle/theme-provider'; +import { SessionProvider, SessionProviderProps } from 'next-auth/react'; + +export default function Providers({ + session, + children +}: { + session: SessionProviderProps['session']; + children: React.ReactNode; +}) { + return ( + <> + + {children} + + + ); +} diff --git a/components/modals/alert-modal.tsx b/components/modals/alert-modal.tsx new file mode 100644 index 0000000..bc33ae9 --- /dev/null +++ b/components/modals/alert-modal.tsx @@ -0,0 +1,46 @@ +'use client'; +import { useEffect, useState } from 'react'; +import { Button } from '@/components/ui/button'; +import { Modal } from '@/components/ui/modal'; + +interface AlertModalProps { + isOpen: boolean; + onClose: () => void; + onConfirm: () => void; + loading: boolean; +} + +export const AlertModal: React.FC = ({ + isOpen, + onClose, + onConfirm, + loading +}) => { + const [isMounted, setIsMounted] = useState(false); + + useEffect(() => { + setIsMounted(true); + }, []); + + if (!isMounted) { + return null; + } + + return ( + +
+ + +
+
+ ); +}; diff --git a/components/mode-toggle.tsx b/components/mode-toggle.tsx new file mode 100644 index 0000000..77a6f14 --- /dev/null +++ b/components/mode-toggle.tsx @@ -0,0 +1,37 @@ +'use client'; + +import * as React from 'react'; +import { useTheme } from 'next-themes'; +import { MoonIcon, SunIcon } from '@radix-ui/react-icons'; + +import { Button } from '@/components/ui/button'; +import { + Tooltip, + TooltipContent, + TooltipTrigger, + TooltipProvider +} from '@/components/ui/tooltip'; + +export function ModeToggle() { + const { setTheme, theme } = useTheme(); + + return ( + + + + + + Switch Theme + + + ); +} diff --git a/components/nav-main.tsx b/components/nav-main.tsx new file mode 100644 index 0000000..6510855 --- /dev/null +++ b/components/nav-main.tsx @@ -0,0 +1,73 @@ +'use client'; + +import { ChevronRight, type LucideIcon } from 'lucide-react'; + +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger +} from '@/components/ui/collapsible'; +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem +} from '@/components/ui/sidebar'; + +export function NavMain({ + items +}: { + items: { + title: string; + url: string; + icon?: LucideIcon; + isActive?: boolean; + items?: { + title: string; + url: string; + }[]; + }[]; +}) { + return ( + + Platform + + {items.map((item) => ( + + + + + {item.icon && } + {item.title} + + + + + + {item.items?.map((subItem) => ( + + + + {subItem.title} + + + + ))} + + + + + ))} + + + ); +} diff --git a/components/nav-projects.tsx b/components/nav-projects.tsx new file mode 100644 index 0000000..ff3e600 --- /dev/null +++ b/components/nav-projects.tsx @@ -0,0 +1,89 @@ +'use client'; + +import { + Folder, + Forward, + MoreHorizontal, + Trash2, + type LucideIcon +} from 'lucide-react'; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger +} from '@/components/ui/dropdown-menu'; +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuAction, + SidebarMenuButton, + SidebarMenuItem, + useSidebar +} from '@/components/ui/sidebar'; + +export function NavProjects({ + projects +}: { + projects: { + name: string; + url: string; + icon: LucideIcon; + }[]; +}) { + const { isMobile } = useSidebar(); + + return ( + + Projects + + {projects.map((item) => ( + + + + + {item.name} + + + + + + + More + + + + + + View Project + + + + Share Project + + + + + Delete Project + + + + + ))} + + + + More + + + + + ); +} diff --git a/components/providers/theme-provider.tsx b/components/providers/theme-provider.tsx new file mode 100644 index 0000000..530befd --- /dev/null +++ b/components/providers/theme-provider.tsx @@ -0,0 +1,9 @@ +'use client'; + +import * as React from 'react'; +import { ThemeProvider as NextThemesProvider } from 'next-themes'; +import { type ThemeProviderProps } from 'next-themes/dist/types'; + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children}; +} diff --git a/components/search-input.tsx b/components/search-input.tsx new file mode 100644 index 0000000..011b519 --- /dev/null +++ b/components/search-input.tsx @@ -0,0 +1,24 @@ +'use client'; +import { Input } from '@/components/ui/input'; +import { useKBar } from 'kbar'; +import { ArrowRight, Search } from 'lucide-react'; +import { Button } from './ui/button'; + +export default function SearchInput() { + const { query } = useKBar(); + return ( +
+ +
+ ); +} diff --git a/components/team-switcher.tsx b/components/team-switcher.tsx new file mode 100644 index 0000000..bd10958 --- /dev/null +++ b/components/team-switcher.tsx @@ -0,0 +1,89 @@ +'use client'; + +import * as React from 'react'; +import { ChevronsUpDown, Plus } from 'lucide-react'; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger +} from '@/components/ui/dropdown-menu'; +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar +} from '@/components/ui/sidebar'; + +export function TeamSwitcher({ + teams +}: { + teams: { + name: string; + logo: React.ElementType; + plan: string; + }[]; +}) { + const { isMobile } = useSidebar(); + const [activeTeam, setActiveTeam] = React.useState(teams[0]); + + return ( + + + + + +
+ +
+
+ + {activeTeam.name} + + {activeTeam.plan} +
+ +
+
+ + + Teams + + {teams.map((team, index) => ( + setActiveTeam(team)} + className="gap-2 p-2" + > +
+ +
+ {team.name} + ⌘{index + 1} +
+ ))} + + +
+ +
+
Add team
+
+
+
+
+
+ ); +} diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx new file mode 100644 index 0000000..0e8b3b1 --- /dev/null +++ b/components/ui/accordion.tsx @@ -0,0 +1,57 @@ +'use client'; + +import * as React from 'react'; +import * as AccordionPrimitive from '@radix-ui/react-accordion'; +import { ChevronDownIcon } from '@radix-ui/react-icons'; + +import { cn } from '@/lib/utils'; + +const Accordion = AccordionPrimitive.Root; + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AccordionItem.displayName = 'AccordionItem'; + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180', + className + )} + {...props} + > + {children} + + + +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)); +AccordionContent.displayName = AccordionPrimitive.Content.displayName; + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/components/ui/alert-dialog.tsx b/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..ca10623 --- /dev/null +++ b/components/ui/alert-dialog.tsx @@ -0,0 +1,145 @@ +'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) => ( + + // yes, you have to set a timeout + setTimeout(() => (document.body.style.pointerEvents = ''), 100) + } + {...props} + /> +)); +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel +}; diff --git a/components/ui/alert.tsx b/components/ui/alert.tsx new file mode 100644 index 0000000..6f5b983 --- /dev/null +++ b/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 px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7', + { + 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/components/ui/avatar.tsx b/components/ui/avatar.tsx new file mode 100644 index 0000000..1346957 --- /dev/null +++ b/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +'use client'; + +import * as React from 'react'; +import * as AvatarPrimitive from '@radix-ui/react-avatar'; + +import { cn } from '@/lib/utils'; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/components/ui/background-beams.tsx b/components/ui/background-beams.tsx new file mode 100644 index 0000000..f0809b5 --- /dev/null +++ b/components/ui/background-beams.tsx @@ -0,0 +1,141 @@ +'use client'; +import React from 'react'; +import { motion } from 'framer-motion'; +import { cn } from '@/lib/utils'; + +export const BackgroundBeams = React.memo( + ({ className }: { className?: string }) => { + const paths = [ + 'M-380 -189C-380 -189 -312 216 152 343C616 470 684 875 684 875', + 'M-373 -197C-373 -197 -305 208 159 335C623 462 691 867 691 867', + 'M-366 -205C-366 -205 -298 200 166 327C630 454 698 859 698 859', + 'M-359 -213C-359 -213 -291 192 173 319C637 446 705 851 705 851', + 'M-352 -221C-352 -221 -284 184 180 311C644 438 712 843 712 843', + 'M-345 -229C-345 -229 -277 176 187 303C651 430 719 835 719 835', + 'M-338 -237C-338 -237 -270 168 194 295C658 422 726 827 726 827', + 'M-331 -245C-331 -245 -263 160 201 287C665 414 733 819 733 819', + 'M-324 -253C-324 -253 -256 152 208 279C672 406 740 811 740 811', + 'M-317 -261C-317 -261 -249 144 215 271C679 398 747 803 747 803', + 'M-310 -269C-310 -269 -242 136 222 263C686 390 754 795 754 795', + 'M-303 -277C-303 -277 -235 128 229 255C693 382 761 787 761 787', + 'M-296 -285C-296 -285 -228 120 236 247C700 374 768 779 768 779', + 'M-289 -293C-289 -293 -221 112 243 239C707 366 775 771 775 771', + 'M-282 -301C-282 -301 -214 104 250 231C714 358 782 763 782 763', + 'M-275 -309C-275 -309 -207 96 257 223C721 350 789 755 789 755', + 'M-268 -317C-268 -317 -200 88 264 215C728 342 796 747 796 747', + 'M-261 -325C-261 -325 -193 80 271 207C735 334 803 739 803 739', + 'M-254 -333C-254 -333 -186 72 278 199C742 326 810 731 810 731', + 'M-247 -341C-247 -341 -179 64 285 191C749 318 817 723 817 723', + 'M-240 -349C-240 -349 -172 56 292 183C756 310 824 715 824 715', + 'M-233 -357C-233 -357 -165 48 299 175C763 302 831 707 831 707', + 'M-226 -365C-226 -365 -158 40 306 167C770 294 838 699 838 699', + 'M-219 -373C-219 -373 -151 32 313 159C777 286 845 691 845 691', + 'M-212 -381C-212 -381 -144 24 320 151C784 278 852 683 852 683', + 'M-205 -389C-205 -389 -137 16 327 143C791 270 859 675 859 675', + 'M-198 -397C-198 -397 -130 8 334 135C798 262 866 667 866 667', + 'M-191 -405C-191 -405 -123 0 341 127C805 254 873 659 873 659', + 'M-184 -413C-184 -413 -116 -8 348 119C812 246 880 651 880 651', + 'M-177 -421C-177 -421 -109 -16 355 111C819 238 887 643 887 643', + 'M-170 -429C-170 -429 -102 -24 362 103C826 230 894 635 894 635', + 'M-163 -437C-163 -437 -95 -32 369 95C833 222 901 627 901 627', + 'M-156 -445C-156 -445 -88 -40 376 87C840 214 908 619 908 619', + 'M-149 -453C-149 -453 -81 -48 383 79C847 206 915 611 915 611', + 'M-142 -461C-142 -461 -74 -56 390 71C854 198 922 603 922 603', + 'M-135 -469C-135 -469 -67 -64 397 63C861 190 929 595 929 595', + 'M-128 -477C-128 -477 -60 -72 404 55C868 182 936 587 936 587', + 'M-121 -485C-121 -485 -53 -80 411 47C875 174 943 579 943 579', + 'M-114 -493C-114 -493 -46 -88 418 39C882 166 950 571 950 571', + 'M-107 -501C-107 -501 -39 -96 425 31C889 158 957 563 957 563', + 'M-100 -509C-100 -509 -32 -104 432 23C896 150 964 555 964 555', + 'M-93 -517C-93 -517 -25 -112 439 15C903 142 971 547 971 547', + 'M-86 -525C-86 -525 -18 -120 446 7C910 134 978 539 978 539', + 'M-79 -533C-79 -533 -11 -128 453 -1C917 126 985 531 985 531', + 'M-72 -541C-72 -541 -4 -136 460 -9C924 118 992 523 992 523', + 'M-65 -549C-65 -549 3 -144 467 -17C931 110 999 515 999 515', + 'M-58 -557C-58 -557 10 -152 474 -25C938 102 1006 507 1006 507', + 'M-51 -565C-51 -565 17 -160 481 -33C945 94 1013 499 1013 499', + 'M-44 -573C-44 -573 24 -168 488 -41C952 86 1020 491 1020 491', + 'M-37 -581C-37 -581 31 -176 495 -49C959 78 1027 483 1027 483' + ]; + return ( +
+ + + + {paths.map((path, index) => ( + + ))} + + {paths.map((path, index) => ( + + + + + + + ))} + + + + + + + + +
+ ); + } +); + +BackgroundBeams.displayName = 'BackgroundBeams'; diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx new file mode 100644 index 0000000..4ce58c0 --- /dev/null +++ b/components/ui/badge.tsx @@ -0,0 +1,36 @@ +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-md 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 shadow hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground shadow 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/components/ui/breadcrumb.tsx b/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..f209322 --- /dev/null +++ b/components/ui/breadcrumb.tsx @@ -0,0 +1,115 @@ +import * as React from 'react'; +import { ChevronRightIcon, DotsHorizontalIcon } from '@radix-ui/react-icons'; +import { Slot } from '@radix-ui/react-slot'; + +import { cn } from '@/lib/utils'; + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<'nav'> & { + separator?: React.ReactNode; + } +>(({ ...props }, ref) =>