├── .gitignore ├── .idea ├── .gitignore ├── apohacks.iml ├── modules.xml └── vcs.xml ├── .prettierrc ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── README.md ├── astro.config.mjs ├── package-lock.json ├── package.json ├── public ├── apotitle.png ├── banner.png ├── event │ └── infoQR.svg ├── favicon.png ├── fonts │ ├── Geist-Black.woff2 │ ├── Geist-Bold.woff2 │ ├── Geist-Light.woff2 │ ├── Geist-Medium.woff2 │ ├── Geist-Regular.woff2 │ ├── Geist-SemiBold.woff2 │ ├── Geist-Thin.woff2 │ ├── Geist-UltraBlack.woff2 │ ├── Geist-UltraLight.woff2 │ ├── NeueBit-Bold.woff │ ├── NeueBit-Bold.woff2 │ ├── NeueMontreal-Book.woff │ └── NeueMontreal-Book.woff2 ├── hctitle.png ├── hero │ ├── parallax-1.svg │ ├── parallax-2.svg │ ├── parallax-3-cn.svg │ ├── parallax-3.svg │ ├── parallax-4.svg │ ├── parallax-top-1.svg │ ├── parallax-top-2.svg │ ├── parallax-top-3.svg │ └── parallax-top-4.svg ├── navbar │ ├── faq.svg │ ├── home.svg │ ├── info.svg │ └── letter.svg ├── ships │ ├── a-r-m-s.jpg │ ├── apoc-trading-centre.jpg │ ├── apocaledger.jpg │ ├── apocalift.png │ ├── apocalypse-alley.jpg │ ├── apocalypse-handbook.jpg │ ├── apocalypse-the-game.jpg │ ├── disaster-survival-senarios.jpg │ ├── dual-zombie-defense-hq.jpg │ ├── elephalert.jpg │ ├── friendly-fire.jpg │ ├── graggleblogfiggle.jpg │ ├── informedead.jpg │ ├── lyfe-saver.jpg │ ├── memory-capsule.jpg │ ├── moan-to-speech.jpg │ ├── outpost.jpg │ ├── practical-illumination.jpg │ ├── stony.jpg │ ├── survivorlog.jpg │ ├── tartarus.jpg │ ├── the-last-escape.jpg │ ├── the-screamers.jpg │ ├── undead-gambling.jpg │ ├── uss-apocalypse.jpg │ ├── wrapped.jpg │ ├── your-apocalypse-tracker.jpg │ ├── yummificator-5000.jpg │ ├── zhield.jpg │ ├── zinder.jpg │ ├── zombae-2.jpg │ ├── zombae.jpg │ ├── zombie-apocalypse-simulator.jpg │ ├── zombie-boxer.jpg │ ├── zombie-cross.jpg │ ├── zombie-home-defense-system.jpg │ ├── zombie-hunger-games.png │ ├── zombie-laser-tag.jpg │ ├── zombie-translator.jpg │ └── zomtrackto.jpg ├── skyline.svg ├── sponsors │ └── Shopify-Logo.png └── yippee_orph.png ├── src ├── components │ ├── Banner.astro │ ├── Bento.astro │ ├── FAQ │ │ ├── FAQ.astro │ │ └── FAQCard.astro │ ├── Footer.astro │ ├── Hero.svelte │ ├── Info │ │ ├── Header.astro │ │ ├── LinkCard.astro │ │ ├── Links.astro │ │ └── Schedule │ │ │ ├── Calendar.svelte │ │ │ └── Schedule.astro │ ├── Letter.astro │ ├── NavBar.astro │ ├── Projects │ │ ├── ProjectItem.astro │ │ ├── ProjectItem.svelte │ │ └── Projects.svelte │ └── ShipCard.astro ├── env.d.ts ├── layouts │ └── Layout.astro └── pages │ ├── 404.astro │ ├── api │ ├── lists │ │ └── subscribe.ts │ └── schedule.ts │ ├── event.astro │ ├── index.astro │ └── ships.astro ├── tailwind.config.mjs └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | 4 | # generated types 5 | .astro/ 6 | 7 | # dependencies 8 | node_modules/ 9 | 10 | # logs 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store 22 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.idea/apohacks.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "prettier-plugin-astro", 4 | "prettier-plugin-tailwindcss", 5 | "prettier-plugin-svelte" 6 | ], 7 | "printWidth": 90, 8 | "_dev_notes": [ 9 | "https://github.com/tailwindlabs/prettier-plugin-tailwindcss#compatibility-with-other-prettier-plugins" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "[astro]": { 4 | "editor.defaultFormatter": "astro-build.astro-vscode" 5 | }, 6 | "editor.formatOnSave": true, 7 | "comment-divider.languagesMap": { 8 | "astro": [""] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apocalypse 2 | 3 | It's 2034, and zombies have taken over! 🧟 But tech still operates. What would you build to survive? 4 | 5 | That's the premise of Apocalypse, a hackathon happening in downtown Toronto this May 17–19! If you're in high school, you should [sign up](https://join.apocalypse.hackclub.com) — we have travel stipends! 6 | 7 | In this repository, you can check out the source code for [our website](https://apocalypse.hackclub.com)! Soon, we'll be open-sourcing deeper peeks into Apocalypse, like: 8 | 9 | - Building the PCB hacker badge 🛠️ 10 | - Developing our theme 🌈 11 | - Surprises from the organizing process 👀 12 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "astro/config"; 2 | 3 | import vercel from "@astrojs/vercel/serverless"; 4 | import tailwind from "@astrojs/tailwind"; 5 | import svelte from "@astrojs/svelte"; 6 | 7 | // https://astro.build/config 8 | export default defineConfig({ 9 | integrations: [tailwind(), svelte()], 10 | redirects: { 11 | "/parents": 12 | "https://docs.google.com/document/d/1NQDChsJd9dK4r1EWsVglzjHr0EnR3iW0DV3xMHSUAZ0/edit", 13 | "/teachers": 14 | "https://docs.google.com/document/d/1NQDChsJd9dK4r1EWsVglzjHr0EnR3iW0DV3xMHSUAZ0/edit", 15 | "/travel": 16 | "https://docs.google.com/document/d/1oEQobHOqMcHUU5N7X5egDNo6Tfvqsx3bx5h--UBDpAs/edit", 17 | "/international": 18 | "https://docs.google.com/document/d/1LuZmVCTGeFPdXYAwqTYx2IHN2d7h4wjuAdhiWNuYJVI/edit?usp=sharing", 19 | "/id": 20 | "https://docs.google.com/document/d/1ro77tpRs1vpQK39YGgAP4IumkNhx3-6pc41BmvI0UzA/edit?usp=sharing", 21 | "/packing": 22 | "https://docs.google.com/document/d/1rGKr5Yn1uCT3fAUEEpQW2Hf3RzR6xymValoaBLmobHM/edit?usp=sharing", 23 | "/grants": "https://join.apocalypse.hackclub.com/grants", 24 | "/showers": 25 | "https://calendar.google.com/calendar/u/0/appointments/AcZssZ3ofoLo-abUmRCvR6_4hVMXJ3IcXXdJhcUlG94=", 26 | "/badge": "https://github.com/LimesKey/NameTagPCB", 27 | "/ship": "https://tally.so/r/wdYg6r" 28 | }, 29 | output: "server", 30 | adapter: vercel({ 31 | webAnalytics: { 32 | enabled: true, 33 | }, 34 | }), 35 | }); 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apocalypse", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "start": "astro dev", 8 | "build": "astro build", 9 | "preview": "astro preview", 10 | "astro": "astro", 11 | "format": "npx prettier --write ." 12 | }, 13 | "dependencies": { 14 | "@astrojs/svelte": "^4.0.4", 15 | "@astrojs/tailwind": "^5.0.2", 16 | "@astrojs/vercel": "^5.2.0", 17 | "@supabase/supabase-js": "^2.42.5", 18 | "@vercel/analytics": "^1.1.1", 19 | "@vercel/speed-insights": "^1.0.2", 20 | "astro": "^3.5.5", 21 | "node-ical": "^0.18.0", 22 | "svelte": "^4.2.8", 23 | "tailwindcss": "^3.4.0" 24 | }, 25 | "devDependencies": { 26 | "prettier": "^3.1.0", 27 | "prettier-plugin-astro": "^0.12.2", 28 | "prettier-plugin-svelte": "^3.1.2", 29 | "prettier-plugin-tailwindcss": "^0.5.7" 30 | }, 31 | "engines": { 32 | "node": "18.x" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /public/apotitle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/apotitle.png -------------------------------------------------------------------------------- /public/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/banner.png -------------------------------------------------------------------------------- /public/event/infoQR.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/favicon.png -------------------------------------------------------------------------------- /public/fonts/Geist-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-Black.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-Bold.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-Light.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-Medium.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-Regular.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-SemiBold.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-Thin.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-UltraBlack.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-UltraBlack.woff2 -------------------------------------------------------------------------------- /public/fonts/Geist-UltraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/Geist-UltraLight.woff2 -------------------------------------------------------------------------------- /public/fonts/NeueBit-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/NeueBit-Bold.woff -------------------------------------------------------------------------------- /public/fonts/NeueBit-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/NeueBit-Bold.woff2 -------------------------------------------------------------------------------- /public/fonts/NeueMontreal-Book.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/NeueMontreal-Book.woff -------------------------------------------------------------------------------- /public/fonts/NeueMontreal-Book.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/fonts/NeueMontreal-Book.woff2 -------------------------------------------------------------------------------- /public/hctitle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/hctitle.png -------------------------------------------------------------------------------- /public/hero/parallax-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/hero/parallax-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /public/hero/parallax-3-cn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/hero/parallax-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /public/hero/parallax-4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /public/hero/parallax-top-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/hero/parallax-top-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /public/hero/parallax-top-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /public/hero/parallax-top-4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /public/navbar/faq.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/navbar/home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/navbar/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/navbar/letter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/ships/a-r-m-s.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/a-r-m-s.jpg -------------------------------------------------------------------------------- /public/ships/apoc-trading-centre.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/apoc-trading-centre.jpg -------------------------------------------------------------------------------- /public/ships/apocaledger.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/apocaledger.jpg -------------------------------------------------------------------------------- /public/ships/apocalift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/apocalift.png -------------------------------------------------------------------------------- /public/ships/apocalypse-alley.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/apocalypse-alley.jpg -------------------------------------------------------------------------------- /public/ships/apocalypse-handbook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/apocalypse-handbook.jpg -------------------------------------------------------------------------------- /public/ships/apocalypse-the-game.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/apocalypse-the-game.jpg -------------------------------------------------------------------------------- /public/ships/disaster-survival-senarios.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/disaster-survival-senarios.jpg -------------------------------------------------------------------------------- /public/ships/dual-zombie-defense-hq.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/dual-zombie-defense-hq.jpg -------------------------------------------------------------------------------- /public/ships/elephalert.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/elephalert.jpg -------------------------------------------------------------------------------- /public/ships/friendly-fire.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/friendly-fire.jpg -------------------------------------------------------------------------------- /public/ships/graggleblogfiggle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/graggleblogfiggle.jpg -------------------------------------------------------------------------------- /public/ships/informedead.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/informedead.jpg -------------------------------------------------------------------------------- /public/ships/lyfe-saver.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/lyfe-saver.jpg -------------------------------------------------------------------------------- /public/ships/memory-capsule.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/memory-capsule.jpg -------------------------------------------------------------------------------- /public/ships/moan-to-speech.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/moan-to-speech.jpg -------------------------------------------------------------------------------- /public/ships/outpost.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/outpost.jpg -------------------------------------------------------------------------------- /public/ships/practical-illumination.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/practical-illumination.jpg -------------------------------------------------------------------------------- /public/ships/stony.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/stony.jpg -------------------------------------------------------------------------------- /public/ships/survivorlog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/survivorlog.jpg -------------------------------------------------------------------------------- /public/ships/tartarus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/tartarus.jpg -------------------------------------------------------------------------------- /public/ships/the-last-escape.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/the-last-escape.jpg -------------------------------------------------------------------------------- /public/ships/the-screamers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/the-screamers.jpg -------------------------------------------------------------------------------- /public/ships/undead-gambling.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/undead-gambling.jpg -------------------------------------------------------------------------------- /public/ships/uss-apocalypse.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/uss-apocalypse.jpg -------------------------------------------------------------------------------- /public/ships/wrapped.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/wrapped.jpg -------------------------------------------------------------------------------- /public/ships/your-apocalypse-tracker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/your-apocalypse-tracker.jpg -------------------------------------------------------------------------------- /public/ships/yummificator-5000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/yummificator-5000.jpg -------------------------------------------------------------------------------- /public/ships/zhield.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zhield.jpg -------------------------------------------------------------------------------- /public/ships/zinder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zinder.jpg -------------------------------------------------------------------------------- /public/ships/zombae-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombae-2.jpg -------------------------------------------------------------------------------- /public/ships/zombae.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombae.jpg -------------------------------------------------------------------------------- /public/ships/zombie-apocalypse-simulator.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombie-apocalypse-simulator.jpg -------------------------------------------------------------------------------- /public/ships/zombie-boxer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombie-boxer.jpg -------------------------------------------------------------------------------- /public/ships/zombie-cross.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombie-cross.jpg -------------------------------------------------------------------------------- /public/ships/zombie-home-defense-system.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombie-home-defense-system.jpg -------------------------------------------------------------------------------- /public/ships/zombie-hunger-games.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombie-hunger-games.png -------------------------------------------------------------------------------- /public/ships/zombie-laser-tag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombie-laser-tag.jpg -------------------------------------------------------------------------------- /public/ships/zombie-translator.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zombie-translator.jpg -------------------------------------------------------------------------------- /public/ships/zomtrackto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/ships/zomtrackto.jpg -------------------------------------------------------------------------------- /public/skyline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /public/sponsors/Shopify-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/sponsors/Shopify-Logo.png -------------------------------------------------------------------------------- /public/yippee_orph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/public/yippee_orph.png -------------------------------------------------------------------------------- /src/components/Banner.astro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/apocalypse/d15cad98e9dcb456346175782a20538aa5b32ec0/src/components/Banner.astro -------------------------------------------------------------------------------- /src/components/Bento.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
7 |

