Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
10d745c
club purge
myr124 May 13, 2026
5dddfe0
cleared home page and implemented new navbar (need to make coloring a…
myr124 May 13, 2026
16d3dd3
changes to navbar, radial dot pattern in globals
myr124 May 13, 2026
38e7eb6
changed regular divs to shadcn buttons with styling (we could do css …
myr124 May 13, 2026
78b3928
took button styles from tailwind and css classes so we can reuse the …
myr124 May 13, 2026
7d4f821
added routes for pages
myr124 May 13, 2026
0df617e
fine tuning gradients (they still suck)
myr124 May 13, 2026
83fcbf5
removed accidentally staged claude.md
myr124 May 13, 2026
5813b7e
moved navbar and bg to layout
myr124 May 14, 2026
8e93cd0
made coderabbit changes, mobile nav, breakpoint fixes for buttons
myr124 May 16, 2026
f970aa1
Bloomknights (#456)
Adr1an04 May 31, 2026
7d43dbf
Hacker application experience and background system (#458)
Adr1an04 Jun 4, 2026
74399cd
Hacker dashboard (#461)
Adr1an04 Jun 6, 2026
30c7a62
BloomKnights and KHix site fixes (#463)
Adr1an04 Jun 8, 2026
a8665ab
css changes and hacker application speed up (#465)
Adr1an04 Jun 8, 2026
a91649b
iphone cut off fix bk application
Adr1an04 Jun 8, 2026
7408cab
background overlay bug fix
Adr1an04 Jun 8, 2026
75877fb
shadow gradient lower
Adr1an04 Jun 8, 2026
26f62e3
hacker form overflow issue potential fix
Adr1an04 Jun 8, 2026
9160adf
Merge remote-tracking branch 'origin/main' into club/new-site
Adr1an04 Jun 11, 2026
a56e72a
Merge remote-tracking branch 'origin/club-site-staging' into club/new…
Adr1an04 Jun 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/2025/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"@trpc/server": "^11.10.0",
"framer-motion": "^12.34.3",
"minimatch": "^10.2.4",
"next": "^16.0.0",
"next": "^16.2.7",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"server-only": "^0.0.1",
Expand All @@ -40,7 +40,7 @@
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"eslint": "catalog:",
"eslint-config-next": "^16.0.0",
"eslint-config-next": "^16.2.7",
"postcss": "^8.5.6",
"prettier": "^3.8.1",
"prettier-plugin-tailwindcss": "^0.7.2",
Expand Down
4 changes: 2 additions & 2 deletions apps/2025/src/app/_components/faq/faq.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ const faqData: FaqItem[] = [
id: "11",
question: "Is food provided?",
answer:
"We provide free meals, snacks, and drinks throughout the event to keep you energized. We also accommodate dietary restrictionsjust let us know during registration.",
"We provide free meals, snacks, and drinks throughout the event to keep you energized. We also accommodate dietary restrictions, just let us know during registration.",
category: "logistics",
},
{
Expand All @@ -165,7 +165,7 @@ const faqData: FaqItem[] = [
id: "14",
question: "Can I use a past project or something I've built before?",
answer:
"Nopeprojects must be started after the hackathon begins. You're welcome to brainstorm ideas or learn tools ahead of time, but actual work should begin during the event to keep it fair for everyone.",
"Nope, projects must be started after the hackathon begins. You're welcome to brainstorm ideas or learn tools ahead of time, but actual work should begin during the event to keep it fair for everyone.",
category: "event-details",
},
{
Expand Down
2 changes: 1 addition & 1 deletion apps/blade/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
"googleapis": "^171.4.0",
"lucide-react": "^0.575.0",
"minio": "^8.0.6",
"next": "^16.0.0",
"next": "^16.2.7",
"next-themes": "^0.4.6",
"react": "^19.2.4",
"react-dom": "^19.2.4",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ export default function RaffleDraw({ entries }: { entries: RaffleEntry[] }) {
>
<Card className="relative mb-8 w-full overflow-hidden rounded-lg border-2 border-primary bg-card p-1">
<div className="flex h-[400px] flex-col items-center justify-center overflow-hidden">
{/* ———————————————————————— STATES ———————————————————————— */}
{/* STATES */}
{!isDrawing && !winner ? (
<div className="flex flex-col items-center justify-center space-y-4 p-8 text-center">
<Sparkles className="h-16 w-16 text-primary" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ export function CreateEventButton() {
)}
/>

{/* Discord Channel ID shown only for internal events */}
{/* Discord Channel ID, shown only for internal events */}
{form.watch("isOperationsCalendar") && (
<FormField
control={form.control}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@ export function UpdateEventButton({ event }: { event: InsertEvent }) {
</div>
</div>

{/* End Date NEW */}
{/* End Date, NEW */}
<FormField
control={form.control}
name="endDate"
Expand Down Expand Up @@ -729,7 +729,7 @@ export function UpdateEventButton({ event }: { event: InsertEvent }) {
)}
/>

{/* Discord Channel ID shown only for internal events */}
{/* Discord Channel ID, shown only for internal events */}
{form.watch("isOperationsCalendar") && (
<FormField
control={form.control}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,9 @@ export function FileUploadResponsesTable({
: "Anonymous"}
</TableCell>
<TableCell>{response.member?.email ?? "N/A"}</TableCell>
<TableCell className="max-w-[500px]">—</TableCell>
<TableCell className="max-w-[500px]">
No response
</TableCell>
</TableRow>
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ export function PerUserResponsesView({

const formatResponseValue = (value: unknown): string => {
if (value === undefined || value === null) {
return "";
return "No response";
}
if (Array.isArray(value)) {
return value.join(", ");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export function ResponsesTable({ question, responses }: ResponsesTableProps) {

let displayValue: React.ReactNode;
if (answer === undefined || answer === null) {
displayValue = "";
displayValue = "No response";
} else if (Array.isArray(answer)) {
displayValue = answer.join(", ");
} else if (typeof answer === "boolean") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ export function UpdateEventButton({ event }: { event: InsertEvent }) {
</div>
</div>

{/* End Date NEW */}
{/* End Date, NEW */}
<FormField
control={form.control}
name="endDate"
Expand Down Expand Up @@ -736,7 +736,7 @@ export function UpdateEventButton({ event }: { event: InsertEvent }) {
)}
/>

{/* Discord Channel ID shown only for internal events */}
{/* Discord Channel ID, shown only for internal events */}
{form.watch("isOperationsCalendar") && (
<FormField
control={form.control}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,43 @@ import { useState } from "react";
import { Check, Loader2 } from "lucide-react";

import type { InsertHacker } from "@forge/db/schemas/knight-hacks";
import { HACKATHON_TEMPLATE_IDS } from "@forge/email/client";
import { Button } from "@forge/ui/button";
import { toast } from "@forge/ui/toast";

import { api } from "~/trpc/react";

export default function AcceptButton({
hacker,
hackathonName,
hackathonRouteName,
}: {
hacker: InsertHacker & { status: string };
hackathonName: string;
hackathonRouteName: string;
}) {
const [isLoading, setIsLoading] = useState(false);

const utils = api.useUtils();

const sendHackathonEmail = api.email.sendHackathonEmail.useMutation({
onSuccess: () => {
toast.success(
`Acceptance email sent to ${hacker.firstName} ${hacker.lastName}!`,
);
},
onError: (opts) => {
toast.error(opts.message);
},
});

const updateStatus = api.hackerMutation.updateHackerStatus.useMutation({
onSuccess() {
toast.success(`Accepted ${hacker.firstName} ${hacker.lastName}!`);
sendHackathonEmail.mutate({
from: "donotreply@knighthacks.org",
hackathonName: hackathonRouteName,
kind: "Accepted",
recipientName: hacker.firstName,
to: hacker.email,
});
},
onError: (opts) => {
toast.error(opts.message);
Expand All @@ -37,35 +54,13 @@ export default function AcceptButton({
},
});

const sendEmail = api.email.sendEmail.useMutation({
onSuccess: () => {
toast.success(
`Acceptance email sent to ${hacker.firstName} ${hacker.lastName}!`,
);
},
onError: (opts) => {
toast.error(opts.message);
},
});

const handleUpdateStatus = () => {
setIsLoading(true);

updateStatus.mutate({
id: hacker.id ?? "",
status: "accepted",
hackathonName,
});

sendEmail.mutate({
from: "donotreply@knighthacks.org",
to: hacker.email,
subject: `[ACTION REQUIRED] ${hackathonName} Acceptance Information!`,
template_id: HACKATHON_TEMPLATE_IDS.Accepted,
data: {
name: hacker.firstName,
hackathon: hackathonName,
},
hackathonName: hackathonRouteName,
});
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { useState } from "react";
import { Gavel, Loader2 } from "lucide-react";

import type { InsertHacker } from "@forge/db/schemas/knight-hacks";
import { HACKATHON_TEMPLATE_IDS } from "@forge/email/client";
import { Button } from "@forge/ui/button";
import {
Dialog,
Expand All @@ -19,20 +18,38 @@ import { api } from "~/trpc/react";

export default function BlacklistButton({
hacker,
hackathonName,
hackathonRouteName,
}: {
hacker: InsertHacker & { status: string };
hackathonName: string;
hackathonRouteName: string;
}) {
const [isOpen, setIsOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);

const utils = api.useUtils();
const sendHackathonEmail = api.email.sendHackathonEmail.useMutation({
onSuccess: () => {
toast.success(
`Blacklist email sent to ${hacker.firstName} ${hacker.lastName}!`,
);
},
onError: (opts) => {
toast.error(opts.message);
},
});

const updateStatus = api.hackerMutation.updateHackerStatus.useMutation({
onSuccess() {
toast.success(
`Denied ${hacker.firstName} ${hacker.lastName} successfully!`,
);
sendHackathonEmail.mutate({
from: "donotreply@knighthacks.org",
hackathonName: hackathonRouteName,
kind: "Blacklist",
recipientName: hacker.firstName,
to: hacker.email,
});
setIsOpen(false);
},
onError(opts) {
Expand All @@ -49,34 +66,12 @@ export default function BlacklistButton({
},
});

const sendEmail = api.email.sendEmail.useMutation({
onSuccess: () => {
toast.success(
`Blacklist email sent to ${hacker.firstName} ${hacker.lastName}!`,
);
},
onError: (opts) => {
toast.error(opts.message);
},
});

const handleUpdateStatus = () => {
setIsLoading(true);
updateStatus.mutate({
id: hacker.id ?? "",
status: "denied",
hackathonName,
});

sendEmail.mutate({
from: "donotreply@knighthacks.org",
to: hacker.email,
subject: `${hackathonName} Status Update`,
template_id: HACKATHON_TEMPLATE_IDS.Blacklist,
data: {
name: hacker.firstName,
hackathon: hackathonName,
},
hackathonName: hackathonRouteName,
});
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { useState } from "react";
import { Loader2, X } from "lucide-react";

import type { InsertHacker } from "@forge/db/schemas/knight-hacks";
import { HACKATHON_TEMPLATE_IDS } from "@forge/email/client";
import { Button } from "@forge/ui/button";
import {
Dialog,
Expand All @@ -19,20 +18,38 @@ import { api } from "~/trpc/react";

export default function DenyButton({
hacker,
hackathonName,
hackathonRouteName,
}: {
hacker: InsertHacker & { status: string };
hackathonName: string;
hackathonRouteName: string;
}) {
const [isOpen, setIsOpen] = useState<boolean>(false);
const [isLoading, setIsLoading] = useState<boolean>(false);

const utils = api.useUtils();
const sendHackathonEmail = api.email.sendHackathonEmail.useMutation({
onSuccess: () => {
toast.success(
`Denial email sent to ${hacker.firstName} ${hacker.lastName}!`,
);
},
onError: (opts) => {
toast.error(opts.message);
},
});

const updateStatus = api.hackerMutation.updateHackerStatus.useMutation({
onSuccess() {
toast.success(
`Denied ${hacker.firstName} ${hacker.lastName} successfully!`,
);
sendHackathonEmail.mutate({
from: "donotreply@knighthacks.org",
hackathonName: hackathonRouteName,
kind: "Capacity",
recipientName: hacker.firstName,
to: hacker.email,
});
setIsOpen(false);
},
onError(opts) {
Expand All @@ -49,34 +66,12 @@ export default function DenyButton({
},
});

const sendEmail = api.email.sendEmail.useMutation({
onSuccess: () => {
toast.success(
`Denial email sent to ${hacker.firstName} ${hacker.lastName}!`,
);
},
onError: (opts) => {
toast.error(opts.message);
},
});

const handleUpdateStatus = () => {
setIsLoading(true);
updateStatus.mutate({
id: hacker.id ?? "",
status: "denied",
hackathonName,
});

sendEmail.mutate({
from: "donotreply@knighthacks.org",
to: hacker.email,
subject: `${hackathonName} Status Update`,
template_id: HACKATHON_TEMPLATE_IDS.Capacity,
data: {
name: hacker.firstName,
hackathon: hackathonName,
},
hackathonName: hackathonRouteName,
});
};

Expand Down
Loading
Loading