Clean up code. Install shadcnui elements for later
This commit is contained in:
		
							
								
								
									
										20
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								package.json
									
									
									
									
									
								
							@@ -15,23 +15,43 @@
 | 
				
			|||||||
    "go": "git pull && next build && next start"
 | 
					    "go": "git pull && next build && next start"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "@hookform/resolvers": "^3.9.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-checkbox": "^1.1.1",
 | 
				
			||||||
 | 
					    "@radix-ui/react-dialog": "^1.1.1",
 | 
				
			||||||
 | 
					    "@radix-ui/react-dropdown-menu": "^2.1.1",
 | 
				
			||||||
 | 
					    "@radix-ui/react-label": "^2.1.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-popover": "^1.1.1",
 | 
				
			||||||
    "@radix-ui/react-progress": "^1.1.0",
 | 
					    "@radix-ui/react-progress": "^1.1.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-radio-group": "^1.2.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-select": "^2.1.1",
 | 
				
			||||||
 | 
					    "@radix-ui/react-slot": "^1.1.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-switch": "^1.1.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-toggle": "^1.1.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-toggle-group": "^1.1.0",
 | 
				
			||||||
 | 
					    "@radix-ui/react-tooltip": "^1.1.2",
 | 
				
			||||||
    "@t3-oss/env-nextjs": "^0.10.1",
 | 
					    "@t3-oss/env-nextjs": "^0.10.1",
 | 
				
			||||||
    "class-variance-authority": "^0.7.0",
 | 
					    "class-variance-authority": "^0.7.0",
 | 
				
			||||||
    "clsx": "^2.1.1",
 | 
					    "clsx": "^2.1.1",
 | 
				
			||||||
 | 
					    "cmdk": "^1.0.0",
 | 
				
			||||||
 | 
					    "date-fns": "^3.6.0",
 | 
				
			||||||
    "drizzle-orm": "^0.30.10",
 | 
					    "drizzle-orm": "^0.30.10",
 | 
				
			||||||
    "geist": "^1.3.1",
 | 
					    "geist": "^1.3.1",
 | 
				
			||||||
    "lucide-react": "^0.411.0",
 | 
					    "lucide-react": "^0.411.0",
 | 
				
			||||||
    "mysql2": "^3.10.3",
 | 
					    "mysql2": "^3.10.3",
 | 
				
			||||||
    "next": "^14.2.5",
 | 
					    "next": "^14.2.5",
 | 
				
			||||||
    "next-auth": "5.0.0-beta.19",
 | 
					    "next-auth": "5.0.0-beta.19",
 | 
				
			||||||
 | 
					    "next-themes": "^0.3.0",
 | 
				
			||||||
    "pm2": "^5.4.2",
 | 
					    "pm2": "^5.4.2",
 | 
				
			||||||
    "react": "^18.3.1",
 | 
					    "react": "^18.3.1",
 | 
				
			||||||
 | 
					    "react-day-picker": "^9.0.2",
 | 
				
			||||||
    "react-dom": "^18.3.1",
 | 
					    "react-dom": "^18.3.1",
 | 
				
			||||||
 | 
					    "react-hook-form": "^7.52.1",
 | 
				
			||||||
    "server-only": "^0.0.1",
 | 
					    "server-only": "^0.0.1",
 | 
				
			||||||
    "sharp": "^0.33.4",
 | 
					    "sharp": "^0.33.4",
 | 
				
			||||||
 | 
					    "sonner": "^1.5.0",
 | 
				
			||||||
    "tailwind-merge": "^2.4.0",
 | 
					    "tailwind-merge": "^2.4.0",
 | 
				
			||||||
    "tailwindcss-animate": "^1.0.7",
 | 
					    "tailwindcss-animate": "^1.0.7",
 | 
				
			||||||
 | 
					    "vaul": "^0.9.1",
 | 
				
			||||||
    "zod": "^3.23.8"
 | 
					    "zod": "^3.23.8"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1416
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1416
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					"use server";
 | 
				
			||||||
import { auth } from "~/auth";
 | 
					import { auth } from "~/auth";
 | 
				
			||||||
import No_Session from "~/components/auth/No_Session";
 | 
					import No_Session from "~/components/auth/No_Session";
 | 
				
			||||||
import TT_Header from "~/components/ui/TT_Header";
 | 
					import Header from "~/components/ui/Header";
 | 
				
			||||||