What’s a hackathon?

8 |
9 |

10 | A social coding marathon! Imagine a weekend where teenagers come together to 11 | code projects for fun—however goofy or janky—and share them with each other. 12 |

13 |

14 | You’ll have a goal to work towards, side quests to tackle, and new friends to 15 | hang out with. You don’t need coding experience—just an open mind. 16 |

17 |
18 |
19 | 20 | 26 |
27 | 28 |
29 | 33 | 34 |
37 |

Build what you love

38 |
39 |

40 | At Apocalypse, don’t worry about being realistic. Build the projects that’d 41 | never make sense IRL, but would be perfect for tackling the zombies—from 42 | post-apocalyptic food delivery to zombie-sized mousetraps. 43 |

44 |

45 | Worried about how you’ll do it all? Fear not; you can always receive 1:1 help 46 | from experienced mentors. 47 |

48 |
49 |
50 |
51 | 52 |
53 |
56 |

Share your knowledge

57 |
58 |

59 | Silly or serious, technical or not, Apocalypse is a space to share what you 60 | know and learn from others. 61 |

62 |

63 | What’s a skill you have? Run a workshop on it—we’ll pay for your supplies! And 64 | is there something you’d love to yap on? Do a lightning talk, like “why I hate 65 | caffeine (controversial)”. 66 |

