Skip to content

Commit d528848

Browse files
committed
Add initial welcome page
1 parent c248103 commit d528848

28 files changed

Lines changed: 7409 additions & 0 deletions

.github/workflows/pages.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Deploy static content to Pages
2+
3+
on:
4+
push:
5+
branches: ["main"]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: "pages"
15+
cancel-in-progress: false
16+
17+
jobs:
18+
deploy:
19+
environment:
20+
name: github-pages
21+
url: "${{ steps.deployment.outputs.page_url }}"
22+
runs-on: ubuntu-latest
23+
steps:
24+
- name: Checkout
25+
uses: actions/checkout@v4
26+
- name: Setup Node
27+
uses: actions/setup-node@v4
28+
with:
29+
node-version: "20"
30+
cache: "npm"
31+
- name: Install dependencies
32+
run: npm ci
33+
- name: Build static site
34+
env:
35+
NEXT_PUBLIC_BASE_PATH: ${{ github.event.repository.name }}
36+
run: npm run build
37+
- name: Setup Pages
38+
uses: actions/configure-pages@v5
39+
- name: Upload artifact
40+
uses: actions/upload-pages-artifact@v3
41+
with:
42+
path: "out"
43+
- name: Deploy to GitHub Pages
44+
id: deployment
45+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.*
7+
.yarn/*
8+
!.yarn/patches
9+
!.yarn/plugins
10+
!.yarn/releases
11+
!.yarn/versions
12+
13+
# testing
14+
/coverage
15+
16+
# next.js
17+
/.next/
18+
/out/
19+
20+
# production
21+
/build
22+
23+
# misc
24+
.DS_Store
25+
*.pem
26+
27+
# debug
28+
npm-debug.log*
29+
yarn-debug.log*
30+
yarn-error.log*
31+
.pnpm-debug.log*
32+
33+
# env files (can opt-in for committing if needed)
34+
.env*
35+
36+
# vercel
37+
.vercel
38+
39+
# typescript
40+
*.tsbuildinfo
41+
next-env.d.ts

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2+
3+
## Getting Started
4+
5+
First, run the development server:
6+
7+
```bash
8+
npm run dev
9+
# or
10+
yarn dev
11+
# or
12+
pnpm dev
13+
# or
14+
bun dev
15+
```
16+
17+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18+
19+
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20+
21+
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22+
23+
## Learn More
24+
25+
To learn more about Next.js, take a look at the following resources:
26+
27+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29+
30+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31+
32+
## Deploy on Vercel
33+
34+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35+
36+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.

app/events/page.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { getAllEvents, isSameDay } from "@/lib/events";
2+
import MatrixRain from "@/components/MatrixRain";
3+
import Link from 'next/link';
4+
5+
export default function EventsPage() {
6+
const allEvents = getAllEvents();
7+
const now = new Date();
8+
9+
// Filter for past events (not including today)
10+
const pastEvents = allEvents.filter(event => {
11+
const [month, day, year] = event.date.split('-').map(Number);
12+
const eventDate = new Date(year, month - 1, day);
13+
// Set hours to end of day to not include today
14+
eventDate.setHours(23, 59, 59, 999);
15+
return eventDate < now && !isSameDay(event.date, now);
16+
});
17+
18+
return (
19+
<main className="relative w-full min-h-screen overflow-x-hidden bg-black text-white">
20+
<MatrixRain />
21+
22+
<div className="relative z-10 container mx-auto px-4 py-16 md:py-24">
23+
<div className="max-w-4xl mx-auto text-center">
24+
<Link href="/" className="inline-block mb-12 text-cyan-400 hover:text-cyan-200 transition-colors duration-300 font-mono text-sm tracking-widest">
25+
&larr; BACK TO HOME
26+
</Link>
27+
<h1 className="text-4xl md:text-6xl font-bold font-mono tracking-widest uppercase mb-4 animate-glow">
28+
Past Events
29+
</h1>
30+
<p className="text-cyan-300 font-mono text-lg md:text-xl tracking-widest opacity-80">
31+
Archive of our previous meetings and workshops.
32+
</p>
33+
</div>
34+
35+
<div className="mt-16 max-w-4xl mx-auto space-y-8">
36+
{pastEvents.length > 0 ? (
37+
pastEvents.map((event, index) => (
38+
<div
39+
key={index}
40+
className="bg-black/40 backdrop-blur-md border border-cyan-500/20 rounded-lg p-6 flex flex-col md:flex-row justify-between items-center gap-4 transition-all hover:border-cyan-500/50 hover:shadow-[0_0_20px_rgba(0,170,255,0.1)]"
41+
>
42+
<div className="flex-1 text-center md:text-left">
43+
<p className="font-mono text-cyan-400 text-sm mb-1 tracking-wider">{event.date}</p>
44+
<h2 className="text-xl md:text-2xl font-semibold text-white">{event.name}</h2>
45+
</div>
46+
{event.slidesUrl && (
47+
<a
48+
href={event.slidesUrl}
49+
target="_blank"
50+
rel="noopener noreferrer"
51+
className="shrink-0 font-mono text-sm tracking-wider px-4 py-2 rounded-md bg-cyan-600/20 hover:bg-cyan-600/40 text-cyan-200 border border-cyan-500/30 transition-colors duration-300"
52+
>
53+
View Slides
54+
</a>
55+
)}
56+
</div>
57+
))
58+
) : (
59+
<div className="text-center font-mono text-gray-400 p-8 border border-dashed border-gray-700 rounded-lg">
60+
No past events found.
61+
</div>
62+
)}
63+
</div>
64+
</div>
65+
</main>
66+
);
67+
}

app/favicon.ico

25.3 KB
Binary file not shown.

app/globals.css

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
@import "tailwindcss";
2+
3+
:root {
4+
--foreground-rgb: 255, 255, 255;
5+
--background-start-rgb: 0, 0, 0;
6+
--background-end-rgb: 0, 0, 0;
7+
}
8+
9+
body {
10+
color: rgb(var(--foreground-rgb));
11+
background: black;
12+
}
13+
14+
/* Base text style (always visible) */
15+
.text-base-layer {
16+
color: white;
17+
text-shadow: 0 0 2px rgba(255, 255, 255, 0.2);
18+
}
19+
20+
/* Glowing text style (revealed by mask) */
21+
.text-glow-layer {
22+
color: white;
23+
text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #00aaff, 0 0 40px #00aaff, 0 0 50px #00aaff, 0 0 60px #00aaff, 0 0 70px #00aaff;
24+
}
25+
26+
/* Scanning Mask Animation */
27+
@keyframes scan-mask {
28+
from {
29+
mask-position: -100% 0;
30+
-webkit-mask-position: -100% 0;
31+
}
32+
to {
33+
mask-position: 200% 0;
34+
-webkit-mask-position: 200% 0;
35+
}
36+
}
37+
38+
.animate-scan-glow {
39+
/* Soft gradient mask - much wider transition to avoid hard edges */
40+
mask-image: linear-gradient(to right, transparent 0%, black 40%, black 60%, transparent 100%);
41+
-webkit-mask-image: linear-gradient(to right, transparent 0%, black 40%, black 60%, transparent 100%);
42+
43+
/* Make the mask image wider than the container so the gradient is stretched and soft */
44+
mask-size: 200% 100%;
45+
-webkit-mask-size: 200% 100%;
46+
47+
mask-repeat: no-repeat;
48+
-webkit-mask-repeat: no-repeat;
49+
50+
animation: scan-mask 6s linear infinite;
51+
}
52+
53+
/* Subtle QR flicker for a hacker-y vibe */
54+
@keyframes qr-flicker {
55+
0%, 7% { opacity: 0; }
56+
8% { opacity: 0.08; }
57+
10% { opacity: 0.02; }
58+
14% { opacity: 0.1; }
59+
16% { opacity: 0; }
60+
35% { opacity: 0.05; }
61+
36% { opacity: 0; }
62+
62% { opacity: 0.07; }
63+
64% { opacity: 0; }
64+
78% { opacity: 0.12; }
65+
80% { opacity: 0; }
66+
100% { opacity: 0; }
67+
}
68+
69+
.qr-flicker {
70+
position: relative;
71+
overflow: hidden;
72+
}
73+
74+
.qr-flicker::after {
75+
content: "";
76+
position: absolute;
77+
inset: 0;
78+
border-radius: inherit;
79+
background: rgba(255, 255, 255, 0.12);
80+
opacity: 0;
81+
animation: qr-flicker 5s steps(1, end) infinite;
82+
pointer-events: none;
83+
}
84+
85+
/* Per-module QR flicker */
86+
@keyframes qr-cell-flicker {
87+
0%, 100% {
88+
box-shadow: none;
89+
}
90+
50% {
91+
box-shadow: 0 0 5px rgba(220, 230, 240, 0.28), inset 0 0 5px rgba(220, 230, 240, 0.2);
92+
}
93+
}
94+
95+
.qr-cell-flicker {
96+
animation:
97+
qr-cell-flicker var(--qr-flicker-duration, 3s) ease-in-out infinite var(--qr-flicker-delay, 0s);
98+
will-change: box-shadow;
99+
}

app/layout.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import type { Metadata } from "next";
2+
import { Geist, Geist_Mono } from "next/font/google";
3+
import "./globals.css";
4+
5+
const geistSans = Geist({
6+
variable: "--font-geist-sans",
7+
subsets: ["latin"],
8+
});
9+
10+
const geistMono = Geist_Mono({
11+
variable: "--font-geist-mono",
12+
subsets: ["latin"],
13+
});
14+
15+
export const metadata: Metadata = {
16+
title: "Create Next App",
17+
description: "Generated by create next app",
18+
};
19+
20+
export default function RootLayout({
21+
children,
22+
}: Readonly<{
23+
children: React.ReactNode;
24+
}>) {
25+
return (
26+
<html lang="en">
27+
<body
28+
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
29+
>
30+
{children}
31+
</body>
32+
</html>
33+
);
34+
}

app/page.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { getAllEvents } from "@/lib/events";
2+
import HomeClient from "@/components/HomeClient";
3+
4+
export default function Home() {
5+
const events = getAllEvents();
6+
7+
return <HomeClient events={events} />;
8+
}

0 commit comments

Comments
 (0)