diff --git a/site/.eslintrc.json b/site/.eslintrc.json
new file mode 100644
index 0000000..bffb357
--- /dev/null
+++ b/site/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "next/core-web-vitals"
+}
diff --git a/site/.gitignore b/site/.gitignore
new file mode 100644
index 0000000..71b863e
--- /dev/null
+++ b/site/.gitignore
@@ -0,0 +1,5 @@
+/node_modules
+/out/
+
+/.next/
+next-env.d.ts
diff --git a/site/.prettierignore b/site/.prettierignore
new file mode 100644
index 0000000..fcac576
--- /dev/null
+++ b/site/.prettierignore
@@ -0,0 +1,6 @@
+# Ignore artifacts:
+build
+coverage
+
+# Ignore all HTML files:
+**/*.html
\ No newline at end of file
diff --git a/site/assets/Bold.woff2 b/site/assets/Bold.woff2
new file mode 100644
index 0000000..8c00084
Binary files /dev/null and b/site/assets/Bold.woff2 differ
diff --git a/site/assets/Italic.woff2 b/site/assets/Italic.woff2
new file mode 100644
index 0000000..056909c
Binary files /dev/null and b/site/assets/Italic.woff2 differ
diff --git a/site/assets/Regular.woff2 b/site/assets/Regular.woff2
new file mode 100644
index 0000000..d7c3d52
Binary files /dev/null and b/site/assets/Regular.woff2 differ
diff --git a/site/layout/layout.tsx b/site/layout/layout.tsx
new file mode 100644
index 0000000..28ff24d
--- /dev/null
+++ b/site/layout/layout.tsx
@@ -0,0 +1,47 @@
+import { Space_Mono, Poppins } from "next/font/google";
+import localFont from "next/font/local";
+
+const space_mono = Space_Mono({
+ weight: ["400", "700"],
+ subsets: ["latin"],
+ display: "swap",
+ variable: "--font-space-mono",
+});
+
+const poppins = Poppins({
+ weight: ["400", "500", "600", "700", "800", "900"],
+ subsets: ["latin"],
+ display: "swap",
+ variable: "--font-poppins",
+});
+
+const phantomSans = localFont({
+ src: [
+ {
+ path: "../assets/Regular.woff2",
+ weight: "400",
+ style: "normal",
+ },
+ {
+ path: "../assets/Italic.woff2",
+ weight: "400",
+ style: "italic",
+ },
+ {
+ path: "../assets/Bold.woff2",
+ weight: "700",
+ style: "normal",
+ },
+ ],
+ variable: "--font-phantom-sans",
+});
+
+export default function Layout({ children }: { children: React.ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/site/next.config.js b/site/next.config.js
new file mode 100644
index 0000000..a35bfad
--- /dev/null
+++ b/site/next.config.js
@@ -0,0 +1,6 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ output: "export",
+};
+
+module.exports = nextConfig;
diff --git a/site/package.json b/site/package.json
new file mode 100644
index 0000000..5deb167
--- /dev/null
+++ b/site/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "site",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "@fortawesome/fontawesome-free": "^6.4.2",
+ "@fortawesome/fontawesome-svg-core": "^6.4.2",
+ "@fortawesome/free-brands-svg-icons": "^6.4.2",
+ "@fortawesome/free-solid-svg-icons": "^6.4.2",
+ "@fortawesome/react-fontawesome": "^0.2.0",
+ "@headlessui/react": "^1.7.17",
+ "@headlessui/tailwindcss": "^0.2.0",
+ "@types/node": "20.5.8",
+ "@types/react": "18.2.21",
+ "@types/react-dom": "18.2.7",
+ "autoprefixer": "10.4.15",
+ "eslint": "8.48.0",
+ "eslint-config-next": "13.4.19",
+ "next": "13.4.19",
+ "postcss": "8.4.29",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
+ "tailwindcss": "3.3.3",
+ "typescript": "5.2.2"
+ },
+ "devDependencies": {
+ "prettier": "^3.0.3",
+ "prettier-plugin-tailwindcss": "^0.5.4"
+ }
+}
diff --git a/site/pages/_app.tsx b/site/pages/_app.tsx
new file mode 100644
index 0000000..c0572f6
--- /dev/null
+++ b/site/pages/_app.tsx
@@ -0,0 +1,14 @@
+import Layout from "@/layout/layout";
+import type { AppProps } from "next/app";
+import { config } from "@fortawesome/fontawesome-svg-core";
+import "@fortawesome/fontawesome-svg-core/styles.css";
+config.autoAddCss = false;
+import "static/globals.css";
+
+export default function App({ Component, pageProps }: AppProps) {
+ return (
+
+
+
+ );
+}
diff --git a/site/pages/_document.tsx b/site/pages/_document.tsx
new file mode 100644
index 0000000..ce4b5e1
--- /dev/null
+++ b/site/pages/_document.tsx
@@ -0,0 +1,13 @@
+import { Html, Head, Main, NextScript } from "next/document";
+
+export default function Document() {
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/site/pages/index.tsx b/site/pages/index.tsx
new file mode 100644
index 0000000..73fbc33
--- /dev/null
+++ b/site/pages/index.tsx
@@ -0,0 +1,154 @@
+import { faGithub } from "@fortawesome/free-brands-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import Head from "next/head";
+import {
+ faChevronDown,
+ faChevronUp,
+ faUpRightFromSquare,
+} from "@fortawesome/free-solid-svg-icons";
+import { Menu, Transition } from "@headlessui/react";
+import { useState, useRef, useEffect } from "react";
+export default function Page() {
+ const [chevron, setChevron] = useState(false);
+ const menuButtonRef = useRef(null);
+ const toggleDropdown = () => {
+ setChevron(!chevron);
+ };
+ const handleClickOutside = (event: MouseEvent) => {
+ if (
+ menuButtonRef.current &&
+ !menuButtonRef.current.contains(event.target as Node)
+ ) {
+ setChevron(false);
+ }
+ };
+ useEffect(() => {
+ document.addEventListener("click", handleClickOutside);
+
+ return () => {
+ document.removeEventListener("click", handleClickOutside);
+ };
+ }, []);
+ return (
+ <>
+
+ Burrow
+
+
+
+
+
+
+ Burrow Through{" "}
+ Firewalls
+
+
+
+ Burrow is an open source tool for burrowing through firewalls,
+ built by teenagers at{" "}
+
+
+ Hack Club.
+
+ {" "}
+
+ burrow
+ {" "}
+ is a Rust-based VPN for getting around restrictive Internet
+ censors.
+
+
+
+
+
+
+
toggleDropdown()}
+ ref={menuButtonRef}
+ className="w-50 h-12 rounded-2xl bg-hackClubRed px-3 font-SpaceMono hover:scale-105 md:h-12 md:w-auto md:rounded-3xl md:text-xl 2xl:h-16 2xl:text-2xl "
+ >
+ Install for Linux
+ {chevron ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ Docs
+
+
+
+
+
+
+ {/* Footer */}
+ {/*
*/}
+
+
+ >
+ );
+}
diff --git a/site/postcss.config.js b/site/postcss.config.js
new file mode 100644
index 0000000..12a703d
--- /dev/null
+++ b/site/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/site/prettier.config.js b/site/prettier.config.js
new file mode 100644
index 0000000..d573118
--- /dev/null
+++ b/site/prettier.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ plugins: ["prettier-plugin-tailwindcss"],
+};
diff --git a/site/public/hackclub.svg b/site/public/hackclub.svg
new file mode 100644
index 0000000..38c2a68
--- /dev/null
+++ b/site/public/hackclub.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/globals.css b/site/static/globals.css
new file mode 100644
index 0000000..b5c61c9
--- /dev/null
+++ b/site/static/globals.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/site/tailwind.config.ts b/site/tailwind.config.ts
new file mode 100644
index 0000000..3df6f5a
--- /dev/null
+++ b/site/tailwind.config.ts
@@ -0,0 +1,28 @@
+import type { Config } from "tailwindcss";
+
+const config: Config = {
+ content: [
+ "./pages/**/*.{js,ts,jsx,tsx,mdx}",
+ "./components/**/*.{js,ts,jsx,tsx,mdx}",
+ "./app/**/*.{js,ts,jsx,tsx,mdx}",
+ ],
+ theme: {
+ extend: {
+ colors: {
+ backgroundBlack: "#17171D",
+ hackClubRed: "#EC3750",
+ hackClubBlueShade: "#32323D",
+ hackClubBlue: "#338EDA",
+ burrowStroke: "#595959",
+ burrowHover: "#3D3D3D",
+ },
+ fontFamily: {
+ SpaceMono: ["var(--font-space-mono)"],
+ Poppins: ["var(--font-poppins)"],
+ PhantomSans: ["var(--font-phantom-sans)"],
+ },
+ },
+ },
+ plugins: [require("@headlessui/tailwindcss")({ prefix: "ui" })],
+};
+export default config;
diff --git a/site/tsconfig.json b/site/tsconfig.json
new file mode 100644
index 0000000..c714696
--- /dev/null
+++ b/site/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}