67 |
68 |
69 | 70 | 74 |
75 | 76 |
77 | 81 | 82 |
85 |

Make new friends

86 |
87 |

88 | Hackathons aren’t just time to code! At Apocalypse, you’ll meet fun teenagers 89 | who love making as much as you do. 90 |

91 |

92 | From board games to karaoke nights, Apocalypse is one long social and a chance 93 | to befriend people you adore. 94 |

95 |
96 |
97 |
98 | 99 |
100 |
103 |

Loads of surprises

104 |
105 |

106 | Apocalypse is experimental at heart! Keep an eye 107 | on our Instagram for showcases of what we're cooking up. Unique swag, fun activities, and 112 | excursions are in the works 👀 113 |

114 |

Are you ready to spark a new age of survival? Registrations are open!

115 |
116 | 117 | 118 | 119 |
120 | 121 | 122 | 127 | Register now! 129 | 148 |
149 |
150 | 151 | 155 |
156 |
157 |
158 | 159 | 215 | -------------------------------------------------------------------------------- /src/components/FAQ/FAQ.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import FAQCard from "./FAQCard.astro"; 3 | --- 4 | 5 |
6 |
10 |

Rundown & FAQ

11 | 12 |
13 |
16 |

17 | Date & Time: Starts at 6:00pm on May 17 and ends at 2:00pm on May 19. 18 |

