diff --git a/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx b/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx
index 27d0906e6..9c9a6419e 100644
--- a/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx
+++ b/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx
@@ -21,6 +21,7 @@ export default function FoodRestrictionsButton({
const [foodString, setFoodString] = useState("");
useEffect(() => {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setFoodString(hacker.foodAllergies?.replace(/,/g, ", ") || "");
}, [hacker.foodAllergies]);
diff --git a/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx b/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx
index 02ac80aec..ffb360f16 100644
--- a/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx
+++ b/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx
@@ -216,6 +216,7 @@ export default function HackerTable({
new Date(a.startDate).getTime() - new Date(b.startDate).getTime(),
)[0];
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setActiveHackathon(closestHackathon ?? hackathons[0] ?? null);
}
}, [hackathons, activeHackathon]);
diff --git a/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx b/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx
index 7bd94a047..72c76e65e 100644
--- a/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx
+++ b/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx
@@ -303,7 +303,7 @@ export default function UpdateHackerButton({
defaultValue={field.value}
>
-
+
diff --git a/apps/blade/src/app/_components/admin/roles/roleedit.tsx b/apps/blade/src/app/_components/admin/roles/roleedit.tsx
index ca26209fc..bcbe0ab22 100644
--- a/apps/blade/src/app/_components/admin/roles/roleedit.tsx
+++ b/apps/blade/src/app/_components/admin/roles/roleedit.tsx
@@ -91,11 +91,13 @@ export default function RoleEdit({
}, []);
useEffect(() => {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
updateString(form.getValues());
}, [form, updateString]);
useEffect(() => {
if (roles)
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setIsDupeID(
oldRole
? false
@@ -113,6 +115,7 @@ export default function RoleEdit({
useEffect(() => {
if (roles)
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setIsDupeName(
oldRole?.name == name
? false
diff --git a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx
index fc69ae4b6..0b3c9f1a6 100644
--- a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx
+++ b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx
@@ -59,6 +59,7 @@ export function HackathonData({
}
useEffect(() => {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setHackerStatus(getStatusName(hacker?.status));
setHackerStatusColor(getStatusColor(hacker?.status));
}, [hacker]);
diff --git a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx
index 0e95103f5..5ae5a4a51 100644
--- a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx
+++ b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx
@@ -86,6 +86,7 @@ export function PointLeaderboard({
);
}, [activeTop, hacker?.id, data?.place, activeInd]);
+ // eslint-disable-next-line react-hooks/purity
return targetDate <= Date.now() && !isAdmin ? (
<>
diff --git a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx
index 01e9edd26..5bcc0a3d8 100644
--- a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx
+++ b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx
@@ -16,6 +16,7 @@ import { api } from "~/trpc/server";
export default async function UpcomingEvents() {
const events = await api.event.getEvents();
+ // eslint-disable-next-line react-hooks/purity
const now = Date.now();
const fiveHoursLater = now + 5 * 60 * 60 * 1000;
diff --git a/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx b/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx
index 7b29f1002..6b3425f74 100644
--- a/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx
+++ b/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx
@@ -136,6 +136,7 @@ export function HackerData({
});
useEffect(() => {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setHackerStatus(getStatusName(hacker?.status));
setHackerStatusColor(getStatusColor(hacker?.status));
}, [hacker]);
diff --git a/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx b/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx
index 66593c897..5a41eb1d4 100644
--- a/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx
+++ b/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx
@@ -201,7 +201,7 @@ export function HackerFormPage({
if (fileList[0].size > MINIO.MAX_RESUME_SIZE) {
ctx.addIssue({
code: z.ZodIssueCode.too_big,
- type: "number",
+ origin: "number",
maximum: MINIO.MAX_RESUME_SIZE,
inclusive: true,
exact: false,
@@ -286,6 +286,7 @@ export function HackerFormPage({
// Set selected allergies for the UI
if (previousHacker.foodAllergies) {
const allergies = previousHacker.foodAllergies.split(",");
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setSelectedAllergies(allergies);
}
@@ -845,7 +846,7 @@ export function HackerFormPage({
Select Allergies:
@@ -871,7 +872,7 @@ export function HackerFormPage({
{FORMS.ALLERGIES.map((allergy) => (
diff --git a/apps/blade/src/app/_components/dashboard/member-dashboard/payment/payment-button.tsx b/apps/blade/src/app/_components/dashboard/member-dashboard/payment/payment-button.tsx
index baee07fd0..f935a1759 100644
--- a/apps/blade/src/app/_components/dashboard/member-dashboard/payment/payment-button.tsx
+++ b/apps/blade/src/app/_components/dashboard/member-dashboard/payment/payment-button.tsx
@@ -28,6 +28,7 @@ export default function PaymentButton({ member }: { member: InsertMember }) {
member.school !== "Full Sail University") ||
(month > 3 && month < 7) // disable during summer months
) {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setDisableButton(true);
}
}, [member.school]);
diff --git a/apps/blade/src/app/_components/dashboard/member/member-application-form.tsx b/apps/blade/src/app/_components/dashboard/member/member-application-form.tsx
index 54b4b678f..124792c32 100644
--- a/apps/blade/src/app/_components/dashboard/member/member-application-form.tsx
+++ b/apps/blade/src/app/_components/dashboard/member/member-application-form.tsx
@@ -90,6 +90,7 @@ export function MemberApplicationForm() {
};
const form = useForm({
+ // @ts-expect-error -- schema uses .transform() so input≠output; ZodType
in useForm can't represent this
schema: InsertMemberSchema.omit({
discordUser: true,
userId: true,
@@ -187,7 +188,7 @@ export function MemberApplicationForm() {
if (file.size > MINIO.MAX_RESUME_SIZE) {
ctx.addIssue({
code: z.ZodIssueCode.too_big,
- type: "number",
+ origin: "number",
maximum: MINIO.MAX_RESUME_SIZE,
inclusive: true,
message: "File too large: maximum 5MB",
@@ -232,7 +233,7 @@ export function MemberApplicationForm() {
if (file.size > MINIO.KNIGHTHACKS_MAX_PROFILE_PICTURE_SIZE) {
ctx.addIssue({
code: z.ZodIssueCode.too_big,
- type: "number",
+ origin: "number",
maximum: MINIO.KNIGHTHACKS_MAX_PROFILE_PICTURE_SIZE,
inclusive: true,
message: `File too large: maximum ${MINIO.KNIGHTHACKS_MAX_PROFILE_PICTURE_SIZE / (1024 * 1024)}MB`,
@@ -255,7 +256,7 @@ export function MemberApplicationForm() {
phoneNumber: "",
dob: "",
gradTerm: "Spring",
- gradYear: (new Date().getFullYear() + 1).toString(),
+ gradYear: new Date().getFullYear() + 1,
githubProfileUrl: "",
linkedinProfileUrl: "",
websiteUrl: "",
diff --git a/apps/blade/src/app/_components/forms/_hooks/useSubmissionSuccess.ts b/apps/blade/src/app/_components/forms/_hooks/useSubmissionSuccess.ts
index 46193c1b8..e182504eb 100644
--- a/apps/blade/src/app/_components/forms/_hooks/useSubmissionSuccess.ts
+++ b/apps/blade/src/app/_components/forms/_hooks/useSubmissionSuccess.ts
@@ -27,6 +27,7 @@ export function useSubmissionSuccess(
useEffect(() => {
if (!isSubmitted) {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setShowCheckmark(false);
setShowText(false);
setRedirectCountdown(Math.ceil(redirectDelayMs / 1000));
diff --git a/apps/blade/src/app/_components/forms/form-responder-client.tsx b/apps/blade/src/app/_components/forms/form-responder-client.tsx
index aeb2ccba3..960930f17 100644
--- a/apps/blade/src/app/_components/forms/form-responder-client.tsx
+++ b/apps/blade/src/app/_components/forms/form-responder-client.tsx
@@ -148,7 +148,7 @@ export function FormResponderWrapper({
const onSubmit = (payload: FormResponsePayload) => {
submitResponse.mutate({
form: formId,
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
responseData: payload as any,
});
};
diff --git a/apps/blade/src/app/_components/forms/form-runner.tsx b/apps/blade/src/app/_components/forms/form-runner.tsx
index 0f0053067..e51437633 100644
--- a/apps/blade/src/app/_components/forms/form-runner.tsx
+++ b/apps/blade/src/app/_components/forms/form-runner.tsx
@@ -124,7 +124,7 @@ export function FormRunner({
{form.banner &&
}
{/* Header */}
-
+
{isReview && `${allowEdit ? "Edit" : "View"} - `}
@@ -145,7 +145,7 @@ export function FormRunner({
return (
{
editResponse.mutate({
id: responseId,
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
responseData: payload as any,
});
};
diff --git a/apps/blade/src/app/_components/forms/shared/instruction-edit-card.tsx b/apps/blade/src/app/_components/forms/shared/instruction-edit-card.tsx
index f5a83d8d7..ff3a39113 100644
--- a/apps/blade/src/app/_components/forms/shared/instruction-edit-card.tsx
+++ b/apps/blade/src/app/_components/forms/shared/instruction-edit-card.tsx
@@ -176,7 +176,7 @@ export function InstructionEditCard({
value={instruction.title}
onChange={handleTitleChange}
placeholder="Instruction Title"
- className="min-h-[3rem] resize-none overflow-hidden border-none bg-transparent px-0 py-0 text-lg font-medium placeholder:text-muted-foreground focus-visible:ring-0"
+ className="min-h-12 resize-none overflow-hidden border-none bg-transparent px-0 py-0 text-lg font-medium placeholder:text-muted-foreground focus-visible:ring-0"
rows={1}
onInput={(e) => {
const target = e.target as HTMLTextAreaElement;
diff --git a/apps/blade/src/app/_components/forms/shared/question-edit-card.tsx b/apps/blade/src/app/_components/forms/shared/question-edit-card.tsx
index e00313ac5..bd4e127d8 100644
--- a/apps/blade/src/app/_components/forms/shared/question-edit-card.tsx
+++ b/apps/blade/src/app/_components/forms/shared/question-edit-card.tsx
@@ -168,7 +168,7 @@ export function QuestionEditCard({
value={question.question}
onChange={handleTitleChange}
placeholder="Question"
- className="min-h-[3rem] resize-none overflow-hidden border-none bg-transparent px-0 py-0 text-lg font-medium placeholder:text-muted-foreground focus-visible:ring-0"
+ className="min-h-12 resize-none overflow-hidden border-none bg-transparent px-0 py-0 text-lg font-medium placeholder:text-muted-foreground focus-visible:ring-0"
rows={1}
onInput={(e) => {
// Auto-resize
diff --git a/apps/blade/src/app/_components/judge/projects-table.tsx b/apps/blade/src/app/_components/judge/projects-table.tsx
index c528b477e..67b21d6dc 100644
--- a/apps/blade/src/app/_components/judge/projects-table.tsx
+++ b/apps/blade/src/app/_components/judge/projects-table.tsx
@@ -91,6 +91,7 @@ export function ProjectsTable({ hackathonId }: { hackathonId?: string }) {
// Auto-filter challenge based on selected judge
useEffect(() => {
if (selectedJudge) {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setChallengeFilter(selectedJudge.challengeId);
} else {
setChallengeFilter("");
diff --git a/apps/blade/src/app/_components/judge/results-table.tsx b/apps/blade/src/app/_components/judge/results-table.tsx
index 1ec1c6250..7d1a2f560 100644
--- a/apps/blade/src/app/_components/judge/results-table.tsx
+++ b/apps/blade/src/app/_components/judge/results-table.tsx
@@ -386,7 +386,7 @@ export default function ResultsTable() {
-
+
{project.challengeTitle}
diff --git a/apps/blade/src/app/_components/navigation/user-dropdown.tsx b/apps/blade/src/app/_components/navigation/user-dropdown.tsx
index 9638972c7..dba314b02 100644
--- a/apps/blade/src/app/_components/navigation/user-dropdown.tsx
+++ b/apps/blade/src/app/_components/navigation/user-dropdown.tsx
@@ -84,7 +84,10 @@ export function UserDropdown({ permissions }: UserDropdownProps) {
{/* Needed a button with no styles for accessibility */}
-
+
diff --git a/apps/blade/src/app/_components/settings/hacker-profile-form.tsx b/apps/blade/src/app/_components/settings/hacker-profile-form.tsx
index e845b5961..2cfa53dd2 100644
--- a/apps/blade/src/app/_components/settings/hacker-profile-form.tsx
+++ b/apps/blade/src/app/_components/settings/hacker-profile-form.tsx
@@ -173,7 +173,7 @@ export function HackerProfileForm({
if (file.size > MINIO.MAX_RESUME_SIZE) {
ctx.addIssue({
code: z.ZodIssueCode.too_big,
- type: "number",
+ origin: "number",
maximum: MINIO.MAX_RESUME_SIZE,
inclusive: true,
exact: false,
@@ -246,6 +246,7 @@ export function HackerProfileForm({
});
if (hacker.foodAllergies) {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setSelectedAllergies(hacker.foodAllergies.split(","));
allergiesRef.current = hacker.foodAllergies.split(",");
}
@@ -388,7 +389,7 @@ export function HackerProfileForm({
)}
/>
-
+
Demographic Information
This is some additional information about you.
@@ -495,7 +496,7 @@ export function HackerProfileForm({
)}
/>
-
+
Academic Information
This is where you go to school and what you're studying.
@@ -593,7 +594,7 @@ export function HackerProfileForm({
)}
/>
-
+
Hackathon Survey
Tell us a bit more about yourself!
@@ -639,7 +640,7 @@ export function HackerProfileForm({
)}
/>
-
+
Additional Links
Feel free to include what makes you, you.
@@ -755,7 +756,7 @@ export function HackerProfileForm({
Select Allergies:
@@ -781,7 +782,7 @@ export function HackerProfileForm({
{FORMS.ALLERGIES.map((allergy) => (
@@ -942,7 +943,7 @@ export function HackerProfileForm({
)}
-
+
Danger Zone
Avoid this if you're not sure what you're doing.
diff --git a/apps/blade/src/app/_components/settings/member-profile-form.tsx b/apps/blade/src/app/_components/settings/member-profile-form.tsx
index 1dc24645f..f35c68658 100644
--- a/apps/blade/src/app/_components/settings/member-profile-form.tsx
+++ b/apps/blade/src/app/_components/settings/member-profile-form.tsx
@@ -114,6 +114,7 @@ export function MemberProfileForm({
};
const form = useForm({
+ // @ts-expect-error -- schema uses .transform() so input≠output; ZodType in useForm can't represent this
schema: InsertMemberSchema.omit({
age: true,
userId: true,
@@ -150,7 +151,7 @@ export function MemberProfileForm({
if (file.size > MINIO.MAX_RESUME_SIZE) {
ctx.addIssue({
code: z.ZodIssueCode.too_big,
- type: "number",
+ origin: "number",
maximum: MINIO.MAX_RESUME_SIZE,
inclusive: true,
message: "File too large: maximum 5MB",
@@ -181,7 +182,7 @@ export function MemberProfileForm({
if (file.size > MINIO.KNIGHTHACKS_MAX_PROFILE_PICTURE_SIZE) {
ctx.addIssue({
code: z.ZodIssueCode.too_big,
- type: "number",
+ origin: "number",
maximum: MINIO.KNIGHTHACKS_MAX_PROFILE_PICTURE_SIZE,
inclusive: true,
message: `File too large: maximum ${MINIO.KNIGHTHACKS_MAX_PROFILE_PICTURE_SIZE / (1024 * 1024)}MB`,
@@ -248,7 +249,7 @@ export function MemberProfileForm({
phoneNumber: member?.phoneNumber ?? "",
dob: member?.dob,
gradTerm: initTermYear.term as FORMS.GradTerm,
- gradYear: initTermYear.year,
+ gradYear: Number(initTermYear.year),
company: member?.company,
githubProfileUrl: member?.githubProfileUrl ?? "",
linkedinProfileUrl: member?.linkedinProfileUrl ?? "",
@@ -434,7 +435,7 @@ export function MemberProfileForm({
)}
/>
-
+
Demographic Information
This is some additional information about you.
@@ -546,7 +547,7 @@ export function MemberProfileForm({
)}
/>
-
+
Academic Information
This is where you go to school and what you're studying.
@@ -754,7 +755,7 @@ export function MemberProfileForm({
/>
)}
-
+
Guild Profile Customization
Personalize how you appear on the Knight Hacks{" "}
@@ -919,7 +920,7 @@ export function MemberProfileForm({
)}
-
+
Danger Zone
Avoid this if you're not sure what you're doing.
diff --git a/apps/blade/src/app/_components/shared/ToggleEditInput.tsx b/apps/blade/src/app/_components/shared/ToggleEditInput.tsx
index 75695fedc..bd6fc4293 100644
--- a/apps/blade/src/app/_components/shared/ToggleEditInput.tsx
+++ b/apps/blade/src/app/_components/shared/ToggleEditInput.tsx
@@ -32,6 +32,7 @@ export default function ToggleEditInput({
useEffect(() => {
if (submit) {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
setToggle(false);
}
}, [submit]);
diff --git a/apps/blade/src/app/admin/forms/[slug]/page.tsx b/apps/blade/src/app/admin/forms/[slug]/page.tsx
index a7dc299b4..bb05a6cba 100644
--- a/apps/blade/src/app/admin/forms/[slug]/page.tsx
+++ b/apps/blade/src/app/admin/forms/[slug]/page.tsx
@@ -7,11 +7,10 @@ import { EditorClient } from "~/app/_components/admin/forms/editor/client";
import { extractProcedures } from "~/lib/utils";
import { api } from "~/trpc/server";
-export default async function FormEditorPage({
- params,
-}: {
- params: { slug: string };
+export default async function FormEditorPage(props: {
+ params: Promise<{ slug: string }>;
}) {
+ const params = await props.params;
const session = await auth();
if (!session) {
diff --git a/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx b/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx
index 361b4f53f..f60c00c37 100644
--- a/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx
+++ b/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx
@@ -12,11 +12,10 @@ import { PerUserResponsesView } from "~/app/_components/admin/forms/responses/Pe
import { SIGN_IN_PATH } from "~/consts";
import { api, HydrateClient } from "~/trpc/server";
-export default async function FormResponsesPage({
- params,
-}: {
- params: { slug: string };
+export default async function FormResponsesPage(props: {
+ params: Promise<{ slug: string }>;
}) {
+ const params = await props.params;
const session = await auth();
if (!session) {
redirect(SIGN_IN_PATH);
diff --git a/apps/blade/src/app/api/membership/route.ts b/apps/blade/src/app/api/membership/route.ts
index 97f754b3e..d0393facb 100644
--- a/apps/blade/src/app/api/membership/route.ts
+++ b/apps/blade/src/app/api/membership/route.ts
@@ -8,7 +8,7 @@ import { DuesPayment, DuesPaymentSchema } from "@forge/db/schemas/knight-hacks";
import { env } from "~/env";
async function membershipRecord(sessionId: string) {
- const stripe = new Stripe(env.STRIPE_SECRET_KEY, { typescript: true });
+ const stripe = new Stripe(env.STRIPE_SECRET_KEY);
// TODO: Make this function safe to run multiple times,
// even concurrently, with the same session ID
@@ -50,7 +50,7 @@ async function membershipRecord(sessionId: string) {
export async function POST(request: NextRequest) {
const sig = request.headers.get("stripe-signature") ?? "";
- const stripe = new Stripe(env.STRIPE_SECRET_KEY, { typescript: true });
+ const stripe = new Stripe(env.STRIPE_SECRET_KEY);
const webhookSecret = env.STRIPE_SECRET_WEBHOOK_KEY;
const body = await request.text();
let event: Stripe.Event;
@@ -63,7 +63,7 @@ export async function POST(request: NextRequest) {
});
}
- let success = false;
+ let success: boolean;
switch (event.type) {
case "checkout.session.async_payment_failed":
diff --git a/apps/blade/src/app/forms/[formName]/[responseId]/page.tsx b/apps/blade/src/app/forms/[formName]/[responseId]/page.tsx
index 22f5e2a6f..64206fa1e 100644
--- a/apps/blade/src/app/forms/[formName]/[responseId]/page.tsx
+++ b/apps/blade/src/app/forms/[formName]/[responseId]/page.tsx
@@ -27,13 +27,12 @@ function serializeSearchParams(
return queryString ? `?${queryString}` : "";
}
-export default async function FormResponderPage({
- params,
- searchParams,
-}: {
- params: { responseId: string; formName: string };
- searchParams: Record;
+export default async function FormResponderPage(props: {
+ params: Promise<{ responseId: string; formName: string }>;
+ searchParams: Promise>;
}) {
+ const params = await props.params;
+ const searchParams = await props.searchParams;
const session = await auth();
if (!session) {
const callbackURL =
diff --git a/apps/blade/src/app/forms/[formName]/page.tsx b/apps/blade/src/app/forms/[formName]/page.tsx
index 7d9561016..ffb477dbe 100644
--- a/apps/blade/src/app/forms/[formName]/page.tsx
+++ b/apps/blade/src/app/forms/[formName]/page.tsx
@@ -8,11 +8,10 @@ import { Card } from "@forge/ui/card";
import { FormResponderWrapper } from "~/app/_components/forms/form-responder-client";
import { api, HydrateClient } from "~/trpc/server";
-export async function generateMetadata({
- params,
-}: {
- params: { formName: string };
+export async function generateMetadata(props: {
+ params: Promise<{ formName: string }>;
}): Promise {
+ const params = await props.params;
try {
const form = await api.forms.getForm({ slug_name: params.formName });
const description = `Official application for ${form.name} through Blade.`;
@@ -48,13 +47,12 @@ function serializeSearchParams(
return queryString ? `?${queryString}` : "";
}
-export default async function FormResponderPage({
- params,
- searchParams,
-}: {
- params: { formName: string };
- searchParams: Record;
+export default async function FormResponderPage(props: {
+ params: Promise<{ formName: string }>;
+ searchParams: Promise>;
}) {
+ const params = await props.params;
+ const searchParams = await props.searchParams;
const session = await auth();
if (!session) {
const callbackURL =
diff --git a/apps/blade/src/app/globals.css b/apps/blade/src/app/globals.css
index feda86387..810060223 100644
--- a/apps/blade/src/app/globals.css
+++ b/apps/blade/src/app/globals.css
@@ -1,6 +1,12 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
+@import "tailwindcss";
+@source "../../packages/ui/src";
+@config "../../tailwind.config.ts";
+
+@utility container {
+ margin-inline: auto;
+ padding-inline: 2rem;
+ max-width: 1400px;
+}
@layer base {
:root {
diff --git a/apps/blade/src/app/hacker/application/[hackathon-id]/page.tsx b/apps/blade/src/app/hacker/application/[hackathon-id]/page.tsx
index b3c61d203..f80682f9e 100644
--- a/apps/blade/src/app/hacker/application/[hackathon-id]/page.tsx
+++ b/apps/blade/src/app/hacker/application/[hackathon-id]/page.tsx
@@ -12,11 +12,10 @@ export const metadata: Metadata = {
description: "Application to be a hacker",
};
-export default async function HackerApplicationPage({
- params,
-}: {
- params: { "hackathon-id": string };
+export default async function HackerApplicationPage(props: {
+ params: Promise<{ "hackathon-id": string }>;
}) {
+ const params = await props.params;
const session = await auth();
if (session == null) {
diff --git a/apps/blade/src/trpc/server.ts b/apps/blade/src/trpc/server.ts
index 18191a246..b9a93fbb5 100644
--- a/apps/blade/src/trpc/server.ts
+++ b/apps/blade/src/trpc/server.ts
@@ -13,7 +13,7 @@ import { createQueryClient } from "./query-client";
* handling a tRPC call from a React Server Component.
*/
const createContext = cache(async () => {
- const heads = new Headers(headers());
+ const heads = new Headers(await headers());
heads.set("x-trpc-source", "rsc");
return createTRPCContext({
diff --git a/apps/blade/tailwind.config.ts b/apps/blade/tailwind.config.ts
index 056b2d032..fd58e7ce3 100644
--- a/apps/blade/tailwind.config.ts
+++ b/apps/blade/tailwind.config.ts
@@ -1,19 +1,73 @@
import type { Config } from "tailwindcss";
-import { fontFamily } from "tailwindcss/defaultTheme";
+import defaultTheme from "tailwindcss/defaultTheme";
-import baseConfig from "@forge/tailwind-config/web";
+const { fontFamily } = defaultTheme;
export default {
- // We need to append the path to the UI package to the content array so that
- // those classes are included correctly.
- content: [...baseConfig.content, "../../packages/ui/src/*.{ts,tsx}"],
- presets: [baseConfig],
+ darkMode: ["class", ".dark"],
theme: {
extend: {
+ colors: {
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ },
+ borderColor: {
+ DEFAULT: "hsl(var(--border))",
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
fontFamily: {
sans: ["var(--font-geist-sans)", ...fontFamily.sans],
mono: ["var(--font-geist-mono)", ...fontFamily.mono],
},
+ keyframes: {
+ "accordion-down": {
+ from: { height: "0" },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ },
},
},
} satisfies Config;
diff --git a/apps/club/next.config.js b/apps/club/next.config.js
index c7a8e1f36..bbe72560b 100644
--- a/apps/club/next.config.js
+++ b/apps/club/next.config.js
@@ -10,7 +10,6 @@ const config = {
transpilePackages: ["@forge/ui"],
/** We already do linting and typechecking as separate tasks in CI */
- eslint: { ignoreDuringBuilds: true },
typescript: { ignoreBuildErrors: true },
};
diff --git a/apps/club/package.json b/apps/club/package.json
index c58058758..224301783 100644
--- a/apps/club/package.json
+++ b/apps/club/package.json
@@ -22,24 +22,25 @@
"@forge/ui": "workspace:*",
"@gsap/react": "^2.1.2",
"@svgr/webpack": "^8.1.0",
- "framer-motion": "^12.0.1",
- "geist": "^1.3.1",
- "gsap": "^3.12.7",
- "lucide-react": "^0.469.0",
- "next": "^14.2.26",
- "react": "catalog:react18",
- "react-dom": "catalog:react18",
- "rsuite": "^5.77.0"
+ "framer-motion": "^12.34.3",
+ "geist": "^1.7.0",
+ "gsap": "^3.14.2",
+ "lucide-react": "^0.575.0",
+ "next": "^16.0.0",
+ "react": "^19.2.4",
+ "react-dom": "^19.2.4",
+ "rsuite": "^6.1.2"
},
"devDependencies": {
"@forge/eslint-config": "workspace:*",
"@forge/prettier-config": "workspace:*",
"@forge/tailwind-config": "workspace:*",
"@forge/tsconfig": "workspace:*",
- "@types/node": "^20.16.11",
- "@types/react": "catalog:react18",
- "@types/react-dom": "catalog:react18",
- "dotenv-cli": "^7.4.2",
+ "@tailwindcss/postcss": "^4.2.1",
+ "@types/node": "^25.3.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "dotenv-cli": "^11.0.0",
"eslint": "catalog:",
"prettier": "catalog:",
"tailwindcss": "catalog:",
diff --git a/apps/club/postcss.config.cjs b/apps/club/postcss.config.cjs
index ee5f90b30..483f37854 100644
--- a/apps/club/postcss.config.cjs
+++ b/apps/club/postcss.config.cjs
@@ -1,5 +1,5 @@
module.exports = {
plugins: {
- tailwindcss: {},
+ "@tailwindcss/postcss": {},
},
};
diff --git a/apps/club/src/app/_components/landing/about.tsx b/apps/club/src/app/_components/landing/about.tsx
index 3c36cb01e..467a3bbc9 100644
--- a/apps/club/src/app/_components/landing/about.tsx
+++ b/apps/club/src/app/_components/landing/about.tsx
@@ -55,7 +55,7 @@ export default function About() {
ref={textRef}
className="font-poppins px-4 text-lg font-semibold leading-relaxed tracking-wide text-white/80 md:px-12 md:text-2xl"
>
-
+
Knight Hacks
{" "}
is the largest Software Development and only Hackathon organization
@@ -70,9 +70,9 @@ export default function About() {
-
-
-
+
+
+
);
}
diff --git a/apps/club/src/app/_components/landing/calendar.tsx b/apps/club/src/app/_components/landing/calendar.tsx
index edd01141f..c7d3c3755 100644
--- a/apps/club/src/app/_components/landing/calendar.tsx
+++ b/apps/club/src/app/_components/landing/calendar.tsx
@@ -16,6 +16,35 @@ import TerminalSVG from "./assets/terminal";
import "rsuite/Calendar/styles/index.css";
+function TodoList({ list }: { list: ReturnEvent[] }) {
+ if (!list.length) {
+ return (
+
+
+ No events for this date
+
+
+ );
+ }
+ return (
+
+ {list.map((item) => (
+
+
+
+ {formatDateRange(item.start_datetime, item.end_datetime)}
+
+ {item.name}
+
+
+ ))}
+
+ );
+}
+
export default function CalendarEventsPage({
events,
}: {
@@ -61,6 +90,7 @@ export default function CalendarEventsPage({
const key = `${date.getDate()}-${date.getMonth()}-${date.getFullYear()}`;
return eventMap.get(key) ?? [];
}
+ const selectedList = selectedDate ? getTodoList(selectedDate) : [];
function renderCell(date: Date) {
const hasEvents = getTodoList(date).length > 0;
@@ -73,35 +103,6 @@ export default function CalendarEventsPage({
) : null;
}
- const TodoList = ({ date }: { date: Date }) => {
- const list = getTodoList(date);
- if (!list.length) {
- return (
-
-
- No events for this date
-
-
- );
- }
- return (
-
- {list.map((item) => (
-
-
-
- {formatDateRange(item.start_datetime, item.end_datetime)}
-
- {item.name}
-
-
- ))}
-
- );
- };
const handleSelect = (date: Date) => {
setSelectedDate(date);
};
@@ -113,7 +114,7 @@ export default function CalendarEventsPage({
Stay up to date!
@@ -154,15 +155,15 @@ export default function CalendarEventsPage({
})}{" "}
Events
-
+
)}
-
-
-
+
+
+
);
}
diff --git a/apps/club/src/app/_components/landing/discover.tsx b/apps/club/src/app/_components/landing/discover.tsx
index b2938c99f..4039dec79 100644
--- a/apps/club/src/app/_components/landing/discover.tsx
+++ b/apps/club/src/app/_components/landing/discover.tsx
@@ -76,15 +76,15 @@ export default function Discover({ memberCount }: { memberCount: number }) {
return (
-
+
Active Members
@@ -99,13 +99,13 @@ export default function Discover({ memberCount }: { memberCount: number }) {
window.open(
DISCORD.PERMANENT_INVITE as string,
diff --git a/apps/club/src/app/_components/landing/hero-assets/typing-text.tsx b/apps/club/src/app/_components/landing/hero-assets/typing-text.tsx
index e5c5eebd7..06cdc04fe 100644
--- a/apps/club/src/app/_components/landing/hero-assets/typing-text.tsx
+++ b/apps/club/src/app/_components/landing/hero-assets/typing-text.tsx
@@ -175,10 +175,9 @@ function Type({
const [direction, setDirection] = useState(
TypingDirection.Forward,
);
- const [isComplete, setIsComplete] = useState(false);
-
const words = useMemo(() => text.split(/\s+/), [text]);
const total = smooth ? words.length : text.length;
+ const isComplete = index === total && !repeat;
useEffect(() => {
// eslint-disable-next-line prefer-const
@@ -224,7 +223,6 @@ function Type({
useEffect(() => {
if (index === total && !repeat) {
- setIsComplete(true);
onComplete?.();
}
}, [index, total, repeat, onComplete]);
diff --git a/apps/club/src/app/_components/landing/hero.tsx b/apps/club/src/app/_components/landing/hero.tsx
index 6dc8b93f6..206796b21 100644
--- a/apps/club/src/app/_components/landing/hero.tsx
+++ b/apps/club/src/app/_components/landing/hero.tsx
@@ -11,8 +11,8 @@ import TypingText from "./hero-assets/typing-text";
const Hero = ({ bladeUrl }: { bladeUrl: string }) => {
return (
-
-
+
+
@@ -26,7 +26,7 @@ const Hero = ({ bladeUrl }: { bladeUrl: string }) => {
repeat={false}
/>
-
+
diff --git a/apps/club/src/app/_components/landing/impact-assets/wave-reveal.tsx b/apps/club/src/app/_components/landing/impact-assets/wave-reveal.tsx
index ffa56b87b..fd4fb4a9c 100644
--- a/apps/club/src/app/_components/landing/impact-assets/wave-reveal.tsx
+++ b/apps/club/src/app/_components/landing/impact-assets/wave-reveal.tsx
@@ -133,7 +133,7 @@ const createAnimatedNodes = (
const isLast = index === length - 1;
const className = cn(
- "inline-block opacity-0 transition-all ease-in-out fill-mode-forwards",
+ "fill-mode-forwards inline-block opacity-0 transition-all ease-in-out",
{
// Determine the animation direction
["animate-[reveal-down]"]: !isUp && !blur,
diff --git a/apps/club/src/app/_components/landing/impact.tsx b/apps/club/src/app/_components/landing/impact.tsx
index 721b8fe2b..919ee26af 100644
--- a/apps/club/src/app/_components/landing/impact.tsx
+++ b/apps/club/src/app/_components/landing/impact.tsx
@@ -64,8 +64,8 @@ export default function Impact() {
ref={containerRef}
className="relative flex h-screen min-h-screen flex-col items-center justify-center"
>
-
-
+
+
IMPACT
diff --git a/apps/club/src/app/_components/landing/sponsors-assets/sponsor-card.tsx b/apps/club/src/app/_components/landing/sponsors-assets/sponsor-card.tsx
index 42f22cfcb..a8487d1c2 100644
--- a/apps/club/src/app/_components/landing/sponsors-assets/sponsor-card.tsx
+++ b/apps/club/src/app/_components/landing/sponsors-assets/sponsor-card.tsx
@@ -25,7 +25,7 @@ export default function SponsorCard({
>
{sponsor}
-
+
{
return (
<>
-
+
{companies.map((logo, index) => (
diff --git a/apps/club/src/app/_components/links/assets/abstract-shape-left-1.tsx b/apps/club/src/app/_components/links/assets/abstract-shape-left-1.tsx
index e00244878..3450aca8f 100644
--- a/apps/club/src/app/_components/links/assets/abstract-shape-left-1.tsx
+++ b/apps/club/src/app/_components/links/assets/abstract-shape-left-1.tsx
@@ -14,11 +14,11 @@ export default function AbstractShapeLeft1SVG(props: SVGProps) {
>
@@ -29,7 +29,7 @@ export default function AbstractShapeLeft1SVG(props: SVGProps) {
width="967.073"
height="592.841"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
>
@@ -29,7 +29,7 @@ export default function AbstractShapeLeft2SVG(props: SVGProps) {
width="924"
height="757.003"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
>
@@ -28,7 +28,7 @@ export default function AbstractShapeRight1SVG(props: SVGProps) {
width="586.021"
height="726.164"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
>
@@ -29,7 +29,7 @@ export default function AbstractShapeRight2SVG(props: SVGProps) {
width="359.111"
height="477.085"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="2022.65"
height="2000.45"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="350.821"
height="367.884"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="350.821"
height="367.884"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="350.821"
height="367.884"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="351.584"
height="361.821"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="351.584"
height="361.821"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="267.691"
height="284.753"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="267.691"
height="284.753"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2665"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="267.691"
height="284.753"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="267.691"
height="284.753"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2667"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="159.436"
height="166.261"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2667"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2667"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="159.436"
height="166.261"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2667"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2665"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="159.436"
height="166.261"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="87.2668"
height="87.2666"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
>
diff --git a/apps/club/src/app/_components/links/assets/chat-bubble.tsx b/apps/club/src/app/_components/links/assets/chat-bubble.tsx
index a8e79b897..0994b6abc 100644
--- a/apps/club/src/app/_components/links/assets/chat-bubble.tsx
+++ b/apps/club/src/app/_components/links/assets/chat-bubble.tsx
@@ -13,8 +13,8 @@ export default function ChatBubbleSVG(props: SVGProps) {
>
diff --git a/apps/club/src/app/_components/links/assets/facebook.tsx b/apps/club/src/app/_components/links/assets/facebook.tsx
index 9ec9b483b..082c97997 100644
--- a/apps/club/src/app/_components/links/assets/facebook.tsx
+++ b/apps/club/src/app/_components/links/assets/facebook.tsx
@@ -14,9 +14,9 @@ export default function FacebookSVG(props: SVGProps) {
);
diff --git a/apps/club/src/app/_components/links/assets/instagram.tsx b/apps/club/src/app/_components/links/assets/instagram.tsx
index 186d1f4cc..7b2883efa 100644
--- a/apps/club/src/app/_components/links/assets/instagram.tsx
+++ b/apps/club/src/app/_components/links/assets/instagram.tsx
@@ -14,9 +14,9 @@ export default function InstagramSVG(props: SVGProps) {
);
diff --git a/apps/club/src/app/_components/links/assets/kh-logo.tsx b/apps/club/src/app/_components/links/assets/kh-logo.tsx
index f7bbc82a9..1da115259 100644
--- a/apps/club/src/app/_components/links/assets/kh-logo.tsx
+++ b/apps/club/src/app/_components/links/assets/kh-logo.tsx
@@ -49,7 +49,7 @@ export default function KightHacksLogoSVG(props: SVGProps) {
d="M719.385 529.247C719.233 529.133 719.086 529.03 718.94 528.944C719.002 528.892 719.227 529.098 719.385 529.247Z"
fill="#D8B4FE"
stroke="#DBC34C"
- stroke-width="0.14"
+ strokeWidth="0.14"
stroke-miterlimit="10"
/>
) {
d="M719.385 529.247C719.233 529.133 719.086 529.03 718.94 528.944C719.002 528.892 719.227 529.098 719.385 529.247Z"
fill="#D8B4FE"
stroke="#DBC34C"
- stroke-width="0.14"
+ strokeWidth="0.14"
stroke-miterlimit="10"
/>
) {
width="2490.96"
height="2490.96"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="437.729"
height="149.92"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
>
diff --git a/apps/club/src/app/_components/links/assets/linkedin.tsx b/apps/club/src/app/_components/links/assets/linkedin.tsx
index eef47c961..d58f20732 100644
--- a/apps/club/src/app/_components/links/assets/linkedin.tsx
+++ b/apps/club/src/app/_components/links/assets/linkedin.tsx
@@ -14,23 +14,23 @@ export default function LinkedinSVG(props: SVGProps) {
);
diff --git a/apps/club/src/app/_components/links/assets/menu-horizontal.tsx b/apps/club/src/app/_components/links/assets/menu-horizontal.tsx
index 87fa25714..6a41d95f2 100644
--- a/apps/club/src/app/_components/links/assets/menu-horizontal.tsx
+++ b/apps/club/src/app/_components/links/assets/menu-horizontal.tsx
@@ -14,23 +14,23 @@ export default function MenuHorizontalSVG(props: SVGProps) {
);
diff --git a/apps/club/src/app/_components/links/assets/outline.tsx b/apps/club/src/app/_components/links/assets/outline.tsx
index d1bd967e4..cb0c6a8fc 100644
--- a/apps/club/src/app/_components/links/assets/outline.tsx
+++ b/apps/club/src/app/_components/links/assets/outline.tsx
@@ -15,443 +15,443 @@ export default function OutlineSVG(props: SVGProps) {
@@ -462,7 +462,7 @@ export default function OutlineSVG(props: SVGProps) {
width="108.585"
height="89.169"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="129.081"
height="106.59"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="68.8056"
height="89.1057"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="12.5478"
height="13.7771"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="277.585"
height="323.087"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="159.986"
height="151.99"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="1581.92"
height="1747.61"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="232.436"
height="244.919"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="74.2925"
height="89.5477"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="162.59"
height="163.962"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="114.433"
height="114.089"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="11.0418"
height="8.02223"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="45.9234"
height="48.8719"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="7.95204"
height="9.55434"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="29.282"
height="29.803"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="65.2003"
height="40.4332"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="102.843"
height="107.228"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="104.978"
height="89.4754"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="103.264"
height="93.94"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="160.404"
height="151.386"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="107.72"
height="113.983"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="314.292"
height="325.829"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="128.777"
height="149.399"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="1702.82"
height="1758.02"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="90.7838"
height="71.5863"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="10.064"
height="12.384"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="45.6356"
height="48.8663"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="101.693"
height="84.3069"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="105.939"
height="107.982"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="176.372"
height="205.291"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="121.166"
height="149.405"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="105.6"
height="113.858"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="60.9762"
height="76.0429"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="72.9149"
height="64.0814"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="73.2634"
height="63.4763"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="70.015"
height="57.8815"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="70.5862"
height="59.1758"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="65.1675"
height="53.3684"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="66.6987"
height="57.2062"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="65.4555"
height="56.5363"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="64.3529"
height="55.8712"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="61.7779"
height="53.224"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="63.4517"
height="55.0335"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="58.5202"
height="49.7902"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="60.3108"
height="51.166"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="58.5831"
height="52.1856"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="86.0374"
height="74.8067"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="100.48"
height="111.073"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="24.7964"
height="27.358"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="29.0942"
height="21.187"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="37.4595"
height="35.0252"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="21.8464"
height="20.1767"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="23.0248"
height="14.5937"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="85.2807"
height="82.0624"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="43.134"
height="49.5285"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="3230.37"
height="3229.72"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="197.284"
height="195.155"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="197.284"
height="195.155"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="197.284"
height="195.155"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="827.71"
height="840.103"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="827.723"
height="840.117"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="1036.57"
height="1088.93"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
width="1334.12"
height="1310.56"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
) {
width="1367.61"
height="1266.57"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
) {
);
diff --git a/apps/club/src/app/_components/links/assets/youtube.tsx b/apps/club/src/app/_components/links/assets/youtube.tsx
index 13a34fda9..81e399c76 100644
--- a/apps/club/src/app/_components/links/assets/youtube.tsx
+++ b/apps/club/src/app/_components/links/assets/youtube.tsx
@@ -14,16 +14,16 @@ export default function YoutubeSVG(props: SVGProps) {
);
diff --git a/apps/club/src/app/_components/links/button.tsx b/apps/club/src/app/_components/links/button.tsx
index 40adf8264..361e89ac3 100644
--- a/apps/club/src/app/_components/links/button.tsx
+++ b/apps/club/src/app/_components/links/button.tsx
@@ -1,13 +1,28 @@
-import type { ComponentType, SVGProps } from "react";
-import type { ButtonProps } from "rsuite";
+import type {
+ AnchorHTMLAttributes,
+ ButtonHTMLAttributes,
+ ComponentType,
+ SVGProps,
+} from "react";
import MenuHorizontalSVG from "./assets/menu-horizontal";
-interface Props extends ButtonProps {
+interface Base {
icon?: ComponentType>;
- href?: string;
}
+type ButtonVariant = Base &
+ ButtonHTMLAttributes & {
+ href?: undefined;
+ };
+
+type AnchorVariant = Base &
+ AnchorHTMLAttributes & {
+ href: string;
+ };
+
+type Props = ButtonVariant | AnchorVariant;
+
export default function Button({ icon: Icon, href, ...props }: Props) {
const innerText = props.children;
@@ -15,19 +30,19 @@ export default function Button({ icon: Icon, href, ...props }: Props) {
return (
<>
)}
>
{Icon && (
)}
{innerText}
{
}
@@ -38,19 +53,19 @@ export default function Button({ icon: Icon, href, ...props }: Props) {
return (
)}
>
{Icon && (
)}
{innerText}
{
}
diff --git a/apps/club/src/app/_components/links/links-header.tsx b/apps/club/src/app/_components/links/links-header.tsx
index 09cbfde92..6ed1fdfee 100644
--- a/apps/club/src/app/_components/links/links-header.tsx
+++ b/apps/club/src/app/_components/links/links-header.tsx
@@ -34,12 +34,12 @@ const links = [
export default function Header() {
return (
-