Skip to content

Commit ca24354

Browse files
committed
Add election results
1 parent 3929dc6 commit ca24354

File tree

7 files changed

+569
-0
lines changed

7 files changed

+569
-0
lines changed

package-lock.json

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"@babel/plugin-syntax-import-attributes": "^7.23.3",
1414
"@headlessui/react": "^2.1.2",
1515
"@heroicons/react": "^1.0.6",
16+
"@radix-ui/react-slot": "^1.1.0",
1617
"clsx": "^2.1.1",
1718
"comclub-website-2024": "file:",
1819
"date-fns": "^3.6.0",

src/components/Card.tsx

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import * as React from 'react';
2+
3+
import { cn } from '../../lib/utils';
4+
5+
const Card = React.forwardRef<
6+
HTMLDivElement,
7+
React.HTMLAttributes<HTMLDivElement>
8+
>(({ className, ...props }, ref) => (
9+
<div
10+
ref={ref}
11+
className={cn(
12+
'rounded-lg border bg-card text-card-foreground shadow-sm',
13+
className,
14+
)}
15+
{...props}
16+
/>
17+
));
18+
Card.displayName = 'Card';
19+
20+
const CardHeader = React.forwardRef<
21+
HTMLDivElement,
22+
React.HTMLAttributes<HTMLDivElement>
23+
>(({ className, ...props }, ref) => (
24+
<div
25+
ref={ref}
26+
className={cn('flex flex-col space-y-1.5 p-6', className)}
27+
{...props}
28+
/>
29+
));
30+
CardHeader.displayName = 'CardHeader';
31+
32+
const CardTitle = React.forwardRef<
33+
HTMLParagraphElement,
34+
React.HTMLAttributes<HTMLHeadingElement>
35+
>(({ className, ...props }, ref) => (
36+
<h3
37+
ref={ref}
38+
className={cn(
39+
'text-2xl font-semibold leading-none tracking-tight',
40+
className,
41+
)}
42+
{...props}
43+
/>
44+
));
45+
CardTitle.displayName = 'CardTitle';
46+
47+
const CardDescription = React.forwardRef<
48+
HTMLParagraphElement,
49+
React.HTMLAttributes<HTMLParagraphElement>
50+
>(({ className, ...props }, ref) => (
51+
<p
52+
ref={ref}
53+
className={cn('text-sm text-muted-foreground', className)}
54+
{...props}
55+
/>
56+
));
57+
CardDescription.displayName = 'CardDescription';
58+
59+
const CardContent = React.forwardRef<
60+
HTMLDivElement,
61+
React.HTMLAttributes<HTMLDivElement>
62+
>(({ className, ...props }, ref) => (
63+
<div ref={ref} className={cn('p-6 pt-0', className)} {...props} />
64+
));
65+
CardContent.displayName = 'CardContent';
66+
67+
const CardFooter = React.forwardRef<
68+
HTMLDivElement,
69+
React.HTMLAttributes<HTMLDivElement>
70+
>(({ className, ...props }, ref) => (
71+
<div
72+
ref={ref}
73+
className={cn('flex items-center p-6 pt-0', className)}
74+
{...props}
75+
/>
76+
));
77+
CardFooter.displayName = 'CardFooter';
78+
79+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };

