diff --git a/apps/app-portal/src/app/(admin)/admin/page.tsx b/apps/app-portal/src/app/(admin)/admin/page.tsx
new file mode 100644
index 00000000..7a10e74e
--- /dev/null
+++ b/apps/app-portal/src/app/(admin)/admin/page.tsx
@@ -0,0 +1,34 @@
+import React from "react";
+const tiles = [
+ {
+ title: "Settings",
+ },
+ {
+ title: "Applicants",
+ },
+ {
+ title: "Stats",
+ },
+];
+
+export default function AdminPage() {
+ return (
+
+
+
Admin Dashboard
+
+
Welcome to the admin portal.
+
+
+
+ {tiles.map((t) => (
+
+ ))}
+
+
+ );
+}
diff --git a/apps/app-portal/src/app/(admin)/admin/settings/page.tsx b/apps/app-portal/src/app/(admin)/admin/settings/page.tsx
new file mode 100644
index 00000000..b85845c5
--- /dev/null
+++ b/apps/app-portal/src/app/(admin)/admin/settings/page.tsx
@@ -0,0 +1,14 @@
+import React from "react";
+import ShowDecisionToggle from "@/components/admin/ShowDecisionToggle";
+import DateControls from "@/components/admin/DateControl";
+import FormConfigEditor from "@/components/admin/FormConfigEditor";
+
+export default function Page() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/apps/app-portal/src/app/(admin)/layout.tsx b/apps/app-portal/src/app/(admin)/layout.tsx
new file mode 100644
index 00000000..ebb71369
--- /dev/null
+++ b/apps/app-portal/src/app/(admin)/layout.tsx
@@ -0,0 +1,25 @@
+import React from "react";
+import Link from "next/link";
+
+export default function AdminLayout() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/app-portal/src/app/api/v1/admin/form-config/route.ts b/apps/app-portal/src/app/api/v1/admin/form-config/route.ts
new file mode 100644
index 00000000..dd7eef65
--- /dev/null
+++ b/apps/app-portal/src/app/api/v1/admin/form-config/route.ts
@@ -0,0 +1,59 @@
+import { NextResponse } from "next/server";
+
+type QuestionType = "text" | "textarea";
+
+type Question = {
+ id: string;
+ label: string;
+ type: QuestionType;
+};
+
+type Section = {
+ id: string;
+ title: string;
+ questions: Question[];
+};
+
+type FormConfig = {
+ sections: Section[];
+};
+
+const mockFormConfig: FormConfig = {
+ sections: [
+ {
+ id: "basic",
+ title: "Basic Info",
+ questions: [
+ {
+ id: "name",
+ label: "Full Name",
+ type: "text",
+ },
+ {
+ id: "reason",
+ label: "Why are you applying?",
+ type: "textarea",
+ },
+ ],
+ },
+ {
+ id: "experience",
+ title: "Experience",
+ questions: [
+ {
+ id: "background",
+ label: "Tell us about your background",
+ type: "textarea",
+ },
+ ],
+ },
+ ],
+};
+
+export async function GET() {
+ return NextResponse.json(mockFormConfig);
+}
+
+export async function POST() {
+ return NextResponse.json({ message: "Not implemented" }, { status: 501 });
+}
diff --git a/apps/app-portal/src/app/api/v1/dates/confirm-by/route.ts b/apps/app-portal/src/app/api/v1/dates/confirm-by/route.ts
new file mode 100644
index 00000000..ecf3dac2
--- /dev/null
+++ b/apps/app-portal/src/app/api/v1/dates/confirm-by/route.ts
@@ -0,0 +1,27 @@
+import { NextResponse } from "next/server";
+import { SingletonKey } from "@/lib/admin/singleton-keys";
+
+type SingletonResponse = {
+ key: SingletonKey;
+ value: string;
+};
+
+export async function GET() {
+ const data: SingletonResponse = {
+ key: "confirm-by",
+ value: "2026-06-15T23:59:00Z",
+ };
+
+ return NextResponse.json(data);
+}
+
+export async function POST() {
+ return NextResponse.json(
+ {
+ message: "Not implemented",
+ },
+ {
+ status: 501,
+ },
+ );
+}
diff --git a/apps/app-portal/src/app/api/v1/dates/registration-closed/route.ts b/apps/app-portal/src/app/api/v1/dates/registration-closed/route.ts
new file mode 100644
index 00000000..0f88631e
--- /dev/null
+++ b/apps/app-portal/src/app/api/v1/dates/registration-closed/route.ts
@@ -0,0 +1,27 @@
+import { NextResponse } from "next/server";
+import { SingletonKey } from "@/lib/admin/singleton-keys";
+
+type SingletonResponse = {
+ key: SingletonKey;
+ value: string;
+};
+
+export async function GET() {
+ const data: SingletonResponse = {
+ key: "registration-closed",
+ value: "2026-06-15T23:59:00Z",
+ };
+
+ return NextResponse.json(data);
+}
+
+export async function POST() {
+ return NextResponse.json(
+ {
+ message: "Not implemented",
+ },
+ {
+ status: 501,
+ },
+ );
+}
diff --git a/apps/app-portal/src/app/api/v1/dates/registration-open/route.ts b/apps/app-portal/src/app/api/v1/dates/registration-open/route.ts
new file mode 100644
index 00000000..72511a76
--- /dev/null
+++ b/apps/app-portal/src/app/api/v1/dates/registration-open/route.ts
@@ -0,0 +1,27 @@
+import { NextResponse } from "next/server";
+import { SingletonKey } from "@/lib/admin/singleton-keys";
+
+type SingletonResponse = {
+ key: SingletonKey;
+ value: string;
+};
+
+export async function GET() {
+ const data: SingletonResponse = {
+ key: "registration-open",
+ value: "2026-06-15T23:59:00Z",
+ };
+
+ return NextResponse.json(data);
+}
+
+export async function POST() {
+ return NextResponse.json(
+ {
+ message: "Not implemented",
+ },
+ {
+ status: 501,
+ },
+ );
+}
diff --git a/apps/app-portal/src/app/api/v1/show-decision/route.ts b/apps/app-portal/src/app/api/v1/show-decision/route.ts
new file mode 100644
index 00000000..769e7e1b
--- /dev/null
+++ b/apps/app-portal/src/app/api/v1/show-decision/route.ts
@@ -0,0 +1,27 @@
+import { NextResponse } from "next/server";
+import { SingletonKey } from "@/lib/admin/singleton-keys";
+
+type SingletonResponse = {
+ key: SingletonKey;
+ value: string;
+};
+
+export async function GET() {
+ const data: SingletonResponse = {
+ key: "show-decision",
+ value: "2026-06-15T23:59:00Z",
+ };
+
+ return NextResponse.json(data);
+}
+
+export async function POST() {
+ return NextResponse.json(
+ {
+ message: "Not implemented",
+ },
+ {
+ status: 501,
+ },
+ );
+}
diff --git a/apps/app-portal/src/components/admin/AdminSidebar.tsx b/apps/app-portal/src/components/admin/AdminSidebar.tsx
new file mode 100644
index 00000000..c5508f6c
--- /dev/null
+++ b/apps/app-portal/src/components/admin/AdminSidebar.tsx
@@ -0,0 +1,5 @@
+import React from "react";
+
+export default function AdminSidebar() {
+ return AdminSidebar here
;
+}
diff --git a/apps/app-portal/src/components/admin/DateControl.tsx b/apps/app-portal/src/components/admin/DateControl.tsx
new file mode 100644
index 00000000..0becc7a5
--- /dev/null
+++ b/apps/app-portal/src/components/admin/DateControl.tsx
@@ -0,0 +1,13 @@
+import React from "react";
+
+export default function DateControls() {
+ return (
+
+
Application Deadline
+
+
+
+
+
+ );
+}
diff --git a/apps/app-portal/src/components/admin/FormConfigEditor.tsx b/apps/app-portal/src/components/admin/FormConfigEditor.tsx
new file mode 100644
index 00000000..4f56b78d
--- /dev/null
+++ b/apps/app-portal/src/components/admin/FormConfigEditor.tsx
@@ -0,0 +1,18 @@
+import React from "react";
+
+export default function FormConfigEditor() {
+ return (
+
+
+
Form Questions
+
+
+
+
+
+ Add Question here
+
+
+
+ );
+}
diff --git a/apps/app-portal/src/components/admin/ShowDecisionToggle.tsx b/apps/app-portal/src/components/admin/ShowDecisionToggle.tsx
new file mode 100644
index 00000000..7fe12bb1
--- /dev/null
+++ b/apps/app-portal/src/components/admin/ShowDecisionToggle.tsx
@@ -0,0 +1,22 @@
+"use client";
+
+import { useState } from "react";
+import React from "react";
+
+export default function ShowDecisionToggle() {
+ const [enabled, setEnabled] = useState(false);
+
+ return (
+
+
Show Decision
+
+
+ );
+}
diff --git a/apps/app-portal/src/components/ui/badge.tsx b/apps/app-portal/src/components/ui/badge.tsx
index 70697bb4..18cc90c5 100644
--- a/apps/app-portal/src/components/ui/badge.tsx
+++ b/apps/app-portal/src/components/ui/badge.tsx
@@ -3,24 +3,31 @@ import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
-const badgeVariants = cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors", {
- variants: {
- variant: {
- default: "border-transparent bg-black text-white",
- secondary: "border-transparent bg-neutral-100 text-neutral-900",
- destructive: "border-transparent bg-red-600 text-white",
- outline: "text-neutral-950",
+const badgeVariants = cva(
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors",
+ {
+ variants: {
+ variant: {
+ default: "border-transparent bg-black text-white",
+ secondary: "border-transparent bg-neutral-100 text-neutral-900",
+ destructive: "border-transparent bg-red-600 text-white",
+ outline: "text-neutral-950",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
},
},
- defaultVariants: {
- variant: "default",
- },
-});
+);
-export interface BadgeProps extends React.HTMLAttributes, VariantProps {}
+export interface BadgeProps
+ extends React.HTMLAttributes,
+ VariantProps {}
function Badge({ className, variant, ...props }: BadgeProps) {
- return ;
+ return (
+
+ );
}
export { Badge, badgeVariants };
diff --git a/apps/app-portal/src/components/ui/button.tsx b/apps/app-portal/src/components/ui/button.tsx
index f9e012f6..e83b1544 100644
--- a/apps/app-portal/src/components/ui/button.tsx
+++ b/apps/app-portal/src/components/ui/button.tsx
@@ -37,7 +37,13 @@ export interface ButtonProps
const Button = React.forwardRef(
({ className, variant, size, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button";
- return ;
+ return (
+
+ );
},
);
Button.displayName = "Button";
diff --git a/apps/app-portal/src/components/ui/card.tsx b/apps/app-portal/src/components/ui/card.tsx
index aabcebb2..dc5a24d4 100644
--- a/apps/app-portal/src/components/ui/card.tsx
+++ b/apps/app-portal/src/components/ui/card.tsx
@@ -2,34 +2,82 @@ import * as React from "react";
import { cn } from "@/lib/utils";
-const Card = React.forwardRef>(({ className, ...props }, ref) => (
-
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
));
Card.displayName = "Card";
-const CardHeader = React.forwardRef>(({ className, ...props }, ref) => (
-
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
));
CardHeader.displayName = "CardHeader";
-const CardTitle = React.forwardRef>(
- ({ className, ...props }, ref) => ,
-);
+const CardTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
CardTitle.displayName = "CardTitle";
-const CardDescription = React.forwardRef>(
- ({ className, ...props }, ref) => ,
-);
+const CardDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
CardDescription.displayName = "CardDescription";
-const CardContent = React.forwardRef>(({ className, ...props }, ref) => (
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
));
CardContent.displayName = "CardContent";
-const CardFooter = React.forwardRef>(({ className, ...props }, ref) => (
-
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
));
CardFooter.displayName = "CardFooter";
-export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
+export {
+ Card,
+ CardHeader,
+ CardFooter,
+ CardTitle,
+ CardDescription,
+ CardContent,
+};
diff --git a/apps/app-portal/src/components/ui/checkbox.tsx b/apps/app-portal/src/components/ui/checkbox.tsx
index 6e2536e5..625c280a 100644
--- a/apps/app-portal/src/components/ui/checkbox.tsx
+++ b/apps/app-portal/src/components/ui/checkbox.tsx
@@ -16,7 +16,9 @@ const Checkbox = React.forwardRef<
)}
{...props}
>
-
+
diff --git a/apps/app-portal/src/components/ui/dialog.tsx b/apps/app-portal/src/components/ui/dialog.tsx
index 9148a4a8..13f373a4 100644
--- a/apps/app-portal/src/components/ui/dialog.tsx
+++ b/apps/app-portal/src/components/ui/dialog.tsx
@@ -15,7 +15,10 @@ const DialogOverlay = React.forwardRef<
>(({ className, ...props }, ref) => (
));
@@ -45,13 +48,31 @@ const DialogContent = React.forwardRef<
));
DialogContent.displayName = DialogPrimitive.Content.displayName;
-const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => (
-
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
);
DialogHeader.displayName = "DialogHeader";
-const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => (
-
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
);
DialogFooter.displayName = "DialogFooter";
@@ -59,7 +80,14 @@ const DialogTitle = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
>(({ className, ...props }, ref) => (
-
+
));
DialogTitle.displayName = DialogPrimitive.Title.displayName;
@@ -67,7 +95,11 @@ const DialogDescription = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
>(({ className, ...props }, ref) => (
-
+
));
DialogDescription.displayName = DialogPrimitive.Description.displayName;
diff --git a/apps/app-portal/src/components/ui/form.tsx b/apps/app-portal/src/components/ui/form.tsx
index 5db7a365..1badcdde 100644
--- a/apps/app-portal/src/components/ui/form.tsx
+++ b/apps/app-portal/src/components/ui/form.tsx
@@ -2,18 +2,30 @@
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
-import { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues } from "react-hook-form";
+import {
+ Controller,
+ FormProvider,
+ useFormContext,
+ type ControllerProps,
+ type FieldPath,
+ type FieldValues,
+} from "react-hook-form";
import { Label } from "@/components/ui/label";
import { cn } from "@/lib/utils";
const Form = FormProvider;
-type FormFieldContextValue = FieldPath> = {
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath,
+> = {
name: TName;
};
-const FormFieldContext = React.createContext({} as FormFieldContextValue);
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue,
+);
const FormField = <
TFieldValues extends FieldValues = FieldValues,
@@ -55,9 +67,14 @@ type FormItemContextValue = {
id: string;
};
-const FormItemContext = React.createContext({} as FormItemContextValue);
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue,
+);
-const FormItem = React.forwardRef>(({ className, ...props }, ref) => {
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
const id = React.useId();
return (
@@ -68,23 +85,39 @@ const FormItem = React.forwardRef, React.ComponentPropsWithoutRef>(
- ({ className, ...props }, ref) => {
- const { error, formItemId } = useFormField();
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField();
- return ;
- },
-);
+ return (
+
+ );
+});
FormLabel.displayName = "FormLabel";
-const FormControl = React.forwardRef, React.ComponentPropsWithoutRef>(({ ...props }, ref) => {
- const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } =
+ useFormField();
return (
@@ -92,16 +125,27 @@ const FormControl = React.forwardRef, React.Compon
});
FormControl.displayName = "FormControl";
-const FormDescription = React.forwardRef>(
- ({ className, ...props }, ref) => {
- const { formDescriptionId } = useFormField();
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField();
- return ;
- },
-);
+ return (
+
+ );
+});
FormDescription.displayName = "FormDescription";
-const FormMessage = React.forwardRef>(({ className, children, ...props }, ref) => {
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
const { error, formMessageId } = useFormField();
const body = error ? String(error?.message ?? "") : children;
@@ -110,11 +154,25 @@ const FormMessage = React.forwardRef
+
{body}
);
});
FormMessage.displayName = "FormMessage";
-export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField };
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField,
+};
diff --git a/apps/app-portal/src/components/ui/input.tsx b/apps/app-portal/src/components/ui/input.tsx
index fa6dde2c..5aa8417b 100644
--- a/apps/app-portal/src/components/ui/input.tsx
+++ b/apps/app-portal/src/components/ui/input.tsx
@@ -2,21 +2,23 @@ import * as React from "react";
import { cn } from "@/lib/utils";
-export interface InputProps extends React.InputHTMLAttributes {}
+export type InputProps = React.ComponentProps<"input">;
-const Input = React.forwardRef(({ className, type, ...props }, ref) => {
- return (
-
- );
-});
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
Input.displayName = "Input";
export { Input };
diff --git a/apps/app-portal/src/components/ui/label.tsx b/apps/app-portal/src/components/ui/label.tsx
index 7722460a..162c6462 100644
--- a/apps/app-portal/src/components/ui/label.tsx
+++ b/apps/app-portal/src/components/ui/label.tsx
@@ -4,13 +4,22 @@ 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 labelVariants = cva(
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
+);
const Label = React.forwardRef<
React.ElementRef,
- React.ComponentPropsWithoutRef & VariantProps
+ React.ComponentPropsWithoutRef &
+ VariantProps
>(({ className, ...props }, ref) => {
- return ;
+ return (
+
+ );
});
Label.displayName = LabelPrimitive.Root.displayName;
diff --git a/apps/app-portal/src/components/ui/select.tsx b/apps/app-portal/src/components/ui/select.tsx
index 72932779..d0b14558 100644
--- a/apps/app-portal/src/components/ui/select.tsx
+++ b/apps/app-portal/src/components/ui/select.tsx
@@ -32,7 +32,14 @@ const SelectScrollUpButton = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
>(({ className, ...props }, ref) => (
-
+
));
@@ -44,13 +51,17 @@ const SelectScrollDownButton = React.forwardRef<
>(({ className, ...props }, ref) => (
));
-SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName;
const SelectContent = React.forwardRef<
React.ElementRef,
@@ -68,7 +79,13 @@ const SelectContent = React.forwardRef<
{...props}
>
-
+
{children}
@@ -80,7 +97,13 @@ SelectContent.displayName = SelectPrimitive.Content.displayName;
const SelectLabel = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => );
+>(({ className, ...props }, ref) => (
+
+));
SelectLabel.displayName = SelectPrimitive.Label.displayName;
const SelectItem = React.forwardRef<
@@ -108,7 +131,13 @@ SelectItem.displayName = SelectPrimitive.Item.displayName;
const SelectSeparator = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => );
+>(({ className, ...props }, ref) => (
+
+));
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
export {
diff --git a/apps/app-portal/src/components/ui/sonner.tsx b/apps/app-portal/src/components/ui/sonner.tsx
index 595eaa15..a1e6490d 100644
--- a/apps/app-portal/src/components/ui/sonner.tsx
+++ b/apps/app-portal/src/components/ui/sonner.tsx
@@ -6,7 +6,14 @@ import { Toaster as Sonner } from "sonner";
type ToasterProps = React.ComponentProps;
const Toaster = ({ ...props }: ToasterProps) => {
- return ;
+ return (
+
+ );
};
export { Toaster };
diff --git a/apps/app-portal/src/components/ui/table.tsx b/apps/app-portal/src/components/ui/table.tsx
index f1874e9e..456c900b 100644
--- a/apps/app-portal/src/components/ui/table.tsx
+++ b/apps/app-portal/src/components/ui/table.tsx
@@ -1,57 +1,118 @@
import * as React from "react";
+/* eslint-disable react/prop-types */
import { cn } from "@/lib/utils";
-const Table = React.forwardRef>(({ className, ...props }, ref) => (
+const Table = React.forwardRef<
+ HTMLTableElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
));
Table.displayName = "Table";
-const TableHeader = React.forwardRef>(
- ({ className, ...props }, ref) => ,
-);
+const TableHeader = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
TableHeader.displayName = "TableHeader";
-const TableBody = React.forwardRef>(
- ({ className, ...props }, ref) => ,
-);
+const TableBody = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
TableBody.displayName = "TableBody";
-const TableFooter = React.forwardRef>(
- ({ className, ...props }, ref) => (
- tr]:last:border-b-0", className)} {...props} />
- ),
-);
+const TableFooter = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+ tr]:last:border-b-0",
+ className,
+ )}
+ {...props}
+ />
+));
TableFooter.displayName = "TableFooter";
-const TableRow = React.forwardRef>(({ className, ...props }, ref) => (
-
+const TableRow = React.forwardRef<
+ HTMLTableRowElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
));
TableRow.displayName = "TableRow";
-const TableHead = React.forwardRef>(
- ({ className, ...props }, ref) => (
- |
- ),
-);
+const TableHead = React.forwardRef<
+ HTMLTableCellElement,
+ React.ThHTMLAttributes
+>(({ className, ...props }, ref) => (
+ |
+));
TableHead.displayName = "TableHead";
-const TableCell = React.forwardRef>(
- ({ className, ...props }, ref) => (
- |
- ),
-);
+const TableCell = React.forwardRef<
+ HTMLTableCellElement,
+ React.TdHTMLAttributes
+>(({ className, ...props }, ref) => (
+ |
+));
TableCell.displayName = "TableCell";
-const TableCaption = React.forwardRef>(
- ({ className, ...props }, ref) => ,
-);
+const TableCaption = React.forwardRef<
+ HTMLTableCaptionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
TableCaption.displayName = "TableCaption";
-export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };
+export {
+ Table,
+ TableHeader,
+ TableBody,
+ TableFooter,
+ TableHead,
+ TableRow,
+ TableCell,
+ TableCaption,
+};
diff --git a/apps/app-portal/src/components/ui/textarea.tsx b/apps/app-portal/src/components/ui/textarea.tsx
index 230f904a..e9a44841 100644
--- a/apps/app-portal/src/components/ui/textarea.tsx
+++ b/apps/app-portal/src/components/ui/textarea.tsx
@@ -2,7 +2,10 @@ import * as React from "react";
import { cn } from "@/lib/utils";
-const Textarea = React.forwardRef>(({ className, ...props }, ref) => {
+const Textarea = React.forwardRef<
+ HTMLTextAreaElement,
+ React.ComponentProps<"textarea">
+>(({ className, ...props }, ref) => {
return (