import Techs from "~/components/ui/Techs";
 | 
					import { getEmployees } from "~/server/functions";
 | 
				
			||||||
 | 
					import TechTable from "~/components/ui/TechTable";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async function HomePage() {
 | 
					export default async function HomePage() {
 | 
				
			||||||
  const session = await auth();
 | 
					  const session = await auth();
 | 
				
			||||||
  if (!session) {
 | 
					  if (!session) {
 | 
				
			||||||
    return <No_Session />
 | 
					    return <No_Session />
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
 | 
					    const employees = await getEmployees();
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <main className="min-h-screen
 | 
					      <main className="min-h-screen
 | 
				
			||||||
        bg-gradient-to-b from-[#111111] to-[#212325]">
 | 
					        bg-gradient-to-b from-[#111111] to-[#212325]">
 | 
				
			||||||
        <TT_Header />
 | 
					        <Header />
 | 
				
			||||||
        <Techs />
 | 
					        <TechTable employees={employees}/>
 | 
				
			||||||
      </main>
 | 
					      </main>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,14 @@
 | 
				
			|||||||
import Link from "next/link";
 | 
					import Link from "next/link";
 | 
				
			||||||
import Image from "next/image";
 | 
					import Image from "next/image";
 | 
				
			||||||
import Sign_In from "~/components/auth/Sign_In";
 | 
					import Sign_In from "~/components/auth/Sign_In";
 | 
				
			||||||
import TT_Header from "~/components/ui/TT_Header";
 | 
					import Header from "~/components/ui/Header";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function No_Session() {
 | 
					export default function No_Session() {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <main className="w-full min-h-screen mx-auto text-center pt-2 md:pt-10
 | 
					    <main className="w-full min-h-screen mx-auto text-center pt-2 md:pt-10
 | 
				
			||||||
      bg-gradient-to-b from-[#111111] to-[#212325]">
 | 
					      bg-gradient-to-b from-[#111111] to-[#212325]">
 | 
				
			||||||
      <div className="w-2/3 pt-4 pb-2 md:pt-8 md:pb-4 m-auto">
 | 
					      <div className="w-2/3 pt-4 pb-2 md:pt-8 md:pb-4 m-auto">
 | 
				
			||||||
        <TT_Header />
 | 
					        < Header />
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      < Sign_In />
 | 
					      < Sign_In />
 | 
				
			||||||
      <div className="w-5/6 mx-auto flex flex-col">
 | 
					      <div className="w-5/6 mx-auto flex flex-col">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import Image from "next/image";
 | 
					import Image from "next/image";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function TT_Header() {
 | 
					export default function Header() {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <header className="w-full py-2 pt-6 md:py-5">
 | 
					    <header className="w-full py-2 pt-6 md:py-5">
 | 
				
			||||||
      <div className="flex flex-row items-center text-center
 | 
					      <div className="flex flex-row items-center text-center
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
"use client"
 | 
					"use client"
 | 
				
			||||||
import * as React from "react"
 | 
					import * as React from "react"
 | 
				
			||||||
import { Progress } from "~/components/ui/progress"
 | 
					import { Progress } from "~/components/ui/shadcn/progress"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface Loading_Props {
 | 
					interface Loading_Props {
 | 
				
			||||||
  interval_amount: number
 | 
					  interval_amount: number
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@ interface Employee {
 | 
				
			|||||||
  updatedAt: Date;
 | 
					  updatedAt: Date;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function Table({ employees }: { employees: Employee[] }) {
 | 
					export default function TechTable({ employees }: { employees: Employee[] }) {
 | 
				
			||||||
  const { data: session, status } = useSession();
 | 
					  const { data: session, status } = useSession();
 | 
				
			||||||
  const [loading, setLoading] = useState(true);
 | 
					  const [loading, setLoading] = useState(true);
 | 
				
			||||||
  const [selectedIds, setSelectedIds] = useState<number[]>([]);
 | 
					  const [selectedIds, setSelectedIds] = useState<number[]>([]);
 | 
				
			||||||
@@ -158,7 +158,7 @@ export default function Table({ employees }: { employees: Employee[] }) {
 | 
				
			|||||||
              <th className="py-3 px-4 border border-[#3e4446]">
 | 
					              <th className="py-3 px-4 border border-[#3e4446]">
 | 
				
			||||||
                <input
 | 
					                <input
 | 
				
			||||||
                  type="checkbox"
 | 
					                  type="checkbox"
 | 
				
			||||||
                  className="m-auto cursor-pointer transform scale-150"
 | 
					                  className="m-auto cursor-pointer scale-150"
 | 
				
			||||||
                  checked={selectAll}
 | 
					                  checked={selectAll}
 | 
				
			||||||
                  onChange={handleSelectAllChange}
 | 
					                  onChange={handleSelectAllChange}
 | 
				
			||||||
                />
 | 
					                />
 | 
				
			||||||
@@ -177,7 +177,7 @@ export default function Table({ employees }: { employees: Employee[] }) {
 | 
				
			|||||||
                <td className="p-1 border border-[#3e4446]">
 | 
					                <td className="p-1 border border-[#3e4446]">
 | 
				
			||||||
                  <input
 | 
					                  <input
 | 
				
			||||||
                    type="checkbox"
 | 
					                    type="checkbox"
 | 
				
			||||||
                    className="m-0 cursor-pointer transform scale-150"
 | 
					                    className="m-auto cursor-pointer scale-150"
 | 
				
			||||||
                    checked={selectedIds.includes(employee.id)}
 | 
					                    checked={selectedIds.includes(employee.id)}
 | 
				
			||||||
                    onChange={() => handleCheckboxChange(employee.id)}
 | 
					                    onChange={() => handleCheckboxChange(employee.id)}
 | 
				
			||||||
                  />
 | 
					                  />
 | 
				
			||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
import { getEmployees } from "~/server/functions";
 | 
					 | 
				
			||||||
import Table from "~/components/ui/Table";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default async function Techs() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const employees = await getEmployees();
 | 
					 | 
				
			||||||
  return <Table employees={employees}/>;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										59
									
								
								src/components/ui/shadcn/button.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/components/ui/shadcn/button.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					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<HTMLButtonElement>,
 | 
				
			||||||
 | 
					    VariantProps<typeof buttonVariants> {
 | 
				
			||||||
 | 
					  asChild?: boolean
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
 | 
				
			||||||
 | 
					  ({ className, variant, size, asChild = false, ...props }, ref) => {
 | 
				
			||||||
 | 
					    const Comp = asChild ? Slot : "button"
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <Comp
 | 
				
			||||||
 | 
					        className={cn(buttonVariants({ variant, size, className }))}
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					Button.displayName = "Button"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Button, buttonVariants }
 | 
				
			||||||
							
								
								
									
										73
									
								
								src/components/ui/shadcn/calendar.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/components/ui/shadcn/calendar.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import { ChevronLeft, ChevronRight } from "lucide-react"
 | 
				
			||||||
 | 
					import { DayPicker } from "react-day-picker"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					import { buttonVariants } from "~/components/ui/button"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type CalendarProps = React.ComponentProps<typeof DayPicker>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Calendar({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  classNames,
 | 
				
			||||||
 | 
					  showOutsideDays = true,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: CalendarProps) {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <DayPicker
 | 
				
			||||||
 | 
					      showOutsideDays={showOutsideDays}
 | 
				
			||||||
 | 
					      className={cn("p-3", className)}
 | 
				
			||||||
 | 
					      classNames={{
 | 
				
			||||||
 | 
					        months: "flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",
 | 
				
			||||||
 | 
					        month: "space-y-4",
 | 
				
			||||||
 | 
					        caption: "flex justify-center pt-1 relative items-center",
 | 
				
			||||||
 | 
					        caption_label: "text-sm font-medium",
 | 
				
			||||||
 | 
					        nav: "space-x-1 flex items-center",
 | 
				
			||||||
 | 
					        nav_button: cn(
 | 
				
			||||||
 | 
					          buttonVariants({ variant: "outline" }),
 | 
				
			||||||
 | 
					          "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100"
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        nav_button_previous: "absolute left-1",
 | 
				
			||||||
 | 
					        nav_button_next: "absolute right-1",
 | 
				
			||||||
 | 
					        table: "w-full border-collapse space-y-1",
 | 
				
			||||||
 | 
					        head_row: "flex",
 | 
				
			||||||
 | 
					        head_cell:
 | 
				
			||||||
 | 
					          "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
 | 
				
			||||||
 | 
					        row: "flex w-full mt-2",
 | 
				
			||||||
 | 
					        cell: "h-9 w-9 text-center text-sm p-0 relative " +
 | 
				
			||||||
 | 
					          "[&:has([aria-selected].day-range-end)]:rounded-r-md " +
 | 
				
			||||||
 | 
					          "[&:has([aria-selected].day-outside)]:bg-accent/50 " +
 | 
				
			||||||
 | 
					          "[&:has([aria-selected])]:bg-accent " +
 | 
				
			||||||
 | 
					          "first:[&:has([aria-selected])]:rounded-l-md " +
 | 
				
			||||||
 | 
					          "last:[&:has([aria-selected])]:rounded-r-md " +
 | 
				
			||||||
 | 
					          "focus-within:relative focus-within:z-20",
 | 
				
			||||||
 | 
					        day: cn(
 | 
				
			||||||
 | 
					          buttonVariants({ variant: "ghost" }),
 | 
				
			||||||
 | 
					          "h-9 w-9 p-0 font-normal aria-selected:opacity-100"
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        day_range_end: "day-range-end",
 | 
				
			||||||
 | 
					        day_selected:
 | 
				
			||||||
 | 
					          "bg-primary text-primary-foreground hover:bg-primary " +
 | 
				
			||||||
 | 
					          "hover:text-primary-foreground focus:bg-primary " +
 | 
				
			||||||
 | 
					          "focus:text-primary-foreground",
 | 
				
			||||||
 | 
					        day_today: "bg-accent text-accent-foreground",
 | 
				
			||||||
 | 
					        day_outside:
 | 
				
			||||||
 | 
					          "day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 " +
 | 
				
			||||||
 | 
					          "aria-selected:text-muted-foreground aria-selected:opacity-30",
 | 
				
			||||||
 | 
					        day_disabled: "text-muted-foreground opacity-50",
 | 
				
			||||||
 | 
					        day_range_middle:
 | 
				
			||||||
 | 
					          "aria-selected:bg-accent aria-selected:text-accent-foreground",
 | 
				
			||||||
 | 
					        day_hidden: "invisible",
 | 
				
			||||||
 | 
					        ...classNames,
 | 
				
			||||||
 | 
					      }}
 | 
				
			||||||
 | 
					      components={{
 | 
				
			||||||
 | 
					        IconLeft: ({ ...props }) => <ChevronLeft className="h-4 w-4" />,
 | 
				
			||||||
 | 
					        IconRight: ({ ...props }) => <ChevronRight className="h-4 w-4" />,
 | 
				
			||||||
 | 
					      }}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					Calendar.displayName = "Calendar"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Calendar }
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/components/ui/shadcn/checkbox.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/components/ui/shadcn/checkbox.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					"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<typeof CheckboxPrimitive.Root>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <CheckboxPrimitive.Root
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background " +
 | 
				
			||||||
 | 
					        "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring " + 
 | 
				
			||||||
 | 
					        "focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 " +
 | 
				
			||||||
 | 
					        "data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <CheckboxPrimitive.Indicator
 | 
				
			||||||
 | 
					      className={cn("flex items-center justify-center text-current")}
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <Check className="h-4 w-4" />
 | 
				
			||||||
 | 
					    </CheckboxPrimitive.Indicator>
 | 
				
			||||||
 | 
					  </CheckboxPrimitive.Root>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					Checkbox.displayName = CheckboxPrimitive.Root.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Checkbox }
 | 
				
			||||||
							
								
								
									
										80
									
								
								src/components/ui/shadcn/combobox.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/components/ui/shadcn/combobox.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import { Check, ChevronsUpDown } from "lucide-react"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					import { Button } from "~/components/ui/button"
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  Command,
 | 
				
			||||||
 | 
					  CommandEmpty,
 | 
				
			||||||
 | 
					  CommandGroup,
 | 
				
			||||||
 | 
					  CommandInput,
 | 
				
			||||||
 | 
					  CommandItem,
 | 
				
			||||||
 | 
					  CommandList,
 | 
				
			||||||
 | 
					} from "~/components/ui/command"
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  Popover,
 | 
				
			||||||
 | 
					  PopoverContent,
 | 
				
			||||||
 | 
					  PopoverTrigger,
 | 
				
			||||||
 | 
					} from "~/components/ui/popover"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Define the type correctly as an array of objects
 | 
				
			||||||
 | 
					type ListItem = {
 | 
				
			||||||
 | 
					  value: string;
 | 
				
			||||||
 | 
					  label: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ComboboxDemoProps = {
 | 
				
			||||||
 | 
					  listItems: ListItem[];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function ComboboxDemo({ listItems }: ComboboxDemoProps) {
 | 
				
			||||||
 | 
					  const [open, setOpen] = React.useState(false);
 | 
				
			||||||
 | 
					  const [value, setValue] = React.useState("");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const selectedItem = listItems.find(
 | 
				
			||||||
 | 
					    (item) => item.value === value)?.label ?? "Select listItem...";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <Popover open={open} onOpenChange={setOpen}>
 | 
				
			||||||
 | 
					      <PopoverTrigger asChild>
 | 
				
			||||||
 | 
					        <Button
 | 
				
			||||||
 | 
					          variant="outline"
 | 
				
			||||||
 | 
					          role="combobox"
 | 
				
			||||||
 | 
					          aria-expanded={open}
 | 
				
			||||||
 | 
					          className="w-[200px] justify-between"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          {selectedItem}
 | 
				
			||||||
 | 
					          <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
 | 
				
			||||||
 | 
					        </Button>
 | 
				
			||||||
 | 
					      </PopoverTrigger>
 | 
				
			||||||
 | 
					      <PopoverContent className="w-[200px] p-0">
 | 
				
			||||||
 | 
					        <Command>
 | 
				
			||||||
 | 
					          <CommandInput placeholder="Search listItem..." />
 | 
				
			||||||
 | 
					          <CommandEmpty>No Item found.</CommandEmpty>
 | 
				
			||||||
 | 
					          <CommandList>
 | 
				
			||||||
 | 
					            <CommandGroup>
 | 
				
			||||||
 | 
					              {listItems.map((listItem) => (
 | 
				
			||||||
 | 
					                <CommandItem
 | 
				
			||||||
 | 
					                  key={listItem.value}
 | 
				
			||||||
 | 
					                  value={listItem.value}
 | 
				
			||||||
 | 
					                  onSelect={(currentValue) => {
 | 
				
			||||||
 | 
					                    setValue(currentValue === value ? "" : currentValue);
 | 
				
			||||||
 | 
					                    setOpen(false);
 | 
				
			||||||
 | 
					                  }}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <Check
 | 
				
			||||||
 | 
					                    className={cn(
 | 
				
			||||||
 | 
					                      "mr-2 h-4 w-4",
 | 
				
			||||||
 | 
					                      value === listItem.value ? "opacity-100" : "opacity-0"
 | 
				
			||||||
 | 
					                    )}
 | 
				
			||||||
 | 
					                  />
 | 
				
			||||||
 | 
					                  {listItem.label}
 | 
				
			||||||
 | 
					                </CommandItem>
 | 
				
			||||||
 | 
					              ))}
 | 
				
			||||||
 | 
					            </CommandGroup>
 | 
				
			||||||
 | 
					          </CommandList>
 | 
				
			||||||
 | 
					        </Command>
 | 
				
			||||||
 | 
					      </PopoverContent>
 | 
				
			||||||
 | 
					    </Popover>
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										168
									
								
								src/components/ui/shadcn/command.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/components/ui/shadcn/command.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import { type DialogProps } from "@radix-ui/react-dialog"
 | 
				
			||||||
 | 
					import { Command as CommandPrimitive } from "cmdk"
 | 
				
			||||||
 | 
					import { Search } from "lucide-react"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					import { Dialog, DialogContent } from "~/components/ui/dialog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Command = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof CommandPrimitive>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CommandPrimitive>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <CommandPrimitive
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "flex h-full w-full flex-col overflow-hidden " +
 | 
				
			||||||
 | 
					      "rounded-md bg-popover text-popover-foreground",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					Command.displayName = CommandPrimitive.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface CommandDialogProps extends DialogProps {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <Dialog {...props}>
 | 
				
			||||||
 | 
					      <DialogContent className="overflow-hidden p-0 shadow-lg">
 | 
				
			||||||
 | 
					        <Command className="[&_[cmdk-group-heading]]:px-2
 | 
				
			||||||
 | 
					          [&_[cmdk-group-heading]]:font-medium
 | 
				
			||||||
 | 
					          [&_[cmdk-group-heading]]:text-muted-foreground
 | 
				
			||||||
 | 
					          [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2
 | 
				
			||||||
 | 
					          [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5
 | 
				
			||||||
 | 
					          [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3
 | 
				
			||||||
 | 
					          [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
 | 
				
			||||||
 | 
					          {children}
 | 
				
			||||||
 | 
					        </Command>
 | 
				
			||||||
 | 
					      </DialogContent>
 | 
				
			||||||
 | 
					    </Dialog>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandInput = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof CommandPrimitive.Input>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <div className="flex items-center border-b px-3" cmdk-input-wrapper="">
 | 
				
			||||||
 | 
					    <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
 | 
				
			||||||
 | 
					    <CommandPrimitive.Input
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "flex h-11 w-full rounded-md bg-transparent py-3 text-sm " +
 | 
				
			||||||
 | 
					        "outline-none placeholder:text-muted-foreground " +
 | 
				
			||||||
 | 
					        "disabled:cursor-not-allowed disabled:opacity-50",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CommandInput.displayName = CommandPrimitive.Input.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandList = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof CommandPrimitive.List>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <CommandPrimitive.List
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CommandList.displayName = CommandPrimitive.List.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandEmpty = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof CommandPrimitive.Empty>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>
 | 
				
			||||||
 | 
					>((props, ref) => (
 | 
				
			||||||
 | 
					  <CommandPrimitive.Empty
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className="py-6 text-center text-sm"
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CommandEmpty.displayName = CommandPrimitive.Empty.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandGroup = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof CommandPrimitive.Group>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <CommandPrimitive.Group
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 " +
 | 
				
			||||||
 | 
					      "[&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs " +
 | 
				
			||||||
 | 
					      "[&_[cmdk-group-heading]]:font-medium " +
 | 
				
			||||||
 | 
					      "[&_[cmdk-group-heading]]:text-muted-foreground",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CommandGroup.displayName = CommandPrimitive.Group.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandSeparator = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof CommandPrimitive.Separator>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <CommandPrimitive.Separator
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("-mx-1 h-px bg-border", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					CommandSeparator.displayName = CommandPrimitive.Separator.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandItem = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof CommandPrimitive.Item>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <CommandPrimitive.Item
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "relative flex cursor-default select-none items-center rounded-sm " +
 | 
				
			||||||
 | 
					      "px-2 py-1.5 text-sm outline-none aria-selected:bg-accent " +
 | 
				
			||||||
 | 
					      "aria-selected:text-accent-foreground " +
 | 
				
			||||||
 | 
					      "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CommandItem.displayName = CommandPrimitive.Item.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CommandShortcut = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLSpanElement>) => {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <span
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "ml-auto text-xs tracking-widest text-muted-foreground",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					CommandShortcut.displayName = "CommandShortcut"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  Command,
 | 
				
			||||||
 | 
					  CommandDialog,
 | 
				
			||||||
 | 
					  CommandInput,
 | 
				
			||||||
 | 
					  CommandList,
 | 
				
			||||||
 | 
					  CommandEmpty,
 | 
				
			||||||
 | 
					  CommandGroup,
 | 
				
			||||||
 | 
					  CommandItem,
 | 
				
			||||||
 | 
					  CommandShortcut,
 | 
				
			||||||
 | 
					  CommandSeparator,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										41
									
								
								src/components/ui/shadcn/date-picker.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/components/ui/shadcn/date-picker.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import { format } from "date-fns"
 | 
				
			||||||
 | 
					import { Calendar as CalendarIcon } from "lucide-react"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					import { Button } from "~/components/ui/button"
 | 
				
			||||||
 | 
					import { Calendar } from "~/components/ui/calendar"
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  Popover,
 | 
				
			||||||
 | 
					  PopoverContent,
 | 
				
			||||||
 | 
					  PopoverTrigger,
 | 
				
			||||||
 | 
					} from "~/components/ui/popover"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function DatePickerDemo() {
 | 
				
			||||||
 | 
					  const [date, setDate] = React.useState<Date>()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <Popover>
 | 
				
			||||||
 | 
					      <PopoverTrigger asChild>
 | 
				
			||||||
 | 
					        <Button
 | 
				
			||||||
 | 
					          variant={"outline"}
 | 
				
			||||||
 | 
					          className={cn(
 | 
				
			||||||
 | 
					            "w-[280px] justify-start text-left font-normal",
 | 
				
			||||||
 | 
					            !date && "text-muted-foreground"
 | 
				
			||||||
 | 
					          )}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          <CalendarIcon className="mr-2 h-4 w-4" />
 | 
				
			||||||
 | 
					          {date ? format(date, "PPP") : <span>Pick a date</span>}
 | 
				
			||||||
 | 
					        </Button>
 | 
				
			||||||
 | 
					      </PopoverTrigger>
 | 
				
			||||||
 | 
					      <PopoverContent className="w-auto p-0">
 | 
				
			||||||
 | 
					        <Calendar
 | 
				
			||||||
 | 
					          mode="single"
 | 
				
			||||||
 | 
					          selected={date}
 | 
				
			||||||
 | 
					          onSelect={setDate}
 | 
				
			||||||
 | 
					          //initialFocus // Causes an error idk if it's needed
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </PopoverContent>
 | 
				
			||||||
 | 
					    </Popover>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										130
									
								
								src/components/ui/shadcn/dialog.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								src/components/ui/shadcn/dialog.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,130 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as DialogPrimitive from "@radix-ui/react-dialog"
 | 
				
			||||||
 | 
					import { X } from "lucide-react"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Dialog = DialogPrimitive.Root
 | 
				
			||||||
 | 
					const DialogTrigger = DialogPrimitive.Trigger
 | 
				
			||||||
 | 
					const DialogPortal = DialogPrimitive.Portal
 | 
				
			||||||
 | 
					const DialogClose = DialogPrimitive.Close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DialogOverlay = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DialogPrimitive.Overlay>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DialogPrimitive.Overlay
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in " +
 | 
				
			||||||
 | 
					      "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 " +
 | 
				
			||||||
 | 
					      "data-[state=open]:fade-in-0",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DialogContent = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DialogPrimitive.Content>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
 | 
				
			||||||
 | 
					>(({ className, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DialogPortal>
 | 
				
			||||||
 | 
					    <DialogOverlay />
 | 
				
			||||||
 | 
					    <DialogPrimitive.Content
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] " +
 | 
				
			||||||
 | 
					        "translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 " +
 | 
				
			||||||
 | 
					        "data-[state=open]:animate-in data-[state=closed]:animate-out " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:slide-out-to-left-1/2 " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:slide-out-to-top-[48%] " +
 | 
				
			||||||
 | 
					        "data-[state=open]:slide-in-from-left-1/2 " +
 | 
				
			||||||
 | 
					        "data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      {children}
 | 
				
			||||||
 | 
					      <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70
 | 
				
			||||||
 | 
					      ring-offset-background transition-opacity hover:opacity-100 focus:outline-none
 | 
				
			||||||
 | 
					      focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none
 | 
				
			||||||
 | 
					      data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
 | 
				
			||||||
 | 
					        <X className="h-4 w-4" />
 | 
				
			||||||
 | 
					        <span className="sr-only">Close</span>
 | 
				
			||||||
 | 
					      </DialogPrimitive.Close>
 | 
				
			||||||
 | 
					    </DialogPrimitive.Content>
 | 
				
			||||||
 | 
					  </DialogPortal>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DialogContent.displayName = DialogPrimitive.Content.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DialogHeader = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLDivElement>) => (
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "flex flex-col space-y-1.5 text-center sm:text-left",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					DialogHeader.displayName = "DialogHeader"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DialogFooter = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLDivElement>) => (
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					DialogFooter.displayName = "DialogFooter"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DialogTitle = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DialogPrimitive.Title>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DialogPrimitive.Title
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "text-lg font-semibold leading-none tracking-tight",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DialogTitle.displayName = DialogPrimitive.Title.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DialogDescription = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DialogPrimitive.Description>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DialogPrimitive.Description
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("text-sm text-muted-foreground", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DialogDescription.displayName = DialogPrimitive.Description.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  Dialog,
 | 
				
			||||||
 | 
					  DialogPortal,
 | 
				
			||||||
 | 
					  DialogOverlay,
 | 
				
			||||||
 | 
					  DialogClose,
 | 
				
			||||||
 | 
					  DialogTrigger,
 | 
				
			||||||
 | 
					  DialogContent,
 | 
				
			||||||
 | 
					  DialogHeader,
 | 
				
			||||||
 | 
					  DialogFooter,
 | 
				
			||||||
 | 
					  DialogTitle,
 | 
				
			||||||
 | 
					  DialogDescription,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										118
									
								
								src/components/ui/shadcn/drawer.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/components/ui/shadcn/drawer.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,118 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import { Drawer as DrawerPrimitive } from "vaul"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Drawer = ({
 | 
				
			||||||
 | 
					  shouldScaleBackground = true,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.ComponentProps<typeof DrawerPrimitive.Root>) => (
 | 
				
			||||||
 | 
					  <DrawerPrimitive.Root
 | 
				
			||||||
 | 
					    shouldScaleBackground={shouldScaleBackground}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					Drawer.displayName = "Drawer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerTrigger = DrawerPrimitive.Trigger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerPortal = DrawerPrimitive.Portal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerClose = DrawerPrimitive.Close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerOverlay = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DrawerPrimitive.Overlay>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DrawerPrimitive.Overlay
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("fixed inset-0 z-50 bg-black/80", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerContent = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DrawerPrimitive.Content>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
 | 
				
			||||||
 | 
					>(({ className, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DrawerPortal>
 | 
				
			||||||
 | 
					    <DrawerOverlay />
 | 
				
			||||||
 | 
					    <DrawerPrimitive.Content
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <div className="mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" />
 | 
				
			||||||
 | 
					      {children}
 | 
				
			||||||
 | 
					    </DrawerPrimitive.Content>
 | 
				
			||||||
 | 
					  </DrawerPortal>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DrawerContent.displayName = "DrawerContent"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerHeader = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLDivElement>) => (
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    className={cn("grid gap-1.5 p-4 text-center sm:text-left", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					DrawerHeader.displayName = "DrawerHeader"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerFooter = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLDivElement>) => (
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    className={cn("mt-auto flex flex-col gap-2 p-4", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					DrawerFooter.displayName = "DrawerFooter"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerTitle = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DrawerPrimitive.Title>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DrawerPrimitive.Title
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "text-lg font-semibold leading-none tracking-tight",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DrawerTitle.displayName = DrawerPrimitive.Title.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DrawerDescription = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DrawerPrimitive.Description>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DrawerPrimitive.Description
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("text-sm text-muted-foreground", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DrawerDescription.displayName = DrawerPrimitive.Description.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  Drawer,
 | 
				
			||||||
 | 
					  DrawerPortal,
 | 
				
			||||||
 | 
					  DrawerOverlay,
 | 
				
			||||||
 | 
					  DrawerTrigger,
 | 
				
			||||||
 | 
					  DrawerClose,
 | 
				
			||||||
 | 
					  DrawerContent,
 | 
				
			||||||
 | 
					  DrawerHeader,
 | 
				
			||||||
 | 
					  DrawerFooter,
 | 
				
			||||||
 | 
					  DrawerTitle,
 | 
				
			||||||
 | 
					  DrawerDescription,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										215
									
								
								src/components/ui/shadcn/dropdown-menu.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								src/components/ui/shadcn/dropdown-menu.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,215 @@
 | 
				
			|||||||
 | 
					"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<typeof DropdownMenuPrimitive.SubTrigger>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
 | 
				
			||||||
 | 
					    inset?: boolean
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					>(({ className, inset, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.SubTrigger
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "flex cursor-default select-none items-center rounded-sm " +
 | 
				
			||||||
 | 
					      "px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
 | 
				
			||||||
 | 
					      inset && "pl-8",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    {children}
 | 
				
			||||||
 | 
					    <ChevronRight className="ml-auto h-4 w-4" />
 | 
				
			||||||
 | 
					  </DropdownMenuPrimitive.SubTrigger>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuSubTrigger.displayName =
 | 
				
			||||||
 | 
					  DropdownMenuPrimitive.SubTrigger.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuSubContent = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.SubContent
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 " +
 | 
				
			||||||
 | 
					      "text-popover-foreground shadow-lg data-[state=open]:animate-in " +
 | 
				
			||||||
 | 
					      "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 " +
 | 
				
			||||||
 | 
					      "data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 " +
 | 
				
			||||||
 | 
					      "data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 " +
 | 
				
			||||||
 | 
					      "data-[side=left]:slide-in-from-right-2 " +
 | 
				
			||||||
 | 
					      "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuSubContent.displayName =
 | 
				
			||||||
 | 
					  DropdownMenuPrimitive.SubContent.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuContent = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DropdownMenuPrimitive.Content>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
 | 
				
			||||||
 | 
					>(({ className, sideOffset = 4, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.Portal>
 | 
				
			||||||
 | 
					    <DropdownMenuPrimitive.Content
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      sideOffset={sideOffset}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 " +
 | 
				
			||||||
 | 
					        "text-popover-foreground shadow-md data-[state=open]:animate-in " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 " +
 | 
				
			||||||
 | 
					        "data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 " +
 | 
				
			||||||
 | 
					        "data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 " +
 | 
				
			||||||
 | 
					        "data-[side=left]:slide-in-from-right-2 " +
 | 
				
			||||||
 | 
					        "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  </DropdownMenuPrimitive.Portal>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuItem = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DropdownMenuPrimitive.Item>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
 | 
				
			||||||
 | 
					    inset?: boolean
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					>(({ className, inset, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.Item
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "relative flex cursor-default select-none items-center rounded-sm " +
 | 
				
			||||||
 | 
					      "px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent " +
 | 
				
			||||||
 | 
					      "focus:text-accent-foreground data-[disabled]:pointer-events-none " +
 | 
				
			||||||
 | 
					      "data-[disabled]:opacity-50",
 | 
				
			||||||
 | 
					      inset && "pl-8",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuCheckboxItem = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
 | 
				
			||||||
 | 
					>(({ className, children, checked, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.CheckboxItem
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "relative flex cursor-default select-none items-center rounded-sm " +
 | 
				
			||||||
 | 
					      "py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent " +
 | 
				
			||||||
 | 
					      "focus:text-accent-foreground data-[disabled]:pointer-events-none " +
 | 
				
			||||||
 | 
					      "data-[disabled]:opacity-50",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    checked={checked}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
 | 
				
			||||||
 | 
					      <DropdownMenuPrimitive.ItemIndicator>
 | 
				
			||||||
 | 
					        <Check className="h-4 w-4" />
 | 
				
			||||||
 | 
					      </DropdownMenuPrimitive.ItemIndicator>
 | 
				
			||||||
 | 
					    </span>
 | 
				
			||||||
 | 
					    {children}
 | 
				
			||||||
 | 
					  </DropdownMenuPrimitive.CheckboxItem>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuCheckboxItem.displayName =
 | 
				
			||||||
 | 
					  DropdownMenuPrimitive.CheckboxItem.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuRadioItem = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
 | 
				
			||||||
 | 
					>(({ className, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.RadioItem
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "relative flex cursor-default select-none items-center rounded-sm " +
 | 
				
			||||||
 | 
					      "py-1.5 pl-8 pr-2 text-sm outline-none transition-colors " +
 | 
				
			||||||
 | 
					      "focus:bg-accent focus:text-accent-foreground " +
 | 
				
			||||||
 | 
					      "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
 | 
				
			||||||
 | 
					      <DropdownMenuPrimitive.ItemIndicator>
 | 
				
			||||||
 | 
					        <Circle className="h-2 w-2 fill-current" />
 | 
				
			||||||
 | 
					      </DropdownMenuPrimitive.ItemIndicator>
 | 
				
			||||||
 | 
					    </span>
 | 
				
			||||||
 | 
					    {children}
 | 
				
			||||||
 | 
					  </DropdownMenuPrimitive.RadioItem>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuLabel = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DropdownMenuPrimitive.Label>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
 | 
				
			||||||
 | 
					    inset?: boolean
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					>(({ className, inset, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.Label
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "px-2 py-1.5 text-sm font-semibold",
 | 
				
			||||||
 | 
					      inset && "pl-8",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuSeparator = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <DropdownMenuPrimitive.Separator
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("-mx-1 my-1 h-px bg-muted", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownMenuShortcut = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLSpanElement>) => {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <span
 | 
				
			||||||
 | 
					      className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  DropdownMenu,
 | 
				
			||||||
 | 
					  DropdownMenuTrigger,
 | 
				
			||||||
 | 
					  DropdownMenuContent,
 | 
				
			||||||
 | 
					  DropdownMenuItem,
 | 
				
			||||||
 | 
					  DropdownMenuCheckboxItem,
 | 
				
			||||||
 | 
					  DropdownMenuRadioItem,
 | 
				
			||||||
 | 
					  DropdownMenuLabel,
 | 
				
			||||||
 | 
					  DropdownMenuSeparator,
 | 
				
			||||||
 | 
					  DropdownMenuShortcut,
 | 
				
			||||||
 | 
					  DropdownMenuGroup,
 | 
				
			||||||
 | 
					  DropdownMenuPortal,
 | 
				
			||||||
 | 
					  DropdownMenuSub,
 | 
				
			||||||
 | 
					  DropdownMenuSubContent,
 | 
				
			||||||
 | 
					  DropdownMenuSubTrigger,
 | 
				
			||||||
 | 
					  DropdownMenuRadioGroup,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										178
									
								
								src/components/ui/shadcn/form.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								src/components/ui/shadcn/form.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,178 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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<TFieldValues> = FieldPath<TFieldValues>
 | 
				
			||||||
 | 
					> = {
 | 
				
			||||||
 | 
					  name: TName
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FormFieldContext = React.createContext<FormFieldContextValue>(
 | 
				
			||||||
 | 
					  {} as FormFieldContextValue
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FormField = <
 | 
				
			||||||
 | 
					  TFieldValues extends FieldValues = FieldValues,
 | 
				
			||||||
 | 
					  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
 | 
				
			||||||
 | 
					>({
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: ControllerProps<TFieldValues, TName>) => {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <FormFieldContext.Provider value={{ name: props.name }}>
 | 
				
			||||||
 | 
					      <Controller {...props} />
 | 
				
			||||||
 | 
					    </FormFieldContext.Provider>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 <FormField>")
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  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<FormItemContextValue>(
 | 
				
			||||||
 | 
					  {} as FormItemContextValue
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FormItem = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLDivElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLDivElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					  const id = React.useId()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <FormItemContext.Provider value={{ id }}>
 | 
				
			||||||
 | 
					      <div ref={ref} className={cn("space-y-2", className)} {...props} />
 | 
				
			||||||
 | 
					    </FormItemContext.Provider>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					FormItem.displayName = "FormItem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FormLabel = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof LabelPrimitive.Root>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					  const { error, formItemId } = useFormField()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <Label
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn(error && "text-destructive", className)}
 | 
				
			||||||
 | 
					      htmlFor={formItemId}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					FormLabel.displayName = "FormLabel"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FormControl = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof Slot>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof Slot>
 | 
				
			||||||
 | 
					>(({ ...props }, ref) => {
 | 
				
			||||||
 | 
					  const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <Slot
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      id={formItemId}
 | 
				
			||||||
 | 
					      aria-describedby={
 | 
				
			||||||
 | 
					        !error
 | 
				
			||||||
 | 
					          ? `${formDescriptionId}`
 | 
				
			||||||
 | 
					          : `${formDescriptionId} ${formMessageId}`
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      aria-invalid={!!error}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					FormControl.displayName = "FormControl"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FormDescription = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLParagraphElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLParagraphElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					  const { formDescriptionId } = useFormField()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <p
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      id={formDescriptionId}
 | 
				
			||||||
 | 
					      className={cn("text-sm text-muted-foreground", className)}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					FormDescription.displayName = "FormDescription"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FormMessage = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLParagraphElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLParagraphElement>
 | 
				
			||||||
 | 
					>(({ className, children, ...props }, ref) => {
 | 
				
			||||||
 | 
					  const { error, formMessageId } = useFormField()
 | 
				
			||||||
 | 
					  const body = error ? String(error?.message) : children
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!body) {
 | 
				
			||||||
 | 
					    return null
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <p
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      id={formMessageId}
 | 
				
			||||||
 | 
					      className={cn("text-sm font-medium text-destructive", className)}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      {body}
 | 
				
			||||||
 | 
					    </p>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					FormMessage.displayName = "FormMessage"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  useFormField,
 | 
				
			||||||
 | 
					  Form,
 | 
				
			||||||
 | 
					  FormItem,
 | 
				
			||||||
 | 
					  FormLabel,
 | 
				
			||||||
 | 
					  FormControl,
 | 
				
			||||||
 | 
					  FormDescription,
 | 
				
			||||||
 | 
					  FormMessage,
 | 
				
			||||||
 | 
					  FormField,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								src/components/ui/shadcn/input.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/components/ui/shadcn/input.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface InputProps
 | 
				
			||||||
 | 
					  extends React.InputHTMLAttributes<HTMLInputElement> {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Input = React.forwardRef<HTMLInputElement, InputProps>(
 | 
				
			||||||
 | 
					  ({ className, type, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <input
 | 
				
			||||||
 | 
					        type={type}
 | 
				
			||||||
 | 
					        className={cn(
 | 
				
			||||||
 | 
					          "flex h-10 w-full rounded-md border border-input bg-background px-3 " +
 | 
				
			||||||
 | 
					          "py-2 text-sm ring-offset-background file:border-0 file:bg-transparent " +
 | 
				
			||||||
 | 
					          "file:text-sm file:font-medium placeholder:text-muted-foreground " +
 | 
				
			||||||
 | 
					          "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring " +
 | 
				
			||||||
 | 
					          "focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
 | 
				
			||||||
 | 
					          className
 | 
				
			||||||
 | 
					        )}
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					Input.displayName = "Input"
 | 
				
			||||||
 | 
					export { Input }
 | 
				
			||||||
							
								
								
									
										27
									
								
								src/components/ui/shadcn/label.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/components/ui/shadcn/label.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as LabelPrimitive from "@radix-ui/react-label"
 | 
				
			||||||
 | 
					import { cva, type VariantProps } from "class-variance-authority"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const labelVariants = cva(
 | 
				
			||||||
 | 
					  "text-sm font-medium leading-none " +
 | 
				
			||||||
 | 
					  "peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Label = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof LabelPrimitive.Root>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
 | 
				
			||||||
 | 
					    VariantProps<typeof labelVariants>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <LabelPrimitive.Root
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(labelVariants(), className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					Label.displayName = LabelPrimitive.Root.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Label }
 | 
				
			||||||
							
								
								
									
										117
									
								
								src/components/ui/shadcn/pagination.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/components/ui/shadcn/pagination.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					import { ButtonProps, buttonVariants } from "~/components/ui/button"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (
 | 
				
			||||||
 | 
					  <nav
 | 
				
			||||||
 | 
					    role="navigation"
 | 
				
			||||||
 | 
					    aria-label="pagination"
 | 
				
			||||||
 | 
					    className={cn("mx-auto flex w-full justify-center", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					Pagination.displayName = "Pagination"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PaginationContent = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLUListElement,
 | 
				
			||||||
 | 
					  React.ComponentProps<"ul">
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <ul
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("flex flex-row items-center gap-1", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					PaginationContent.displayName = "PaginationContent"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PaginationItem = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLLIElement,
 | 
				
			||||||
 | 
					  React.ComponentProps<"li">
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <li ref={ref} className={cn("", className)} {...props} />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					PaginationItem.displayName = "PaginationItem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type PaginationLinkProps = {
 | 
				
			||||||
 | 
					  isActive?: boolean
 | 
				
			||||||
 | 
					} & Pick<ButtonProps, "size"> &
 | 
				
			||||||
 | 
					  React.ComponentProps<"a">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PaginationLink = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  isActive,
 | 
				
			||||||
 | 
					  size = "icon",
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: PaginationLinkProps) => (
 | 
				
			||||||
 | 
					  <a
 | 
				
			||||||
 | 
					    aria-current={isActive ? "page" : undefined}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      buttonVariants({
 | 
				
			||||||
 | 
					        variant: isActive ? "outline" : "ghost",
 | 
				
			||||||
 | 
					        size,
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					PaginationLink.displayName = "PaginationLink"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PaginationPrevious = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.ComponentProps<typeof PaginationLink>) => (
 | 
				
			||||||
 | 
					  <PaginationLink
 | 
				
			||||||
 | 
					    aria-label="Go to previous page"
 | 
				
			||||||
 | 
					    size="default"
 | 
				
			||||||
 | 
					    className={cn("gap-1 pl-2.5", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <ChevronLeft className="h-4 w-4" />
 | 
				
			||||||
 | 
					    <span>Previous</span>
 | 
				
			||||||
 | 
					  </PaginationLink>
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					PaginationPrevious.displayName = "PaginationPrevious"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PaginationNext = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.ComponentProps<typeof PaginationLink>) => (
 | 
				
			||||||
 | 
					  <PaginationLink
 | 
				
			||||||
 | 
					    aria-label="Go to next page"
 | 
				
			||||||
 | 
					    size="default"
 | 
				
			||||||
 | 
					    className={cn("gap-1 pr-2.5", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <span>Next</span>
 | 
				
			||||||
 | 
					    <ChevronRight className="h-4 w-4" />
 | 
				
			||||||
 | 
					  </PaginationLink>
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					PaginationNext.displayName = "PaginationNext"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PaginationEllipsis = ({
 | 
				
			||||||
 | 
					  className,
 | 
				
			||||||
 | 
					  ...props
 | 
				
			||||||
 | 
					}: React.ComponentProps<"span">) => (
 | 
				
			||||||
 | 
					  <span
 | 
				
			||||||
 | 
					    aria-hidden
 | 
				
			||||||
 | 
					    className={cn("flex h-9 w-9 items-center justify-center", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <MoreHorizontal className="h-4 w-4" />
 | 
				
			||||||
 | 
					    <span className="sr-only">More pages</span>
 | 
				
			||||||
 | 
					  </span>
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					PaginationEllipsis.displayName = "PaginationEllipsis"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  Pagination,
 | 
				
			||||||
 | 
					  PaginationContent,
 | 
				
			||||||
 | 
					  PaginationEllipsis,
 | 
				
			||||||
 | 
					  PaginationItem,
 | 
				
			||||||
 | 
					  PaginationLink,
 | 
				
			||||||
 | 
					  PaginationNext,
 | 
				
			||||||
 | 
					  PaginationPrevious,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										36
									
								
								src/components/ui/shadcn/popover.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/components/ui/shadcn/popover.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as PopoverPrimitive from "@radix-ui/react-popover"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Popover = PopoverPrimitive.Root
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PopoverTrigger = PopoverPrimitive.Trigger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PopoverContent = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof PopoverPrimitive.Content>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
 | 
				
			||||||
 | 
					>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <PopoverPrimitive.Portal>
 | 
				
			||||||
 | 
					    <PopoverPrimitive.Content
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      align={align}
 | 
				
			||||||
 | 
					      sideOffset={sideOffset}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md " +
 | 
				
			||||||
 | 
					        "outline-none data-[state=open]:animate-in data-[state=closed]:animate-out " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 " +
 | 
				
			||||||
 | 
					        "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 " +
 | 
				
			||||||
 | 
					        "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  </PopoverPrimitive.Portal>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					PopoverContent.displayName = PopoverPrimitive.Content.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Popover, PopoverTrigger, PopoverContent }
 | 
				
			||||||
							
								
								
									
										45
									
								
								src/components/ui/shadcn/radio-group.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/components/ui/shadcn/radio-group.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as RadioGroupPrimitive from "@radix-ui/react-radio-group"
 | 
				
			||||||
 | 
					import { Circle } from "lucide-react"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const RadioGroup = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof RadioGroupPrimitive.Root>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <RadioGroupPrimitive.Root
 | 
				
			||||||
 | 
					      className={cn("grid gap-2", className)}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					RadioGroup.displayName = RadioGroupPrimitive.Root.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const RadioGroupItem = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof RadioGroupPrimitive.Item>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <RadioGroupPrimitive.Item
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "aspect-square h-4 w-4 rounded-full border border-primary text-primary " +
 | 
				
			||||||
 | 
					        "ring-offset-background focus:outline-none focus-visible:ring-2 " +
 | 
				
			||||||
 | 
					        "focus-visible:ring-ring focus-visible:ring-offset-2 " +
 | 
				
			||||||
 | 
					        "disabled:cursor-not-allowed disabled:opacity-50",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <RadioGroupPrimitive.Indicator className="flex items-center justify-center">
 | 
				
			||||||
 | 
					        <Circle className="h-2.5 w-2.5 fill-current text-current" />
 | 
				
			||||||
 | 
					      </RadioGroupPrimitive.Indicator>
 | 
				
			||||||
 | 
					    </RadioGroupPrimitive.Item>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { RadioGroup, RadioGroupItem }
 | 
				
			||||||
							
								
								
									
										171
									
								
								src/components/ui/shadcn/select.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								src/components/ui/shadcn/select.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as SelectPrimitive from "@radix-ui/react-select"
 | 
				
			||||||
 | 
					import { Check, ChevronDown, ChevronUp } from "lucide-react"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Select = SelectPrimitive.Root
 | 
				
			||||||
 | 
					const SelectGroup = SelectPrimitive.Group
 | 
				
			||||||
 | 
					const SelectValue = SelectPrimitive.Value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SelectTrigger = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SelectPrimitive.Trigger>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
 | 
				
			||||||
 | 
					>(({ className, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SelectPrimitive.Trigger
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "flex h-10 w-full items-center justify-between rounded-md border " +
 | 
				
			||||||
 | 
					      "border-input bg-background px-3 py-2 text-sm ring-offset-background " +
 | 
				
			||||||
 | 
					      "placeholder:text-muted-foreground focus:outline-none focus:ring-2 " +
 | 
				
			||||||
 | 
					      "focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed " +
 | 
				
			||||||
 | 
					      "disabled:opacity-50 [&>span]:line-clamp-1",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    {children}
 | 
				
			||||||
 | 
					    <SelectPrimitive.Icon asChild>
 | 
				
			||||||
 | 
					      <ChevronDown className="h-4 w-4 opacity-50" />
 | 
				
			||||||
 | 
					    </SelectPrimitive.Icon>
 | 
				
			||||||
 | 
					  </SelectPrimitive.Trigger>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SelectScrollUpButton = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SelectPrimitive.ScrollUpButton
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "flex cursor-default items-center justify-center py-1",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <ChevronUp className="h-4 w-4" />
 | 
				
			||||||
 | 
					  </SelectPrimitive.ScrollUpButton>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SelectScrollDownButton = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SelectPrimitive.ScrollDownButton
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "flex cursor-default items-center justify-center py-1",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <ChevronDown className="h-4 w-4" />
 | 
				
			||||||
 | 
					  </SelectPrimitive.ScrollDownButton>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					SelectScrollDownButton.displayName =
 | 
				
			||||||
 | 
					  SelectPrimitive.ScrollDownButton.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SelectContent = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SelectPrimitive.Content>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
 | 
				
			||||||
 | 
					>(({ className, children, position = "popper", ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SelectPrimitive.Portal>
 | 
				
			||||||
 | 
					    <SelectPrimitive.Content
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border " +
 | 
				
			||||||
 | 
					        "bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in " +
 | 
				
			||||||
 | 
					        "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 " +
 | 
				
			||||||
 | 
					        "data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 " +
 | 
				
			||||||
 | 
					        "data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 " +
 | 
				
			||||||
 | 
					        "data-[side=left]:slide-in-from-right-2 " +
 | 
				
			||||||
 | 
					        "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
 | 
				
			||||||
 | 
					        position === "popper" &&
 | 
				
			||||||
 | 
					          "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 " +
 | 
				
			||||||
 | 
					          "data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      position={position}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <SelectScrollUpButton />
 | 
				
			||||||
 | 
					      <SelectPrimitive.Viewport
 | 
				
			||||||
 | 
					        className={cn(
 | 
				
			||||||
 | 
					          "p-1",
 | 
				
			||||||
 | 
					          position === "popper" &&
 | 
				
			||||||
 | 
					            "h-[var(--radix-select-trigger-height)] w-full " +
 | 
				
			||||||
 | 
					            "min-w-[var(--radix-select-trigger-width)]"
 | 
				
			||||||
 | 
					        )}
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        {children}
 | 
				
			||||||
 | 
					      </SelectPrimitive.Viewport>
 | 
				
			||||||
 | 
					      <SelectScrollDownButton />
 | 
				
			||||||
 | 
					    </SelectPrimitive.Content>
 | 
				
			||||||
 | 
					  </SelectPrimitive.Portal>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					SelectContent.displayName = SelectPrimitive.Content.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SelectLabel = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SelectPrimitive.Label>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SelectPrimitive.Label
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					SelectLabel.displayName = SelectPrimitive.Label.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SelectItem = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SelectPrimitive.Item>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
 | 
				
			||||||
 | 
					>(({ className, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SelectPrimitive.Item
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "relative flex w-full cursor-default select-none items-center rounded-sm " +
 | 
				
			||||||
 | 
					      "py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent " +
 | 
				
			||||||
 | 
					      "focus:text-accent-foreground data-[disabled]:pointer-events-none " +
 | 
				
			||||||
 | 
					      "data-[disabled]:opacity-50",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
 | 
				
			||||||
 | 
					      <SelectPrimitive.ItemIndicator>
 | 
				
			||||||
 | 
					        <Check className="h-4 w-4" />
 | 
				
			||||||
 | 
					      </SelectPrimitive.ItemIndicator>
 | 
				
			||||||
 | 
					    </span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
 | 
				
			||||||
 | 
					  </SelectPrimitive.Item>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					SelectItem.displayName = SelectPrimitive.Item.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SelectSeparator = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SelectPrimitive.Separator>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SelectPrimitive.Separator
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("-mx-1 my-1 h-px bg-muted", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					SelectSeparator.displayName = SelectPrimitive.Separator.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  Select,
 | 
				
			||||||
 | 
					  SelectGroup,
 | 
				
			||||||
 | 
					  SelectValue,
 | 
				
			||||||
 | 
					  SelectTrigger,
 | 
				
			||||||
 | 
					  SelectContent,
 | 
				
			||||||
 | 
					  SelectLabel,
 | 
				
			||||||
 | 
					  SelectItem,
 | 
				
			||||||
 | 
					  SelectSeparator,
 | 
				
			||||||
 | 
					  SelectScrollUpButton,
 | 
				
			||||||
 | 
					  SelectScrollDownButton,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										36
									
								
								src/components/ui/shadcn/switch.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/components/ui/shadcn/switch.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as SwitchPrimitives from "@radix-ui/react-switch"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Switch = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof SwitchPrimitives.Root>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <SwitchPrimitives.Root
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full " +
 | 
				
			||||||
 | 
					      "border-2 border-transparent transition-colors focus-visible:outline-none " +
 | 
				
			||||||
 | 
					      "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 " +
 | 
				
			||||||
 | 
					      "focus-visible:ring-offset-background disabled:cursor-not-allowed " +
 | 
				
			||||||
 | 
					      "disabled:opacity-50 data-[state=checked]:bg-primary " +
 | 
				
			||||||
 | 
					      "data-[state=unchecked]:bg-input",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <SwitchPrimitives.Thumb
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        "pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg " +
 | 
				
			||||||
 | 
					        "ring-0 transition-transform data-[state=checked]:translate-x-5 " +
 | 
				
			||||||
 | 
					        "data-[state=unchecked]:translate-x-0"
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  </SwitchPrimitives.Root>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					Switch.displayName = SwitchPrimitives.Root.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Switch }
 | 
				
			||||||
							
								
								
									
										118
									
								
								src/components/ui/shadcn/table.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/components/ui/shadcn/table.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,118 @@
 | 
				
			|||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Table = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLTableElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <div className="relative w-full overflow-auto">
 | 
				
			||||||
 | 
					    <table
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn("w-full caption-bottom text-sm", className)}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					Table.displayName = "Table"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TableHeader = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableSectionElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLTableSectionElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TableHeader.displayName = "TableHeader"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TableBody = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableSectionElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLTableSectionElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <tbody
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("[&_tr:last-child]:border-0", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TableBody.displayName = "TableBody"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TableFooter = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableSectionElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLTableSectionElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <tfoot
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TableFooter.displayName = "TableFooter"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TableRow = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableRowElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLTableRowElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <tr
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TableRow.displayName = "TableRow"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TableHead = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableCellElement,
 | 
				
			||||||
 | 
					  React.ThHTMLAttributes<HTMLTableCellElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <th
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "h-12 px-4 text-left align-middle font-medium " +
 | 
				
			||||||
 | 
					      "text-muted-foreground [&:has([role=checkbox])]:pr-0",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TableHead.displayName = "TableHead"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TableCell = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableCellElement,
 | 
				
			||||||
 | 
					  React.TdHTMLAttributes<HTMLTableCellElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <td
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TableCell.displayName = "TableCell"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TableCaption = React.forwardRef<
 | 
				
			||||||
 | 
					  HTMLTableCaptionElement,
 | 
				
			||||||
 | 
					  React.HTMLAttributes<HTMLTableCaptionElement>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <caption
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("mt-4 text-sm text-muted-foreground", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TableCaption.displayName = "TableCaption"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					  Table,
 | 
				
			||||||
 | 
					  TableHeader,
 | 
				
			||||||
 | 
					  TableBody,
 | 
				
			||||||
 | 
					  TableFooter,
 | 
				
			||||||
 | 
					  TableHead,
 | 
				
			||||||
 | 
					  TableRow,
 | 
				
			||||||
 | 
					  TableCell,
 | 
				
			||||||
 | 
					  TableCaption,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										31
									
								
								src/components/ui/shadcn/toaster.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/components/ui/shadcn/toaster.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import { useTheme } from "next-themes"
 | 
				
			||||||
 | 
					import { Toaster as Sonner } from "sonner"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ToasterProps = React.ComponentProps<typeof Sonner>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Toaster = ({ ...props }: ToasterProps) => {
 | 
				
			||||||
 | 
					  const { theme = "system" } = useTheme()
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <Sonner
 | 
				
			||||||
 | 
					      theme={theme as ToasterProps["theme"]}
 | 
				
			||||||
 | 
					      className="toaster group"
 | 
				
			||||||
 | 
					      toastOptions={{
 | 
				
			||||||
 | 
					        classNames: {
 | 
				
			||||||
 | 
					          toast:
 | 
				
			||||||
 | 
					            "group toast group-[.toaster]:bg-background " +
 | 
				
			||||||
 | 
					            "group-[.toaster]:text-foreground " +
 | 
				
			||||||
 | 
					            "group-[.toaster]:border-border group-[.toaster]:shadow-lg",
 | 
				
			||||||
 | 
					          description: "group-[.toast]:text-muted-foreground",
 | 
				
			||||||
 | 
					          actionButton:
 | 
				
			||||||
 | 
					            "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
 | 
				
			||||||
 | 
					          cancelButton:
 | 
				
			||||||
 | 
					            "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      }}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Toaster }
 | 
				
			||||||
							
								
								
									
										59
									
								
								src/components/ui/shadcn/toggle-group.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/components/ui/shadcn/toggle-group.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group"
 | 
				
			||||||
 | 
					import { type VariantProps } from "class-variance-authority"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					import { toggleVariants } from "~/components/ui/toggle"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ToggleGroupContext = React.createContext<
 | 
				
			||||||
 | 
					  VariantProps<typeof toggleVariants>
 | 
				
			||||||
 | 
					>({
 | 
				
			||||||
 | 
					  size: "default",
 | 
				
			||||||
 | 
					  variant: "default",
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ToggleGroup = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof ToggleGroupPrimitive.Root>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &
 | 
				
			||||||
 | 
					    VariantProps<typeof toggleVariants>
 | 
				
			||||||
 | 
					>(({ className, variant, size, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <ToggleGroupPrimitive.Root
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn("flex items-center justify-center gap-1", className)}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <ToggleGroupContext.Provider value={{ variant, size }}>
 | 
				
			||||||
 | 
					      {children}
 | 
				
			||||||
 | 
					    </ToggleGroupContext.Provider>
 | 
				
			||||||
 | 
					  </ToggleGroupPrimitive.Root>
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ToggleGroupItem = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof ToggleGroupPrimitive.Item>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &
 | 
				
			||||||
 | 
					    VariantProps<typeof toggleVariants>
 | 
				
			||||||
 | 
					>(({ className, children, variant, size, ...props }, ref) => {
 | 
				
			||||||
 | 
					  const context = React.useContext(ToggleGroupContext)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <ToggleGroupPrimitive.Item
 | 
				
			||||||
 | 
					      ref={ref}
 | 
				
			||||||
 | 
					      className={cn(
 | 
				
			||||||
 | 
					        toggleVariants({
 | 
				
			||||||
 | 
					          variant: context.variant ?? variant,
 | 
				
			||||||
 | 
					          size: context.size ?? size,
 | 
				
			||||||
 | 
					        }),
 | 
				
			||||||
 | 
					        className
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					      {...props}
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      {children}
 | 
				
			||||||
 | 
					    </ToggleGroupPrimitive.Item>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { ToggleGroup, ToggleGroupItem }
 | 
				
			||||||
							
								
								
									
										50
									
								
								src/components/ui/shadcn/toggle.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/components/ui/shadcn/toggle.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as TogglePrimitive from "@radix-ui/react-toggle"
 | 
				
			||||||
 | 
					import { cva, type VariantProps } from "class-variance-authority"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const toggleVariants = cva(
 | 
				
			||||||
 | 
					  "inline-flex items-center justify-center rounded-md text-sm font-medium " +
 | 
				
			||||||
 | 
					  "ring-offset-background transition-colors hover:bg-muted " +
 | 
				
			||||||
 | 
					  "hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 " +
 | 
				
			||||||
 | 
					  "focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none " +
 | 
				
			||||||
 | 
					  "disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    variants: {
 | 
				
			||||||
 | 
					      variant: {
 | 
				
			||||||
 | 
					        default: "bg-transparent",
 | 
				
			||||||
 | 
					        outline:
 | 
				
			||||||
 | 
					          "border border-input bg-transparent hover:bg-accent " +
 | 
				
			||||||
 | 
					          "hover:text-accent-foreground",
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      size: {
 | 
				
			||||||
 | 
					        default: "h-10 px-3",
 | 
				
			||||||
 | 
					        sm: "h-9 px-2.5",
 | 
				
			||||||
 | 
					        lg: "h-11 px-5",
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    defaultVariants: {
 | 
				
			||||||
 | 
					      variant: "default",
 | 
				
			||||||
 | 
					      size: "default",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Toggle = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof TogglePrimitive.Root>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &
 | 
				
			||||||
 | 
					    VariantProps<typeof toggleVariants>
 | 
				
			||||||
 | 
					>(({ className, variant, size, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <TogglePrimitive.Root
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    className={cn(toggleVariants({ variant, size, className }))}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Toggle.displayName = TogglePrimitive.Root.displayName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Toggle, toggleVariants }
 | 
				
			||||||
							
								
								
									
										30
									
								
								src/components/ui/shadcn/tooltip.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/components/ui/shadcn/tooltip.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					"use client"
 | 
				
			||||||
 | 
					import * as React from "react"
 | 
				
			||||||
 | 
					import * as TooltipPrimitive from "@radix-ui/react-tooltip"
 | 
				
			||||||
 | 
					import { cn } from "~/lib/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TooltipProvider = TooltipPrimitive.Provider
 | 
				
			||||||
 | 
					const Tooltip = TooltipPrimitive.Root
 | 
				
			||||||
 | 
					const TooltipTrigger = TooltipPrimitive.Trigger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TooltipContent = React.forwardRef<
 | 
				
			||||||
 | 
					  React.ElementRef<typeof TooltipPrimitive.Content>,
 | 
				
			||||||
 | 
					  React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
 | 
				
			||||||
 | 
					>(({ className, sideOffset = 4, ...props }, ref) => (
 | 
				
			||||||
 | 
					  <TooltipPrimitive.Content
 | 
				
			||||||
 | 
					    ref={ref}
 | 
				
			||||||
 | 
					    sideOffset={sideOffset}
 | 
				
			||||||
 | 
					    className={cn(
 | 
				
			||||||
 | 
					      "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 " +
 | 
				
			||||||
 | 
					      "text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 " +
 | 
				
			||||||
 | 
					      "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 " +
 | 
				
			||||||
 | 
					      "data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 " +
 | 
				
			||||||
 | 
					      "data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 " +
 | 
				
			||||||
 | 
					      "data-[side=top]:slide-in-from-bottom-2",
 | 
				
			||||||
 | 
					      className
 | 
				
			||||||
 | 
					    )}
 | 
				
			||||||
 | 
					    {...props}
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					TooltipContent.displayName = TooltipPrimitive.Content.displayName
 | 
				
			||||||
 | 
					export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
 | 
				
			||||||
		Reference in New Issue
	
	Block a user