19 |
20 | 21 |
22 |
25 |
28 |

29 | Shopify Toronto
30 | 620 King St W
31 | Toronto, ON M5V 1M6 32 |

33 | 34 | 39 | 40 | 43 | 44 |
45 | 46 | 51 |
52 | 53 | 65 |
66 | 67 |
68 | 69 | Anyone 13–18 is welcome! If you're in middle school or a gap year student, check 70 | in with us at apocalypse@hackclub.com. Don't forget to bring an ID that includes a photo! Read our policy here. 78 | 79 | 80 | 81 |

82 | Apocalypse is for hackers across Canada and the world. If you need help paying 83 | for travel costs, you've got options! 84 |

85 |

86 | Travelling by car, bus, or train? The 87 | Hack Club Gas Fund can reimburse your costs. Learn more here. 92 |

93 | Flying in? We have a limited amount 94 | of grants available. Please indicate your interest on the registration form. 95 | Looking for the travel grant application? It's over here! 100 |

101 |

102 |
103 | 104 | 105 | Yep. Attending costs a grand total of $0. Zilch. Nada. Nothing. From meals to 106 | mini-events, Apocalypse is universally accessible. 107 | 108 | 109 | 110 | Apocalypse is for hackers of all skill levels. We’ll learn more together at 111 | workshops! If you want to start learning from home, YouTube and these workshops 116 | are awesome. If nothing else, you can learn surprisingly fast at a hackathon :) 117 | 118 | 119 | 120 | Not required, but highly encouraged! You can meet teammates at Apocalypse, too 121 | :) Teams are limited to 4 hackers. 122 | 123 | 124 | 125 | Please bring an official ID that includes a photo (read the full policy), laptop ⚡ with its charger ⚡, sleeping bag, 129 | toiletries, water bottle, and imagination. 130 | 131 | 132 | 133 | Apocalypse will have 24/7 supervision by background-checked adults, with venue 134 | access limited to participants.
Our parent's guide is available here. Please reach out to apocalypse@hackclub.com with any concerns. 143 |
144 | 145 | 146 | Apocalypse is organized by an eclectic group of teens who've worked on 147 | hackathons across the world! We're part of Hack Club, an 8-year old nonprofit 148 | organization whose mission is to foster a wholesome generation of coders, 149 | makers, founders and builders. Watch a recap of Outernet, Hack Club's summer 150 | 2023 hackathon, here. 154 | 155 |
156 |
157 |
158 | 159 | 164 |
165 | -------------------------------------------------------------------------------- /src/components/FAQ/FAQCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { question, cardId } = Astro.props; 3 | --- 4 | 5 |
9 |

10 | {question} 11 |

12 |

13 | 14 |