src/components/Table.tsx

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import * as React from 'react';
2+
3+
import { cn } from '../../lib/utils';
4+
5+
const Table = React.forwardRef<
6+
HTMLTableElement,
7+
React.HTMLAttributes<HTMLTableElement>
8+
>(({ className, ...props }, ref) => (
9+
<div className='relative w-full overflow-auto'>
10+
<table
11+
ref={ref}
12+
className={cn('w-full caption-bottom text-sm', className)}
13+
{...props}
14+
/>
15+
</div>
16+
));
17+
Table.displayName = 'Table';
18+
19+
const TableHeader = React.forwardRef<
20+
HTMLTableSectionElement,
21+
React.HTMLAttributes<HTMLTableSectionElement>
22+
>(({ className, ...props }, ref) => (
23+
<thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />
24+
));
25+
TableHeader.displayName = 'TableHeader';
26+
27+
const TableBody = React.forwardRef<
28+
HTMLTableSectionElement,
29+
React.HTMLAttributes<HTMLTableSectionElement>
30+
>(({ className, ...props }, ref) => (
31+
<tbody
32+
ref={ref}
33+
className={cn('[&_tr:last-child]:border-0', className)}
34+
{...props}
35+
/>
36+
));
37+
TableBody.displayName = 'TableBody';
38+
39+
const TableFooter = React.forwardRef<
40+
HTMLTableSectionElement,
41+
React.HTMLAttributes<HTMLTableSectionElement>
42+
>(({ className, ...props }, ref) => (
43+
<tfoot
44+
ref={ref}
45+
className={cn(
46+
'border-t bg-muted/50 font-medium [&>tr]:last:border-b-0',
47+
className,
48+
)}
49+
{...props}
50+
/>
51+
));
52+
TableFooter.displayName = 'TableFooter';
53+
54+
const TableRow = React.forwardRef<
55+
HTMLTableRowElement,
56+
React.HTMLAttributes<HTMLTableRowElement>
57+
>(({ className, ...props }, ref) => (
58+
<tr
59+
ref={ref}
60+
className={cn(
61+
'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',
62+
className,
63+
)}
64+
{...props}
65+
/>
66+
));
67+
TableRow.displayName = 'TableRow';
68+
69+
const TableHead = React.forwardRef<
70+
HTMLTableCellElement,
71+
React.ThHTMLAttributes<HTMLTableCellElement>
72+
>(({ className, ...props }, ref) => (
73+
<th
74+
ref={ref}
75+
className={cn(
76+
'h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0',
77+
className,
78+
)}
79+
{...props}
80+
/>
81+
));
82+
TableHead.displayName = 'TableHead';
83+
84+
const TableCell = React.forwardRef<
85+
HTMLTableCellElement,
86+
React.TdHTMLAttributes<HTMLTableCellElement>
87+
>(({ className, ...props }, ref) => (
88+
<td
89+
ref={ref}
90+
className={cn('p-4 align-middle [&:has([role=checkbox])]:pr-0', className)}
91+
{...props}
92+
/>
93+
));
94+
TableCell.displayName = 'TableCell';
95+
96+
const TableCaption = React.forwardRef<
97+
HTMLTableCaptionElement,
98+
React.HTMLAttributes<HTMLTableCaptionElement>
99+
>(({ className, ...props }, ref) => (
100+
<caption
101+
ref={ref}
102+
className={cn('mt-4 text-sm text-muted-foreground', className)}
103+
{...props}
104+
/>
105+
));
106+
TableCaption.displayName = 'TableCaption';
107+
108+
export {
109+
Table,
110+
TableHeader,
111+
TableBody,
112+
TableFooter,
113+
TableHead,
114+
TableRow,
115+
TableCell,
116+
TableCaption,
117+
};

src/pages/elections/Candidates.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { AnimatePresence, motion } from 'framer-motion';
44
import { useOutsideClick } from '../../../hooks/use-outside-click';
55
import WindowCard from '../../layout/WindowCard';
66
import { cards } from './constants';
7+
import Results from './Results';
78

89
export function Candidates() {
910
const [active, setActive] = useState<(typeof cards)[number] | boolean | null>(
@@ -86,6 +87,7 @@ export function Candidates() {
8687

8788
return (
8889
<section className='elections h-full gap-4'>
90+
<Results />
8991
<h1 className='title'>Candidates</h1>
9092
<p className='text-neutral-500 text-xl text-center'>
9193
See the candidates running for the NUS Students&apos; Computing Club

0 commit comments

Comments
 (0)