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"
 | 
			
		||||
  },
 | 
			
		||||
  "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-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",
 | 
			
		||||
    "class-variance-authority": "^0.7.0",
 | 
			
		||||
    "clsx": "^2.1.1",
 | 
			
		||||
    "cmdk": "^1.0.0",
 | 
			
		||||
    "date-fns": "^3.6.0",
 | 
			
		||||
    "drizzle-orm": "^0.30.10",
 | 
			
		||||
    "geist": "^1.3.1",
 | 
			
		||||
    "lucide-react": "^0.411.0",
 | 
			
		||||
    "mysql2": "^3.10.3",
 | 
			
		||||
    "next": "^14.2.5",
 | 
			
		||||
    "next-auth": "5.0.0-beta.19",
 | 
			
		||||
    "next-themes": "^0.3.0",
 | 
			
		||||
    "pm2": "^5.4.2",
 | 
			
		||||
    "react": "^18.3.1",
 | 
			
		||||
    "react-day-picker": "^9.0.2",
 | 
			
		||||
    "react-dom": "^18.3.1",
 | 
			
		||||
    "react-hook-form": "^7.52.1",
 | 
			
		||||
    "server-only": "^0.0.1",
 | 
			
		||||
    "sharp": "^0.33.4",
 | 
			
		||||
    "sonner": "^1.5.0",
 | 
			
		||||
    "tailwind-merge": "^2.4.0",
 | 
			
		||||
    "tailwindcss-animate": "^1.0.7",
 | 
			
		||||
    "vaul": "^0.9.1",
 | 
			
		||||
    "zod": "^3.23.8"
 | 
			
		||||
  },
 | 
			
		||||
  "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 No_Session from "~/components/auth/No_Session";
 | 
			
		||||
import TT_Header from "~/components/ui/TT_Header";
 | 
			
		||||
import Techs from "~/components/ui/Techs";
 | 
			
		||||
import Header from "~/components/ui/Header";
 | 
			
		||||
import { getEmployees } from "~/server/functions";
 | 
			
		||||
import TechTable from "~/components/ui/TechTable";
 | 
			
		||||
 | 
			
		||||
export default async function HomePage() {
 | 
			
		||||
  const session = await auth();
 | 
			
		||||
  if (!session) {
 | 
			
		||||
    return <No_Session />
 | 
			
		||||
  } else {
 | 
			
		||||
    const employees = await getEmployees();
 | 
			
		||||
    return (
 | 
			
		||||
      <main className="min-h-screen
 | 
			
		||||
        bg-gradient-to-b from-[#111111] to-[#212325]">
 | 
			
		||||
        <TT_Header />
 | 
			
		||||
        <Techs />
 | 
			
		||||
        <Header />
 | 
			
		||||
        <TechTable employees={employees}/>
 | 
			
		||||
      </main>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
import Link from "next/link";
 | 
			
		||||
import Image from "next/image";
 | 
			
		||||
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() {
 | 
			
		||||
  return (
 | 
			
		||||
    <main className="w-full min-h-screen mx-auto text-center pt-2 md:pt-10
 | 
			
		||||
      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">
 | 
			
		||||
        <TT_Header />
 | 
			
		||||
        < Header />
 | 
			
		||||
      </div>
 | 
			
		||||
      < Sign_In />
 | 
			
		||||
      <div className="w-5/6 mx-auto flex flex-col">
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import Image from "next/image";
 | 
			
		||||
 | 
			
		||||
export default function TT_Header() {
 | 
			
		||||
export default function Header() {
 | 
			
		||||
  return (
 | 
			
		||||
    <header className="w-full py-2 pt-6 md:py-5">
 | 
			
		||||
      <div className="flex flex-row items-center text-center
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
"use client"
 | 
			
		||||
import * as React from "react"
 | 
			
		||||
import { Progress } from "~/components/ui/progress"
 | 
			
		||||
import { Progress } from "~/components/ui/shadcn/progress"
 | 
			
		||||
 | 
			
		||||
interface Loading_Props {
 | 
			
		||||
  interval_amount: number
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ interface Employee {
 | 
			
		||||
  updatedAt: Date;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default function Table({ employees }: { employees: Employee[] }) {
 | 
			
		||||
export default function TechTable({ employees }: { employees: Employee[] }) {
 | 
			
		||||
  const { data: session, status } = useSession();
 | 
			
		||||
  const [loading, setLoading] = useState(true);
 | 
			
		||||
  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]">
 | 
			
		||||
                <input
 | 
			
		||||
                  type="checkbox"
 | 
			
		||||
                  className="m-auto cursor-pointer transform scale-150"
 | 
			
		||||
                  className="m-auto cursor-pointer scale-150"
 | 
			
		||||
                  checked={selectAll}
 | 
			
		||||
                  onChange={handleSelectAllChange}
 | 
			
		||||
                />
 | 
			
		||||
@@ -177,7 +177,7 @@ export default function Table({ employees }: { employees: Employee[] }) {
 | 
			
		||||
                <td className="p-1 border border-[#3e4446]">
 | 
			
		||||
                  <input
 | 
			
		||||
                    type="checkbox"
 | 
			
		||||
                    className="m-0 cursor-pointer transform scale-150"
 | 
			
		||||
                    className="m-auto cursor-pointer scale-150"
 | 
			
		||||
                    checked={selectedIds.includes(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