15 |
16 | 17 | 27 | 28 | 53 | -------------------------------------------------------------------------------- /src/components/Footer.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const organizers = [ 3 | { 4 | name: "Acon Lin", 5 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/60.png", 6 | site: "https://aconlin.vercel.app/", 7 | }, 8 | { 9 | name: "Arav Narula", 10 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/71.png", 11 | site: "https://www.radioblahaj.com/?ref=apocalypse", 12 | }, 13 | { 14 | name: "Mutammim Sarkar", 15 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/92.png", 16 | site: "https://www.mutammim.com/", 17 | }, 18 | { 19 | name: "Shayaan Azeem", 20 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/83.png", 21 | site: "https://www.shayaanazeem.co/", 22 | }, 23 | { 24 | name: "Ryan Di Lorenzo", 25 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/04.png", 26 | site: "https://limeskey.com/", 27 | }, 28 | { 29 | name: "Gregory Gu", 30 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/15.png", 31 | site: "https://www.linkedin.com/in/gregory-gu-b777212ba/ ", 32 | }, 33 | { 34 | name: "Sam Liu", 35 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/26.png", 36 | site: "https://samliu.dev/", 37 | }, 38 | { 39 | name: "Sarvesh Mohan Kumar", 40 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/37.png", 41 | site: "https://www.linkedin.com/in/sarvesh-mohan-kumar-a009ba268/", 42 | }, 43 | { 44 | name: "Evelyn Wong", 45 | img: "https://cloud-8bqvtn5zz-hack-club-bot.vercel.app/08.png", 46 | site: "https://www.evelynw.ong/", 47 | }, 48 | { 49 | name: "Vivian Yuan", 50 | img: "https://cloud-jy1p4tt69-hack-club-bot.vercel.app/59.png", 51 | site: "https://www.linkedin.com/in/vivian-yuan-240716284/", // TODO: Replace with personal site(?) 52 | }, 53 | ]; 54 | --- 55 | 56 |
57 |
60 |

61 | An event crafted with by students 64 |

65 |

Organizing Team

66 |
67 | { 68 | organizers.map((organizer, i) => ( 69 | 75 | {organizer.name} 80 | 81 | )) 82 | } 83 |
84 |

85 | Our website and finances are open and transparent 94 |

95 |

96 | Inquiries? Contact us at apocalypse@hackclub.com 102 |

103 |
104 |
105 | 106 | 121 | -------------------------------------------------------------------------------- /src/components/Hero.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 |
9 | 10 |
11 |
15 |
16 | Hack Club Presents 21 | Apocalypse 26 |
27 |
28 |

29 | The high school hackathon where you build fun 30 | tech to survive the 31 | zombie apocalypse! 32 |

33 |

34 | May 17-19, 2024 @ Shopify Toronto 35 |

36 |
37 | 43 | 49 | Watch the recap 55 | View projects 60 |
61 |
62 |
63 |
64 | 65 | 66 | 67 | Hack Club Flag 72 | 73 | 74 | 75 |
79 | 80 | 81 |
85 |
90 |
95 |
100 |
105 | 106 | 107 |
108 |
112 |
116 |
120 |
124 |
125 |
126 | 127 | 184 | -------------------------------------------------------------------------------- /src/components/Info/Header.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | videoWall: boolean; 4 | } 5 | 6 | const { videoWall = false } = Astro.props; 7 | --- 8 | 9 |
12 |
13 |
14 |
15 | Apocalypse Logo 16 |

19 | Event
Information 20 |

21 |
22 |
25 |
26 |

May 17, 6 PM - May 19, 2 PM • Shopify Toronto

27 |

28 | Need urgent help? Call +1 (855) 625-4225 31 |

32 | { 33 | videoWall && ( 34 |

35 | Scan the QR code for event information & quick links{" "} 36 |

37 | ) 38 | } 39 |
40 | { 41 | videoWall && ( 42 | QR code to Event Information 47 | ) 48 | } 49 |
50 |
51 | 52 | 53 |
54 |
55 | -------------------------------------------------------------------------------- /src/components/Info/LinkCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { name, link } = Astro.props; 3 | --- 4 | 5 | 6 |
9 |

10 | {name} 11 |

12 |
13 | 14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /src/components/Info/Links.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import LinkCard from "./LinkCard.astro"; 3 | --- 4 | 5 |
6 |
7 |

Quick Links

8 |
11 | 12 |

All projects must be submitted before 9:00 am today

13 |
14 | 15 |

Read our guide on travelling to Apocalypse.

16 |
17 | 18 |

Make sure you have an accepted form of physical photo ID at entry.

19 |
20 | 21 |

Check over this list to ensure you've brought everything you need!

22 |
23 | 24 |

Learn more about how Apocalypse will be a safe experience for your child.

25 |
26 | 27 |

Learn more about how your students can benefit from attending Apocalypse!

28 |
29 | 30 |

31 | Be respectful of the shower space and bring your own soap or body wash. Towels 32 | are provided. 33 |

34 |
35 |
36 |
37 |
38 | 39 | 44 | -------------------------------------------------------------------------------- /src/components/Info/Schedule/Calendar.svelte: -------------------------------------------------------------------------------- 1 | 389 | 390 | {#if popup} 391 |
394 |
(popup = false)} 400 | > 401 |
402 |

{popupEvent.name}

403 | 415 |
416 |

417 | {formatTime(popupEvent.start)} - {formatTime( 418 | popupEvent.end, 419 | )}{#if popupEvent.location} 420 | , {popupEvent.location} 421 | {/if} 422 |

423 | 424 | {#if popupEvent.description} 425 |

{popupEvent.description}

426 | {/if} 427 |
428 |
429 | {/if} 430 | 431 |
438 |
447 | 448 | {#each DATES as date, i} 449 | 450 |
454 |
455 |

456 | {date.toLocaleDateString("en-CA", { 457 | weekday: "long", 458 | month: "long", 459 | day: "numeric", 460 | timeZone: "UTC", 461 | })} 462 |

463 |

Day {i + 1}

464 |
465 |
466 | 467 | 468 |
474 |
475 | {#each Array(dayHours[i]) as _, j} 476 |
482 |

486 | {j + (i == 0 ? startHour : 0) == 0 487 | ? "12" 488 | : j + (i == 0 ? startHour : 0) > 12 489 | ? j + (i == 0 ? startHour : 0) - 12 490 | : j + (i == 0 ? startHour : 0)} 491 | {j + (i == 0 ? startHour : 0) >= 12 ? "PM" : "AM"} 492 |

493 | {/each} 494 |
495 | {/each} 496 | 497 | {#if !loading} 498 | 499 | {#each milestones as milestone} 500 |
506 |

507 | {formatTime(milestone.date)} - {milestone.name} 508 |

509 |
510 | {/each} 511 | 512 | 513 |
518 | {#each scheduleCols as eventCol, i} 519 | {#each eventCol as event, j} 520 | 572 | {/each} 573 | {/each} 574 |
575 | 576 | 577 | {#if minsOutsideEvent(currentTime) <= 0} 578 |
579 |
586 |

592 | {formatTime(currentTime)} 593 |

594 |
595 | {#if !followTime} 596 |
599 |
603 | 612 |
613 |
614 | {/if} 615 | {/if} 616 | {/if} 617 |
618 |
619 | 620 | 625 | -------------------------------------------------------------------------------- /src/components/Info/Schedule/Schedule.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { GET } from "../../../pages/api/schedule"; 3 | import Calendar from "./Calendar.svelte"; 4 | 5 | let resp; 6 | 7 | try { 8 | resp = await GET(); 9 | } catch (e) { 10 | console.error(e); 11 | } 12 | 13 | interface Props { 14 | videoWall: boolean; 15 | } 16 | 17 | const { videoWall = false } = Astro.props; 18 | --- 19 | 20 |
23 |
24 |
25 |

Schedule

26 | 31 |

Join the Slack

32 |
33 |
34 | 35 |
36 | 44 |
45 |
46 |

Click on an event for more information

47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/components/Letter.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Projects from "./Projects/Projects.svelte"; 3 | 4 | const futureDate = new Date(); 5 | futureDate.setFullYear(futureDate.getFullYear() + 10); 6 | 7 | // TODO: TO BE CONFIRMED 8 | const eventDate = new Date("2024-05-17T18:00:00-04:00"); 9 | --- 10 | 11 |
12 |
16 | 17 |
18 |

19 | { 20 | futureDate.toLocaleDateString(undefined, { 21 | year: "numeric", 22 | month: "long", 23 | day: "numeric", 24 | }) 25 | } 26 |

27 |

28 | {Math.round((eventDate.valueOf() - Date.now()) / (24 * 60 * 60 * 1000))} days 29 | until event 30 |

31 |
32 | 33 |
36 |

39 | Greetings, hacker. 40 |

41 |

42 | Just a few months ago, the world fell into a zombie apocalypse. It’s absurd how 43 | fast civilization has fallen to the virus. 44 |

45 |

46 | Cities have turned to battlefields. Subways and schools have grown infected with 47 | the fallen. 48 |

49 |

It's the beginning of the end.

50 |

51 | But one thing still stands: technology. WiFi is up, electricity runs, and hardware 52 | operates. 53 |

54 |
55 | 56 |
57 |
60 |

61 | Join 150 hackers 62 | like you for 63 | 44 hours at our safehouse. 64 |

65 |

66 | Build something, anything, to help us survive this 67 | apocalypse. 68 |

69 |
70 |
71 | 72 |
73 |

74 | So, what will you make? Humanity is counting on you. From the Apocalypse team... 75 |

76 | 80 |
81 |
82 |
83 | 84 | 90 | -------------------------------------------------------------------------------- /src/components/NavBar.astro: -------------------------------------------------------------------------------- 1 |
2 |
6 |
9 | 10 | 19 |
20 |

LETTER

21 | 27 |
28 |
29 |

INFO

30 | 36 |
37 |
38 |

FAQ

39 | 45 |
46 |
47 |
48 |
49 | 50 | 76 | 77 | 107 | -------------------------------------------------------------------------------- /src/components/Projects/ProjectItem.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { img, description, credit, creditLink } = Astro.props; 3 | --- 4 | 5 |
6 |
7 | {description} 15 |

16 | Photo credit: 17 | {credit} 23 |

24 |
25 |
26 |

{description}

27 |
28 |
29 | -------------------------------------------------------------------------------- /src/components/Projects/ProjectItem.svelte: -------------------------------------------------------------------------------- 1 | 51 | 52 |
53 | 64 |
65 | -------------------------------------------------------------------------------- /src/components/Projects/Projects.svelte: -------------------------------------------------------------------------------- 1 | 110 | 111 |
112 |
113 | {#each shiftToProject(currentId) as project (project.id)} 114 | 121 | {/each} 122 |
123 |
124 |

129 | {projects[currentId].desc} 130 |

131 |
132 |
133 | -------------------------------------------------------------------------------- /src/components/ShipCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { name, description, href, team, imgSrc } = Astro.props; 3 | 4 | let possibleRots = ["motion-safe:hover:rotate-1", "motion-safe:hover:-rotate-1"]; 5 | let rot = possibleRots[Math.floor(Math.random() * possibleRots.length)]; 6 | 7 | let parsedTeam = team.split(", "); 8 | 9 | let teamString = ""; 10 | if (parsedTeam.length == 1) { 11 | teamString = parsedTeam[0]; 12 | } else if (parsedTeam.length == 2) { 13 | teamString = `${parsedTeam[0]} and ${parsedTeam[1]}`; 14 | } else if (parsedTeam.length == 3) { 15 | teamString = `${parsedTeam.slice(0, -1).join(", ")}, and ${parsedTeam[2]}`; 16 | } else if (parsedTeam.length == 4) { 17 | teamString = `${parsedTeam.slice(0, 2).join(", ")},
${parsedTeam[2]}, and ${ 18 | parsedTeam[3] 19 | }`; 20 | } 21 | --- 22 | 23 | {href.length > 0 && ( 24 | 25 |
28 |
29 |
30 |

{name}

31 |

32 |

33 |

{description}

34 |
35 |
39 |
40 |
43 |
44 | 45 |
46 |
50 |
51 |
55 |
56 |
60 |
61 |
65 |
66 |
67 |
70 |
71 | 72 |
73 |
74 |
)} 75 | 76 | {href.length == 0 && ( 77 |
80 |
81 |
82 |

{name}

83 |

84 |

85 |

{description}

86 |
87 |
91 |
92 |
95 |
96 | 97 |
98 |
102 |
103 |
107 |
108 |
112 |
113 |
117 |
118 |
119 |
122 |
123 | 124 |
125 |
126 | )} 127 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/layouts/Layout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | title: string; 4 | } 5 | 6 | const { title } = Astro.props; 7 | const description = 8 | "Apocalypse is Toronto's biggest in-person high school hackathon. For 44 hours, build fun tech with 150 other high school programmers & engineers to survive the zombie apocalypse!"; 9 | const banner = "/banner.png"; 10 | 11 | const { url } = Astro.request; 12 | let slug = new URL(url).pathname; 13 | if (slug == "/") slug = ""; 14 | 15 | // import SpeedInsights from "@vercel/speed-insights/astro"; 16 | --- 17 | 18 | 19 | 20 | 21 | 22 | 23 | {title} 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |
57 | 58 | 59 | 60 | 61 | 152 | 153 | -------------------------------------------------------------------------------- /src/pages/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../layouts/Layout.astro"; 3 | --- 4 | 5 | 6 |
7 |
8 |
11 |

404!

12 |

Umm... It seems like you're lost.

13 | Go back home 18 |
19 |
20 |
21 |
22 | 23 | 29 | -------------------------------------------------------------------------------- /src/pages/api/lists/subscribe.ts: -------------------------------------------------------------------------------- 1 | type SubscribeBody = { 2 | email: string; 3 | } 4 | 5 | export async function POST({ request }) { 6 | // Check for valid request body 7 | if (!request.body) { 8 | return new Response( 9 | JSON.stringify({ success: false }), 10 | { headers: { "Content-Type": "application/json", }, status: 400 } 11 | ) 12 | } 13 | let body; 14 | try { 15 | body = await request.json(); 16 | } catch { 17 | return new Response( 18 | JSON.stringify({ success: false }), 19 | { headers: { "Content-Type": "application/json", }, status: 400 } 20 | ) 21 | } 22 | if (typeof body['email'] != "string") { 23 | return new Response( 24 | JSON.stringify({ success: false }), 25 | { headers: { "Content-Type": "application/json", }, status: 400 } 26 | ) 27 | } 28 | body = body as SubscribeBody; 29 | 30 | // Timeout after 5 seconds 31 | setTimeout(() => { 32 | return new Response( 33 | JSON.stringify({ success: false }), 34 | { headers: { "Content-Type": "application/json", }, status: 500 }, 35 | ) 36 | }, 5000); 37 | 38 | let res: Response; 39 | 40 | try { 41 | res = await fetch("https://postal.hackclub.com/subscribe", { 42 | headers: { 43 | "content-type": "application/x-www-form-urlencoded", 44 | }, 45 | body: `email=${encodeURIComponent(body.email)}&hp=&list=YAbJpY892wYYel892gyGNghouQ&subform=yes`, 46 | method: "POST" 47 | }); 48 | } catch { 49 | return new Response( 50 | JSON.stringify({ success: false }), 51 | { headers: { "Content-Type": "application/json", }, status: 500 } 52 | ) 53 | } 54 | if (res.redirected && (res.url == "https://www.apohacks.com/lists/success" || res.url == "https://www.apohacks.com/lists/prevsub")) { 55 | return new Response( 56 | JSON.stringify({ success: true }), 57 | { headers: { "Content-Type": "application/json", }, status: 200 } 58 | ) 59 | } else { 60 | return new Response( 61 | JSON.stringify({ success: false }), 62 | { headers: { "Content-Type": "application/json", }, status: 500 } 63 | ) 64 | } 65 | } -------------------------------------------------------------------------------- /src/pages/api/schedule.ts: -------------------------------------------------------------------------------- 1 | import { createClient } from "@supabase/supabase-js"; 2 | import ical, { type CalendarResponse, type VEvent } from "node-ical"; 3 | 4 | // const supabase = createClient(import.meta.env.SUPABASE_URL, import.meta.env.SUPABASE_SECRET); 5 | 6 | type Event = { 7 | name: string, 8 | type?: string, 9 | location?: string, 10 | description?: string, 11 | start: Date, 12 | end: Date, 13 | fullDay: boolean, 14 | }; 15 | 16 | type Milestone = { 17 | name: string, 18 | date: Date, 19 | }; 20 | 21 | type EventResponse = EventsSuccess | EventError; 22 | 23 | type EventsSuccess = { 24 | ok: true, 25 | last_updated: Date, 26 | events: Event[], 27 | milestones: Milestone[], 28 | }; 29 | 30 | type EventError = { 31 | ok: false, 32 | message: string, 33 | details?: string, 34 | }; 35 | 36 | async function fetchEvents(): Promise { 37 | let schd: CalendarResponse; 38 | 39 | try { 40 | schd = await ical.async.fromURL(import.meta.env.ICAL_URL); 41 | } catch (e) { 42 | console.error(e); 43 | return { 44 | ok: false, 45 | message: "Failed to fetch calendar", 46 | details: e.message, 47 | } 48 | } 49 | 50 | let events = Object.values(schd).map((event) => { 51 | if (event.type !== "VEVENT") { 52 | return; 53 | } 54 | if (!event.start || !event.end || !event.summary) { 55 | return; 56 | } 57 | 58 | const splitted = event.summary.split("-") 59 | let type; 60 | let name = event.summary; 61 | 62 | if (splitted.length > 1) { 63 | type = splitted[0].trim().toLowerCase(); 64 | name = splitted.slice(1).join("-").trim(); 65 | } 66 | 67 | return { 68 | name, 69 | type, 70 | location: event.location, 71 | description: event.description, 72 | start: event.start, 73 | end: event.end, 74 | fullDay: event.datetype === "date", 75 | }; 76 | }).filter(event => event); 77 | 78 | let milestones = events.filter(event => event.type === "milestone").map(event => { 79 | return { 80 | name: event.name, 81 | date: event.start, 82 | }; 83 | }); 84 | 85 | events = events.filter(event => event.type != "milestone"); 86 | 87 | return { 88 | ok: true, 89 | last_updated: new Date(), 90 | events: events, 91 | milestones: milestones, 92 | }; 93 | } 94 | 95 | export async function GET() { 96 | 97 | // const { data, error } = await supabase.from("events").select("*").eq("id", "cache"); 98 | // if (error) { 99 | if (true) { 100 | // console.error("Failed to fetch from supabase, not using cache", error); 101 | 102 | const events = await fetchEvents(); 103 | if (events.ok == false) { 104 | return new Response( 105 | JSON.stringify({ 106 | ok: false, 107 | message: "Failed to fetch events", 108 | details: events.message, 109 | }), 110 | { 111 | status: 500, 112 | headers: { 113 | "Content-Type": "application/json", 114 | "Cache-Control": "no-cache, must-revalidate" 115 | }, 116 | }, 117 | ); 118 | } 119 | 120 | const expires = new Date(events.last_updated); 121 | expires.setMinutes(expires.getMinutes() + 1); 122 | 123 | return new Response( 124 | JSON.stringify(events), 125 | { 126 | status: 200, 127 | headers: { 128 | "Content-Type": "application/json", 129 | "Last-Modified": events.last_updated.toUTCString(), 130 | "Cache-Control": "public, must-revalidate", 131 | "Expires": expires.toUTCString(), 132 | }, 133 | }, 134 | ); 135 | } 136 | 137 | // if (data.length == 0) { 138 | // console.warn("No cache found in supabase, fetching events"); 139 | // const events = await fetchEvents(); 140 | // if (events.ok == false) { 141 | // return new Response( 142 | // JSON.stringify({ 143 | // ok: false, 144 | // message: "Failed to fetch events", 145 | // details: events.message, 146 | // }), 147 | // { 148 | // status: 500, 149 | // headers: { 150 | // "Content-Type": "application/json", 151 | // "Cache-Control": "no-cache, must-revalidate" 152 | // }, 153 | // }, 154 | // ); 155 | // } 156 | 157 | // await supabase.from("events").upsert({ id: "cache", last_updated: events.last_updated, events: events.events, milestones: events.milestones }) 158 | 159 | // const expires = new Date(events.last_updated); 160 | // expires.setMinutes(expires.getMinutes() + 1); 161 | 162 | // return new Response( 163 | // JSON.stringify(events), 164 | // { 165 | // status: 200, 166 | // headers: { 167 | // "Content-Type": "application/json", 168 | // "Last-Modified": events.last_updated.toUTCString(), 169 | // "Cache-Control": "public, must-revalidate", 170 | // "Expires": expires.toUTCString(), 171 | // }, 172 | // }, 173 | // ); 174 | // } 175 | 176 | // let events = { 177 | // ok: true, 178 | // last_updated: new Date(data[0].last_updated), 179 | // events: data[0].events, 180 | // milestones: data[0].milestones 181 | // } as EventsSuccess; 182 | 183 | // if (events.last_updated.getTime() + 60000 <= Date.now()) { 184 | // const newEvents = await fetchEvents(); 185 | // if (newEvents.ok == false) { 186 | // return new Response( 187 | // JSON.stringify({ 188 | // ok: false, 189 | // message: "Failed to fetch events", 190 | // details: newEvents.message, 191 | // }), 192 | // { 193 | // status: 500, 194 | // headers: { 195 | // "Content-Type": "application/json", 196 | // "Cache-Control": "no-cache, must-revalidate" 197 | // }, 198 | // }, 199 | // ); 200 | // } 201 | 202 | // await supabase.from("events").upsert({ id: "cache", last_updated: newEvents.last_updated, events: newEvents.events, milestones: newEvents.milestones }) 203 | 204 | // events = newEvents; 205 | // } 206 | 207 | // const expires = new Date(events.last_updated); 208 | // expires.setMinutes(expires.getMinutes() + 1); 209 | 210 | // return new Response( 211 | // JSON.stringify(events), 212 | // { 213 | // status: 200, 214 | // headers: { 215 | // "Content-Type": "application/json", 216 | // "Last-Modified": events.last_updated.toUTCString(), 217 | // "Cache-Control": "public, must-revalidate", 218 | // "Expires": expires.toUTCString(), 219 | // }, 220 | // }, 221 | // ); 222 | } 223 | -------------------------------------------------------------------------------- /src/pages/event.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Header from "../components/Info/Header.astro"; 3 | import Links from "../components/Info/Links.astro"; 4 | import Schedule from "../components/Info/Schedule/Schedule.astro"; 5 | import Layout from "../layouts/Layout.astro"; 6 | 7 | const videoWall = Boolean(Astro.url.searchParams.get("videowall")) || false; 8 | --- 9 | 10 | 11 |
12 |
13 |
14 | 15 | {!videoWall && } 16 |
17 |
18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Bento from "../components/Bento.astro"; 3 | import FAQ from "../components/FAQ/FAQ.astro"; 4 | import Hero from "../components/Hero.svelte"; 5 | import Layout from "../layouts/Layout.astro"; 6 | import Letter from "../components/Letter.astro"; 7 | import Footer from "../components/Footer.astro"; 8 | import NavBar from "../components/NavBar.astro"; 9 | --- 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 |
19 |