[
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: 'bun'\n    directory: '/'\n    schedule:\n      interval: 'weekly'\n\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n      interval: 'weekly'\n"
  },
  {
    "path": ".github/workflows/attachment-warn.yml",
    "content": "name: Perhaps You Should Upload To CDN Instead?\n\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  warn:\n    runs-on: ubuntu-slim\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: actions/github-script@v9\n        continue-on-error: true\n        with:\n          # this checks via the octokit, because just using pull_requests.paths would warn on every single commit, regardless of the files changed if the PR has at least 1 attachment in it\n          script: |\n            // dont comment again if already commented\n            const comments = await github.rest.issues.listComments({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                issue_number: context.issue.number\n            });\n\n            const existingComment = comments.data.find(c =>\n              c.body.includes(\"Heyo, maybe upload these to a CDN instead\")\n            );\n\n            // unallowed file extensions\n            const EXTENSIONS = [\n              'png','jpg','jpeg','gif','webp',\n              'webm','pdf','mp4','mov','zip',\n            ];\n\n            // paginate cause what if there's 100+ changed files, better safe than sorry\n            const files = await github.paginate(\n              github.rest.pulls.listFiles,\n              {\n                  owner: context.repo.owner,\n                  repo: context.repo.repo,\n                  pull_number: context.issue.number,\n                  per_page: 100\n              }\n            );\n\n            // check if any of the changed files have unallowed extension, and are not removed\n            // only exclude removed files, since modifying/copying/etc has the same hit to the repo size as a new file\n            const blobs = files.filter(f => {\n              if (!f.filename.includes('.')) return false;\n              const ext = f.filename.split('.').pop().toLowerCase();\n              return EXTENSIONS.includes(ext) && f.status !== 'removed';\n            });\n\n            if (blobs.length === 0) {\n              // if we already commented, but the files were removed, edit the comment to kinda mark as resolved\n              if (existingComment) {\n                await github.rest.issues.updateComment({\n                  owner: context.repo.owner,\n                  repo: context.repo.repo,\n                  comment_id: existingComment.id,\n                  body: `## ~~Heyo, maybe upload these to a CDN instead~~\\n\\nThis has been resolved now.`\n                });\n                return;\n              }\n              return\n            };\n\n            const prefix = `## Heyo, maybe upload these to a CDN instead\\n\\nImages, videos or any attachments can unnecessarily bloat the repository size. Consider uploading these files to [Hack Club CDN](https://cdn.hackclub.com/) instead, and using the CDN links instead.\\n\\n---\\n\\n### Files Detected:\\n\\n`;\n\n            if (existingComment) {\n              // Update existing comment with new file list\n              await github.rest.issues.updateComment({\n                  owner: context.repo.owner,\n                  repo: context.repo.repo,\n                  comment_id: existingComment.id,\n                  body: `${prefix}${blobs.map(b => `- \\`${b.filename}\\``).join('\\n')}`\n              });\n              return;\n            }\n\n            // create comment if there are any attachments\n            await github.rest.issues.createComment({ \n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              issue_number: context.issue.number,\n              body: `${prefix}${blobs.map(b => `- \\`${b.filename}\\``).join('\\n')}`\n            });\n"
  },
  {
    "path": ".github/workflows/caniuse-update.yml",
    "content": "name: Update Browserslist database\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 2 1,15 * *'\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  update-browserslist-database:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n      - name: Configure git\n        run: |\n          git config --global user.email \"action@github.com\"\n          git config --global user.name \"GitHub Action\"\n      - name: Update Browserslist database and create PR if applies\n        uses: c2corg/browserslist-update-action@v2\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          branch: browserslist-update\n          base_branch: main\n          commit_message: 'build: update Browserslist db'\n          title: 'build: update Browserslist db'\n          body: Auto-generated by [browserslist-update-action](https://github.com/c2corg/browserslist-update-action/). Caniuse database has been updated. Review changes, merge this PR, and be merry.\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\non:\n  - push\n  - pull_request\n\njobs:\n  lint:\n    name: Lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v6\n      - uses: oven-sh/setup-bun@v2\n      - run: bun install\n      - run: bun run lint\n\n  format:\n    name: Format\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v6\n      - uses: oven-sh/setup-bun@v2\n      - run: bun install\n      - run: bun run format:check\n"
  },
  {
    "path": ".github/workflows/validate-team-json.yml",
    "content": "name: Validate Team JSON\n\non:\n  push:\n    paths:\n      - 'public/team.json'\n  pull_request:\n    paths:\n      - 'public/team.json'\n\njobs:\n  validate:\n    name: Validate team.json\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - name: Validate JSON format\n        run: |\n          if ! jq empty public/team.json 2>/dev/null; then\n            echo \"Error: team.json is not valid JSON\"\n            exit 1\n          fi\n          echo \"✓ team.json is valid JSON\"\n"
  },
  {
    "path": ".gitignore",
    "content": ".now\n.env*\n.next\nnode_modules\n.DS_Store\npublic/sitemap.xml\n.vercel\n.vscode\nyarn-error.log\nbun.lockb\n.idea\n.yarn\n.yarnrc.yml\n.env*.local\ntsconfig.tsbuildinfo\nnext-env.d.ts"
  },
  {
    "path": ".prettierignore",
    "content": ".next"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"singleQuote\": true,\n  \"trailingComma\": \"none\",\n  \"arrowParens\": \"avoid\",\n  \"printWidth\": 80,\n  \"semi\": false\n}\n"
  },
  {
    "path": "AGENT.md",
    "content": "# AGENT.md - Hack Club Site Development Guide\n\n## Commands\n\n- **Dev**: `bun run dev` (start development server)\n- **Build**: `bun run build` (production build)\n- **Lint**: `bun run lint` (Next.js ESLint)\n- **Format**: `bun run format` (Prettier formatting)\n- **Start**: `bun run start` (production server)\n- **Test**: No test framework configured\n\n## Code Style\n\n- **Imports**: Use relative imports (`../components/nav`), Theme UI components (`{ Box, Text }`)\n- **Formatting**: Single quotes, no semicolons, no trailing commas, 80 char width\n- **Components**: Functional components with destructured props, default exports\n- **Styling**: Theme UI `sx` prop for styling, styled components with @emotion/styled\n- **Types**: TypeScript enabled but strict mode off, prefer implicit typing\n- **Naming**: camelCase for variables/functions, PascalCase for components\n\n## Architecture\n\n- Next.js app with pages/ directory structure\n- MDX support for content pages\n- Theme UI for consistent styling with Hack Club theme\n- Components in components/ directory, modular cards in components/index/cards/\n- Static assets in public/\n- Configuration in next.config.mjs includes essential redirects/rewrites\n"
  },
  {
    "path": "LICENSE.md",
    "content": "_Code under MIT License, assets may not be re-used or re-distributed._\n\n### MIT License\n\nCopyright 2026 The Hack Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"><img width=\"192\" alt=\"Hack Club logo\" src=\"https://assets.hackclub.com/flag-standalone.svg\"></p>\n<h1 align=\"center\"><a href=\"https://hackclub.com/\">Hack Club's Site (v3)</a></h1>\n<p align=\"center\"><i>The source code for hackclub.com</i></p>\n\nHack Club's new website. This codebase is what runs on [hackclub.com](https://hackclub.com). For new developers getting started, run the following in your terminal:\n\n1. Download the code to your computer:\n\n   ```bash\n   git clone https://github.com/hackclub/site && cd site\n   ```\n\n2. Install dependencies:\n\n   ```bash\n   bun install\n   ```\n\n3. Start running the website on your computer:\n\n   ```bash\n   bun run dev\n   ```\n\n4. Open up your web browser and go to [localhost:3000](http://localhost:3000)\n\n> [!NOTE]\n> There are a number of redirects and rewrites essential to the website's functionality, which you can see in [next.config.ts](./next.config.ts).\n\nPowered by [Next.js] with [MDX], [Theme UI], & [Hack Club Theme].\n\nCode under MIT License, assets may not be re-used or re-distributed.\n\n---\n\n<h1 align=\"center\">Building <a href=\"https://hackclub.com/\">hackclub.com</a></h1>\n\nJoin us in building Hack Club's homepage and show new hackers what Hack Club could be for them 💖.\n\nSee something that could be better? Make a PR! Have an easter egg idea? Make a PR! Is the site missing something? Make a PR! _(Do you see a trend? :))_\n\nIf you need to add content to the site, here's how you can:\n\n<details> <summary>Create a new card</summary>\n<img width=\"600\" alt=\"Screenshot of the Sprig card\" src=\"https://github.com/hackclub/site/assets/65808924/fed45800-c834-4e4c-ad87-a21e01414fa9\">\n\nMost things on the homepage are cards, modular components that can easily be added and removed according to relevancy to Hack Clubbers. There are 3 main sections: connection, open-source, and IRL community. Most new cards will likely fall within the first two sections!\n\nFirst, you can create a new file under [components/index/cards](components/index/cards/) with the name of your new event/project. Next add `import CardModel from './card-model'` and add whatever you want :) Finally, use a `<Buttons>` component (`import Buttons from './button'`) to highlight call-to-action buttons. If it's the main button, use the primary prop to add a background color!\n\nYour challenge: try and make the card as unique as possible, like a mini poster! Not sure where to start? Look at other cards on the page :)\n\n</details>\n\n<details>\n<summary>Add to the carousel</summary>\n\n<img width=\"600\" alt=\"Screenshot of a carousel section\" src=\"https://github.com/hackclub/site/assets/65808924/044660eb-fb3d-43b6-a270-64a3fe51f3ca\">\n\nIf there's a Hack Club or Hack Club community-led project (past or present) that Hack Clubbers can get involved in, please add it to [public/carousel.json](public/carousel.json) and add your card to the end of the json file. An example looks like this:\n\n```json\n{\n  \"background\": \"dark\",\n  \"titleColor\": \"white\",\n  \"descriptionColor\": \"white\",\n  \"title\": \"Hackers Wanted\",\n  \"description\": \"Our open love letter to hackers\",\n  \"img\": \"https://a.slack-edge.com/production-standard-emoji-assets/14.0/apple-large/1f4bb@2x.png\",\n  \"link\": \"/hackers-wanted\"\n}\n```\n\n</details>\n\nEvery week, thousands of people visit hackclub.com. What story do you want to tell?\n\n_Have questions? Join us in [#hackclub-site-dev](https://hackclub.slack.com/archives/C036BTDGP43) and to learn more about the style guide at Hack Club check [this](https://hackclub.com/brand/) out_\n\n---\n\nHack Club, 2026. MIT License.\n\n[next.js]: https://nextjs.org\n[mdx]: https://mdxjs.com\n[theme ui]: https://theme-ui.com\n[hack club theme]: https://theme.hackclub.com\n"
  },
  {
    "path": "components/AButton.ts",
    "content": "import { Button } from 'theme-ui'\n\nexport const AButton = Button as any\n"
  },
  {
    "path": "components/analytics.tsx",
    "content": "import Script from 'next/script'\n\nconst Analytics = () => (\n  <Script\n    defer\n    data-domain=\"hackclub.com\"\n    src=\"https://plausible.io/js/script.pageview-props.tagged-events.js\"\n  />\n)\n\nexport default Analytics\n"
  },
  {
    "path": "components/announcement.tsx",
    "content": "import { keyframes } from '@emotion/react'\nimport Image from 'next/image'\nimport { Box, Card, Text } from 'theme-ui'\nimport Icon from './icon'\n\nexport const unfold = keyframes({\n  from: { transform: 'scaleY(0)' },\n  to: { transform: 'scaleY(100%)' }\n})\n\ntype AnnouncementProps = {\n  caption?: string\n  copy: string\n  iconLeft?: string\n  iconRight?: string\n  imgSrc?: string\n  imgAlt?: string\n  color?: string\n  textColor?: string\n  sx?: any\n  width?: number | string\n  href?: string\n}\n\nconst Announcement = ({\n  caption,\n  copy,\n  iconLeft,\n  iconRight,\n  imgSrc,\n  imgAlt,\n  color = 'accent',\n  textColor = 'secondary',\n  sx = {},\n  width,\n  ...props\n}: AnnouncementProps) => (\n  <Card\n    as={props.href ? 'a' : 'div'}\n    variant=\"interactive\"\n    sx={{\n      variant: 'cards.translucent',\n      mx: 'auto',\n      maxWidth: 'narrow',\n      width: width ? width : '100%',\n      textAlign: 'left',\n      textDecoration: 'none',\n      lineHeight: 'caption',\n      display: 'flex',\n      alignItems: 'center',\n      p: [2, 2],\n      px: 3,\n      mb: [3, 4],\n      mt: [null, -3, -5],\n      transform: 'scale(1)',\n      '@media (prefers-reduced-motion: no-preference)': {\n        animation: `${unfold} 0.5s ease-out`\n      },\n      svg: { flexShrink: 'none' },\n      ...sx\n    }}\n    {...props}\n  >\n    {iconLeft && (\n      <Icon\n        glyph={iconLeft}\n        sx={{ mr: [2, 3], ml: 2, color, display: ['none', 'block'] }}\n      />\n    )}\n    {imgSrc && (\n      <Box sx={{ mr: [2, 3], ml: 2, width: 32, flexShrink: 0 }}>\n        <Image\n          src={imgSrc}\n          alt={imgAlt}\n          width={32}\n          height={32}\n          style={{\n            maxWidth: '100%',\n            height: 'auto'\n          }}\n        />\n      </Box>\n    )}\n    <Text\n      as=\"p\"\n      sx={{\n        flex: '1 1 auto',\n        strong: { display: ['inline', 'block'], color: textColor }\n      }}\n    >\n      <strong>{copy}</strong>\n      {caption && (\n        <Text as=\"span\" variant=\"caption\" color={textColor}>\n          {' '}\n          {caption}\n        </Text>\n      )}\n    </Text>\n    {iconRight && <Icon glyph={iconRight} sx={{ ml: [2, 3], color }} />}\n  </Card>\n)\n\nexport default Announcement\n"
  },
  {
    "path": "components/announcements/amount.tsx",
    "content": "import Sparkles from '../sparkles'\n\nconst Amount = ({ amount }) => (\n  <Sparkles\n    sx={{\n      WebkitTextStroke: 'currentColor',\n      WebkitTextStrokeWidth: ['2px', '3px'],\n      WebkitTextFillColor: 'transparent'\n    }}\n  >\n    {amount}\n  </Sparkles>\n)\n\nexport default Amount\n"
  },
  {
    "path": "components/announcements/cta.tsx",
    "content": "import { Box, Button, Grid, Heading, Text } from 'theme-ui'\nimport Icon from '@hackclub/icons'\nimport NextLink from 'next/link'\nimport { thousands } from '../../lib/members'\n\nexport default function SlackCTA() {\n  return (\n    <Box\n      as=\"section\"\n      sx={{\n        bg: 'orange',\n        backgroundImage: (t: any) => t.util.gx('yellow', 'orange'),\n        color: 'white',\n        py: [4, 5]\n      }}\n    >\n      <Grid gap={[3, 4]} columns={[null, 'auto 1fr']} variant=\"layout.copy\">\n        <Icon glyph=\"welcome\" size={72} />\n        <Box>\n          <Heading as=\"h2\" variant=\"headline\" mt={0}>\n            Teenager? New here? Welcome!\n          </Heading>\n          <Text variant=\"subtitle\" sx={{ lineHeight: 'caption', mb: 3 }}>\n            Hack Club is a global community of high school makers & student-led\n            coding clubs. We’ve got a 24/7 Slack chatroom of {thousands}k+\n            teenagers learning to code & building amazing projects, & you’ll fit\n            right in.\n          </Text>\n          <br />\n          <br />\n          <NextLink href=\"/\">\n            <Button bg=\"cyan\">Learn more</Button>\n          </NextLink>\n        </Box>\n      </Grid>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/announcements/elon.mdx",
    "content": "import Amount from './amount'\nimport Signature from '../signature'\n\n# Today, I’m proud to share: Elon&nbsp;Musk is donating <Amount amount=\"$500,000\" /> to&nbsp;[Hack&nbsp;Club](https://hackclub.com).\n\nElon Musk is one of the most prolific and ambitious hackers of the last decade.\n\nIt was a huge honor last month to have Elon [spend an hour in an ask-me-anything call with our community of high schoolers](https://youtu.be/riru9OzScwk)—at one point he remarked we were “asking better questions than all the mainstream media” and called our community “very wholesome.”\n\n**Afterwards, Elon wanted to support Hack&nbsp;Club further.**\n\nWhen hackers see problems in the world, we don’t blame someone else: we try to take them on to solve. Elon is very selective about the nonprofits he supports and I’m proud Hack&nbsp;Club is one of them.\n\nSo…how will Hack&nbsp;Club invest $500,000? We want to use this to help 1,000 more students start and join Hack Clubs in their towns ([see the worldwide map](https://hackclub.com/map/)). For those already in Hack&nbsp;Club, we look to you to help us make a higher-quality experience. We plan to continue much of what we’re already doing (and [what I wrote about in January](https://zachinto2020.wordpress.com/2019/12/31/as-midnight-approaches/)): spending as little money as possible at all times, growing slowly, adding diverse staff to make Hack&nbsp;Club better (video game designers, software engineers, media producers, and more). We are pushing hard to try and make the [Hack&nbsp;Club Slack](https://hackclub.com/) the best place to be a teenager on the internet and expanding [HCB](https://hackclub.com/fiscal-sponsorship/).\n\nWe’ll be fully transparent in how we spend this money. One thing we’ve been working toward after winning the [Frank Grant](https://grant.frank.ly/) is open sourcing our finances. Hack&nbsp;Club HQ has been running on HCB since February, and starting today, [**you can see our finances publicly**](https://hcb.hackclub.com/hq). Through HCB, you can track how we spend every dollar of Elon’s gift. Soon, we’ll also launch [Frank’s](https://frank.ly/) transparency tools on [hackclub.com](https://hackclub.com/).\n\nHack&nbsp;Club’s mission is to build a new generation of hackers. This starts in high school, where Hack&nbsp;Club students learn to be technically proficient, build their friend network, learn to raise and spend money, and develop into kind, curious, thoughtful, optimistic, and honest leaders. And now Elon Musk is one of our largest supporters.\n\nTo every Hack Clubber: Elon is now supporting you and your work, so go forth and do amazing things. We can’t wait to show Elon what you make.\n\n<Signature fname=\"Zach\" lname=\"Latta\" />\n\nZach Latta, Founder\n"
  },
  {
    "path": "components/announcements/hcb-mobile.mdx",
    "content": "I’m Mohamad, a 17-year-old from the SF Bay Area, and I just shipped the official mobile app for HCB.\n\nIf you haven't heard of it, HCB is the financial backbone for over **6,500 teenager-led nonprofits**, clubs, and hackathons. We provide **501(c)(3) nonprofit** status, access to a bank account, a donation collection platform, and debit cards for thousands of young people trying to do good in their communities.\n\nHCB is currently processing an average of **$6 million per month** (over $80M in its lifetime).[^1] For the last year, I’ve led the project to build the first-ever mobile app for this entire community.\n\n_The entire project is open source on [GitHub](https://github.com/hackclub/hcb-mobile) (we'd love a ⭐️!)._\n\n## Why build this?\n\nThese teenagers are running run robotics teams, hackathons, and nonprofit projects that improve their community. They need a way to manage their organization's finances from their pocket.\nWith HCB Mobile, they'll be able to:\n\n- Track their **organization's balance** and transactions on the go.\n- Accept in-person **tap-to-pay donations**, perfect for an in-person fundraiser or event! No extra hardware required. Just tap any credit/debit card against your phone.\n- **Issue new debit cards**, add them to **Apple / Google Wallet**, and freeze or cancel them directly from their phone.\n- **Upload receipts** directly from their device or match existing receipts in Receipt Bin to transactions with a tap.\n\n## The Technical Stuff\n\nWhen I started working on this app, I wanted to build in native code like **SwiftUI** for iOS and **Kotlin/Jetpack Compose** for Android. However, I realized that it would be a pain for me, a **full-time student** with classes, to handle two codebases. I'd have to duplicate every feature I created for one OS to the other and deal with all the integration issues along the way. Then, I discovered **Expo** (a React Native framework) which allowed me to write one app that worked on multiple devices. Working with Expo, I learned about creating my own Expo Modules (to bridge native code features to Typescript) and optimization methods like memoization and component recycling.\n\nThe non-code side of this app was _no joke_, either. I had to work with the Apple and Google app review teams to obtain **restricted entitlements** for features like mobile **tap-to-pay terminal provisioning** (made possible by Stripe) and **push provisioning** (which allows users to add cards to their payment wallet directly from HCB Mobile). It took several months and many back-and-forth email chains to finally get the entitlements we needed.\n\nAfter over 250 hours of development work, I can say that I'm incredibly proud of HCB Mobile because it's **built by teenagers** to make it easier for teenagers like me to run nonprofit organizations and projects with HCB. Beyond teenagers, HCB also supports hundreds of adult-ran organizations such as mutual aid groups, open source projects, and community spaces.\n\n<br />\n\n## Download the app!\n\n<br />\n<a href=\"https://apps.apple.com/us/app/hcb-by-hack-club/id6465424810\">\n  <img\n    src=\"/fiscal-sponsorship/apple-web-badge.svg\"\n    alt=\"Download on the App Store\"\n    height=\"40\"\n  />\n</a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://play.google.com/store/apps/details?id=com.hackclub.hcb\">\n  <img\n    src=\"/fiscal-sponsorship/google-play-web-badge.png\"\n    alt=\"Get it on Google Play\"\n    height=\"40\"\n  />\n</a>\n\n[^1]: _This amount is excluding HQ (our own) [finances](https://hcb.hackclub.com/hq)._\n"
  },
  {
    "path": "components/announcements/hcb-open-source.mdx",
    "content": "Hack Club launched HCB in 2018 to enable hackathons to raise and spend money\nthrough [fiscal sponsorship](https://hackclub.com/fiscal-sponsorship/). Since\nthen, we’ve expanded to all nonprofit projects; our 12,000 users have transacted\n$50 million.\n\n<p style={{ textAlign: 'center' }}>\n  <img\n    alt=\"HCB's user interface showing Hack Club HQ's transactions\"\n    src=\"https://cdn.hackclub.com/019c76b7-a601-7e83-a9fb-e26595864142/flGLlg.png\"\n    width=\"700px\"\n  />\n</p>\n\nLocal student-ran hackathons, robotics teams, and community groups use HCB as a\nnonprofit neobank to collect donations, send payments, issue debit cards, and\ngain 501(c)(3) status.\n\nWhen we started HCB, it was developed in private for security reasons. That\nsaid, one of Hack Club’s core principles has always been transparency - we [open\nsource](https://github.com/hackclub/ledger) our\n[finances](https://hcb.hackclub.com/hq), [document how we run\nevents](https://github.com/hackclub/assemble), and have 500+ public repositories\non [GitHub](https://github.com/hackclub).\n\n**_[github.com/hackclub/hcb](https://github.com/hackclub/hcb) is now public -\ncheck it out and star it._**\n\nPaired with our technical documentation, it’s a great resource for anyone\ninterested in building financial software or applications with Ruby on Rails.\nOur engineering work is also entirely public; the world can learn from our\nsuccesses and mistakes.\n\nSince 2018, over fifty people have made 10k+ commits to HCB (thank you!); we\ncan’t wait for more contributors to join us:\n\n<video width=\"100%\" controls style={{ borderRadius: '8px' }}>\n  <source\n    src=\"https://noras-second-secret-cdn.hackclub.dev/gsource.mp4\"\n    type=\"video/mp4\"\n  />\n  Your browser does not support the video tag.\n</video>\n\nPS: if you’re looking to start a nonprofit, we’re accepting applications! Head\nover to [nonprofit.new](https://nonprofit.new/) and we’ll be in touch.\n\n<img src=\"https://cdn.hackclub.com/019c76b9-f285-79f8-93af-2b43e0a67674/A8ZCLg.jpeg\" />\n<small>We're launching this live from SF!</small>\n"
  },
  {
    "path": "components/announcements/hcb_cta.tsx",
    "content": "import { Box, Button, Grid, Heading, Text } from 'theme-ui'\nimport Icon from '@hackclub/icons'\nimport NextLink from 'next/link'\n\nexport default function HCBCTA() {\n  return (\n    <Box\n      as=\"section\"\n      sx={{\n        bg: 'orange',\n        backgroundImage: (t: any) => t.util.gx('yellow', 'orange'),\n        color: 'white',\n        py: [4, 5]\n      }}\n    >\n      <Grid gap={[3, 4]} columns={[null, 'auto 1fr']} variant=\"layout.copy\">\n        <Icon glyph=\"bank-account\" size={72} />\n        <Box>\n          <Heading as=\"h2\" variant=\"headline\" mt={0}>\n            Looking to start a nonprofit?\n          </Heading>\n          <Text variant=\"subtitle\" sx={{ lineHeight: 'caption', mb: 3 }}>\n            We're accepting applications! No startup fees, no minimum balance,\n            and no long wait time.\n          </Text>\n          <br />\n          <br />\n          <NextLink href=\"/fiscal-sponsorship\">\n            <Button bg=\"cyan\">Learn more</Button>\n          </NextLink>\n          &nbsp;&nbsp;&nbsp;\n          <NextLink href=\"https://nonprofit.new\">\n            <Button bg=\"orange\">Apply now</Button>\n          </NextLink>\n        </Box>\n      </Grid>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/announcements/holder.tsx",
    "content": "import { Container, BaseStyles } from 'theme-ui'\n\nexport default function AnnouncementHolder({ children }) {\n  return (\n    <Container\n      as={BaseStyles}\n      variant=\"copy\"\n      sx={{\n        py: [4, 5],\n        fontSize: [2, 3],\n        h1: {\n          textAlign: ['left', 'center'],\n          color: 'cyan',\n          my: 4,\n          a: { color: 'inherit' }\n        },\n        'a[href^=\"#fn-\"], a[href^=\"#fnref-\"]': {\n          textDecoration: 'none',\n          color: 'inherit'\n        }\n      }}\n    >\n      {children}\n    </Container>\n  )\n}\n"
  },
  {
    "path": "components/announcements/pills.tsx",
    "content": "import { Avatar, Badge, Flex } from 'theme-ui'\n\nexport function PillHolder({ children }) {\n  return (\n    <Flex\n      sx={{\n        flexWrap: 'wrap',\n        justifyContent: 'center',\n        alignItems: 'center',\n        div: {\n          mt: 0,\n          mb: 2,\n          color: 'muted',\n          border: '1px solid',\n          borderColor: 'border',\n          bg: 'snow',\n          fontSize: 2,\n          fontWeight: 'body',\n          lineHeight: '36px'\n        }\n      }}\n    >\n      {children}\n    </Flex>\n  )\n}\n\nexport function AuthorPill({ tag, image, firstName }) {\n  return (\n    <Badge\n      variant=\"pill\"\n      sx={{\n        mr: [2, 3],\n        pl: 2,\n        pr: 3,\n        display: 'inline-flex',\n        alignItems: 'center'\n      }}\n    >\n      <Avatar src={image} alt={firstName} size={36} mr={2} />\n      {tag}\n    </Badge>\n  )\n}\n\nexport function DatePill({ tag }) {\n  return (\n    <Badge variant=\"pill\" px={3}>\n      {tag}\n    </Badge>\n  )\n}\n"
  },
  {
    "path": "components/announcements/preston-werner-2022.mdx",
    "content": "This gift means a lot to the Hack Club community, and we are grateful for Tom and Theresa’s continued support.\n\nIn 2014, Hack Club was founded, and Tom joined as Hack Club’s first board member. In the years since, he has contributed open source code, mentored Hack Clubbers 1:1, donated dozens of laptops to teenagers who didn't have access to computers, and been a constant advisor on the Hack Club community, strategy, and product.\n\nTom and Theresa also helped fund [The Hacker Zephyr](https://hack.af/zephyrdoc), an epic, cross-country train hackathon taken by 42 teen hackers in the summer of 2021. Tom even hacked alongside Hack Clubbers onboard.\n\nWith this gift, we will continue to build the engineering team at Hack Club, including a Tech Lead for [HCB](https://hackclub.com/fiscal-sponsorship), and new engineers to support clubs, the Hack Club online community, and events.\n\nOne of our goals in 2022 is to improve Hack Club and to support more teenagers in joining the community. Thank you Tom and Theresa for helping make this possible.\n\nWe thank Tom and Theresa for their generous gift and will carefully use each cent to advance our mission to create a new generation of young, highly-technical teen leaders capable of solving our world’s greatest problems. Every penny will be spent [transparently](https://hcb.hackclub.com/hq).\n\n— Christina Asquith, COO, and Zach Latta, founder\n"
  },
  {
    "path": "components/announcements/preston-werner.mdx",
    "content": "import Amount from './amount'\n\n# Today, we're proud to share: Tom and Theresa Preston-Werner are donating <Amount amount=\"$500,000\" /> to&nbsp;[Hack&nbsp;Club](https://hackclub.com).\n\nWe are deeply grateful for this gift.\n\nIn the coming months, we hope you’ll share our excitement as we make 2 new hires directly serving Hack Clubbers. This gift increases Hack Club’s budget by 60%, and helps us build a diverse foundation at the leadership level of Hack Club as we grow.\n\nWe are so honored to be included among the many gifts the Preston-Werners make each year. This is the 3rd year the Preston-Werners have given a gift to Hack Club, and they've supported the organization from the beginning.\n\nTom and Theresa inspire Hack Club's values. They are self-made hackers, passionate about constructing a better world in creative ways. They are deeply committed to environmental protection, women’s rights, ending global poverty and injustice; and are tremendous collaborators in making Hack Club a place where all young people can build and create their own solutions through coding and technology, regardless of their background. They apply rigorous-thinking, curiosity, humility, transparency, and deep expertise in academia and coding to the problems that need solving in the world, and inspire us to do the same.\n\nThe Preston-Werners generously donate dozens of hours of their time each year to Hack Club HQ and Hack Clubbers. Theresa has been a steady champion of Hack Club, supporting us with feedback, advice, editing, and meeting with Hack Club students. Tom is a founding board member and a personal mentor of Zach’s for the last 5 years. Just some of the ways they support Hack Club is that they inspired the idea to launch Hack Club’s “Ask Me Anything” series, and Tom was our first speaker last April. In December 2019, they threw an amazing Christmas party at their San Francisco home for Hack Club.\n\nTheir incredible and generous gift ushers Hack Club into a big new year in which we get closer to our vision to build a new cultural institution for the 21st century akin to the Boy and Girl Scouts, in which we support high schoolers to gain critical computer science skills, healthy, fun and wholesome friendships, and a set of modern values that honor kindness, integrity, inclusivity, curiosity, optimism, and building and doing.\n\nWe send them a huge thank you. To every Hack Clubber: Tom and Theresa are now supporting you and your work, so go forth and do amazing things. We can’t wait to show them what you make.\n\n—Christina Asquith, COO, and Zach Latta, founder\n"
  },
  {
    "path": "components/announcements/relon.mdx",
    "content": "import Signature from '../signature'\nimport Signatures from '../signatures'\nimport Image from 'theme-ui'\n\nIn March 2020, Elon Musk [spent an hour hanging out with Hack Clubbers](https://www.youtube.com/watch?v=riru9OzScwk). He [donated $500,000 to build our team](https://hackclub.com/elon/), [tweeted Hack Club was a cool group](https://twitter.com/elonmusk/status/1263275969743216640), and said that Hack Club makes him more optimistic about the future. This year, Hack Clubbers met SpaceX engineers and demoed projects on SpaceX's factory floor in Hawthorne, California.\n\nThis summer, Elon reached back out.\n\nToday, we're excited to announce Elon is donating $1 million to Hack Club.\n\nThis gift will help launch a number of ideas we've been discussing, including helping more in-person hackathons get off the ground, providing more direct 1:1 technical support on the [Hack Club Slack](https://slack.hackclub.com), and starting up cool new projects like [The Hacker Zephyr](https://github.com/hackclub/the-hacker-zephyr). We also want to use his gift to help 1,000 more teenagers start and join Hack Clubs in their towns.\n\nWe will be spending every dollar as wisely as possible, growing thoughtfully, and adding diverse staff to make Hack Club better. We are pushing hard to try and make the Hack Club Slack the best place to be a teenager on the internet and expanding [HCB](https://hackclub.com/fiscal-sponsorship/).\n\nElon is very selective about the nonprofits he supports and we're proud Hack Club is one of them.\n\nHack Club will be fully transparent in how we spend this money. Hack Club HQ has been running on HCB since February 2020, and [you can see our finances publicly here](https://hcb.hackclub.com/hq).\n\nHack Club's mission is to help foster a new generation of hackers. This starts in high school, where Hack Clubbers learn to be technically proficient, build their friend network, learn to raise and spend money, and develop into kind, curious, thoughtful, optimistic, and honest leaders. And now Elon Musk is one of our largest supporters.\n\nTo every Hack Clubber: Elon continues to support you and your work, so go forth and do amazing things. We can't wait to share what you make.\n\n<Signatures fileName=\"christina_and_zrl\" width={320} />\n\nZach Latta, Founder & Executive Director  \nChristina Asquith, COO\n"
  },
  {
    "path": "components/arcade/footer.tsx",
    "content": "import { Box, Heading, Text, Link } from 'theme-ui'\nimport Footer from '../footer'\n\nconst Description = () => (\n  <Box sx={{ a: { color: '#FF5C00' }, pb: 4 }}>\n    <Heading as=\"h3\" variant=\"subheadline\" mb={2}>\n      A project by <a href=\"https://hackclub.com/\">Hack Club</a>.\n    </Heading>\n    <Text as=\"p\" variant=\"caption\" mb={3} sx={{ width: ['85%', '75%', '60%'] }}>\n      <Link href=\"/arcade/power-hour\">Previous edition: Power Hour</Link>\n    </Text>\n    <Text as=\"p\" variant=\"caption\" mb={3} sx={{ width: ['85%', '75%', '60%'] }}>\n      Hack Club is a registered 501(c)3 nonprofit organization that supports a\n      network of 20k+ technical high schoolers. We believe you learn best by\n      building so we're creating community and providing grants so you can make.\n      In the past few years, we've{' '}\n      <Link href=\"https://summer.hackclub.com\" target=\"_blank\">\n        given away 100k+ in hardware grants\n      </Link>\n      ,{' '}\n      <Link\n        href=\"https://github.com/hackclub/the-hacker-zephyr\"\n        target=\"_blank\"\n      >\n        hosted the world's longest hackathon on land\n      </Link>\n      , and{' '}\n      <Link href=\"https://github.com/hackclub/assemble\" target=\"_blank\">\n        brought 183 teenagers to SF for a hackathon\n      </Link>\n      .\n    </Text>\n  </Box>\n)\n\nconst ArcadeFooter = () => {\n  return (\n    <Footer>\n      <Description />\n    </Footer>\n  )\n}\n\nexport default ArcadeFooter\n"
  },
  {
    "path": "components/arcade/projects.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport React, { useState } from 'react'\nimport styled from '@emotion/styled'\nimport {\n  Box,\n  Button,\n  Container,\n  Flex,\n  Heading,\n  Card,\n  Grid,\n  Text,\n  Avatar\n} from 'theme-ui'\nimport NextImage from 'next/image'\nimport Marquee from '../marquee'\nimport Photo1 from '../../public/winter/1.jpeg'\nimport Photo2 from '../../public/winter/2.png'\nimport Photo3 from '../../public/winter/3.jpeg'\nimport Photo4 from '../../public/winter/4.jpeg'\nimport Photo5 from '../../public/winter/5.jpeg'\nimport Photo6 from '../../public/winter/6.jpeg'\nimport Photo7 from '../../public/winter/7.jpeg'\nimport Photo8 from '../../public/winter/8.jpeg'\nimport Photo9 from '../../public/winter/9.jpeg'\nimport Photo10 from '../../public/winter/10.jpeg'\nimport Photo12 from '../../public/winter/12.jpeg'\nimport Photo13 from '../../public/winter/13.jpeg'\nimport Photo14 from '../../public/winter/14.jpeg'\nimport Photo15 from '../../public/winter/15.jpeg'\nimport Photo16 from '../../public/winter/16.jpeg'\nimport Photo17 from '../../public/winter/17.jpeg'\nimport Photo18 from '../../public/winter/18.jpeg'\nimport Photo19 from '../../public/winter/19.jpeg'\nimport Photo20 from '../../public/winter/20.jpeg'\nimport Photo21 from '../../public/winter/21.jpeg'\n\nconst Header = styled(Box)`\n  background: url('/pattern.svg');\n`\n\nconst PhotoRow = ({ photos }) => (\n  <Box sx={{ height: '225px', overflow: 'hidden' }}>\n    <Box sx={{ display: ['block', 'block', 'block', 'block', 'none'] }}>\n      <Marquee velocity={12} onInit={() => {}} onFinish={() => {}}>\n        {photos.map((photo, index) => (\n          <NextImage\n            placeholder=\"blur\"\n            src={photo}\n            className=\"next-image\"\n            height=\"225px\"\n            width=\"300px\"\n            alt=\"Hack Club students\"\n            key={'image-' + index}\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'cover'\n            }}\n          />\n        ))}\n      </Marquee>\n    </Box>\n    <Box sx={{ display: ['none', 'none', 'none', 'none', 'block'] }}>\n      <Marquee velocity={12} onInit={() => {}} onFinish={() => {}}>\n        {photos.map((photo, index) => (\n          <NextImage\n            placeholder=\"blur\"\n            src={photo}\n            className=\"next-image\"\n            height=\"200px\"\n            width=\"600px\"\n            key={'image-' + index}\n            alt=\"Hack Club students\"\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'cover'\n            }}\n          />\n        ))}\n      </Marquee>\n    </Box>\n  </Box>\n)\n\nconst Cards = ({ avatar, username, description, image }) => {\n  return (\n    <Card\n      className=\"post\"\n      sx={{ p: [3, 3], width: '100%', background: '#FAEFD6', color: '#5E3414' }}\n    >\n      <Flex\n        as=\"a\"\n        href={\n          username !== 'cjmika110'\n            ? `https://scrapbook.hackclub.com/${username}`\n            : 'https://scrapbook.hackclub.com'\n        }\n        sx={{\n          color: 'inherit',\n          textDecoration: 'none',\n          alignItems: 'center',\n          mb: 2\n        }}\n      >\n        <Avatar loading=\"lazy\" src={avatar} alt=\"\" mr={2} />\n        <Box>\n          <Text variant=\"subheadline\" my={0} fontSize={[1, 1]}>\n            @{username}\n          </Text>\n        </Box>\n      </Flex>\n      <Text\n        as=\"p\"\n        sx={{\n          fontSize: 1,\n          textAlign: 'left',\n          mb: 2,\n          a: {\n            color: 'primary',\n            wordBreak: 'break-all',\n            wordWrap: 'break-word'\n          },\n          '> div': { width: 18, height: 18 }\n        }}\n      >\n        {description}\n      </Text>\n      <Box\n        sx={{\n          position: 'relative',\n          width: '100%',\n          height: '160px',\n          overflow: 'hidden',\n          backgroundImage: `url('${image}')`,\n          backgroundSize: '100%',\n          backgroundPosition: 'bottom center',\n          backgroundRepeat: 'no-repeat'\n        }}\n      >\n        {/* <img src={image} sx={{ width: '100%' }} /> */}\n      </Box>\n    </Card>\n  )\n}\n\nexport default function Projects() {\n  const [count, setCount] = useState(0)\n\n  const list = [\n    'Drawing robot',\n    '3D printer',\n    'DIY Electric Skateboard',\n    'Pixel art display',\n    'Smart Garden',\n    'CNC machine',\n    'Interactive LED Art',\n    'VR Escape Room',\n    'Image Recognition App',\n    'DIY Camera',\n    'Multiplayer AR Game',\n    'Drone Swarm Choreography'\n  ]\n\n  if (count === list.length - 1) {\n    setCount(0)\n  }\n\n  const project_idea = list[count]\n\n  return (\n    <Box>\n      <Header sx={{ position: 'relative' }}>\n        <Box\n          sx={{\n            background: [\n              '#D0BF97 url(/arcade/white_bg.svg) no-repeat center center',\n              '#D0BF97 url(/arcade/white_bg.svg) no-repeat center center',\n              'rgba(0,0,0, 0.8)',\n              'rgba(0,0,0, 0.8)'\n            ],\n            backgroundSize: 'cover',\n            zIndex: 1,\n            position: 'relative',\n            color: 'white!important',\n            height: ['auto', 'auto', '900px', '900px']\n          }}\n          pt={[5, 5, 5, '50px']}\n          pb={[5, 5, 0, 0]}\n        >\n          <Box\n            sx={{\n              maxWidth: '64rem',\n              mx: 'auto',\n              zIndex: 1,\n              position: 'relative'\n            }}\n            align=\"center\"\n            py={2}\n            px={[1, 3]}\n          >\n            <Container sx={{ maxWidth: '48rem' }}>\n              <Heading\n                variant=\"headline\"\n                sx={{\n                  textShadow: '0px 0px 21px #FAEFD6',\n                  color: '#FAEFD6',\n                  display: 'flex',\n                  flexDirection: 'column',\n                  alignItems: 'center',\n                  gap: 1,\n                  fontSize: [2, 4, 5]\n                }}\n              >\n                <Text>You could be building a</Text>\n                <Text\n                  sx={{\n                    backgroundColor: '#FF5C00',\n                    py: 2,\n                    px: 3,\n                    borderRadius: 10,\n                    position: 'relative',\n                    width: 'fit-content',\n                    height: 'min-content',\n                    cursor: 'pointer',\n                    userSelect: 'none',\n                    color: '#FAEFD6'\n                  }}\n                  onClick={() => setCount(count + 1)}\n                >\n                  <Box as=\"span\" sx={{ whiteSpace: 'nowrap' }}>\n                    {project_idea}\n                  </Box>\n                </Text>\n              </Heading>\n              <Grid\n                columns={[1, 1, 3, 3]}\n                mt={4}\n                mx={['5vw', '5vw', 'auto', 'auto']}\n              >\n                <Cards\n                  avatar=\"https://scrapbook.hackclub.com/_next/image?url=https%3A%2F%2Favatars.slack-edge.com%2F2024-05-06%2F7077145829972_8597fe575e09a698859c_192.png&w=48&q=75\"\n                  username=\"elijah\"\n                  description=\"Finally shipped my personal ai clone and had a ton of fun playing around with it and seeing what other people did with it! Personal favorite was when it threatened to kill me and got very unhinged when the person threatened to send screenshots to me\"\n                  image=\"https://scrapbook-into-the-redwoods.s3.amazonaws.com/4d4ecc40-c388-4b9d-997f-1f3d6a21302c-image.png\"\n                />\n                <Cards\n                  avatar=\"https://scrapbook.hackclub.com/_next/image?url=https%3A%2F%2Favatars.slack-edge.com%2F2023-04-15%2F5116546887938_afb907f96fa13e434a49_192.png&w=48&q=75\"\n                  username=\"cupcakes\"\n                  description=\"Assembling blot robot! 🪛\"\n                  image=\"https://scrapbook-into-the-redwoods.s3.amazonaws.com/e75cf24a-46d9-45fa-92d3-b9e5862d0d47-img_2442.jpg\"\n                />\n                <Cards\n                  avatar=\"https://scrapbook.hackclub.com/_next/image?url=https://secure.gravatar.com/avatar/c2e358d7bf4677cac086556035ce1dbc.jpg?s%3D192%26d%3Dhttps%253A%252F%252Fa.slack-edge.com%252Fdf10d%252Fimg%252Favatars%252Fava_0011-192.png&w=640&q=75\"\n                  username=\"KonstantinosFragkoulis\"\n                  description=\"Well, the drone now should be able to follow the biggest object that it sees with a specific color. I haven't tested it yet though 😞 (I'm too scared to crash it). Here is a clip from earlier today, my genuine reaction to the first takeoff ever (got a bit scared at the end) 👍 \"\n                  image=\"https://cloud-fshng6w8x-hack-club-bot.vercel.app/0videoframe_809.png\"\n                />\n              </Grid>\n              <Button\n                as=\"a\"\n                variant=\"cta\"\n                href=\"https://scrapbook.hackclub.com/\"\n                sx={{\n                  background:\n                    'linear-gradient(32deg, rgba(51, 142, 218, 0.9) 0%, rgba(51, 214, 166, 0.9) 100%)',\n                  mt: 4\n                }}\n              >\n                See more projects →\n              </Button>\n            </Container>\n          </Box>\n        </Box>\n        <Box\n          sx={{\n            position: 'absolute',\n            top: 0,\n            zIndex: 0,\n            width: '100%',\n            display: ['none', 'none', 'block', 'block']\n          }}\n        >\n          <PhotoRow photos={[Photo1, Photo2, Photo3, Photo4, Photo5]} />\n          <PhotoRow photos={[Photo6, Photo7, Photo8, Photo9, Photo10]} />\n          <PhotoRow photos={[Photo21, Photo12, Photo13, Photo14, Photo15]} />\n          <PhotoRow photos={[Photo16, Photo17, Photo18, Photo19, Photo20]} />\n        </Box>\n      </Header>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/background-image.tsx",
    "content": "import { Box } from 'theme-ui'\nimport Image, { StaticImageData } from 'next/image'\n\n/*\n * Use this component inside a container with CSS:\n * `position: relative; overflow: hidden;`\n * then pass width/height/alt/src as usual\n * (you can pass `gradient` valueless to avoid gradient)\n */\n\ntype BGImgProps = {\n  gradient?: string | boolean\n  alt?: string\n  src: string | StaticImageData\n  placeholder?: 'blur' | 'empty'\n}\n\nexport default function BGImg({\n  gradient = 'linear-gradient(rgba(0,0,0,0.25), rgba(0,0,0,0.5))',\n  alt = '',\n  ...props\n}: BGImgProps) {\n  return (\n    <Box\n      sx={{\n        position: 'absolute',\n        display: 'block',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        zIndex: 0,\n        '&:after': {\n          content: '\"\"',\n          position: 'absolute',\n          ...(typeof gradient === 'string'\n            ? { backgroundImage: gradient }\n            : {}),\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0\n        },\n        img: { objectFit: 'cover', objectPosition: 'center center' },\n        '~ *': { position: 'relative' }\n      }}\n    >\n      <Image fill alt={alt} {...props} />\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/bin/GalleryPosts.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Image from 'next/image'\nimport styles from '../../public/bin/style/gallery.module.css'\nimport PartTag from './PartTag'\n\ntype BinPostProps = {\n  title: string\n  desc: string\n  slack: string\n  link: string\n  id: string\n  date: string\n  parts?: string[]\n}\n\nconst BinPost = ({\n  title = 'Bin Post',\n  desc = 'Bin Project',\n  slack = '',\n  link = '',\n  id,\n  date,\n  parts\n}: BinPostProps) => {\n  link = link.trim()\n  if (!/^https?:\\/\\//i.test(link)) {\n    link = 'https://' + link\n  }\n  const projectID = link.split('/')[4]\n  const imgLink = `https://thumbs.wokwi.com/projects/${projectID}/social/bin.png`\n\n  function handleClick() {\n    if (typeof window !== 'undefined') {\n      window.open(link, '_blank')\n    }\n  }\n\n  function formatDate(dateString) {\n    const inputDate = new Date(dateString)\n    const now = new Date()\n    const oneDay = 24 * 60 * 60 * 1000 // Number of milliseconds in one day\n\n    // Check if the input date is within the last 24 hours\n    if (now.getTime() - inputDate.getTime() < oneDay) {\n      const hours = inputDate.getHours().toString().padStart(2, '0')\n      const minutes = inputDate.getMinutes().toString().padStart(2, '0')\n      return `Today at ${hours}:${minutes}`\n    } else {\n      // Format the date to \"Month day, year\"\n      const options = {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric'\n      } as const\n      return inputDate.toLocaleDateString(undefined, options)\n    }\n  }\n  if (parts) {\n    parts = parts.filter(\n      part => part !== 'recvK14pXAY1tn3HQ' && part !== 'rec5TQNvkGkscsGuQ'\n    ) //Filter out breadboards and raspberry pi\n  }\n\n  return (\n    <div alt={id} className={styles.gallery_card} onClick={handleClick}>\n      <h1 className={styles.card_title}>\n        {title}\n        <br />\n      </h1>\n\n      <div className={styles.img_container}>\n        <Image src={imgLink} alt=\"Project Image\" width={1200} height={628} />\n      </div>\n\n      <p className={styles.card_desc}>{desc}</p>\n      <span className={styles.slack}>\n        {(slack ? (slack.startsWith('@') ? slack : `@${slack}`) : '') + ' '}\n      </span>\n      <span className={styles.date}>{formatDate(date)}</span>\n      <div className={styles.tag_container}>\n        {parts &&\n          parts.map(part => {\n            return <PartTag key={part} partID={part} />\n          })}\n      </div>\n    </div>\n  )\n}\n\nexport default BinPost\n"
  },
  {
    "path": "components/bin/PartTag.module.css",
    "content": ".tag {\n  color: e1e1e1;\n  padding: 4px 10px;\n  border-radius: 20px;\n  width: fit-content;\n  max-width: 300px;\n  display: flex;\n  text-align: center;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  transition: transform 0.3s ease;\n  box-sizing: border-box;\n}\n\n.tag:hover {\n  cursor: pointer;\n  transform: scale(1.1);\n}\n\n.outlined {\n  border: 5px dotted #c5c5c5;\n}\n"
  },
  {
    "path": "components/bin/PartTag.tsx",
    "content": "import React from 'react'\nimport styles from './PartTag.module.css'\nimport { useState } from 'react'\n\nconst PartTag = ({ partID, search = false, addFilter, removeFilter }) => {\n  const [isOutlined, setIsOutlined] = useState(false)\n\n  const handleClick = () => {\n    if (search) {\n      setIsOutlined(prevState => !prevState)\n      if (isOutlined) {\n        removeFilter(partID)\n      } else {\n        addFilter(partID)\n      }\n    }\n  }\n\n  let backgroundColor: string\n  let text: string\n  switch (partID) {\n    case 'recltWikgPdLvpJfe':\n      backgroundColor = '#0000FF' // Vibrant blue\n      text = 'Servo'\n      break\n    case 'recRzllr0dui91NLd':\n      backgroundColor = '#008000' // Vibrant green\n      text = 'LED'\n      break\n    case 'recM7OOofV9Bp7AM9':\n      backgroundColor = '#FF0000' // Vibrant red\n      text = 'ESP32'\n      break\n    case 'recALoD1CCKt3CxKE':\n      backgroundColor = '#800080' // Vibrant purple\n      text = 'Buzzer'\n      break\n    case 'rechtwyljZ5WR8DtR':\n      backgroundColor = '#FF4500' // Vibrant orange\n      text = 'Slider'\n      break\n    case 'recry1GsMO6QLakzw':\n      backgroundColor = '#8B4513' // Dark brown\n      text = 'Photoresistor'\n      break\n    case 'recjRu1vTAU3qDanE':\n      backgroundColor = '#FF1493' // Vibrant pink\n      text = 'LCD'\n      break\n    case 'recrgS7NnxS42tkmg':\n      backgroundColor = '#A52A2A' // Vibrant brown\n      text = 'LED Screen'\n      break\n    case 'recocuypi4xP0UgAj':\n      backgroundColor = '#000000' // Black\n      text = 'Joystick'\n      break\n    case 'recgLUxtFZHufN70W':\n      backgroundColor = '#1E90FF' // Dodger blue\n      text = 'LED Bar Graph'\n      break\n    case 'recKBAnftT9PgppUC':\n      backgroundColor = '#00FFFF' // Vibrant cyan\n      text = 'Shift Register'\n      break\n    case 'recibIXNCSdhDHjXD':\n      backgroundColor = '#FF00FF' // Vibrant magenta\n      text = 'Thermistor'\n      break\n    case 'recwSKHd3anpKqNbg':\n      backgroundColor = '#00FF00' // Vibrant lime\n      text = 'IR Receiver'\n      break\n    case 'recLRovQNumB1Et8B':\n      backgroundColor = '#008080' // Vibrant teal\n      text = 'Range Finder'\n      break\n    case 'recMVBkeJ4KQdZihl':\n      backgroundColor = '#808000' // Vibrant olive\n      text = 'Keypad'\n      break\n    case 'recGrj5GpSExI18Ff':\n      backgroundColor = '#000080' // Vibrant navy\n      text = 'Humidity'\n      break\n    case 'rec9G0CAXM0kdp7HY':\n      backgroundColor = '#800000' // Vibrant maroon\n      text = 'RTC'\n      break\n    case 'rec4vTiJIx4UP8Thl':\n      backgroundColor = '#DAA520' // Goldenrod\n      text = 'Motion Sensor'\n      break\n    case 'reczWN9rZOY95VXOT':\n      backgroundColor = '#FF8C00' // Dark orange\n      text = 'LED Matrix'\n      break\n    case 'recNjAmh8gF0gZNtI':\n      backgroundColor = '#FF6347' // Tomato red\n      text = 'Accelerometer'\n      break\n    case 'recPmyV5b8cvaMtTk':\n      backgroundColor = '#4B0082' // Vibrant indigo\n      text = 'Neopixel LED'\n      break\n    case 'recj5b4DKez4GNa8i':\n      backgroundColor = '#87CEEB' // Vibrant sky blue\n      text = 'Relay'\n      break\n    case 'rec5TQNvkGkscsGuQ':\n      backgroundColor = '#9932CC' // Vibrant orchid\n      text = 'Pico W'\n      break\n    case 'recqffGd1j1jRh56m':\n      backgroundColor = '#DDA0DD' // Vibrant plum\n      text = 'Multicolor LED'\n      break\n    case 'recJUolkJURydamzG':\n      backgroundColor = '#CD5C5C' // Vibrant light coral\n      text = 'Encoder'\n      break\n    case 'rec7lggt0DsgrWHzc':\n      backgroundColor = '#20B2AA' // Vibrant light sea green\n      text = 'Temp Sensor'\n      break\n    case 'rectVgu4kWbbaqccc':\n      backgroundColor = '#FFA07A' // Vibrant light salmon\n      text = 'Button'\n      break\n    case 'recWKEXSaByRvl68t':\n      backgroundColor = '#4682B4' // Vibrant light steel blue\n      text = '4 Digit Display'\n      break\n    default:\n      backgroundColor = 'gray' // Default gray\n      text = 'Invalid Tag'\n      console.log('invalid', partID)\n  }\n\n  return (\n    <div\n      style={{ backgroundColor }}\n      className={styles.tag + (isOutlined ? ` ${styles.outlined}` : '')}\n      onClick={handleClick}\n    >\n      {text}\n    </div>\n  )\n}\n\nexport default PartTag\n"
  },
  {
    "path": "components/bin/nav.tsx",
    "content": "import React from 'react'\nimport styles from '../../public/bin/style/gallery.module.css'\n\nconst Nav = () => {\n  return (\n    <div className={styles.nav}>\n      <button\n        className={styles.nav_button}\n        onClick={() => (window.location.href = '/bin')}\n      >\n        Bin Home\n      </button>\n      <button\n        className={styles.nav_button}\n        onClick={() => (window.location.href = '/bin/gallery')}\n      >\n        Gallery\n      </button>\n    </div>\n  )\n}\n\nexport default Nav\n"
  },
  {
    "path": "components/bin/rsvp-form.tsx",
    "content": "/** @jsxImportSource theme-ui */\n\nimport { Checkbox, Input, Label, Text, Box } from 'theme-ui'\nimport useForm from '../../lib/use-form'\nimport Submit from '../submit'\nimport { Slide } from '../react-reveal-compat'\n\nexport default function RsvpForm() {\n  const { status, formProps, useField } = useForm('/api/bin/rsvp', null, {\n    clearOnSubmit: 5000,\n    method: 'POST',\n    initData: {},\n    bearer: null\n  })\n\n  return (\n    <>\n      <form {...formProps}>\n        <Label>\n          <Text>Email</Text>\n          <Input\n            {...useField('email')}\n            placeholder=\"fiona@hackclub.com\"\n            required\n            sx={{ border: '1px solid', borderColor: 'muted', mb: 2 }}\n          />\n        </Label>\n        <Label variant=\"labelHoriz\" sx={{ fontSize: 1, pt: 2 }}>\n          <Checkbox\n            {...useField('high_schooler', 'checkbox')}\n            defaultChecked={false}\n          />\n          I am a current high school student or younger.\n        </Label>\n        <Label variant=\"labelHoriz\" sx={{ fontSize: 1, pt: 2 }}>\n          <Checkbox {...useField('stickers', 'checkbox')} />I want a sticker\n          sheet.\n        </Label>\n        <Box\n          sx={{\n            display: (useField('stickers', 'checkbox') as any).checked\n              ? 'block'\n              : 'none'\n          }}\n        >\n          <Slide left delay={20}>\n            <Label mt={2}>\n              Address (line 1)\n              <Input\n                {...useField('address_line_1')}\n                placeholder=\"1 Hacker Way\"\n                sx={{ border: '1px solid', borderColor: 'muted' }}\n              />\n            </Label>\n            <Label mt={2}>\n              Address (zip code)\n              <Input\n                {...useField('address_zip')}\n                placeholder=\"01337\"\n                sx={{ border: '1px solid', borderColor: 'muted' }}\n              />\n            </Label>\n          </Slide>\n        </Box>\n        <Submit\n          status={status}\n          labels={{\n            default: 'Submit',\n            error: 'Something went wrong',\n            success: 'Success!'\n          }}\n        />\n      </form>\n    </>\n  )\n}\n"
  },
  {
    "path": "components/bio.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Icon from '@hackclub/icons'\nimport { useState } from 'react'\nimport { Box, Card, Flex, Text } from 'theme-ui'\n\nexport default function Bio({ popup = true, spanTwo = false, ...props }) {\n  const { name, teamRole, pronouns, text, subrole, email, href, video, img } =\n    props\n  const [expand, setExpand] = useState(false)\n  return (\n    <>\n      <Card\n        bg=\"snow\"\n        p={popup ? [2, 2, 2] : [3, 3, 3]}\n        py={popup ? [3, 3, 3] : [4, 4, 4]}\n        sx={{\n          display: 'flex',\n          alignItems: popup ? 'center' : 'flex-start',\n          transition: 'transform 0.125s ease-in-out',\n          '&:hover': { transform: 'scale(1.025)' },\n          cursor: (text && popup) || href ? 'pointer' : null,\n          textDecoration: 'none',\n          maxWidth: '600px',\n          zIndex: !popup ? 1003 : 5,\n          maxHeight: '90vh',\n          overflowY: 'hidden',\n          overscrollBehavior: 'auto',\n          gridColumn: !spanTwo ? null : [null, null, '1 / span 2'],\n          position: 'relative'\n        }}\n        as={href && !text ? 'a' : 'div'}\n        href={href}\n        target=\"_blank\"\n        onClick={() => {\n          if (text && popup) {\n            setExpand(true)\n          }\n        }}\n      >\n        {img && (\n          <Box\n            as=\"img\"\n            src={img}\n            alt={name}\n            sx={{\n              width: 96,\n              height: 96,\n              minWidth: 96,\n              borderRadius: '50%',\n              objectFit: 'cover',\n              mr: 3\n            }}\n          />\n        )}\n        <Box>\n          <Text sx={{ fontSize: [3, 3, 3] }} variant=\"headline\" color=\"black\">\n            {name}\n          </Text>\n          <Flex>\n            <Text>\n              <Text\n                color=\"#24B5A5\"\n                variant=\"subheadline\"\n                fontSize={2}\n                sx={{\n                  mb: ['0px', '0px', '0px'],\n                  fontSize: '1.1em',\n                  width: 'fit-content'\n                }}\n              >\n                {teamRole}\n              </Text>\n              {subrole && (\n                <>\n                  <br />\n                  <Text\n                    color=\"#24B5A5\"\n                    sx={{\n                      mb: ['0px', '0px', '0px'],\n                      fontSize: 1,\n                      fontWeight: 400,\n                      width: 'fit-content'\n                    }}\n                  >\n                    {subrole}\n                  </Text>\n                </>\n              )}\n              {pronouns && (\n                <Text fontSize={1} ml={1} color=\"muted\" align=\"center\">\n                  ({pronouns})\n                </Text>\n              )}\n            </Text>\n          </Flex>\n          {!popup &&\n            email &&\n            (email.includes('@') ? (\n              <Text color=\"muted\" as={'a'} href={`mailto:${email}`}>\n                {email}\n                <br />\n              </Text>\n            ) : (\n              <Text\n                color=\"muted\"\n                as={'a'}\n                href={`mailto:${email}@hackclub.com`}\n              >\n                {email}@hackclub.com\n                <br />\n              </Text>\n            ))}\n\n          {!popup && (\n            <>\n              <Text mt={2} mb={0} color=\"black\">\n                {text}\n              </Text>\n              {video && (\n                <Flex\n                  sx={{\n                    marginTop: 4,\n                    marginX: 5,\n                    justifyContent: 'center',\n                    aspectRatio: 4 / 3\n                  }}\n                >\n                  <iframe\n                    width=\"100%\"\n                    src={video}\n                    title=\"YouTube video player\"\n                    frameBorder=\"0\"\n                    allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                    allowfullscreen\n                  />\n                </Flex>\n              )}\n            </>\n          )}\n          {!popup && href && (\n            <Flex sx={{ alignItems: 'center' }}>\n              <Text\n                sx={{\n                  transform: 'translateX(-4px) translateY(2px)',\n                  display: 'inline-flex',\n                  alignItems: 'center'\n                }}\n              >\n                <Icon glyph=\"external-fill\" size={24} />\n              </Text>\n              <Text\n                mt={1}\n                mb={0}\n                color=\"black\"\n                as={'a'}\n                target=\"_blank\"\n                href={href}\n                sx={{ transform: 'translateX(-2px)' }}\n              >\n                {href}\n              </Text>\n            </Flex>\n          )}\n        </Box>\n      </Card>\n      {popup && expand && (\n        <Flex\n          sx={{\n            position: 'fixed',\n            zIndex: 1004,\n            top: 0,\n            left: 0,\n            height: '100vh',\n            width: '100vw',\n            alignItems: 'center',\n            justifyContent: 'center',\n            background: 'rgba(0,0,0,0.6)',\n            pb: 4\n          }}\n        >\n          <Bio {...props} popup={false} />\n          <Flex\n            sx={{\n              position: 'fixed',\n              zIndex: 1002,\n              top: 0,\n              left: 0,\n              height: '100vh',\n              width: '100vw',\n              alignItems: 'center',\n              justifyContent: 'center',\n              pb: 4\n            }}\n            onClick={() => setExpand(false)}\n          />\n        </Flex>\n      )}\n    </>\n  )\n}\n"
  },
  {
    "path": "components/boardbio.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Icon from '@hackclub/icons'\nimport { useState } from 'react'\nimport { Avatar, Box, Card, Flex, Text } from 'theme-ui'\n\nexport default function BoardBox({ popup = true, ...props }) {\n  const { img, name, teamRole, pronouns, text, subrole, email, href, video } =\n    props\n  const [expand, setExpand] = useState(false)\n\n  return (\n    <>\n      <Card\n        bg=\"#d9f7ed\"\n        sx={{\n          display: 'flex',\n          flexDirection: popup ? 'column' : 'row',\n          alignItems: popup ? 'center' : 'flex-start',\n          justifyContent: popup ? 'center' : 'flex-start',\n          transition: 'transform 0.125s ease-in-out',\n          '&:hover': { transform: 'scale(1.025)' },\n          cursor: (text && popup) || href ? 'pointer' : null,\n          textDecoration: 'none',\n          maxWidth: popup ? 'auto' : '600px',\n          zIndex: !popup ? 1003 : 5,\n          maxHeight: popup ? 'auto' : '90vh',\n          overflowY: 'hidden',\n          position: 'relative'\n        }}\n        as={href && !text ? 'a' : 'div'}\n        href={href}\n        target=\"_blank\"\n        onClick={() => {\n          if (text && popup) {\n            setExpand(true)\n          }\n        }}\n      >\n        {popup ? (\n          <>\n            <Text\n              variant=\"headline\"\n              sx={{\n                fontSize: subrole ? 3 : 4,\n                textAlign: 'center',\n                mb: subrole ? 0 : 1,\n                mt: subrole ? -3 : -2\n              }}\n              color=\"black\"\n            >\n              {name}\n            </Text>\n            <Text\n              color=\"#24B5A5\"\n              variant=\"subheadline\"\n              sx={{\n                fontSize: subrole ? 1 : 3,\n                textAlign: 'center',\n                mb: subrole ? 0 : 2\n              }}\n            >\n              {teamRole}\n            </Text>\n            {subrole && (\n              <Text\n                color=\"#24B5A5\"\n                sx={{\n                  fontSize: 1,\n                  textAlign: 'center',\n                  mb: 2,\n                  fontWeight: 400\n                }}\n              >\n                {subrole}\n              </Text>\n            )}\n            <Box\n              as=\"img\"\n              src={img}\n              alt={name}\n              sx={{\n                width: '120px',\n                height: '120px',\n                borderRadius: '50%',\n                objectFit: 'cover',\n                mb: subrole ? -3 : -2\n              }}\n            />\n          </>\n        ) : (\n          <>\n            <Avatar\n              size={64}\n              width={64}\n              height={64}\n              mr={3}\n              src={img}\n              alt={name}\n              sx={{\n                overflow: 'hidden',\n                objectFit: 'cover',\n                transition: 'transform 0.125s ease-in-out',\n                '&:hover': { transform: 'rotate(-8deg) scale(1.25)' },\n                flexShrink: 0,\n                width: '64px',\n                height: '64px'\n              }}\n            />\n            <Box>\n              <Text\n                sx={{ fontSize: [3, 3, 3] }}\n                variant=\"headline\"\n                color=\"black\"\n              >\n                {name}\n              </Text>\n              <Flex>\n                <Text>\n                  <Text\n                    color=\"#24B5A5\"\n                    variant=\"subheadline\"\n                    fontSize={2}\n                    sx={{\n                      mb: ['0px', '0px', '0px'],\n                      fontSize: '1.1em',\n                      width: 'fit-content'\n                    }}\n                  >\n                    {teamRole}\n                  </Text>\n                  {subrole && (\n                    <>\n                      <br />\n                      <Text\n                        color=\"#24B5A5\"\n                        sx={{\n                          mb: ['0px', '0px', '0px'],\n                          fontSize: 1,\n                          fontWeight: 400,\n                          width: 'fit-content'\n                        }}\n                      >\n                        {subrole}\n                      </Text>\n                    </>\n                  )}\n                  {pronouns && (\n                    <Text fontSize={1} ml={1} color=\"muted\" align=\"center\">\n                      ({pronouns})\n                    </Text>\n                  )}\n                </Text>\n              </Flex>\n              {email &&\n                (email.includes('@') ? (\n                  <Text color=\"muted\" as={'a'} href={`mailto:${email}`}>\n                    {email}\n                    <br />\n                  </Text>\n                ) : (\n                  <Text\n                    color=\"muted\"\n                    as={'a'}\n                    href={`mailto:${email}@hackclub.com`}\n                  >\n                    {email}@hackclub.com\n                    <br />\n                  </Text>\n                ))}\n              <Text mt={2} mb={0} color=\"black\">\n                {text}\n              </Text>\n              {video && (\n                <Flex\n                  sx={{\n                    marginTop: 4,\n                    marginX: 5,\n                    justifyContent: 'center',\n                    aspectRatio: 4 / 3\n                  }}\n                >\n                  <iframe\n                    width=\"100%\"\n                    src={video}\n                    title=\"YouTube video player\"\n                    frameBorder=\"0\"\n                    allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                    allowFullScreen\n                  />\n                </Flex>\n              )}\n              {href && (\n                <Flex sx={{ alignItems: 'center' }}>\n                  <Text\n                    sx={{\n                      transform: 'translateX(-4px) translateY(2px)',\n                      display: 'inline-flex',\n                      alignItems: 'center'\n                    }}\n                  >\n                    <Icon glyph=\"external-fill\" size={24} />\n                  </Text>\n                  <Text\n                    mt={1}\n                    mb={0}\n                    color=\"black\"\n                    as={'a'}\n                    target=\"_blank\"\n                    href={href}\n                    sx={{ transform: 'translateX(-2px)' }}\n                  >\n                    {href}\n                  </Text>\n                </Flex>\n              )}\n            </Box>\n          </>\n        )}\n      </Card>\n      {popup && expand && (\n        <Flex\n          sx={{\n            position: 'fixed',\n            zIndex: 1004,\n            top: 0,\n            left: 0,\n            height: '100vh',\n            width: '100vw',\n            alignItems: 'center',\n            justifyContent: 'center',\n            background: 'rgba(0,0,0,0.6)',\n            pb: 4\n          }}\n        >\n          <BoardBox {...props} popup={false} />\n          <Flex\n            sx={{\n              position: 'fixed',\n              zIndex: 1002,\n              top: 0,\n              left: 0,\n              height: '100vh',\n              width: '100vw',\n              alignItems: 'center',\n              justifyContent: 'center',\n              pb: 4\n            }}\n            onClick={() => setExpand(false)}\n          />\n        </Flex>\n      )}\n    </>\n  )\n}\n"
  },
  {
    "path": "components/color-switcher.tsx",
    "content": "import { IconButton, useColorMode } from 'theme-ui'\n\nconst ColorSwitcher = props => {\n  const [mode, setMode] = useColorMode()\n  return (\n    <IconButton\n      onClick={() => setMode(mode === 'dark' ? 'light' : 'dark')}\n      title={`Switch to ${mode === 'dark' ? 'light' : 'dark'} mode`}\n      sx={{\n        position: 'absolute',\n        top: [2, 3],\n        right: [2, 3],\n        color: 'primary',\n        cursor: 'pointer',\n        borderRadius: 'circle',\n        transition: 'box-shadow .125s ease-in-out',\n        ':hover,:focus': {\n          boxShadow: '0 0 0 3px',\n          outline: 'none'\n        }\n      }}\n      {...props}\n    >\n      <svg viewBox=\"0 0 32 32\" width={24} height={24} fill=\"currentcolor\">\n        <circle\n          cx={16}\n          cy={16}\n          r={14}\n          fill=\"none\"\n          stroke=\"currentcolor\"\n          strokeWidth={4}\n        />\n        <path d=\"M 16 0 A 16 16 0 0 0 16 32 z\" />\n      </svg>\n    </IconButton>\n  )\n}\n\nexport default ColorSwitcher\n"
  },
  {
    "path": "components/comma.ts",
    "content": "export default function Comma({ children }) {\n  return children\n    ? children.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n    : ''\n}\n"
  },
  {
    "path": "components/directoryModal.tsx",
    "content": "/** @jsxImportSource theme-ui */\n\nexport const badges = [\n  {\n    label: 'Transparent',\n    id: 'Transparent',\n    tooltip: 'Transparent',\n    color: 'purple',\n    icon: 'explore',\n    match: org => org.isTransparent\n  }\n]\n\nexport function getBadgesForOrg(org: { [key: string]: any }): typeof badges {\n  return badges.filter(badge => badge.match?.(org))\n}\n\nimport { Badge as ThemeBadge, Box, Flex } from 'theme-ui'\nimport { Text, Button, Card } from 'theme-ui'\nimport Icon from '@hackclub/icons'\nimport Image from 'next/image'\n\ntype OrganizationModalProps = {\n  organization: {\n    name: string\n    location: {\n      country: string\n    }\n    branding: {\n      backgroundImage: string\n      logo?: string\n      description?: string\n    }\n    links: {\n      website?: string\n      financials?: string\n      donations: string\n    }\n    raw: {\n      transparent?: boolean\n    }\n  }\n  onClose: () => void\n}\nexport function OrganizationModal({\n  organization,\n  onClose\n}: OrganizationModalProps) {\n  return (\n    <Box\n      sx={{\n        position: 'fixed',\n        top: '0px',\n        left: '0px',\n        right: '0px',\n        bottom: '0px',\n        zIndex: 1000,\n        display: 'flex',\n        justifyContent: 'center',\n        alignItems: 'center',\n        bg: '#00000044'\n      }}\n      onClick={onClose}\n    >\n      <Card\n        sx={{\n          width: 'min(640px, 90%)',\n          bg: 'elevated',\n          borderRadius: '10px',\n          position: 'relative',\n          display: 'flex',\n          boxSizing: 'border-box',\n          flexDirection: 'column',\n          maxHeight: '90vh',\n          overflowY: 'scroll'\n        }}\n        onClick={e => {\n          e.stopPropagation()\n        }}\n      >\n        <Flex\n          sx={{\n            position: 'absolute',\n            top: '10px',\n            right: '10px',\n            width: '40px',\n            height: '40px',\n            bg: 'smoke',\n            borderRadius: '50%',\n            justifyContent: 'center',\n            alignItems: 'center',\n            cursor: 'pointer'\n          }}\n        >\n          <Icon glyph=\"view-close\" size={32} onClick={onClose} />\n        </Flex>\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'stretch',\n            gap: 3\n          }}\n        >\n          <Flex\n            sx={{\n              flexDirection: 'column',\n              justifyContent: 'end',\n              minHeight: '200px',\n              m: -4,\n              p: '24px',\n              boxSizing: 'content-box',\n              backgroundPosition: 'center center',\n              color: 'white',\n              backgroundRepeat: 'no-repeat',\n              backgroundSize: 'cover',\n              backgroundImage: `url('${organization.branding.backgroundImage}')`\n            }}\n          >\n            <Flex\n              sx={{\n                flexDirection: ['column', 'row', 'row'],\n                alignItems: 'center',\n                justifyContent: 'start',\n                gap: '24px'\n              }}\n            >\n              {organization.branding.logo && (\n                <Image\n                  alt={`${organization.name}'s logo`}\n                  src={organization.branding.logo}\n                  width={128}\n                  height={128}\n                  sx={{\n                    width: 'auto',\n                    height: '96px',\n                    borderRadius: '8px'\n                  }}\n                />\n              )}\n              <Flex\n                sx={{\n                  flexDirection: 'column'\n                }}\n              >\n                <Text\n                  variant=\"title\"\n                  sx={{\n                    wordBreak: 'break-word',\n                    marginBottom: '12px',\n                    textAlign: ['center', 'left', 'left'],\n                    fontSize: ['36px', '36px', '36px'],\n                    color: 'white',\n                    textShadow: '0px 10px 10px rgba(0, 0, 0, 0.25)'\n                  }}\n                >\n                  {organization.name}\n                </Text>\n                <Text\n                  variant=\"subheadline\"\n                  sx={{\n                    whiteSpace: 'nowrap',\n                    textAlign: ['center', 'left', 'left'],\n                    color: 'white',\n                    textShadow: '0px 10px 10px rgba(0, 0, 0, 0.25)',\n                    marginBottom: '0px'\n                  }}\n                >\n                  {organization.location.country}\n                </Text>\n              </Flex>\n            </Flex>\n          </Flex>\n\n          {/* Badges */}\n          <Flex\n            sx={{\n              flexDirection: 'row',\n              justifyContent: ['center', 'start', 'start'],\n              alignItems: 'center',\n              gap: 2,\n              width: '100%',\n              mt: '40px',\n              mb: -2,\n              flexWrap: 'wrap'\n            }}\n          >\n            {/* hardcoded \"nonprofit\" badge */}\n            <ThemeBadge\n              as=\"span\"\n              aria-label=\"Nonprofit\"\n              sx={{\n                bg: 'blue',\n                color: 'snow',\n                fontSize: '20px',\n                textShadow: 'none',\n                borderRadius: '15px',\n                px: 2,\n                display: 'block'\n              }}\n            >\n              Nonprofit\n            </ThemeBadge>\n\n            {organization.raw.transparent && (\n              <ThemeBadge\n                as=\"span\"\n                aria-label=\"Transparent\"\n                sx={{\n                  bg: 'purple',\n                  color: 'snow',\n                  fontSize: '20px',\n                  textShadow: 'none',\n                  borderRadius: '15px',\n                  px: 2,\n                  display: 'block'\n                }}\n              >\n                Transparent\n              </ThemeBadge>\n            )}\n          </Flex>\n\n          <Flex\n            sx={{\n              flexDirection: 'row',\n              alignItems: 'start',\n              gap: 4,\n              width: '100%'\n            }}\n          >\n            {/* info & buttons */}\n            <Flex\n              sx={{\n                flexDirection: 'column',\n                alignItems: 'start',\n                flex: '1'\n              }}\n            >\n              {organization.branding.description && (\n                <Text variant=\"lead\" style={{ fontSize: '22px' }}>\n                  {organization.branding.description}\n                </Text>\n              )}\n\n              <Flex\n                sx={{\n                  flexDirection: 'column',\n                  alignItems: 'start',\n                  my: 2,\n                  ml: -1,\n                  gap: 1\n                }}\n              >\n                {organization.links.website && (\n                  <Flex\n                    as=\"a\"\n                    target=\"_blank\"\n                    href={organization.links.website}\n                    sx={{\n                      flexDirection: 'row',\n                      justifyContent: 'start',\n                      alignItems: 'center',\n                      color: 'slate',\n                      textDecoration: 'none'\n                    }}\n                  >\n                    <Icon glyph=\"web\" size={38} />\n                    <Text style={{ fontSize: '20px', marginLeft: '6px' }}>\n                      Website\n                    </Text>\n                    <Icon\n                      glyph=\"external\"\n                      size={20}\n                      style={{ marginLeft: '2px', marginBottom: '6px' }}\n                    />\n                  </Flex>\n                )}\n                {organization.links.financials && (\n                  <Flex\n                    as=\"a\"\n                    target=\"_blank\"\n                    href={organization.links.financials}\n                    sx={{\n                      flexDirection: 'row',\n                      justifyContent: 'start',\n                      alignItems: 'center',\n                      color: 'slate',\n                      textDecoration: 'none'\n                    }}\n                  >\n                    <Icon glyph=\"explore\" size={38} />\n                    <Text style={{ fontSize: '20px', marginLeft: '6px' }}>\n                      Transparent Finances\n                    </Text>\n                    <Icon\n                      glyph=\"external\"\n                      size={20}\n                      style={{ marginLeft: '2px', marginBottom: '6px' }}\n                    />\n                  </Flex>\n                )}\n              </Flex>\n            </Flex>\n          </Flex>\n\n          <Flex\n            sx={{\n              flexDirection: 'row',\n              width: '100%',\n              justifyContent: 'space-between',\n              alignItems: 'center'\n            }}\n          >\n            <Text sx={{ display: ['none', 'none', 'block'] }}>\n              All donations are tax-deductible.\n            </Text>\n\n            <Button\n              as=\"a\"\n              variant=\"lg\"\n              href={organization.links.donations}\n              target=\"_blank\"\n              sx={{\n                backgroundImage: t => t.util.gx('green', 'blue'),\n                width: ['100%', 'auto', 'auto']\n              }}\n            >\n              <Flex\n                sx={{\n                  flexDirection: 'row',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                  width: '24px',\n                  height: '24px',\n                  marginLeft: -1,\n                  marginRight: 2\n                }}\n              >\n                <Icon glyph=\"friend\" size={20} style={{ scale: '2.5' }} />\n              </Flex>\n              Make a Donation\n            </Button>\n          </Flex>\n        </Flex>\n      </Card>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/donate/donors.json",
    "content": "{\n  \"1517\": \"http://www.1517fund.com/\",\n  \"Aakash Adesara\": null,\n  \"Abby Fischler\": null,\n  \"Achal Srinivasan\": null,\n  \"Adora Svitak\": null,\n  \"Adrienne Tran\": null,\n  \"Alex Koren\": \"https://twitter.com/alexekoren\",\n  \"Alex Peña\": \"http://www.alexaaronpena.com/home.html\",\n  \"Alexander Turin\": null,\n  \"Alishaan Ali\": \"https://alishaan.io\",\n  \"Allyson Dias\": \"https://twitter.com/AllysonDias\",\n  \"Amanda Mae-an Wofford\": null,\n  \"Amanda Southworth\": \"https://twitter.com/amndasuthwrth\",\n  \"Amogh Chaubey\": \"https://amogh.sh\",\n  \"Amritha Jayanti\": null,\n  \"Amy Sorto\": null,\n  \"Andrew Breckenridge\": \"https://github.com/AndrewSB\",\n  \"Andrew Downing\": null,\n  \"Andrew Ninh\": null,\n  \"Andrew Zoerb\": null,\n  \"Andy Haden\": \"https://github.com/andyh2\",\n  \"Angus Jyu\": null,\n  \"Ankit Ranjan\": \"http://www.ankit.io/\",\n  \"Ankit Shah\": \"https://twitter.com/AnkitShah\",\n  \"Ann Mazuk\": null,\n  \"Arjun Dileep\": null,\n  \"Asta Lasf\": null,\n  \"Athul Blesson\": \"https://www.linkedin.com/in/athul-blesson-92ab3b115/\",\n  \"Avi Romanoff\": null,\n  \"Ben Yu\": \"https://twitter.com/intenex\",\n  \"Beyang Liu\": \"https://www.linkedin.com/in/beyang-liu-07651227\",\n  \"Bhargav Yadavalli\": \"https://www.linkedin.com/in/bhargavy/\",\n  \"Bigglesworth Family Foundation\": \"https://www.bigglesworthff.org/\",\n  \"Brayden McLean\": null,\n  \"Brett Neese\": null,\n  \"Brian Nguyen\": null,\n  \"Cayce Beames\": null,\n  \"Chaleb Pommells\": null,\n  \"Changbai Li\": \"https://changbai.li/\",\n  \"Chaoyi Zha\": null,\n  \"Chris Van Pelt\": \"https://twitter.com/vanpelt\",\n  \"Chris Walker\": \"https://twitter.com/EnDimensions\",\n  \"Christian Zenaty\": null,\n  \"Christina Kim\": null,\n  \"Christina Lewis Halpern\": null,\n  \"Clara Tsao\": null,\n  \"Connie Liu\": null,\n  \"Daniel Sinclair\": null,\n  \"David C Farnan-Williams\": null,\n  \"Dennis Ashendorf\": null,\n  \"Dhruv Maheshwari\": null,\n  \"Doris Capet\": null,\n  \"Edward Jiang\": null,\n  \"Elon Musk\": \"https://en.wikipedia.org/wiki/Elon_Musk\",\n  \"Emily Pries\": null,\n  \"Emily Tseng\": null,\n  \"Erik Batista\": null,\n  \"Ethan Resnick\": null,\n  \"Evan Shui\": null,\n  \"Fast Forward\": \"https://www.ffwd.org/\",\n  \"Fern Ray\": null,\n  \"Ferran Arricivita\": null,\n  \"Fiona Carty\": \"https://dribbble.com/nonafiona\",\n  \"Garrett Wesley\": null,\n  \"Gautam Bhargava\": null,\n  \"Gautam Mittal\": null,\n  \"Gemma Busoni\": \"https://twitter.com/gemmabusoni\",\n  \"Geoff Ralston\": null,\n  \"Gisela Kottmeier\": null,\n  \"Google.org\": \"https://www.google.org/\",\n  \"Gordon Smith\": null,\n  \"Guilherme de Souza\": null,\n  \"Hallie Lomax\": \"http://lomax.ninja/\",\n  \"Hamza bnr Bellucci\": null,\n  \"Hortensia Gomez-tirella\": null,\n  \"Ishaan Parikh\": null,\n  \"Jack Chak\": null,\n  \"Jackcheal Dang\": null,\n  \"Jacob Haap\": \"https://jacobhaap.com\",\n  \"Jake Brownson\": null,\n  \"Jamsheed Mistri\": null,\n  \"Jason Marmon\": null,\n  \"Jay Freeman\": \"http://www.saurik.com/\",\n  \"Jeff Hilnbrand\": null,\n  \"Jeffrey Owens\": null,\n  \"Jennifer Kakuske\": null,\n  \"Jevin Sidhu\": null,\n  \"Jim Latta\": null,\n  \"Joe Lonsdale\": null,\n  \"Joseph Douglas\": \"https://twitter.com/JosephRDouglas\",\n  \"Josh & Michelle Weatherspoon\": null,\n  \"Julie Latta\": null,\n  \"Junius Sim\": \"https://www.linkedin.com/in/juniussim/\",\n  \"Justin Brezhnev\": null,\n  \"Justin Harris\": \"https://envisionwithjustin.com/\",\n  \"Kartik Talwar\": null,\n  \"Katie Latta\": null,\n  \"Keala Lusk\": \"http://kea.la/\",\n  \"Kelly Peng\": null,\n  \"Kevin Chu\": null,\n  \"Kevin Conner\": null,\n  \"Kevin Wang\": \"https://twitter.com/kevinverse\",\n  \"Kunal Batra\": null,\n  \"Kyle Emile\": null,\n  \"Lachlan Campbell\": \"https://lachlanjc.com\",\n  \"LạiDuy\": null,\n  \"Lan Paje\": \"https://twitter.com/lanpaje\",\n  \"Larry Weiss\": null,\n  \"Lia Stanciu Gregory\": null,\n  \"Liam Horne\": \"https://twitter.com/liamihorne\",\n  \"Mackenzie Burnett\": null,\n  \"Maria Choi\": null,\n  \"Mark Prideaux\": null,\n  \"Matthew Stanciu\": \"https://matthewstanciu.me\",\n  \"Megan Cui\": \"https://megancui.com/\",\n  \"Michael Akilian\": null,\n  \"Michael Copley\": null,\n  \"Michael Hulet\": null,\n  \"Michael Yoo\": null,\n  \"Michelle Leveille\": null,\n  \"Mick Donahue\": null,\n  \"Mike Swift\": \"https://twitter.com/swiftalphaone\",\n  \"Mingjie Jiang\": \"https://mingjie.info\",\n  \"Mohit Bhatia\": \"https://github.com/mohitbhatia1994\",\n  \"Myles Byrne\": \"https://twitter.com/quackingduck\",\n  \"Nate Wienert\": \"https://github.com/natew\",\n  \"Nelson Gomez\": null,\n  \"Nick Quinlan\": null,\n  \"Nikhil Srinivasan\": null,\n  \"Oliver Belanger\": null,\n  \"Patrick Pistor\": \"https://github.com/yogert96\",\n  \"Paul Cichocki\": null,\n  \"Phat Le\": \"https://www.phatle.com/\",\n  \"Phil Hedayatnia\": \"http://www.hedayatnia.com/\",\n  \"Polly Schneider\": null,\n  \"Prisma Data, Inc.\": \"https://prismic.io/\",\n  \"Quinn Slack\": \"https://qslack.com/\",\n  \"Rashid Al-Abri\": null,\n  \"Reid Workman\": null,\n  \"Robert Gregory\": null,\n  \"Rohith Varanasi\": null,\n  \"Rush Wofford\": null,\n  \"Ryan Orbuch\": \"https://twitter.com/orbuch\",\n  \"Saharsh Yeruva\": \"https://saharsh.tech\",\n  \"Samay Shamdasani\": \"https://shamdasani.org/\",\n  \"Samuel Escapa\": \"https://github.com/saescapa\",\n  \"Santiago Siri\": \"https://twitter.com/santisiri\",\n  \"Scott Chow\": null,\n  \"Scott Motte\": \"https://www.scottmotte.com/\",\n  \"Sean Kim\": null,\n  \"Selynna Sun\": \"https://www.selynnasun.com/\",\n  \"Shariq Hashme\": \"https://shar.iq/\",\n  \"Sheryl Kern-Jones\": null,\n  \"Shrav Mehta\": null,\n  \"Shriya Nevatia\": null,\n  \"Shriyash Jalukar\": \"https://www.linkedin.com/in/shriyashjalukar/\",\n  \"Siddhartha Desai\": null,\n  \"Sina Hamedian\": null,\n  \"Sourcegraph\": \"https://sourcegraph.com/\",\n  \"Spencer Yen\": null,\n  \"Stephanie He\": null,\n  \"Steven Duong\": null,\n  \"Tanya Latta\": null,\n  \"Taylor Otwell\": null,\n  \"Tejas Manohar\": \"https://tejas.io/\",\n  \"The Reva & David Logan Foundation\": \"http://www.loganfdn.org/\",\n  \"The Thiel Fellowship\": \"http://thielfellowship.org/\",\n  \"Thiel Foundation\": \"http://www.thielfoundation.org/\",\n  \"Tiffany Yin\": null,\n  \"Tom Preston-Werner\": \"http://tom.preston-werner.com/\",\n  \"Truman Chan\": null,\n  \"Tyler Hilliard\": null,\n  \"Victor Truong\": \"https://victortruong.net\",\n  \"Waj Waj\": null,\n  \"Will Gaybrick\": null,\n  \"William Wold\": null,\n  \"Xavier Shay\": \"https://xaviershay.com/\",\n  \"Yacoub Oulad Daoud\": null,\n  \"Yev Barkalov\": \"http://www.yev.sh/\",\n  \"Zach Holman\": \"https://zachholman.com/\",\n  \"Zane Davis-Barrs\": \"https://zane.sh/\",\n  \"Zane Sindhu\": null\n}\n"
  },
  {
    "path": "components/donate/sponsors.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport styled from '@emotion/styled'\nimport { Box, Image, Link } from 'theme-ui'\n\nconst Base = styled(Box)`\n  display: grid;\n  grid-gap: 18px;\n  grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));\n  align-items: center;\n  justify-content: center;\n  img {\n    margin: auto;\n    max-width: 12rem;\n  }\n`\n\nconst Sponsor = ({ name, href, img, ...props }) => (\n  <Link href={href || `https://${name.toLowerCase()}.com`} target=\"_blank\">\n    <Image\n      src={`/inkind_logos/${img || name.toLowerCase() + '.svg'}`}\n      alt={name}\n      {...props}\n    />\n  </Link>\n)\n\nconst Sponsors = props => (\n  <Base maxWidth={48} {...props}>\n    {[\n      'Vercel',\n      'Slack',\n      'Netlify',\n      'FullStory',\n      'BrowserStack',\n      'Stripe',\n      'Segment',\n      'Bugsnag',\n      'Google',\n      'Dialpad'\n    ].map(name => (\n      <Sponsor name={name} key={name} />\n    ))}\n    <Sponsor name=\"Checkly\" href=\"https://checklyhq.com\" img=\"checkly.svg\" />\n    <Sponsor\n      name=\"Fast Forward\"\n      href=\"https://ffwd.org\"\n      img=\"fastforward.png\"\n    />\n    <Sponsor\n      name=\"Intercom\"\n      href=\"https://www.intercom.com\"\n      img=\"intercom.png\"\n    />\n  </Base>\n)\n\nexport default Sponsors\n"
  },
  {
    "path": "components/dot.tsx",
    "content": "import { Text } from 'theme-ui'\nimport { keyframes } from '@emotion/react'\n\nconst flashing = keyframes({\n  from: { opacity: 0 },\n  '50%': { opacity: 1 },\n  to: { opacity: 0 }\n})\n\nexport default function Dot({ hideOnMobile }) {\n  return (\n    <Text\n      sx={{\n        bg: 'green',\n        color: 'white',\n        borderRadius: 'circle',\n        lineHeight: 0,\n        width: '.4em',\n        height: '.4em',\n        marginRight: '.4em',\n        marginBottom: '.12em',\n        animationName: `${flashing}`,\n        animationDuration: '3s',\n        animationTimingFunction: 'ease-in-out',\n        animationIterationCount: 'infinite',\n        display: hideOnMobile ? ['none', 'default'] : 'default'\n      }}\n    />\n  )\n}\n"
  },
  {
    "path": "components/elon.mdx",
    "content": "Elon Musk holds a special place amongst hackers. After growing up in a difficult\nfamily situation in South Africa, working his way in small jobs until reaching\nLos Angeles, teaching himself to code, and making hundreds of millions\nco-founding PayPal, he kept on building.\n\nIt was a huge honor last month to have Elon [spend an hour in a Hack Club\nAMA](https://youtu.be/riru9OzScwk)—at one point he remarked we were “asking\nbetter questions than all the mainstream media.”\n\nAfterwards, Elon wanted to support Hack Club further.\n\n# Today, I’m proud to share: Elon&nbsp;Musk is donating $500,000 to&nbsp;Hack&nbsp;Club.\n\nIn so many ways, this is a milestone for every Hack Clubber. 6 years ago, I\nstarted Hack Club as a 16-year-old programmer living on my own, scraping by,\nbarely able to make rent. Now Elon Musk is one of our largest supporters.\n\nElon is supporting us because we are a community of builders. When hackers see\nproblems in the world, we don’t blame someone else: we try to take them on\nourselves to solve. Elon is very selective about the nonprofits he supports and\nI’m proud Hack Club is one of them.\n\nSo…how is Hack Club going to invest $500k? We want to use this to help 1000 more\nstudents start and join Hack Clubs in their communities. For those already in\nHack Clubs, we look to you to help us make a more high-quality experience. We’re\na lot of what we’ve already been doing (and [what I wrote about at the beginning\nof the year](https://zachinto2020.wordpress.com/2019/12/31/as-midnight-approaches/)):\nwe’ll spend as little money as possible at all times, and we’ll hire a small\nnumber of diverse staff from video game engineers to media producers to make\nHack Club better. We are pushing hard now to expand users of [HCB](https://hackclub.com/fiscal-sponsorship/),\nand continuing to try and make the Hack Club Slack the best place to be a teenager on the intenet.\n\nWe’ll have a proper announcement in a few weeks, but one thing we’re doing after\nwinning the [Frank Grant](https://grant.frank.ly/) and now receiving Elon’s\ngift, is open sourcing our finances. Hack Club HQ has been running on HCB\nsince February and starting today, you can see our account publicly at\nhttps://hcb.hackclub.com/hq. You can track how we spend every single dollar of\nElon’s gift. Soon, we will also launch https://frank.ly/ on Hack&nbsp;Club’s\nwebsite.\n\nHack Club’s mission is to build a new generation of hackers. This starts in high\nschool, where Hack Club students learn to be technically proficient, build their\nfriend network, learn to raise and spend money, and develop into kind, curious,\nthoughtful, optimistic, and honest leaders.\n\nElon Musk is now supporting you and your work, so go out and do amazing things.\nElon can’t wait to see what you make.\n\n—Zach\n"
  },
  {
    "path": "components/fade-in.tsx",
    "content": "import React from 'react'\nimport { Box } from 'theme-ui'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\n\nconst fadeIn = keyframes({ from: { opacity: 0 }, to: { opacity: 1 } })\n\nconst Wrapper = styled(Box)`\n  @media (prefers-reduced-motion: no-preference) {\n    animation-name: ${fadeIn};\n    animation-fill-mode: backwards;\n  }\n`\n\nconst FadeIn = ({ duration = 300, delay = 0, ...props }) => (\n  <Wrapper\n    {...props}\n    style={{\n      ...(props.style || {}),\n      animationDuration: duration + 'ms',\n      animationDelay: delay + 'ms'\n    }}\n  />\n)\n\nexport default FadeIn\n"
  },
  {
    "path": "components/fiscal-sponsorship/contact.tsx",
    "content": "import Icon from '../icon'\nimport { Flex, Link, Text } from 'theme-ui'\n\nconst phoneNumber = '+1 (844) 237-2290'\nconst phoneNumberUri = '+1-844-237-2290'\nconst email = 'hcb@hackclub.com'\n\nexport default function ContactBanner({ sx }) {\n  return (\n    <Flex\n      sx={{\n        display: ['none', 'flex'],\n        bg: 'sunken',\n        color: 'slate',\n        alignItems: 'center',\n        p: 3,\n        gap: [3, 2],\n        ...sx\n      }}\n    >\n      <Icon\n        glyph=\"message\"\n        sx={{ color: 'inherit', flexShrink: 0, my: -1 }}\n        aria-hidden\n      />\n      <Text\n        sx={{\n          textWrap: 'balance',\n          a: { color: 'inherit', mx: '0.125em', whiteSpace: 'nowrap' }\n        }}\n      >\n        Questions? Email <Link href={`mailto:${email}`}>{email}</Link>{' '}\n        or&nbsp;call <Link href={`tel:${phoneNumberUri}`}>{phoneNumber}</Link>\n      </Text>\n    </Flex>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/directory/card.tsx",
    "content": "import { Card, Badge as ThemeBadge, Box, Heading, Text, Image } from 'theme-ui'\nimport { Organization } from '../../../lib/organization'\nimport Tilt from '../../tilt'\nimport Icon from '@hackclub/icons'\nimport Tooltip from '../tooltip'\n\nexport const Badge = ({ badge }) =>\n  badge.image ? (\n    <ThemeBadge\n      as=\"span\"\n      sx={{\n        backgroundImage: `url(\"${badge.image}\")`,\n        backgroundSize: 'contain',\n        backgroundColor: 'unset',\n        backgroundRepeat: 'no-repeat',\n        backgroundPosition: 'center',\n        fontSize: 'inherit',\n        textShadow: 'none',\n        borderRadius: 5,\n        display: 'block',\n        height: 30,\n        width: 38\n      }}\n    >\n      <span style={{ opacity: '0' }}>.</span>\n    </ThemeBadge>\n  ) : (\n    <ThemeBadge\n      as=\"span\"\n      sx={{\n        bg: badge.color,\n        color: 'snow',\n        fontSize: 'inherit',\n        textShadow: 'none',\n        borderRadius: 5,\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center'\n      }}\n    >\n      <Icon glyph={badge.icon} size={30} />\n    </ThemeBadge>\n  )\n\ntype OrganizationCardProps = {\n  organization: Organization\n  openModal: (organization: Organization) => void\n  badges: any[]\n}\n\n/**\n *\n * @param {{\n * organization: Organization,\n * showTags: boolean\n * }} props\n * @returns\n */\nexport const OrganizationCard = ({\n  openModal,\n  badges,\n  organization\n}: OrganizationCardProps) => (\n  <Tilt>\n    <Card\n      onClick={() => openModal(organization)}\n      rel=\"noopener noreferrer\"\n      itemScope\n      itemType=\"http://schema.org/Event\"\n      variant=\"event\"\n      sx={{\n        justifyContent: 'center',\n        alignItems: 'center',\n        minHeight: 128,\n        color: 'white',\n        cursor: 'pointer',\n        textShadow: '0 1px 4px rgba(0, 0, 0, 0.375)',\n        textDecoration: 'none',\n        backgroundColor: 'black',\n        backgroundSize: 'cover',\n        backgroundPosition: 'center',\n        backgroundRepeat: 'no-repeat',\n        borderRadius: 'extra',\n        overflow: 'hidden',\n        position: 'relative',\n        p: 3,\n        height: '100%',\n        display: 'flex',\n        px: 3,\n        backgroundImage: `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,0.375) 75%), url('${organization.branding.backgroundImage}')`,\n        textAlign: 'center',\n        flexDirection: 'column'\n      }}\n    >\n      <Box\n        sx={{\n          display: 'flex',\n          justifyContent: 'end',\n          alignItems: 'center',\n          width: '100%',\n          gap: 2,\n          flexDirection: 'row',\n          mb: 3\n        }}\n      >\n        {badges.map((badge, i) => (\n          <Tooltip.W key={i} text={badge.label} id={badge.id}>\n            <span className={`tooltipped-${badge.id}`}>\n              <Badge badge={badge} />\n            </span>\n          </Tooltip.W>\n        ))}\n      </Box>\n\n      {organization.branding.logo && (\n        <Image\n          src={organization.branding.logo}\n          alt={`${organization.name} logo`}\n          loading=\"lazy\"\n          sx={{\n            // minWidth: 64,\n            height: 64,\n            objectFit: 'contain',\n            objectPosition: 'left',\n            borderRadius: 'default',\n            mt: 'auto'\n          }}\n        />\n      )}\n      <Heading\n        as={'h3'}\n        itemProp=\"name\"\n        sx={{\n          fontSize: [3, 4],\n          mt: 2,\n          mb: 3,\n          overflowWrap: 'anywhere',\n          width: '100%',\n          display: 'block'\n        }}\n      >\n        {organization.name}\n      </Heading>\n      <Box\n        as=\"footer\"\n        sx={{\n          mt: 'auto',\n          mb: 0,\n          width: '100%',\n          opacity: 0.875,\n          textTransform: 'none'\n        }}\n      >\n        <>\n          <Text\n            as=\"span\"\n            itemProp=\"location\"\n            itemScope\n            itemType=\"http://schema.org/Place\"\n          >\n            <span itemProp=\"address\">\n              {organization.raw.location.continent}\n            </span>\n          </Text>\n        </>\n      </Box>\n      <Box sx={{ display: 'none' }}>\n        <span itemProp=\"url\">{organization.links.website}</span>\n      </Box>\n    </Card>\n  </Tilt>\n)\n\nexport default OrganizationCard\n"
  },
  {
    "path": "components/fiscal-sponsorship/features.tsx",
    "content": "import { Box, Heading, Link, Text, Container, Grid } from 'theme-ui'\nimport Icon from '../icon'\nimport { Balancer } from 'react-wrap-balancer'\nimport Image from 'next/image'\nimport imgLaptop from '../../public/fiscal-sponsorship/laptop.png'\n\nexport default function Features() {\n  return (\n    <Box sx={{ pt: 5, pb: [5, 6] }}>\n      <Container>\n        <Heading as=\"h2\" variant=\"title\" sx={{ mb: 3, maxWidth: 'copyUltra' }}>\n          <Balancer>\n            Powerful financial tools built by our nonprofit, for yours.\n          </Balancer>\n        </Heading>\n        <Text as=\"p\" variant=\"lead\" sx={{ color: 'slate', maxWidth: '55ch' }}>\n          Since day one, we’ve built beautiful, self-serve software to empower\n          you to raise and spend money without administrative hassle. We’re also\n          open&nbsp;source!\n        </Text>\n        <Grid columns={[null, 2, 3]} sx={{ mt: 4, rowGap: 3, columnGap: 4 }}>\n          <Module\n            icon=\"bank-account\"\n            name=\"Receive foundation grants\"\n            body=\"with tax-deductible 501(c)(3) status.\"\n          />\n          {/* Send money & reimburse via check, ACH, bank wire, & more.\n              Operate globally with a US Entity.\n              Issue physical & virtual debit cards to your team.\n              Get 24 hour support on weekdays.\n              Pay team members with built-in payroll.\n              Embed a custom donation form on your website.\n              We file all your taxes automatically, including Form 990. \" */}\n          <Module\n            icon=\"card\"\n            name=\"Issue physical & virtual debit cards\"\n            body=\"with receipt tracking & Apple Pay.\"\n          />\n          <Module\n            icon=\"web\"\n            name=\"Operate globally\"\n            body=\"with a U.S. legal entity.\"\n          />\n          <Module\n            icon=\"payment-transfer\"\n            name=\"Send money & reimburse\"\n            body=\"via check, ACH, bank wire, & more.\"\n          />\n          <Module\n            icon=\"explore\"\n            name=\"Make your finances transparent\"\n            body=\"to your team and optionally, public.\"\n          />\n          <Module\n            icon=\"docs\"\n            name=\"We file all your taxes\"\n            body=\"automatically, including Form 990.\"\n          />\n          <Module\n            icon=\"admin\"\n            name=\"Pay team members\"\n            body=\"with built-in payroll.\"\n          />\n          <Module\n            icon=\"support\"\n            name=\"Accept donations of any size\"\n            body=\"with a custom, embeddable online form.\"\n          />\n          <Module\n            icon=\"leader\"\n            name=\"Get 24-hour support\"\n            body=\"on weekdays with a dedicated point of contact.\"\n          />\n        </Grid>\n      </Container>\n      <Container variant=\"copy\" sx={{ mt: [4, 5] }}>\n        <Laptop\n          href=\"https://hcb.hackclub.com/reboot\"\n          title=\"See Reboot’s finances in public\"\n        />\n        <Link\n          href=\"https://github.com/hackclub/hcb\"\n          title=\"Open Source\"\n          sx={{ textAlign: 'center' }}\n        >\n          <Text variant=\"caption\" as=\"p\" sx={{ color: 'primary', mt: 2 }}>\n            See our open source on GitHub\n          </Text>\n        </Link>\n      </Container>\n    </Box>\n  )\n}\n\nfunction Module({ icon, name, body }) {\n  return (\n    <Box\n      sx={{\n        display: 'flex',\n        alignItems: 'start',\n        columnGap: 3\n      }}\n    >\n      <Box\n        sx={{\n          flexShrink: 0,\n          width: 40,\n          height: 40,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center'\n        }}\n      >\n        <Icon\n          size={40}\n          glyph={icon}\n          sx={{\n            color: 'primary',\n            flexShrink: 0,\n            display: 'block',\n            width: 40,\n            height: 40\n          }}\n        />\n      </Box>\n      <Text\n        as=\"p\"\n        sx={{\n          color: 'slate',\n          lineHeight: '1.375',\n          fontSize: 20,\n          m: 0\n        }}\n      >\n        <Balancer>\n          <Text as=\"strong\" color=\"slate\">\n            {name}\n          </Text>{' '}\n          {body}\n        </Balancer>\n      </Text>\n    </Box>\n  )\n}\n\nfunction Laptop({ href, title }) {\n  return (\n    <Link href={href} title={title} sx={{ textAlign: 'center' }}>\n      <Image\n        src={imgLaptop}\n        alt=\"Laptop\"\n        unoptimized\n        style={{\n          width: '100%',\n          maxWidth: '100%',\n          height: 'auto'\n        }}\n      />\n      <Text variant=\"caption\" as=\"p\" sx={{ color: 'primary', mt: 2 }}>\n        See <i>Reboot</i>’s finances in Transparency Mode\n      </Text>\n    </Link>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/first/apply-button.tsx",
    "content": "import { Button, Text, Flex } from 'theme-ui'\nimport Icon from '../../icon'\nimport Link from 'next/link'\n\nexport default function ApplyButton() {\n  return (\n    <Link href=\"https://hcb.hackclub.com/applications/new\">\n      <Button\n        variant=\"ctaLg\"\n        sx={{\n          width: '100%',\n          height: '4.2rem'\n          // borderRadius: '1.5rem',\n        }}\n      >\n        <Flex\n          sx={{\n            alignItems: 'center',\n            gap: 3,\n            mr: '-32px' // Man...\n          }}\n        >\n          <Text color=\"white\" sx={{ fontWeight: 'bold', fontSize: 4 }}>\n            Apply now\n          </Text>\n          <Icon glyph=\"view-forward\" size={46} color=\"white\" />\n        </Flex>\n      </Button>\n    </Link>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/first/features.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Heading, Link, Text, Container, Card, Image } from 'theme-ui'\nimport Icon from '../../icon'\nimport Masonry from 'react-masonry-css'\nimport NextImage from 'next/image'\n\nimport { Fade } from '../../react-reveal-compat'\n\nexport default function Features() {\n  return (\n    <Box sx={{ py: 5 }}>\n      <Box as=\"a\" href=\"#testimonials\">\n        <Image\n          src=\"/fiscal-sponsorship/meet-teams-using-hcb.svg\"\n          alt=\"yeah\"\n          width={200}\n          height={100}\n          sx={{\n            position: 'absolute',\n            right: 2,\n            mt: -36,\n            display: ['none', 'none', 'none', 'block'],\n            '&:hover': {\n              transform: 'scale(1.05)'\n            }\n          }}\n        />\n      </Box>\n      <Container>\n        <Text variant=\"heading\" sx={{ fontSize: 50 }}>\n          Everything you'll need.\n        </Text>\n        <br />\n        <br />\n        <Text sx={{ color: 'muted', maxWidth: '48', fontSize: 28 }}>\n          Organize your team's finances in real time, receive grants, gain\n          nonprofit status, & more.\n          <br />\n          Use features engineered by <i>FIRST</i> alumni to help you run a\n          successful team.\n        </Text>\n        <br />\n        <br />\n      </Container>\n      <Container>\n        <Masonry\n          breakpointCols={{\n            10000: 3,\n            640: 2,\n            480: 1,\n            default: 1\n          }}\n          className=\"masonry-posts\"\n          columnClassName=\"masonry-posts-column\"\n        >\n          <Module\n            icon=\"bank-account\"\n            name=\"Nonprofit status\"\n            body=\"Become part of Hack Club's legal entity, getting the benefits of our 501(c)(3) tax status.\"\n          />\n\n          <ModuleDetails>\n            <Link\n              href=\"https://hcb.hackclub.com/poseidon-robotics\"\n              target=\"_blank\"\n            >\n              <NextImage\n                src=\"/fiscal-sponsorship/poseidon-dashboard.png\"\n                alt=\"iPad\"\n                width={500}\n                height={300}\n                style={{\n                  maxWidth: '100%',\n                  height: 'auto'\n                }}\n              />\n            </Link>\n          </ModuleDetails>\n\n          <Module\n            icon=\"analytics\"\n            name=\"Balance &amp; history\"\n            body=\"Keep everyone on your team and beyond up to date with real-time balance and transaction history.\"\n          />\n\n          <Module\n            icon=\"card\"\n            name=\"Debit cards\"\n            body=\"Issue physical debit cards to all your teammates.\"\n          />\n\n          <Module\n            icon=\"payment\"\n            name=\"Grants &amp; donations\"\n            body=\"Easily receive and deposit money from grants and donations into your account. You'll also get a customizable online donation form to share with friends and family.\"\n          />\n\n          <Module\n            icon=\"payment-transfer\"\n            name=\"Reimbursement flow\"\n            body=\"Reimburse teammates for expenses with flexible money transfer options including ACH, mailed checks, and more.\"\n          />\n          {/* <Fade bottom>\n            <Tilt>\n              <Card\n                as=\"div\"\n                sx={{\n                  backgroundImage:\n                    'url(\"https://cloud-ehtgzdn7u-hack-club-bot.vercel.app/0card.png\")',\n                  height: '230px',\n                  backgroundSize: 'cover',\n                  boxShadow: '0 8px 32px rgba(255, 255, 255, 0.0625)'\n                }}\n              />\n            </Tilt>\n          </Fade> */}\n          <Module\n            icon=\"support\"\n            name=\"Support anytime\"\n            body=\"With 24-hour response time on weekdays, we'll never leave you hanging.\"\n          />\n          {/* <Tilt>\n            <Card\n              as=\"div\"\n              sx={{\n                borderRadius: 0,\n                backgroundColor: '#193046',\n                boxShadow:\n                  '0 0 2px 0 rgb(0 0 0 / 6%), 0 6px 12px 0 rgb(0 0 0 / 25%)',\n                '&::before': {\n                  position: 'absolute',\n                  content: '\"\"',\n                  top: 0,\n                  left: 0,\n                  right: 0,\n                  bottom: 0,\n                  margin: '0.5rem',\n                  border: '1px dotted #8492a6'\n                }\n              }}\n            >\n              <Flex sx={{ justifyContent: 'end' }}>\n                <Text\n                  sx={{\n                    textTransform: 'uppercase',\n                    fontSize: '10px',\n                    lineHeight: 1\n                  }}\n                >\n                  Date\n                </Text>\n                <Text sx={{ fontFamily: 'cursive' }}>10-10-2020</Text>\n              </Flex>\n              <Flex sx={{ width: '100%' }}>\n                <Text\n                  sx={{\n                    textTransform: 'uppercase',\n                    fontSize: '10px',\n                    lineHeight: 1\n                  }}\n                >\n                  Pay to the <br />\n                  order of\n                </Text>\n                <Text\n                  as=\"span\"\n                  sx={{ fontFamily: 'cursive', textAlign: 'left', ml: 2 }}\n                >\n                  Hack Club\n                </Text>\n\n                <Text\n                  sx={{\n                    textAlign: 'right',\n                    ml: 'auto'\n                  }}\n                >\n                  $\n                  <Text\n                    as=\"span\"\n                    sx={{\n                      border: '1px solid rgba(255, 255, 255, 0.25)',\n                      fontFamily: 'cursive'\n                    }}\n                  >\n                    1000\n                  </Text>\n                </Text>\n              </Flex>\n              <Flex sx={{ justifyContent: 'space-between', alignItems: 'end' }}>\n                <Text sx={{ fontFamily: 'cursive' }}>One thousand only</Text>\n                <Text\n                  sx={{\n                    textTransform: 'uppercase',\n                    fontSize: '10px',\n                    lineHeight: 1\n                  }}\n                >\n                  Dollars\n                </Text>\n              </Flex>\n\n              <Flex\n                sx={{\n                  justifyContent: 'space-between',\n                  alignItems: 'center',\n                  pb: 1\n                }}\n              >\n                <Text\n                  sx={{\n                    textTransform: 'uppercase',\n                    fontSize: '10px',\n                    lineHeight: 1\n                  }}\n                >\n                  Memo\n                  <Text\n                    as=\"span\"\n                    sx={{\n                      fontFamily: 'cursive',\n                      fontSize: '12px',\n                      textTransform: 'none'\n                    }}\n                  >\n                    {' '}\n                    Grant for Poseidon Robotics\n                  </Text>\n                </Text>\n                <Image\n                  src=\"/signatures/prophet_orpheus-light.png\"\n                  alt=\"Prophet Orpheus signature\"\n                  width={80}\n                  height={30}\n                />\n              </Flex>\n              <Flex>\n                <Text\n                  sx={{\n                    fontFamily: 'monospace',\n                    fontSize: '10px',\n                    lineHeight: 1,\n                    pt: 1,\n                    mb: -3\n                  }}\n                >\n                  ⑆ 00000000000 ⑆ 123456789 ⑆\n                </Text>\n              </Flex>\n            </Card>\n          </Tilt> */}\n          {/* <Module\n            icon=\"rep\"\n            name=\"No start-up costs\"\n            body=\"All fees waived on your first $25k until September 1st, 2023. Then, just 7% of revenue (as compared to 10-14% charged by other fiscal sponsors). \"\n          /> */}\n        </Masonry>\n      </Container>\n      <Container\n        variant=\"narrow\"\n        sx={{\n          pt: 3,\n          borderColor: 'muted',\n          textAlign: 'center'\n        }}\n      >\n        <Text variant=\"caption\" sx={{ color: 'muted' }}>\n          Hack Club does not directly provide banking services. Banking services\n          are provided by FDIC-certified financial institutions.\n        </Text>\n      </Container>\n      <style>{`\n      .masonry-posts {\n        display: flex;\n        width: 100%;\n        max-width: 100%;\n      }\n\n      .masonry-posts-column {\n        background-clip: padding-box;\n      }\n\n      .post {\n        margin-bottom: 16px;\n      }\n\n      @media (max-width: 32em) {\n        .post:nth-child(8) ~ .post {\n          display: none;\n        }\n      }\n\n      @media (min-width: 32em) {\n        .masonry-posts {\n          padding-right: 12px;\n        }\n\n        .masonry-posts-column {\n          padding-left: 12px;\n        }\n\n        .post {\n          border-radius: 12px;\n          margin-bottom: 12px;\n        }\n      }\n\n      @media (min-width: 64em) {\n        .masonry-posts {\n          padding-right: 24px;\n        }\n\n        .masonry-posts-column {\n          padding-left: 24px;\n        }\n\n        .post {\n          margin-bottom: 24px;\n        }\n      }\n\n    `}</style>\n    </Box>\n  )\n}\n\ntype ModuleProps = {\n  icon: string\n  name: string\n  body: string\n  iconColor?: string\n}\n\nfunction Module({ icon, name, body, iconColor }: ModuleProps) {\n  return (\n    <Fade bottom>\n      <Card\n        variant=\"primary\"\n        sx={{\n          display: 'flex',\n          flexDirection: 'column',\n          p: [4, null, 4]\n        }}\n        className=\"post\"\n      >\n        <Box\n          as=\"span\"\n          sx={{\n            width: 'fit-content',\n            background: iconColor || 'primary',\n            borderRadius: 'default',\n            lineHeight: 0,\n            p: 1,\n            mb: 1,\n            display: 'inline-block',\n            transform: ['scale(0.75)', 'none'],\n            transformOrigin: 'bottom left',\n            boxShadow:\n              'inset 2px 2px 6px rgba(255,255,255,0.2), inset -2px -2px 6px rgba(0,0,0,0.1), 0 1px 4px rgba(0,0,0,0.1), 0 4px 8px rgba(0,0,0,0.1)'\n          }}\n        >\n          <Icon glyph={icon} size={28} />\n        </Box>\n        <Box>\n          <Heading sx={{ color: 'snow', lineHeight: '1.5' }}>{name}</Heading>\n          <Text\n            sx={{\n              color: 'muted',\n              lineHeight: '1.375',\n              fontSize: 17\n            }}\n          >\n            {body}\n          </Text>\n        </Box>\n      </Card>\n    </Fade>\n  )\n}\n\nfunction ModuleDetails({ children }) {\n  return (\n    <Fade bottom>\n      <Box\n        sx={{\n          bg: 'none',\n          color: 'smoke',\n          boxShadow: '0 8px 32px rgba(255, 255, 255, 0.0625)',\n          borderRadius: 'default',\n          p: 0,\n          mb: 3\n        }}\n      >\n        {children}\n      </Box>\n    </Fade>\n  )\n}\n\nfunction Document({ name, cost }) {\n  return (\n    <Box sx={{ display: 'flex' }}>\n      <Icon\n        size={28}\n        mr={1}\n        glyph=\"payment\"\n        sx={{ flexShrink: 0, color: 'green' }}\n      />\n      <Box sx={{ display: 'flex', flexDirection: 'column' }}>\n        <Text fontSize={2}>{name}</Text>\n\n        {cost && (\n          <Text fontSize={1} color=\"muted\" style={{ lineHeight: '1.375' }}>\n            {cost}\n          </Text>\n        )}\n      </Box>\n    </Box>\n  )\n}\n\nfunction Laptop({ href, title, sx }) {\n  return (\n    <Link href={href} title={title} sx={sx}>\n      <Box\n        sx={{\n          display: 'block',\n          width: '100%',\n          height: '100%',\n          minHeight: '16rem',\n          backgroundSize: 'auto 115%',\n          backgroundImage:\n            \"url('https://cloud-az94fzpyw-hack-club-bot.vercel.app/1poseidon.png')\",\n          backgroundPosition: 'center top',\n          backgroundRepeat: 'no-repeat'\n        }}\n      ></Box>\n    </Link>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/first/start.tsx",
    "content": "import { Box, Link, Text, Heading, Flex } from 'theme-ui'\nimport Stats from './stats'\nimport ApplyButton from './apply-button'\n\nexport default function Start({ stats }) {\n  return (\n    <>\n      <Box as=\"section\" id=\"apply\" py={6}>\n        <Flex\n          sx={{ flexDirection: 'column', alignItems: 'center', gap: 5, mx: 4 }}\n        >\n          <Flex\n            sx={{\n              flexDirection: 'column',\n              textAlign: 'center',\n              gap: 3\n            }}\n          >\n            <Heading variant=\"ultratitle\" color=\"white\">\n              Sign up for HCB.\n            </Heading>\n            <Text color=\"muted\" variant=\"lead\" m=\"0 !important\">\n              Open to Hack Clubs, hackathons, and charitable organizations in\n              the US and Canada.\n            </Text>\n          </Flex>\n          <Stats stats={stats} />\n          <Flex\n            sx={{ flexDirection: 'column', textAlign: 'center', gap: 4, mx: 3 }}\n          >\n            <ApplyButton />\n            <Text color=\"muted\" sx={{ fontSize: 18 }}>\n              We run Hack Club HQ on HCB!{' '}\n              <Link href=\"https://hcb.hackclub.com/hq\" color=\"primary\">\n                See&nbsp;our&nbsp;finances.\n              </Link>\n            </Text>\n          </Flex>\n        </Flex>\n      </Box>\n    </>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/first/stats.tsx",
    "content": "import { Text, Box, Flex } from 'theme-ui'\nimport { useEffect, useState } from 'react'\n\nconst easeInOutExpo = x =>\n  x === 0\n    ? 0\n    : x === 1\n      ? 1\n      : x < 0.5\n        ? Math.pow(2, 20 * x - 10) / 2\n        : (2 - Math.pow(2, -20 * x + 10)) / 2\n\nfunction startMoneyAnimation(\n  setBalance,\n  amount,\n  duration = 2_000,\n  moneyFormatter\n) {\n  const startTime = performance.now()\n\n  function animate() {\n    const time = performance.now() - startTime\n    const progress = time / duration\n    const easedProgress = easeInOutExpo(progress)\n\n    setBalance(moneyFormatter(amount * easedProgress))\n\n    if (progress < 1) {\n      requestAnimationFrame(animate)\n    } else {\n      setBalance(moneyFormatter(amount))\n    }\n  }\n\n  requestAnimationFrame(animate)\n}\n\nfunction formatMoney(amount) {\n  const normalisedAmount = amount / 100\n  return normalisedAmount\n    .toLocaleString('en-US', { style: 'currency', currency: 'USD' })\n    .split('.')\n}\n\nconst Stats = ({ stats }) => {\n  const [balance, setBalance] = useState(0) // A formatted balance string, split by decimal\n\n  useEffect(() => {\n    const observer = new IntersectionObserver(\n      e => {\n        if (e[0].isIntersecting) {\n          console.info('intersecting')\n          startMoneyAnimation(\n            setBalance,\n            stats.transactions_volume,\n            2_500,\n            formatMoney\n          )\n        }\n      },\n      { threshold: 1.0 }\n    )\n    observer.observe(document.querySelector('#parent'))\n\n    return () => observer.disconnect()\n  }, [stats.transactions_volume])\n\n  if (stats.transactions_volume === undefined) {\n    return null\n  }\n\n  return (\n    <Box id=\"parent\">\n      <Flex sx={{ flexDirection: 'column', alignItems: 'center' }}>\n        <Text sx={{ fontSize: [3, 4] }}>So far we have enabled</Text>\n        {stats ? (\n          <>\n            <Text\n              variant=\"title\"\n              color=\"green\"\n              sx={{\n                color: 'green',\n                fontSize: [5, 6]\n              }}\n            >\n              {balance[0]}\n              <Text sx={{ fontSize: [3, 4] }}>.{balance[1]}</Text>\n            </Text>\n          </>\n        ) : (\n          <Text\n            variant=\"title\"\n            color=\"green\"\n            sx={{\n              color: 'green',\n              fontSize: [5, 6]\n            }}\n          >\n            ...\n          </Text>\n        )}\n        <Text sx={{ fontSize: [3, 4] }}>in transactions</Text>\n      </Flex>\n    </Box>\n  )\n}\n\nexport async function getStaticProps() {\n  const res = await fetch(`https://hcb.hackclub.com/stats`)\n  try {\n    const stats = await res.json()\n    return {\n      props: {\n        stats\n      },\n      revalidate: 10\n    }\n  } catch (e) {\n    return {\n      props: {\n        stats: {}\n      },\n      revalidate: 10\n    }\n  }\n}\n\nexport default Stats\n"
  },
  {
    "path": "components/fiscal-sponsorship/first/testimonials.tsx",
    "content": "import {\n  Box,\n  Image,\n  Text,\n  Heading,\n  Container,\n  Grid,\n  Link,\n  Avatar,\n  Button\n} from 'theme-ui'\nimport { Slide } from '../../react-reveal-compat'\n\nexport default function Testimonials() {\n  return (\n    <>\n      <Container\n        variant=\"copy\"\n        sx={{\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'center',\n          textAlign: 'center'\n        }}\n      >\n        <Heading variant=\"title\">\n          <i>FIRST</i> teams all over the country run on HCB.\n        </Heading>\n        <Text variant=\"lead\" color=\"muted\">\n          Everywhere from San Jose to Boston to New York, HCB powers teams of\n          all sizes.\n        </Text>\n      </Container>\n      <Container>\n        <Grid\n          gap={4}\n          sx={{\n            gridTemplateColumns: ['100%', null, null, '1fr 1fr']\n          }}\n        >\n          <Organization\n            logo=\"https://cloud-ab81zjlm9-hack-club-bot.vercel.app/0image.png\"\n            name=\"Poseidon Robotics\"\n            teamNum=\"FTC Team #16898\"\n            teamLocation=\"San Jose, CA\"\n            budget=\"$1,000,000\"\n            budgetLabel=\"in grants\"\n            website=\"evposeidon.wixsite.com\"\n            url=\"https://evposeidon.wixsite.com/robo/home\"\n            imgSrc=\"https://cloud-qtng6088u-hack-club-bot.vercel.app/0image.png\"\n            quote=\"Overall, [HCB] has opened more opportunities for Poseidon, allowing us to undertake larger projects, both on the playing field and in our community.\"\n            hackerName=\"Ian Marwong\"\n            hackerRole=\"Team Lead\"\n            hackerAvatarUrl=\"/hackers/ian-marwong.jpg\"\n            transparency=\"poseidon-robotics\"\n          />\n          <Organization\n            logo=\"https://cloud-ga0lm1r8d-hack-club-bot.vercel.app/0image.png\"\n            name=\"Killabytez\"\n            teamNum=\"FTC Team #14663\"\n            teamLocation=\"Fremont, CA\"\n            budget=\"$1,000,000\"\n            budgetLabel=\"in grants\"\n            website=\"killabytez.club\"\n            url=\"http://www.killabytez.club/\"\n            hackerAvatarUrl=\"/hackers/brian-cisto.jpeg\"\n            hackerName=\"Brian Cisto\"\n            hackerRole=\"Team Captain & Software Lead\"\n            imgSrc=\"https://cloud-oelh6sp7b-hack-club-bot.vercel.app/0screen_shot_2022-11-06_at_8.45.37_pm.png\"\n            quote=\"[HCB] has been essential to keeping track of our finances as well as giving us the opportunity to establish ourselves as a nonprofit.\"\n          />\n        </Grid>\n      </Container>\n    </>\n  )\n}\n\nfunction Organization({\n  logo,\n  name,\n  website,\n  teamNum,\n  teamLocation,\n  budget: _budget,\n  budgetLabel: _budgetLabel,\n  url,\n  imgSrc,\n  quote,\n  hackerName,\n  hackerAvatarUrl,\n  hackerRole,\n  transparency = undefined\n}) {\n  return (\n    <Slide bottom>\n      <Box\n        sx={{\n          backgroundColor: 'darkless',\n          color: 'smoke',\n          borderRadius: 'extra',\n          mx: 'auto'\n        }}\n      >\n        <Container sx={{ padding: 0, margin: 0 }}>\n          <Image\n            src={imgSrc}\n            alt=\"Robots team\"\n            width={800}\n            height={450}\n            sx={{\n              borderRadius: 'default',\n              objectFit: 'cover'\n            }}\n          />\n          <Box p={[3, null, 4]}>\n            <Box\n              sx={{\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'space-between'\n              }}\n            >\n              <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                <Image\n                  src={logo}\n                  alt={`${name} logo`}\n                  sx={{\n                    height: '4rem',\n                    width: '4rem',\n                    objectFit: 'cover',\n                    borderRadius: 'default'\n                  }}\n                />\n                <Box sx={{ ml: 3 }}>\n                  <Text\n                    color=\"white\"\n                    variant=\"headline\"\n                    sx={{\n                      fontSize: [28, null, 38],\n                      lineHeight: 1,\n                      letterSpacing: -0.1\n                    }}\n                  >\n                    {name}\n                  </Text>\n                  <br />\n                  <Link\n                    href={url || `https://${website}`}\n                    sx={{\n                      textDecoration: 'none',\n                      color: 'muted',\n                      '&:hover': { textDecoration: 'underline' }\n                    }}\n                  >\n                    {teamNum}\n                  </Link>{' '}\n                  • {teamLocation}\n                </Box>\n              </Box>\n            </Box>\n\n            <br />\n            <Text\n              sx={{\n                color: 'snow',\n                textIndent: '-.375em',\n                lineHeight: 'caption',\n                fontSize: 18\n              }}\n            >\n              \"{quote}\"\n            </Text>\n\n            <Box\n              sx={{\n                display: 'flex',\n                flexDirection: 'row',\n                flexWrap: 'wrap',\n                justifyContent: 'space-between',\n                marginTop: ['0px', 3]\n              }}\n            >\n              <Box\n                sx={{\n                  display: 'flex',\n                  alignItems: 'center',\n                  mt: ['16px', '0px']\n                }}\n              >\n                <Avatar\n                  src={hackerAvatarUrl}\n                  size={48}\n                  sx={{\n                    mr: 2,\n                    borderRadius: '100%'\n                  }}\n                  alt=\"Photo of ${hackerName}\"\n                />\n                <Text\n                  color=\"white\"\n                  sx={{\n                    fontSize: 19,\n                    display: 'flex',\n                    flexDirection: 'column'\n                  }}\n                >\n                  <Text sx={{ fontWeight: 'bold', lineHeight: 1.125 }}>\n                    {hackerName}\n                  </Text>\n                  <Text>{hackerRole}</Text>\n                </Text>\n              </Box>\n              {transparency && (\n                <Link\n                  href={`https://hcb.hackclub.com/${transparency}`}\n                  target=\"_blank\"\n                  rel=\"noreferrer\"\n                  sx={{ mt: ['16px', '0px'] }}\n                >\n                  <Button\n                    mt={[null, null, 4, 0]}\n                    ml={[0, 'auto']}\n                    sx={{ textTransform: 'none' }}\n                    variant=\"primary\"\n                    title=\"🎶 take a look, it's in our books 🎵\"\n                  >\n                    See Finances\n                  </Button>\n                </Link>\n              )}\n            </Box>\n          </Box>\n        </Container>\n      </Box>\n    </Slide>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/open-source.tsx",
    "content": "/** @jsxImportSource theme-ui */\n\nimport { Box, Heading, Button, Text, Container, Grid, Flex } from 'theme-ui'\nimport Icon from '../icon'\nimport Photo from '../photo'\nimport HCBGource from '../../public/fiscal-sponsorship/hcb-gource.gif'\n\nexport default function OpenSource() {\n  return (\n    <Box as=\"section\" sx={{ py: [4, 5], bg: 'snow' }}>\n      <Container>\n        <Grid columns={[1, 2]} gap={[4, 5]} sx={{ alignItems: 'center' }}>\n          <div>\n            <Heading as=\"h2\" variant=\"headline\" sx={{ mb: 3 }}>\n              Open source infrastructure for fiscally sponsored organizations.\n            </Heading>\n            <Text as=\"p\" sx={{ mb: 3 }}>\n              HCB is open source and built in public, like many other Hack Club\n              projects. Join us in building the infrastructure powering fiscally\n              sponsored organizations around the world.\n            </Text>\n            <Flex\n              sx={{\n                flexWrap: 'wrap',\n                gap: 3\n              }}\n            >\n              <Button\n                as=\"a\"\n                sx={{ flexShrink: 0, gap: 14, paddingLeft: 25 }}\n                variant=\"outline\"\n                target=\"_blank\"\n                href=\"https://github.com/hackclub/hcb\"\n              >\n                Star on GitHub\n                <Icon glyph=\"github\" />\n              </Button>\n              <Button\n                as=\"a\"\n                sx={{\n                  flexShrink: 0,\n                  gap: 1,\n                  paddingLeft: 25,\n                  paddingRight: '5px'\n                }}\n                href=\"https://hackclub.com/hcb/open-source\"\n                target=\"_blank\"\n              >\n                Read our blog post\n                <Icon glyph=\"view-forward\" />\n              </Button>\n            </Flex>\n          </div>\n          <Photo\n            src={HCBGource}\n            width={888}\n            height={500}\n            unoptimized\n            sx={{\n              maxWidth: '100%',\n              width: 'auto !important',\n              height: '500 !important',\n              boxShadow: 'elevated'\n            }}\n            alt=\"Since open-sourcing, we've merged over 1,800 pull requests from contributors!\"\n            showAlt\n          />\n        </Grid>\n      </Container>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/organization-spotlight.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Tilt from '../tilt'\nimport { Card, Heading, Text } from 'theme-ui'\nimport Image from 'next/image'\nimport { Balancer } from 'react-wrap-balancer'\n\nexport default function OrganizationSpotlight({ organization }) {\n  return (\n    <Tilt>\n      <Card\n        as=\"a\"\n        href={`https://hcb.hackclub.com/${organization.slug}`}\n        sx={{\n          justifyContent: 'center',\n          alignItems: 'center',\n          minHeight: 128,\n          color: 'white',\n          cursor: 'pointer',\n          textShadow: '0 1px 4px rgba(0, 0, 0, 0.5)',\n          textDecoration: 'none',\n          backgroundColor: 'black',\n          backgroundSize: 'cover',\n          backgroundPosition: 'center',\n          backgroundRepeat: 'no-repeat',\n          borderRadius: 'extra',\n          overflow: 'hidden',\n          position: 'relative',\n          p: 3,\n          height: '100%',\n          display: 'grid',\n          gridTemplateColumns: '64px 1fr',\n          columnGap: 3,\n          rowGap: 2\n        }}\n        style={{\n          backgroundImage: `linear-gradient(rgba(0,0,0,0.375) 0%, rgba(0,0,0,0.5) 75%), url('${organization.background_image}')`\n        }}\n      >\n        <Image\n          src={organization.logo}\n          alt={`${organization.name} logo`}\n          loading=\"lazy\"\n          width={64}\n          height={64}\n          style={{\n            borderRadius: '16px',\n            maxWidth: '100%',\n            height: 'auto'\n          }}\n        />\n        <div>\n          <Heading\n            as=\"h3\"\n            sx={{\n              fontSize: [3, 4],\n              m: 0,\n              overflowWrap: 'anywhere',\n              width: '100%',\n              display: 'block'\n            }}\n          >\n            {organization.name}\n          </Heading>\n          <Text\n            variant=\"caption\"\n            sx={{\n              color: 'white',\n              opacity: 0.875\n            }}\n          >\n            {organization.location.readable}\n          </Text>\n        </div>\n        <Text as=\"p\" sx={{ gridColumn: ['span 2', '2'] }}>\n          <Balancer>{organization.description}</Balancer>\n        </Text>\n      </Card>\n    </Tilt>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/sign-in.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { useEffect, useState } from 'react'\nimport { Button, Image } from 'theme-ui'\n\nexport default function SignIn() {\n  const [user, setUser] = useState(null)\n\n  useEffect(() => {\n    ;(async () => {\n      const _user = await fetch('https://hcb.hackclub.com/api/current_user', {\n        credentials: 'include'\n      })\n        .then(r => (r.ok ? r.json() : null))\n        .catch(() => {})\n\n      if (_user) setUser(_user)\n    })()\n  }, [])\n\n  return (\n    <Button\n      as=\"a\"\n      href=\"https://hcb.hackclub.com\"\n      variant=\"outline\"\n      sx={{ color: 'white' }}\n    >\n      {user ? (\n        <>\n          <Image\n            src={user.avatar}\n            alt={`${user.name}'s HCB avatar`}\n            width={30}\n            sx={{ borderRadius: 'circle', mr: 2, boxShadow: 'elevated' }}\n          />\n          Continue to HCB\n        </>\n      ) : (\n        'Sign in'\n      )}\n    </Button>\n  )\n}\n"
  },
  {
    "path": "components/fiscal-sponsorship/tooltip.tsx",
    "content": "import React from 'react'\n\nconst tooltip = direction =>\n  function Tooltip({ children, text, id }) {\n    const escapedText = text.replace(/'/g, \"\\\\'\")\n    const directionalStyles = {\n      e: `\n            left: 100%;\n            bottom: 50%;\n            right: 0;\n            margin-left: 0.5rem;\n            transform: translateY(50%);\n        `,\n      w: `\n            right: 100%;\n            bottom: 50%;\n            margin-right: 0.5rem;\n            transform: translateY(50%);\n        `,\n      n: `\n            right: 50%;\n            bottom: 100%;\n            margin-bottom: 0.5rem;\n            transform: translateX(50%);\n        `,\n      s: `\n            right: 50%;\n            top: 100%;\n            margin-top: 0.5rem;\n            transform: translateX(50%);\n        `\n    }[direction || 'e']\n\n    return (\n      <>\n        <style>{`.tooltipped${id ? '-' + id : ''} {\n                position: relative;\n            }\n            \n            @media (min-width: 56em) {\n                .tooltipped${id ? '-' + id : ''}:after {\n                    background-color: rgba(31, 45, 61, 0.875);\n                    border-radius: 0.5rem;\n                    box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.0625),\n                    0 4px 8px 0 rgba(0, 0, 0, 0.125);\n                    color: #ffffff;\n                    content: '${escapedText}';\n                    font-family: $font-family;\n                    font-size: 0.875rem;\n                    font-weight: 500;\n                    height: min-content;\n                    letter-spacing: 0;\n                    line-height: 1.375;\n                    max-width: 16rem;\n                    min-height: 1.25rem;\n                    opacity: 0;\n                    padding: 0.25rem 0.75rem;\n                    pointer-events: none;\n                    position: absolute;\n                    right: 100%;\n                    text-align: center;\n                    transform: translateY(50%);\n                    transition: 0.125s all ease-in-out;\n                    width: max-content;\n                    z-index: 1000000;\n            \n                }\n            \n                .tooltipped${id ? '-' + id : ''}:hover:after,\n                .tooltipped${id ? '-' + id : ''}:active:after,\n                .tooltipped${id ? '-' + id : ''}:focus:after {\n                    opacity: 1;\n                    z-index: 9000000;\n                    backdrop-filter: blur(2px);\n                }\n            \n                .tooltipped${id ? '-' + id : ''}:after {\n                    ${directionalStyles}\n                }\n            }`}</style>\n\n        {children}\n      </>\n    )\n  }\n\ntype TooltipComponent = React.FC<{ children: any; text: any; id: any }> & {\n  N: React.FC<{ children: any; text: any; id: any }>\n  S: React.FC<{ children: any; text: any; id: any }>\n  E: React.FC<{ children: any; text: any; id: any }>\n  W: React.FC<{ children: any; text: any; id: any }>\n}\n\nconst Tooltip = tooltip('e') as TooltipComponent\nTooltip.N = tooltip('n')\nTooltip.S = tooltip('s')\nTooltip.E = tooltip('e')\nTooltip.W = tooltip('w')\n\nexport { Tooltip }\nexport default Tooltip\n"
  },
  {
    "path": "components/flag.tsx",
    "content": "import theme from '../lib/theme'\nimport styled from '@emotion/styled'\nimport { css, keyframes } from '@emotion/react'\nimport Link from 'next/link'\n\nconst waveFlag = keyframes`\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(-5deg);\n  }\n`\n\nconst waveFlagScaled = keyframes`\n  from {\n    transform: scale(.875) rotate(0deg);\n  }\n  to {\n    transform: scale(.875) rotate(-5deg);\n  }\n`\n\nconst scrolled = props =>\n  props.scrolled\n    ? css`\n        transform: scale(0.875);\n        height: 56px;\n        &:hover,\n        &:focus {\n          animation: ${waveFlagScaled} 0.5s linear infinite alternate;\n        }\n      `\n    : undefined\n\nconst Base = styled(Link)<{ uwu?: boolean }>`\n  background-image: ${props =>\n    props.uwu\n      ? 'url(/stickers/hack-club-anime.png)'\n      : 'url(https://assets.hackclub.com/flag-orpheus-top.svg)'};\n  background-repeat: no-repeat;\n  background-position: top left;\n  background-size: contain;\n  cursor: pointer;\n  flex-shrink: 0;\n  width: 112px;\n  height: 48px;\n  transition: ${3 / 16}s cubic-bezier(0.375, 0, 0.675, 1) transform;\n  transform-origin: top left;\n  @media (min-width: ${theme.breakpoints[1]}) {\n    width: 172px;\n    height: 64px;\n  }\n  &:hover,\n  &:focus {\n    animation: ${waveFlag} 0.5s linear infinite alternate;\n  }\n  @media (prefers-reduced-motion: reduce) {\n    animation: none !important;\n  }\n  ${scrolled};\n`\n\nconst Flag = props => <Base href=\"/\" title=\"Homepage\" {...props} />\n\nexport default Flag\n"
  },
  {
    "path": "components/flex-col.tsx",
    "content": "import { Flex } from 'theme-ui'\n\nexport default function FlexCol({ children, ...props }) {\n  return <Flex sx={{ flexDirection: 'column', ...props }}>{children}</Flex>\n}\n"
  },
  {
    "path": "components/footer.tsx",
    "content": "import React from 'react'\nimport styled from '@emotion/styled'\nimport { Box, Container, Grid, Heading, Link, Text } from 'theme-ui'\nimport NextLink from 'next/link'\nimport theme from '@hackclub/theme'\nimport Icon from './icon'\nimport { getGitSha, getGitShaShort } from '../lib/git-info'\n\nconst Base = styled(Box, { shouldForwardProp: prop => prop !== 'dark' })<{\n  dark?: boolean\n}>`\n  background: ${props =>\n    props.dark\n      ? `${theme.colors.darker} radial-gradient(${theme.colors.black} 1px, transparent 1px)`\n      : `${theme.colors.snow} url('/pattern.svg') repeat`};\n  ${props =>\n    props.dark &&\n    `\n      background-size: ${theme.space[4]}px ${theme.space[4]}px;\n    `} @media print {\n    display: none;\n  }\n`\n\nconst Logo = props => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width=\"256\"\n    height=\"90\"\n    fill=\"#8492A6\"\n    viewBox=\"0 0 256 90\"\n    {...props}\n  >\n    <path d=\"M75.156 38.08l6.475 1.105s1.798-11.402-.224-10.199l-6.251 9.094zM204.85 34.495l2.161 5.06s5.237-2.106 4.619-4.915c-.537-2.442-3.098-1.496-5.641-.557h-.001c-.382.142-.764.282-1.138.412zM207.752 43.455s1.483 6.212 1.421 5.93c-.007-.093.397-.247 1.002-.477 2.014-.766 6.257-2.379 4.999-5.453-1.636-3.997-7.422 0-7.422 0z\" />\n    <path\n      fillRule=\"evenodd\"\n      d=\"M7.205 89.303c-.022-2.227-.161-16.553 3.072-32.54 15.846-2.401 28.778.144 54.94 7.37 5.142 1.42 10.135 2.927 15.139 4.437 21.52 6.494 43.238 13.047 77.819 13.047 39.513 0 89.839-46.125 96.97-52.854.321-.303.07-.804-.37-.798a895.798 895.798 0 01-22.817-.006.484.484 0 01-.422-.707L241.991 6.9c.186-.36-.392-.91-.737-.696-10.403 6.44-68.291 38.655-125.701 11.127C62.987-7.874 36.693.801 29.405 4.381c.206-.647.195-1.355-.559-1.45-.953-.121-1.458.46-1.458.46-.955.738-11.701 20.409-18.91 41.665C1.272 66.313-.092 87.361.006 89.551h7.202c0-.049 0-.132-.002-.248zm33.522-73.187c-.647 3.657-1.888 9.939-4.497 18.056-5.42 12.948 3.823 10.836 6.47 5.457 1.569-2.97 3.182-6.194 3.182-6.194l8.307 3.185s-.669 3.783-1.353 6.912c-2.61 8.118 4.998 7.144 7.102 1.146.177-.583.477-1.518.856-2.697 1.62-5.045 4.672-14.553 5.648-20.073 1.814-4.357-4.395-8.336-7.205-1.295-1.502 2.593-3.941 8.27-3.941 8.27s-6.857-2.534-6.938-2.81c-.14-.362.021-1.024.212-1.812.177-.727.38-1.562.397-2.37-.418-11.655-7.37-10.693-8.24-5.775zm36.6 9.076c2.114-4.209 4.542-4.915 6.347-4.723.779.065 1.838 1.648 2.648 3.17 2.651 10.02-2.1 28.448-2.94 29.686-2.892 4.671-7.967 3.788-6.04-1.259.901-3.066 1.865-5.852 1.865-5.852l-6.568-.734c-5.162 10.028-9.802 5.829-7.128 1.497 2.861-5.074 8.956-16.183 11.816-21.785zm33.437 10.102c.857-2.414-.924-7.875-7.149-6.964-9.016.065-12.136 15.862-12.136 15.862s-1.498 7.65.867 12.865c1.971 4.611 6.52 5.007 8.041 5.139.137.012.25.022.334.032 5.917-1.78 3.891-5.722 2.879-5.849-.221-.011-.456-.014-.701-.018-1.178-.015-2.578-.034-3.746-.988-2.393-1.928-1.967-6.824-1.447-9.457 1.224-4.429 3.918-13.223 8.213-11.07 2.577 3.293 4.386 1.78 4.845.448zm5.93-.406c-.608 1.855-.691 3.748-.785 5.895-.151 3.458-.332 7.576-2.777 13.261-.68 1.62-2.071 4.212-2.9 5.756-.323.602-.561 1.045-.638 1.21-2.196 4.16 2.263 6.611 7.175-.657 1.19-1.664 2.501-5.919 2.501-5.919l2.137-.24s1.867 8.216 2.296 11.736c.46 3.396 6.476 5.328 6.564-1.338-.215-2.285-1.011-5.374-2.509-9.298 0 0-.978-2.874-1.925-3.247 0 0 6.713-6.677 7.353-9.268.67-2.714-.552-4.6-5.802-.172-5.249 4.428-5.858 5.846-5.858 5.846s1.248-5.583 1.123-9.812c.456-4.473-4.584-7.73-5.955-3.753zm33.811 8.412c-2.253 2.233-3.67 6.425-3.512 12.767.314 9.466 4.236 14.906 10.933 13.822 6.697-1.083 5.12-5.915 4.503-6.075-.088-.022-.163-.059-.244-.098-.376-.181-.861-.415-3.12.435-2.746 1.032-4.814-.173-6.545-4.375-1.144-2.843-1.764-8.367.302-11.452.537-.795 1.051-1.088 1.378-1.275l.075-.042.039-.024.019-.011c1.235-.753 2.5-.023 2.717.166 3.458 2.504 4.135-.27 2.899-2.736-2.44-3.446-5.681-4.15-9.444-1.102zm14.971.143c-.033-3.593 3.677-6.363 4.981 1.672.926 2.985 1.185 7.574 1.384 11.111.147 2.614.262 4.655.59 5.05.773.93 6.526-.368 8.084-.892 1.558-.524 4.428.164 3.78 1.724-.423 1.281-1.467 1.63-2.02 1.814-.134.045-.239.08-.3.116-.309.187-13.313 4.042-13.796 1.475-.342-1.815-.457-2.938-.667-4.986h-.001c-.087-.848-.19-1.854-.332-3.133-.178-1.594-.448-3.404-.721-5.234h-.001c-.475-3.187-.961-6.434-.981-8.717zm15.594-3.216c-.282-2.598 2.367-4.185 3.927-1.396.534.974 1.107 3.415 1.752 6.165.788 3.354 1.682 7.167 2.746 9.337 1.06 1.599 3.243 1.887 4.271.42 1.214-2.218.338-7.759-.413-12.204a62.31 62.31 0 00-.479-1.777v-.001c-.361-1.286-.655-2.334-.634-3.168.466-4.003 3.677-3.055 5.175 1.049 1.249 4.572 2.551 11.959 1.898 14.585l-.074.3c-.604 2.447-1.329 5.39-4.442 6.131-.842.185-7.855 1.196-10.321-6.477l-.757-2.562c-1.783-6.024-2.399-8.103-2.649-10.402zm21.992-8.576c4.312-2.607 7.547-3.502 10.075-2.589 1.48.91 2.436 3.407 2.037 5.558-.461 1.87-1.231 3.396-1.231 3.396 2.559.258 4.432 2.811 4.918 6.153.487 3.341-2.661 6.486-8.515 8.433-1.972.556-4.067.549-4.16-.138-.063-1.341-5.033-17.326-5.033-17.326-.015-.096-.034-.193-.053-.29-.175-.892-.37-1.884 1.962-3.197z\"\n      clipRule=\"evenodd\"\n    />\n  </svg>\n)\n\nconst Service = ({ href, icon, name = '', ...props }) => (\n  <Link\n    target=\"_blank\"\n    rel=\"noopener me\"\n    href={href}\n    title={`Hack Club on ${name ? name : icon}`}\n    {...props}\n  >\n    <Icon glyph={icon} />\n  </Link>\n)\n\nconst Footer = ({\n  dark = false,\n  email = 'team@hackclub.com',\n  children = undefined,\n  ...props\n}) => (\n  <Base\n    color={dark ? 'muted' : 'slate'}\n    py={[4, 5]}\n    dark={dark}\n    sx={{ textAlign: 'left' }}\n    as=\"footer\"\n    {...props}\n  >\n    <Container px={[3, null, 4]}>\n      {children}\n      <Grid\n        as=\"article\"\n        gap={[2, 4]}\n        columns={[2, 3, 4]}\n        sx={{\n          px: 0,\n          a: {\n            textDecoration: 'none',\n            color: 'muted',\n            transition: '0.125s color ease-in-out',\n            ':hover,:focus': { color: 'slate', textDecoration: 'underline' }\n          },\n          '> div > a': {\n            display: 'block',\n            mb: 2\n          },\n          'h2,p': { color: 'muted' },\n          h2: { fontSize: 3 },\n          'a,p': { fontSize: 2 }\n        }}\n      >\n        <Box>\n          <Heading as=\"h2\" variant=\"subheadline\" mb={3}>\n            Hack&nbsp;Club\n          </Heading>\n          <Link as={NextLink} href=\"/philosophy\">\n            Philosophy\n          </Link>\n          <Link as={NextLink} href=\"/team\">\n            Our Team & Board\n          </Link>\n          <Link as={NextLink} href=\"/jobs\">\n            Jobs\n          </Link>\n          <Link as={NextLink} href=\"/brand\">\n            Brand Guide\n          </Link>\n          <Link as={NextLink} href=\"/press\">\n            Press Inquiries\n          </Link>\n          <Link as={NextLink} href=\"/philanthropy\">\n            Donate\n          </Link>\n          <Link as={NextLink} href=\"/imprint\">\n            Imprint\n          </Link>\n        </Box>\n        <Box>\n          <Heading as=\"h2\" variant=\"subheadline\" mb={3}>\n            Resources\n          </Heading>\n          <Link href=\"https://events.hackclub.com/\">Community Events</Link>\n          <Link href=\"https://jams.hackclub.com/\">Jams</Link>\n          <Link href=\"https://toolbox.hackclub.com/\">Toolbox</Link>\n          <Link href=\"https://hackclub.com/map\">Clubs Map</Link>\n          <Link href=\"https://hackclub.com/conduct/\">Code of Conduct</Link>\n          <Link href=\"https://hackclub.com/privacy/\">Privacy & Terms</Link>\n        </Box>\n        <Box sx={{ gridColumn: ['span 2', 'span 1'] }}>\n          <Box\n            sx={{ display: 'flex', alignItems: 'end', flexDirection: 'row' }}\n          >\n            <Logo aria-label=\"Hack Club logo\" width={128} height={45} />\n            <Text as=\"span\" color=\"muted\" sx={{ marginBottom: '-.5em' }}>\n              <Link\n                sx={{ fontSize: 'inherit' }}\n                href={`https://github.com/hackclub/site/commit/${getGitSha()}`}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                <code style={{ fontFamily: 'monospace', fontSize: '13px' }}>\n                  {getGitShaShort()}\n                </code>\n              </Link>\n            </Text>\n          </Box>\n          <Grid\n            columns={[8, 4]}\n            gap={2}\n            sx={{\n              alignItems: 'center',\n              ml: -1,\n              my: 3,\n              maxWidth: [null, 192],\n              svg: { fill: 'currentColor', width: 32, height: 32 },\n              a: {\n                lineHeight: 0,\n                mb: 0,\n                transition:\n                  'transform .125s ease-in-out, color .125s ease-in-out',\n                ':hover,:focus': { transform: 'scale(1.125)' }\n              },\n              placeItems: 'center'\n            }}\n          >\n            <Service\n              href=\"https://slack.hackclub.com\"\n              icon=\"slack-fill\"\n              name=\"Slack\"\n              target=\"_self\"\n            />\n            <Service\n              href=\"https://twitter.com/hackclub\"\n              icon=\"twitter\"\n              name=\"Twitter\"\n            />\n            <Service\n              href=\"https://github.com/hackclub\"\n              icon=\"github\"\n              name=\"GitHub\"\n            />\n            <Service\n              href=\"https://figma.com/@hackclub\"\n              icon=\"figma-fill\"\n              name=\"Figma\"\n            />\n            <Service\n              href=\"https://social.dino.icu/@hackclub\"\n              icon=\"mastodon\"\n              name=\"Mastodon\"\n            />\n            <Service\n              href=\"https://www.youtube.com/c/HackClubHQ\"\n              icon=\"youtube\"\n              name=\"YouTube\"\n            />\n            <Service\n              href=\"https://www.instagram.com/starthackclub\"\n              icon=\"instagram\"\n              name=\"Instagram\"\n            />\n            <Service href={`mailto:${email}`} icon=\"email-fill\" name=\"Email\" />\n          </Grid>\n          <Text my={2}>\n            <Link href=\"tel:1-855-625-4225\">1-855-625-HACK</Link>\n            <br />\n            <Text as=\"span\" color=\"muted\">\n              (call toll-free)\n            </Text>\n          </Text>\n        </Box>\n      </Grid>\n      <Text as=\"p\" variant=\"caption\" sx={{ mt: 3 }}>\n        © {new Date().getFullYear()} Hack&nbsp;Club. 501(c)(3) nonprofit (EIN:\n        81-2908499)\n      </Text>\n    </Container>\n  </Base>\n)\n\nexport default Footer\n"
  },
  {
    "path": "components/force-theme.ts",
    "content": "import { useEffect } from 'react'\nimport { useColorMode } from 'theme-ui'\n\nconst ForceTheme = ({ theme }) => {\n  const [_colorMode, setColorMode] = useColorMode()\n  useEffect(() => {\n    setColorMode(theme)\n  }, [setColorMode, theme])\n  return null\n}\n\nexport default ForceTheme\n"
  },
  {
    "path": "components/hackathons/features/marketing.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Button, Box, Container, Heading, Text } from 'theme-ui'\nimport usePrefersMotion from '../../../lib/use-prefers-motion'\nimport useHasMounted from '../../../lib/use-has-mounted'\nimport Link from 'next/link'\n\nconst Content = () => (\n  <Container\n    sx={{\n      zIndex: 999,\n      py: 6,\n      color: 'white',\n      'h2,p': { textShadow: 'text' },\n      textAlign: [null, 'center'],\n      position: 'relative',\n      overflow: 'hidden'\n    }}\n  >\n    <Text as=\"p\" variant=\"eyebrow\" sx={{ color: 'white', opacity: 0.75 }}>\n      hackathons.hackclub.com\n    </Text>\n    <Heading as=\"h2\" variant=\"title\">\n      Spread the word about your hackathon.\n    </Heading>\n    <Text as=\"p\" variant=\"lead\" sx={{ maxWidth: 'copyPlus', mx: 'auto' }}>\n      Reach hackers worldwide by listing your event on hackathons.hackclub.com,\n      the first Google search result for \"high school hackathons.\" Your event\n      will also be emailed to a network of high school hackers in your area.\n    </Text>\n    <Link href=\"https://hackathons.hackclub.com\">\n      <Button\n        variant=\"ctaLg\"\n        sx={{\n          backgroundImage: (theme: any) => theme.util.gx('yellow', 'red')\n        }}\n      >\n        Add your hackathon →\n      </Button>\n    </Link>\n  </Container>\n)\n\nconst Cover = () => (\n  <Box\n    sx={{\n      position: 'absolute',\n      bottom: 0,\n      top: 0,\n      left: 0,\n      right: 0,\n      backgroundImage: (t: any) => t.util.gx('slate', 'black'),\n      opacity: 0.7,\n      zIndex: 1\n    }}\n  />\n)\n\nconst Static = ({\n  img = 'https://cloud-ateizv565-hack-club-bot.vercel.app/0screen_shot_2022-07-27_at_2.57.41_pm.png'\n}) => (\n  <Box\n    as=\"section\"\n    id=\"slack\"\n    sx={{\n      position: 'relative',\n      overflow: 'hidden',\n      backgroundImage: `url(${img})`,\n      backgroundSize: 'cover'\n    }}\n  >\n    <Cover />\n    <Content />\n  </Box>\n)\n\nconst Marketing = () => {\n  const hasMounted = useHasMounted()\n  const prefersMotion = usePrefersMotion()\n  if (hasMounted && prefersMotion) {\n    return (\n      <Box\n        as=\"section\"\n        id=\"slack\"\n        sx={{ overflow: 'hidden', position: 'relative' }}\n      >\n        <Box\n          as=\"video\"\n          autoPlay\n          muted\n          loop\n          playsInline\n          poster=\"https://cloud-ateizv565-hack-club-bot.vercel.app/0screen_shot_2022-07-27_at_2.57.41_pm.png\"\n          duration={2000}\n          sx={{\n            position: 'absolute',\n            bottom: 0,\n            top: 0,\n            left: 0,\n            right: 0,\n            height: '100%',\n            zIndex: -1,\n            width: '100vw',\n            objectFit: 'cover'\n          }}\n        >\n          <source\n            src=\"https://cloud-55tm7eveg-hack-club-bot.vercel.app/0screen_recording_2022-07-27_at_2.48.43_pm.mp4\"\n            type=\"video/mp4; codecs=hevc\"\n          />\n          <source\n            src=\"https://cloud-r9u5vfqcv-hack-club-bot.vercel.app/0screen_recording_2022-07-27_at_2.48.43_pm.webm\"\n            type=\"video/webm; codecs=vp9,opus\"\n          />\n          <source\n            src=\"https://cloud-r9u5vfqcv-hack-club-bot.vercel.app/1screen_recording_2022-07-27_at_2.48.43_pm.mp4\"\n            type=\"video/quicktime\"\n          />\n        </Box>\n        <Cover />\n        <Content />\n      </Box>\n    )\n  } else {\n    return <Static />\n  }\n}\n\nexport default Marketing\n"
  },
  {
    "path": "components/hackathons/features/slack.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Button, Box, Container, Heading, Text, Link } from 'theme-ui'\nimport usePrefersMotion from '../../../lib/use-prefers-motion'\nimport useHasMounted from '../../../lib/use-has-mounted'\nimport NextLink from 'next/link'\n\nconst Content = () => (\n  <Container\n    sx={{\n      zIndex: 999,\n      py: 6,\n      color: 'white',\n      'h2,p': { textShadow: 'text' },\n      textAlign: [null, 'center'],\n      position: 'relative',\n      overflow: 'hidden'\n    }}\n  >\n    <Text as=\"p\" variant=\"eyebrow\" sx={{ color: 'white', opacity: 0.75 }}>\n      The Hack Club Community\n    </Text>\n    <Heading as=\"h2\" variant=\"title\">\n      A hackathon organizer's{' '}\n      <Text\n        as=\"span\"\n        sx={{\n          borderRadius: 'default',\n          px: 2,\n          mx: [-2, 0],\n          whiteSpace: 'nowrap',\n          color: 'currentColor',\n          bg: 'green'\n        }}\n      >\n        best friend\n      </Text>\n      .\n    </Heading>\n    <Text as=\"p\" variant=\"lead\" sx={{ maxWidth: 'copyPlus', mx: 'auto' }}>\n      The{' '}\n      <Box\n        as=\"span\"\n        sx={{\n          bg: 'rgb(245, 233, 181, .3)',\n          px: 1,\n          borderRadius: 5\n        }}\n      >\n        <Link\n          href=\"https://hackclub.slack.com/archives/C03QSGGCJN7\"\n          sx={{ textDecoration: 'none', color: 'currentColor' }}\n          target=\"_blank\"\n        >\n          #hackathon-organizers\n        </Link>\n      </Box>{' '}\n      channel is where teenagers around the world ask questions and share their\n      own hackathon organizing experiences—from finding a venue to securing\n      sponsorships to ordering food.\n    </Text>\n    <NextLink href=\"https://slack.hackclub.com\">\n      <Button\n        variant=\"ctaLg\"\n        sx={{\n          background: 'linear-gradient(-132deg, #338eda 14%, #33d6a6 82%)'\n        }}\n      >\n        Join us on Slack →\n      </Button>\n    </NextLink>\n  </Container>\n)\n\nconst Cover = () => (\n  <Box\n    sx={{\n      position: 'absolute',\n      bottom: 0,\n      top: 0,\n      left: 0,\n      right: 0,\n      backgroundImage: (t: any) => t.util.gx('cyan', 'purple'),\n      opacity: 0.825,\n      zIndex: 1\n    }}\n  />\n)\n\nconst Static = ({\n  // screenshot of messages from #hackathon-organizers\n  img = 'https://cloud-8611bon87-hack-club-bot.vercel.app/0screen_shot_2022-08-05_at_2.27.38_pm.png'\n}) => (\n  <Box\n    as=\"section\"\n    id=\"slack\"\n    sx={{\n      position: 'relative',\n      overflow: 'hidden',\n      backgroundImage: `url(${img})`,\n      backgroundSize: 'cover'\n    }}\n  >\n    <Cover />\n    <Content />\n  </Box>\n)\n\nconst Slack = () => {\n  const hasMounted = useHasMounted()\n  const prefersMotion = usePrefersMotion()\n  if (hasMounted && prefersMotion) {\n    return (\n      <Box\n        as=\"section\"\n        id=\"slack\"\n        sx={{ overflow: 'hidden', position: 'relative' }}\n      >\n        <Box\n          as=\"video\"\n          autoPlay\n          muted\n          loop\n          playsInline\n          // screenshot of messages from #hackathon-organizers\n          poster=\"https://cloud-iwkoq2544-hack-club-bot.vercel.app/0screen_shot_2022-07-30_at_9.03.43_am.png\"\n          duration={2000}\n          sx={{\n            position: 'absolute',\n            bottom: 0,\n            top: 0,\n            left: 0,\n            right: 0,\n            height: '100%',\n            zIndex: -1,\n            width: '100vw',\n            objectFit: 'cover'\n          }}\n        >\n          <source\n            src=\"https://cloud-hsc3k1am6-hack-club-bot.vercel.app/0screen_recording_2022-08-03_at_9.50.26_am.mp4\"\n            type=\"video/mp4; codecs=hevc\"\n          />\n          <source\n            src=\"https://cloud-azjxx4vqu-hack-club-bot.vercel.app/0have-finally-figured-it-out-hell-yeah.webm\"\n            type=\"video/webm; codecs=vp9,opus\"\n          />\n          <source\n            src=\"https://cloud-hsc3k1am6-hack-club-bot.vercel.app/0screen_recording_2022-08-03_at_9.50.26_am.mp4\"\n            type=\"video/quicktime\"\n          />\n        </Box>\n        <Cover />\n        <Content />\n      </Box>\n    )\n  } else {\n    return <Static />\n  }\n}\n\nexport default Slack\n"
  },
  {
    "path": "components/hackathons/keep-exploring.tsx",
    "content": "import { Box, Heading, Button, Text, Grid, Container } from 'theme-ui'\nimport Link from 'next/link'\nimport Icon from '../icon'\n\nexport default function KeepExploring() {\n  return (\n    <>\n      <Box\n        sx={{\n          backgroundImage: (t: any) => t.util.gx('orange', 'red'),\n          margin: 'auto',\n          maxWidth: '90%',\n          my: 4,\n          borderRadius: 8,\n          color: 'white',\n          textAlign: 'center',\n          py: 5\n        }}\n      >\n        <Heading\n          as=\"h1\"\n          sx={{\n            fontSize: 6,\n            mb: 3,\n            display: 'flex',\n            justifyContent: 'center',\n            alignContent: 'center'\n          }}\n        >\n          Keep exploring{' '}\n          <Icon\n            glyph=\"explore\"\n            size={70}\n            sx={{ display: ['none', 'flex', 'flex'] }}\n          />\n        </Heading>\n        <Link href=\"https://slack.hackclub.com\">\n          <Button\n            sx={{\n              bg: 'white',\n              color: 'red',\n              mr: [0, 3],\n              mb: [3, 0],\n              fontSize: [2, 3]\n            }}\n          >\n            Meet other hackers\n          </Button>\n        </Link>\n\n        <Link href=\"https://hackathons.hackclub.com\">\n          <Button sx={{ bg: 'white', color: 'red', fontSize: [2, 3] }}>\n            Discover more hackathons\n          </Button>\n        </Link>\n      </Box>\n\n      <Container>\n        <Grid\n          columns={[null, '1fr 1fr']}\n          my={[3, 5]}\n          sx={{ maxWidth: 'copyUltra', mx: 'auto' }}\n        >\n          <Heading as=\"h3\" variant=\"headline\" sx={{ fontSize: [4, 5], mb: 0 }}>\n            Behind the scenes...\n          </Heading>\n          <Text\n            as=\"p\"\n            variant=\"lead\"\n            sx={{ mt: 0, a: { variant: 'styles.a', color: 'blue' } }}\n          >\n            Teenagers organize hackathons like{' '}\n            <a\n              href=\"https://assemble.hackclub.com\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n            >\n              Assemble\n            </a>{' '}\n            &{' '}\n            <a href=\"https://windyhacks.com\" target=\"_blank\" rel=\"noreferrer\">\n              Windy&nbsp;City&nbsp;Hacks\n            </a>\n            . The&nbsp;hack’s the limit.\n          </Text>\n        </Grid>\n      </Container>\n    </>\n  )\n}\n"
  },
  {
    "path": "components/hackathons/landing.tsx",
    "content": "import { Box, Button, Heading, Text, Card } from 'theme-ui'\nimport { Fade } from '../react-reveal-compat'\nimport ScrollHint from '../scroll-hint'\nimport Image from 'next/image'\nimport Icon from '../icon'\n\nexport default function Landing() {\n  return (\n    <>\n      <Slide>\n        <BlueGradientFilter />\n        <Box\n          sx={{\n            position: 'absolute',\n            flexDirection: 'column',\n            justifyContent: 'center',\n            bottom: 140,\n            mx: 'auto',\n            width: '100%'\n          }}\n        >\n          <Box\n            sx={{\n              zIndex: 999,\n              paddingTop: 96\n            }}\n          >\n            <Fade duration={625} bottom>\n              <Card\n                variant=\"translucent\"\n                sx={{\n                  variant: 'layout.container',\n                  maxWidth: [null, 700, 1000],\n                  borderRadius: 'extra',\n                  p: [3, 4],\n                  position: 'relative',\n                  color: 'black'\n                }}\n              >\n                <Button\n                  as=\"a\"\n                  {...({ target: '_blank' } as any)}\n                  variant=\"cta\"\n                  href=\"https://hackathons.hackclub.com\"\n                  sx={{\n                    backgroundImage: (t: any) => t.util.gx('yellow', 'pink'),\n                    position: 'absolute',\n                    right: [0, -3],\n                    top: -3,\n                    transform: [\n                      'translateY(-50%) rotate(8deg)',\n                      'translateX(15%) rotate(12deg)'\n                    ],\n                    fontSize: [2, 3],\n                    display: ['none', 'inline', 'inline']\n                  }}\n                >\n                  Looking for hackathons?{' '}\n                  <Icon glyph=\"external\" size={30} sx={{ pl: 1 }} />\n                </Button>\n\n                <Heading\n                  as=\"h2\"\n                  variant=\"title\"\n                  sx={{\n                    color: 'black',\n                    span: { color: 'white', display: 'block' }\n                  }}\n                >\n                  Welcome to the{' '}\n                  <Text\n                    as=\"span\"\n                    variant=\"ultratitle\"\n                    sx={{\n                      WebkitTextStroke: 'currentColor',\n                      WebkitTextStrokeWidth: '2px',\n                      WebkitTextFillColor: '#33D6A6',\n                      whiteSpace: [null, null, 'nowrap']\n                    }}\n                  >\n                    high school hackathon.\n                  </Text>\n                </Heading>\n                <Text\n                  as=\"p\"\n                  variant=\"subtitle\"\n                  sx={{\n                    mt: 3,\n                    fontSize: [2, 3]\n                  }}\n                >\n                  <strong>\n                    It's not an extracurricular or a club. It's not a class or a\n                    lecture.\n                  </strong>{' '}\n                  Hackathons are a place to build things for fun and meet others\n                  doing the same.\n                </Text>\n              </Card>\n            </Fade>\n          </Box>\n          <br />\n          <br />\n          <ScrollHint />\n        </Box>\n      </Slide>\n    </>\n  )\n}\n\nfunction Slide({ children }) {\n  return (\n    <Box\n      style={{\n        display: 'flex',\n        flexDirection: 'column',\n        justifyContent: 'end',\n        backgroundColor: '#000000',\n        boxShadow: 'inset 0 0 4rem 1rem rgba(0, 0, 0, 0.5)',\n        backgroundPosition: 'center',\n        backgroundSize: 'cover',\n        width: '100%',\n        minHeight: '100vh',\n        position: 'relative'\n      }}\n    >\n      <Image\n        // public/hackathons/assemble.JPG\n        src=\"/hackathons/assemble.JPG\"\n        alt=\"Dark room with a stage and students sitting below\"\n        // placeholder=\"blur\"\n        priority\n        fill\n        sizes=\"100vw\"\n        style={{\n          objectFit: 'cover'\n        }}\n      />\n      {children}\n    </Box>\n  )\n}\n\nfunction BlueGradientFilter() {\n  return (\n    <Box\n      style={{\n        backgroundImage:\n          'linear-gradient(to bottom,rgba(51, 142, 218, .9),rgba(51, 142, 218, 0.7) 35%, rgba(91, 192, 222, 0.2) 100%)',\n        height: '100vh',\n        left: '0',\n        right: '0',\n        position: 'absolute',\n        zIndex: '0'\n      }}\n    ></Box>\n  )\n}\n"
  },
  {
    "path": "components/hackathons/overview.tsx",
    "content": "import { Box, Heading, Container, Text, Grid } from 'theme-ui'\n\nexport default function Overview() {\n  return (\n    <>\n      <Box as=\"section\" sx={{ py: [4, 5], color: 'black' }}>\n        <Container sx={{ width: '95vw' }}>\n          <Heading\n            sx={{\n              fontSize: [36, 50, 50, 50, 48],\n              mb: 3,\n              color: 'purple'\n            }}\n          >\n            A hackathon is a social coding marathon where teenagers{' '}\n            <Highlight>come together</Highlight> to{' '}\n            <Highlight>build projects</Highlight> for a weekend and{' '}\n            <Highlight>share them with the world</Highlight>.\n          </Heading>\n          <Grid columns={[null, null, 2]} gap={[3, 4]}>\n            <Text as=\"p\" variant=\"subtitle\">\n              <Box\n                as=\"span\"\n                sx={{ display: 'block', color: 'blue', fontSize: 28, mb: 2 }}\n              >\n                The best way to learn is by <b>building</b>.\n              </Box>\n              A hackathon is a space that helps give makers everything they need\n              to start building–mentors, collaborators, inspiration, and a goal\n              to work towards. Hackers will leave a hackathon with a project of\n              their own, ready and excited to keep hacking once they get home.\n            </Text>\n            <Text as=\"p\" variant=\"subtitle\">\n              <Box\n                as=\"span\"\n                sx={{ display: 'block', color: 'green', fontSize: 28, mb: 2 }}\n              >\n                We're at our best when we're <b>making</b>.\n              </Box>\n              Hack Club is a global community of thousands of high school\n              makers. We're organizers, coders, hackers, painters, engineers,\n              musicians, writers, volunteers. We make things. We want others to\n              make things too.\n            </Text>\n          </Grid>\n          <Grid columns={[null, null, 2]} gap={[3, 4]} mt={4}>\n            <iframe\n              width=\"100%\"\n              height=\"300px\"\n              src=\"https://www.youtube.com/embed/PnK4gzO6S3Q\"\n              title=\"YouTube video player\"\n              style={{ border: 0 }}\n              allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n              allowFullScreen\n            ></iframe>\n            <iframe\n              width=\"100%\"\n              height=\"300px\"\n              src=\"https://www.youtube.com/embed/KLx4NZZPzMc\"\n              title=\"YouTube video player\"\n              style={{ border: 0 }}\n              allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n              allowFullScreen\n            ></iframe>\n          </Grid>\n        </Container>\n      </Box>\n    </>\n  )\n}\n\nfunction Highlight({ children }) {\n  return (\n    <Text\n      as=\"span\"\n      sx={{\n        bg: 'yellow',\n        borderRadius: 'default',\n        px: 1,\n        color: '#5d114c',\n        lineHeight: '1.3'\n      }}\n    >\n      {children}\n    </Text>\n  )\n}\n"
  },
  {
    "path": "components/hackathons/recap.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Card, Box, Heading, Grid, Text } from 'theme-ui'\nimport Stage from '../stage'\n\nexport default function Recap() {\n  return (\n    <>\n      <Box as=\"header\" sx={{ textAlign: [null, 'center'], pt: [4, 5] }}>\n        <Text as=\"p\" variant=\"eyebrow\">\n          Get started today\n        </Text>\n        <Heading as=\"h2\" variant=\"title\">\n          Resources so you can organize an{' '}\n          <Text\n            as=\"span\"\n            sx={{\n              borderRadius: 'default',\n              px: 2,\n              mx: [-2, 0],\n              bg: 'rgb(91, 255, 205)',\n              color: '#095365',\n              display: 'inline-block',\n              whiteSpace: ['wrap', 'nowrap']\n            }}\n          >\n            amazing\n          </Text>{' '}\n          hackathon.\n        </Heading>\n      </Box>\n      <Grid\n        pt={[3, 4]}\n        pb={[5, 6]}\n        gap={[4, 3, 4]}\n        columns={[1, null, 2]}\n        sx={{\n          textAlign: 'left',\n          '> a, > div': {\n            borderRadius: 'extra',\n            boxShadow: 'elevated',\n            px: [3, null, 4],\n            py: [4, null, 5]\n          },\n          span: {\n            boxShadow:\n              '-2px -2px 6px rgba(255,255,255,0.125), inset 2px 2px 6px rgba(0,0,0,0.1), 2px 2px 8px rgba(0,0,0,0.0625)'\n          },\n          svg: { fill: 'currentColor' }\n        }}\n      >\n        <Card\n          variant=\"interactive\"\n          as=\"a\"\n          href=\"https://slack.hackclub.com\"\n          sx={{\n            background: 'linear-gradient(-32deg, #6f31b7 14%, #fb558e 82%)',\n            color: 'white',\n            svg: { color: '#fb558e' }\n          }}\n        >\n          <Stage\n            icon=\"slack\"\n            color=\"white\"\n            name=\"Slack community\"\n            desc=\"Chat in Slack for support with organizing your hackathon, from finding a venue to marketing your event.\"\n          />\n        </Card>\n        <Card\n          variant=\"interactive\"\n          as=\"a\"\n          href=\"https://hackathons.hackclub.com/\"\n          sx={{\n            background:\n              'linear-gradient(32deg, rgba(51, 142, 218, 0.9) 0%, rgba(51, 214, 166, 0.9) 100%)',\n            color: 'white',\n            svg: { color: 'rgb(51, 142, 218)' }\n          }}\n        >\n          <Stage\n            icon=\"event-check\"\n            color=\"white\"\n            name=\"Marketing\"\n            desc=\"Get your event listed on Google's front page, emailed to nearby teens, and seen by our hackathon calendar's 3K+ monthly users.\"\n          />\n        </Card>\n      </Grid>\n    </>\n  )\n}\n"
  },
  {
    "path": "components/hackathons/scrolling-hackathons.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Ticker from 'react-ticker'\nimport {\n  Box,\n  Card,\n  Text,\n  Heading,\n  Badge,\n  Container,\n  Image,\n  Link\n} from 'theme-ui'\nimport { useState } from 'react'\nimport { keyframes } from '@emotion/react'\nimport Tilt from '../tilt'\nimport PageVisibility from 'react-page-visibility'\nimport { formatAddress } from '../../lib/helpers'\n\nexport default function ScrollingHackathons({\n  eventData,\n  mode,\n  title,\n  ...props\n}) {\n  const [pageIsVisible, setPageIsVisible] = useState(true)\n  const handleVisibilityChange = isVisible => {\n    setPageIsVisible(isVisible)\n  }\n\n  return (\n    <>\n      {title ? (\n        <Container>\n          <Heading\n            sx={{\n              fontSize: [36, 64],\n              color: 'black',\n              textAlign: 'center',\n              maxWidth: ['95vw', '66vw'],\n              margin: 'auto',\n              mt: 4\n            }}\n          >\n            Join other high-schoolers at an upcoming hackathon.\n          </Heading>\n          <Box\n            sx={{\n              maxWidth: ['95vw', '66vw'],\n              margin: 'auto',\n              display: 'flex',\n              justifyContent: 'center',\n              alignItems: 'center',\n              mb: 2\n            }}\n          >\n            <Text sx={{ display: ['none', 'flex'], alignItems: 'center' }}>\n              <Dot />\n            </Text>\n            <Text\n              variant=\"lead\"\n              sx={{ color: 'muted', mr: 2, textAlign: 'center' }}\n            >\n              from{' '}\n              <Link\n                href=\"https://hackathons.hackclub.com\"\n                sx={{ color: 'currentcolor' }}\n              >\n                hackathons.hackclub.com\n              </Link>\n              , last updated just now.\n            </Text>\n          </Box>\n        </Container>\n      ) : (\n        <></>\n      )}\n      <PageVisibility onChange={handleVisibilityChange}>\n        {pageIsVisible && (\n          <Ticker mode={mode || 'string'} {...props}>\n            {() => (\n              <Box as=\"div\" sx={{ display: 'flex', py: 3 }}>\n                {eventData.map((event: any) => (\n                  <EventCard key={event.website} {...event} />\n                ))}\n              </Box>\n            )}\n          </Ticker>\n        )}\n      </PageVisibility>\n    </>\n  )\n}\n\nconst flashing = keyframes({\n  from: { opacity: 0 },\n  '50%': { opacity: 1 },\n  to: { opacity: 0 }\n})\n\nfunction Dot() {\n  return (\n    <Text\n      sx={{\n        bg: 'green',\n        color: 'white',\n        borderRadius: 'circle',\n        display: 'inline-block',\n        lineHeight: 0,\n        width: '.5em',\n        height: '.5em',\n        marginRight: '.4em',\n        marginBottom: '.12em',\n        animationName: `${flashing}`,\n        animationDuration: '3s',\n        animationTimingFunction: 'ease-in-out',\n        animationIterationCount: 'infinite'\n      }}\n    />\n  )\n}\n\ntype EventCardProps = {\n  name: string\n  website: string\n  start: string\n  end: string\n  city?: string\n  state?: string\n  country?: string\n  countryCode?: string\n  banner: string\n  logo?: string\n  virtual?: boolean\n  hybrid?: boolean\n  footer?: React.ReactNode\n}\n\nfunction EventCard({\n  name,\n  website,\n  start,\n  end,\n  city,\n  state,\n  country,\n  countryCode,\n  banner,\n  logo,\n  virtual,\n  hybrid,\n  footer\n}: EventCardProps) {\n  return (\n    <Tilt>\n      <Card\n        as=\"a\"\n        href={website}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        itemScope\n        itemType=\"http://schema.org/Event\"\n        sx={{\n          display: 'flex',\n          flexDirection: 'column',\n          px: 4,\n          mx: 4,\n          borderRadius: 'extra',\n          width: '400px',\n          height: '200px',\n          textDecoration: 'none',\n          color: 'white'\n        }}\n        style={{\n          backgroundImage: `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,0.375) 75%), url('${banner}')`,\n          textAlign: 'center',\n          backgroundSize: 'cover'\n        }}\n      >\n        <Badge\n          as=\"span\"\n          itemType=\"VirtualLocation\"\n          sx={{\n            position: 'absolute',\n            top: 16,\n            right: 16,\n            bg: 'snow',\n            color: virtual ? 'red' : hybrid ? 'orange' : 'blue',\n            fontSize: 'inherit',\n            textShadow: 'none',\n            borderRadius: 5\n          }}\n        >\n          {virtual ? 'Online' : hybrid ? 'Hybrid' : 'In-Person'}\n        </Badge>\n\n        {logo && (\n          <Image\n            src={logo}\n            alt={`${name} logo`}\n            loading=\"lazy\"\n            sx={{\n              minWidth: 64,\n              height: 64,\n              objectFit: 'contain',\n              borderRadius: 'default',\n              mt: 'auto'\n            }}\n          />\n        )}\n\n        <Heading\n          variant=\"headline\"\n          as=\"h3\"\n          itemProp=\"name\"\n          sx={{\n            fontSize: [3, 4],\n            mt: 2,\n            mb: 3,\n            overflowWrap: 'anywhere',\n            width: '100%',\n            color: 'white',\n            textDecoration: 'none'\n          }}\n        >\n          {name}\n        </Heading>\n        <Box\n          as=\"footer\"\n          sx={{\n            mt: 'auto',\n            mb: 0,\n            width: '100%',\n            opacity: 0.875\n          }}\n        >\n          {footer ? (\n            footer\n          ) : (\n            <>\n              <Text\n                as=\"span\"\n                itemProp=\"location\"\n                itemScope\n                itemType=\"http://schema.org/Place\"\n              >\n                {!virtual && (\n                  <span itemProp=\"address\">\n                    {formatAddress(city, state, country, countryCode)}\n                  </span>\n                )}\n              </Text>\n            </>\n          )}\n        </Box>\n        <Box sx={{ display: 'none' }}>\n          <span itemProp=\"eventAttendanceMode\">\n            {virtual\n              ? 'https://schema.org/OnlineEventAttendanceMode'\n              : 'https://schema.org/OfflineEventAttendanceMode'}\n          </span>\n          <span itemProp=\"url\">{website}</span>\n          <span itemProp=\"startDate\" content={start}>\n            {start}\n          </span>\n          <span itemProp=\"endDate\" content={end}>\n            {end}\n          </span>\n        </Box>\n      </Card>\n    </Tilt>\n  )\n}\n"
  },
  {
    "path": "components/icon.tsx",
    "content": "import React from 'react'\nimport Icon from '@hackclub/icons'\n\nexport default function IconComponent(props: any): React.ReactElement {\n  return <Icon {...props} />\n}\n"
  },
  {
    "path": "components/index/cards/beest.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Image, Text } from 'theme-ui'\nimport { keyframes } from '@emotion/react'\n\nconst slideIn = keyframes({\n  from: { transform: 'translateX(0)' },\n  to: { transform: 'translateX(-70%)' }\n})\n\nexport default function Beest() {\n  return (\n    <CardModel\n      color=\"black\"\n      sx={{\n        background: '#A7C1D6',\n        backgroundImage:\n          'url(https://cdn.hackclub.com/019d88c4-02ec-7b2a-844a-02dcb9f02b99/beestbg.webp)',\n        backgroundSize: 'cover',\n        backgroundPosition: 'bottom',\n        borderRadius: '16px',\n        paddingTop: '3em !important',\n        paddingBottom: '3em !important',\n        position: 'relative',\n        overflow: 'hidden'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      visible={true}\n    >\n      <Image\n        alt=\"strandbeest\"\n        src=\"https://cdn.hackclub.com/019d87ae-ead2-7b25-8d39-2730ac702452/beest-sticker.webp\"\n        sx={{\n          position: 'absolute',\n          bottom: '45px',\n          right: '-170px',\n          maxWidth: '21em',\n          zIndex: 1,\n          display: ['none', 'none', 'none', 'block'],\n\n          // Explicitly handle the animation\n          '@supports (animation-timeline: scroll(root))': {\n            animationName: `${slideIn}`,\n            animationTimingFunction: 'ease-in-out',\n            animationFillMode: 'both',\n            animationTimeline: 'scroll(root)',\n            animationRange: 'entry 10% contain 50%'\n          },\n\n          // Firefox Fallback\n          '@supports not (animation-timeline: scroll(root))': {\n            right: '10px',\n            transform: 'none'\n          }\n        }}\n      />\n      <Box\n        sx={{\n          paddingInline: '2em',\n          maxWidth: ['100%', '100%', '100%', '75%'],\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'space-around',\n          height: '100%',\n          zIndex: 2,\n          position: 'relative'\n        }}\n      >\n        <Image\n          alt=\"beest\"\n          src=\"https://cdn.hackclub.com/019d87e3-965d-75b0-83dd-c73469f47911/beest-cropped.png\"\n          sx={{\n            maxWidth: ['80%', '60%', '50%', '45%']\n          }}\n        />\n\n        <Text\n          variant=\"subtitle\"\n          sx={{\n            color: '#4C483C',\n            fontSize: ['18px', '24px'],\n            fontFamily: 'system-ui, sans-serif',\n            fontWeight: '600',\n            lineHeight: 1.3,\n            mb: 5,\n            display: 'block',\n            textAlign: 'left'\n          }}\n        >\n          Spend 40 hours building projects, fly to the Netherlands, build a\n          mechanical animal!\n        </Text>\n        <Box\n          sx={{\n            height: '48px'\n          }}\n        >\n          <Box\n            as=\"a\"\n            href=\"https://beest.hackclub.com/\"\n            sx={{\n              display: 'inline-block',\n              padding: '8px 22px',\n              background: '#c48382',\n              color: '#fff',\n              fontFamily: '\"Courier New\", monospace',\n              fontSize: '14px',\n              fontWeight: 700,\n              letterSpacing: '0.04em',\n              textDecoration: 'none',\n              textTransform: 'uppercase',\n              border: '3px solid #a06a69',\n              borderBottom: '8px solid #8a5857',\n              boxShadow: '4px 4px 0 #3a3832',\n              transition:\n                'transform 0.1s ease, box-shadow 0.1s ease, border-bottom-width 0.1s ease',\n              '&:hover': {\n                transform: 'translate(-1px, -1px)',\n                boxShadow: '5px 5px 0 #3a3832'\n              },\n              '&:active': {\n                transform: 'translateY(5px)',\n                borderBottomWidth: '3px',\n                boxShadow: '2px 1px 0 #3a3832'\n              }\n            }}\n          >\n            Get building!\n          </Box>\n        </Box>\n      </Box>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/button.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Button, Text } from 'theme-ui'\nimport ReactTooltip from '../../react-tooltip'\nimport Icon from '@hackclub/icons'\n\ntype ButtonsProps = {\n  children: React.ReactNode\n  icon?: string\n  customIcon?: React.ReactNode\n  id: string\n  content?: React.ReactNode\n  link?: string\n  primary?: boolean | string\n  overrideColor?: string\n  zIndex?: number\n  sx?: any\n}\n\nexport default function Buttons({\n  children,\n  icon,\n  customIcon,\n  id,\n  content,\n  link,\n  primary,\n  overrideColor,\n  zIndex,\n  sx,\n  ...props\n}: ButtonsProps) {\n  const fontWeight = primary ? '700' : '400'\n\n  return (\n    <Box\n      as=\"button\"\n      sx={{\n        background: 'transparent',\n        border: 'none',\n        color: 'white',\n        zIndex: zIndex || 0,\n        ...sx\n      }}\n      py={1}\n      tabIndex={-1}\n    >\n      <Button\n        data-place=\"right\"\n        data-for={id}\n        data-effect=\"solid\"\n        data-tip\n        sx={{\n          background:\n            (typeof primary === 'string' ? primary : undefined) ||\n            overrideColor ||\n            'rgb(255, 255, 255, 0.3)',\n          borderRadius: '100px',\n          border: 'none',\n          display: 'flex',\n          alignItems: 'center',\n          color: 'inherit',\n          px: '3',\n          py: primary ? '12px' : 2,\n          width: 'fit-content',\n          textTransform: 'none',\n          fontSize: primary ? ['18px', '20px', '22px'] : [1, '16px', '18px'],\n          backdropFilter: 'blur(2px)',\n          fontWeight: fontWeight,\n          zIndex: 999\n        }}\n        as=\"a\"\n        href={link || '/'}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        {...props}\n      >\n        {customIcon ? (\n          <Box sx={{ marginRight: 2, display: 'flex', alignItems: 'center' }}>\n            {customIcon}\n          </Box>\n        ) : (\n          <Icon\n            glyph={(icon || 'plus-fill') as any}\n            size={24}\n            style={{ color: 'inherit', marginRight: 2 }}\n          />\n        )}\n        <Text sx={{ fontFamily: 'Phantom Sans', textAlign: 'left' }}>\n          {children}\n        </Text>\n      </Button>\n      <ReactTooltip\n        id={id}\n        delayShow={150}\n        delayHide={100}\n        delayUpdate={500}\n        clickable={true}\n        getContent={() => {\n          return null\n        }}\n        className=\"custom-tooltip-radius custom-arrow-radius\"\n        arrowRadius=\"2\"\n        tooltipRadius=\"10\"\n      >\n        {content}\n      </ReactTooltip>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/card-model.tsx",
    "content": "import Icon from '../../icon'\nimport { Box, Card, Flex, Image, Link, Text } from 'theme-ui'\nimport ReactTooltip from '../../react-tooltip'\nimport Comma from '../../comma'\n\n/** @jsxImportSource theme-ui */\nconst CardModel = ({\n  background,\n  children,\n  image,\n  image_fit,\n  link,\n  highlight,\n  github_link,\n  badge,\n  text,\n  color,\n  stars,\n  delay,\n  position,\n  filter,\n  visible = false,\n  ...props\n}: {\n  [x: string]: any\n  background?: any\n  children?: any\n  image?: any\n  image_fit?: any\n  link?: any\n  highlight?: any\n  github_link?: any\n  badge?: any\n  text?: any\n  color?: any\n  stars?: any\n  delay?: any\n  position?: any\n  filter?: any\n  visible?: boolean\n}) => (\n  // <Zoom delay={delay}>\n  <Card\n    sx={{\n      position: 'relative',\n      width: '100%',\n      color: color,\n      my: [4, 4],\n      p: '24px',\n      backgroundSize: 'cover',\n      backgroundImage: background ? `url(${background})` : undefined,\n      backgroundPosition: 'center bottom',\n      backgroundRepeat: 'no-repeat',\n      '& p': {\n        fontSize: ['18px', '20px', '22px']\n      },\n      overflow: visible ? 'visible' : 'hidden'\n    }}\n    {...props}\n  >\n    {badge && (\n      <Box\n        sx={{\n          position: ['relative', 'relative', 'relative', 'absolute'],\n          width: 'fit-content',\n          right: [0, 0, 0, 3],\n          top: [0, 0, 0, 3],\n          zIndex: 3,\n          px: '12px',\n          py: '4px',\n          mb: 2,\n          float: [null, 'right', null],\n          // background: 'rgba(255,255,255,0.2)',\n          border: 'rgba(255,255,255,0.2) dashed 1px',\n          borderRadius: 'circle',\n          fontWeight: 'bold'\n        }}\n      >\n        {text || 'Happening now'}\n      </Box>\n    )}\n    {github_link && (\n      <Box>\n        {position === 'bottom' ? (\n          <Flex\n            sx={{\n              position: 'absolute',\n              left: 3,\n              bottom: 2,\n              alignItems: 'center',\n              zIndex: 2\n            }}\n          >\n            <Link\n              href={github_link}\n              sx={{ mr: 2 }}\n              target=\"_blank\"\n              rel=\"noopener\"\n            >\n              <Icon\n                glyph=\"github\"\n                size={42}\n                color=\"#2351fs\"\n                sx={{\n                  color: '#000',\n                  '&:hover': {\n                    color: highlight || color\n                  }\n                }}\n              />\n            </Link>\n            {stars ? (\n              <Text as=\"h2\">\n                ⭐️ <Comma>{stars}</Comma>\n              </Text>\n            ) : (\n              <></>\n            )}\n          </Flex>\n        ) : (\n          <Flex\n            sx={{\n              position: 'absolute',\n              right: 2,\n              top: 2,\n              alignItems: 'center',\n              zIndex: 2\n              // flexDirection: ['column', 'row', 'row']\n            }}\n          >\n            {stars ? (\n              <Text as=\"h2\" sx={{ fontSize: ['20px', '24px', '28px'] }}>\n                ⭐️ <Comma>{stars}</Comma>\n              </Text>\n            ) : (\n              <></>\n            )}\n            <Link href={github_link} sx={{ ml: 2 }}>\n              <Icon\n                glyph=\"github\"\n                size={42}\n                sx={{\n                  color: color,\n                  transition: '0.4s',\n                  '&:hover': {\n                    color: highlight || color\n                  }\n                }}\n              />\n            </Link>\n          </Flex>\n        )}\n      </Box>\n    )}\n    {image && (\n      <Image\n        src={image}\n        draggable=\"false\"\n        sx={{\n          objectFit: image_fit ? image_fit : 'cover',\n          position: 'absolute',\n          width: '100%',\n          height: '100%',\n          ml: ['-24px', '-32px', '-32px', '-32px'],\n          mt: ['-24px', '-32px', '-32px', '-32px'],\n          zIndex: 0,\n          filter\n        }}\n        alt=\"\"\n      />\n    )}\n    {children}\n    <ReactTooltip />\n  </Card>\n  // </Zoom>\n)\n\nexport default CardModel\n"
  },
  {
    "path": "components/index/cards/clubs.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Buttons from './button'\nimport CardModel from './card-model'\nimport { Box, Grid, Flex, Image, Text } from 'theme-ui'\n\nconst Cover = () => (\n  <Box\n    sx={{\n      position: 'absolute',\n      bottom: 0,\n      top: 0,\n      left: 0,\n      right: 0,\n      backgroundImage:\n        'linear-gradient(to bottom,rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.8))',\n      opacity: 0.8,\n      zIndex: 1\n    }}\n  />\n)\n\nexport default function Clubs() {\n  // let [fooRef, setFooRef] = useState('')\n  // let [toggle, setToggle] = useState(true)\n\n  return (\n    <CardModel\n      color=\"white\"\n      sx={{\n        backgroundColor: 'red'\n      }}\n    >\n      <Image\n        src=\"https://cloud-5pdwvchgm-hack-club-bot.vercel.app/05851864a.jpg\"\n        alt=\"Summer Creek Hack Club meeting, February 2020\"\n        sx={{\n          objectFit: 'cover',\n          position: 'absolute',\n          width: '120%',\n          height: '120%',\n          ml: ['-24px', '-32px', '-32px', '-32px'],\n          mt: ['-24px', '-32px', '-32px', '-32px'],\n          zIndex: 0\n        }}\n      />\n      <Cover />\n      <Text\n        variant=\"title\"\n        as=\"h3\"\n        sx={{\n          borderRadius: 'default',\n          px: 2,\n          mx: [-2, 0],\n          whiteSpace: [null, 'nowrap', 'nowrap'],\n          fontSize: ['36px', 4, 5],\n          position: 'relative',\n          zIndex: 2,\n          width: 'fit-content'\n        }}\n      >\n        A Network of 1000+ Coding Clubs\n      </Text>\n      <Grid columns={[1, 1, 2]} sx={{ position: 'relative', zIndex: 2 }}>\n        <Box>\n          <Text\n            as=\"p\"\n            variant=\"subtitle\"\n            sx={{ textShadow: '1px 1px 5px black' }}\n          >\n            Join or start a Hack&nbsp;Club and be part of a network of high\n            quality coding clubs where you learn to code entirely through\n            building things.\n          </Text>\n          <Text\n            as=\"p\"\n            variant=\"subtitle\"\n            sx={{ textShadow: '1px 1px 5px black' }}\n          >\n            You can start with no experience and build and ship a project every\n            meeting.\n          </Text>\n          <Flex sx={{ flexDirection: 'column', mt: [3, 3, 4] }}>\n            <Buttons\n              content=\"we'll support you with meeting content, stickers, and more\"\n              id=\"2\"\n              icon=\"welcome\"\n              link=\"https://apply.hackclub.com/\"\n              primary=\"red\"\n            >\n              Start a club\n            </Buttons>\n          </Flex>\n        </Box>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/fallout.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Text, Image } from 'theme-ui'\nimport CardModel from './card-model'\nimport Buttons from './button'\n\nexport default function Fallout() {\n  return (\n    <CardModel\n      color=\"black\"\n      sx={{\n        borderRadius: '16px',\n        border: '2px solid #61453A',\n        boxShadow: '0 8px 24px rgba(0, 0, 0, 0.1)',\n        position: 'relative',\n        backgroundImage:\n          'url(\"https://cdn.hackclub.com/019ce02f-ed7b-7b9f-bf91-84503a43c535/bg.webp\")',\n        backgroundSize: 'cover',\n        backgroundPosition: 'center'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      visible={true}\n    >\n      <video\n        autoPlay\n        loop\n        muted\n        playsInline\n        style={{\n          width: '300px',\n          maxWidth: '30%',\n          position: 'absolute',\n          bottom: 0,\n          right: 10,\n          height: 'auto',\n          zIndex: 10\n        }}\n      >\n        <source\n          src=\"https://cdn.hackclub.com/019ce0b8-d90a-7f80-866c-185a5ccd74d9/soup.webm\"\n          type=\"video/webm\"\n        />\n      </video>\n\n      <Box\n        sx={{\n          position: 'relative',\n          zIndex: 2,\n          paddingInline: '20px',\n          maxWidth: ['100%', '100%', '100%', '50%'],\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'space-around',\n          height: '100%'\n        }}\n      >\n        <Image\n          src=\"https://cdn.hackclub.com/019cdfd0-6f09-7c8c-bd01-d0349e421c32/logo2.svg\"\n          alt=\"Fallout\"\n          sx={{\n            maxWidth: '400px',\n            marginTop: '20px',\n            width: '100%'\n          }}\n        />\n        <Text\n          variant=\"subtitle\"\n          as=\"p\"\n          sx={{\n            fontFamily: 'system-ui, -apple-system, sans-serif',\n            color: 'white',\n            fontSize: ['20px', '24px'],\n            fontWeight: 600,\n            lineHeight: 1.5,\n            mb: 4,\n            maxWidth: '400px',\n            display: 'block',\n            textAlign: 'left'\n          }}\n        >\n          Build hardware projects, track your hours, then{' '}\n          <span style={{ fontWeight: 700 }}>\n            attend a hardware hackathon in Shenzhen!\n          </span>\n        </Text>\n        <Buttons\n          id=\"fallout-join\"\n          icon=\"enter\"\n          link=\"https://fallout.hackclub.com/?utm_source=site_card\"\n          rel=\"noopener\"\n          sx={{\n            background: '#9F715D',\n            color: '#EDD1B0',\n            border: '2px solid #61453A',\n            borderRadius: '100px',\n            px: 3,\n            py: '10px',\n            fontFamily: 'system-ui, -apple-system, sans-serif',\n            fontWeight: '600'\n          }}\n        >\n          Start Building\n        </Buttons>\n      </Box>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/flavortown.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Flex, Grid, Image, Text } from 'theme-ui'\nimport Buttons from './button'\n\nexport default function Flavortown() {\n  return (\n    <CardModel\n      color=\"white\"\n      sx={{\n        background:\n          'url(\"https://flavortown.hackclub.com/assets/mask/project-card-bd9acd6b.webp\"), linear-gradient(to top, rgba(123,73,66,0.9), rgba(123,73,66,0.9))',\n        borderRadius: '24px',\n        boxShadow: '0 8px 24px rgba(0, 0, 0, 0.1)'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      visible={true}\n    >\n      <Grid\n        columns={[1, 1, '1.5fr 1fr']}\n        sx={{\n          position: 'relative',\n          alignItems: 'center',\n          zIndex: 2,\n          paddingInline: '50px'\n        }}\n      >\n        <Box sx={{ textAlign: ['left', 'left', 'left'] }}>\n          <Image\n            src=\"https://cdn.hackclub.com/019c76b8-4f54-7de9-ae34-90b2190c2440/TeQ27w.png\"\n            alt=\"Flavortown Text Logo\"\n            sx={{\n              height: '70px'\n            }}\n          />\n\n          <Text\n            variant=\"subtitle\"\n            sx={{\n              color: '#f0dcc8ff',\n              fontSize: ['18px', '20px'],\n              fontWeight: 500,\n              lineHeight: 1.5,\n              mb: 3,\n              display: 'block',\n              textAlign: 'left'\n            }}\n          >\n            Make a website, game, hardware project, or anything your heart\n            desires, share your project for others to experience and to get\n            cookies - our virtual currency, and exchange your cookies for iPads,\n            MacBooks, Raspberry Pis and so many more things - all for free!\n          </Text>\n          <Buttons\n            id=\"join-flavortown\"\n            icon=\"enter\"\n            link=\"https://flavortown.hackclub.com/?ref=site-1\"\n            primary=\"#D1525B\"\n            color=\"white\"\n          >\n            Start Cooking\n          </Buttons>\n        </Box>\n\n        <Flex sx={{ justifyContent: 'center', alignItems: 'center' }}>\n          <Box\n            sx={{\n              position: 'relative',\n              height: '200px',\n              width: '100%',\n              display: ['none', 'none', 'block', 'block'],\n              '@keyframes breathe': {\n                '0%': { transform: 'scale(1)' },\n                '50%': { transform: 'scale(1.15) rotate(10deg)' },\n                '100%': { transform: 'scale(1)' }\n              }\n            }}\n          >\n            <Image\n              alt=\"Flavortown Logo\"\n              src=\"https://cdn.hackclub.com/019c76b5-b513-7f5a-8718-bea38d4abb80/DM6Ztg.avif\"\n              sx={{\n                position: 'absolute',\n                top: '-150px',\n                right: '-40px',\n                width: '250px',\n                rotate: '-15deg',\n                animation: 'breathe infinite 3.5s ease',\n                '@media (prefers-reduced-motion)': {\n                  animation: 'none'\n                }\n              }}\n            />\n            <Image\n              alt=\"Flavortown Sticker\"\n              src=\"https://cdn.hackclub.com/019c76b6-2fc4-7620-9432-8645249d6ab6/9Ftvlg.png\"\n              sx={{\n                position: 'absolute',\n                bottom: '-80px',\n                right: '80px',\n                width: '170px',\n                animation: 'breathe infinite 4s 1s ease-in-out',\n                '@media (prefers-reduced-motion)': {\n                  animation: 'none'\n                },\n                rotate: '5deg'\n              }}\n            />\n          </Box>\n        </Flex>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/hackathons.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Flex, Grid, Image, Link, Text } from 'theme-ui'\nimport Buttons from './button'\nimport Dot from '../../dot'\nimport { formatDate } from '../../../lib/dates'\n\nconst Cover = () => (\n  <Box\n    sx={{\n      position: 'absolute',\n      bottom: 0,\n      top: 0,\n      left: 0,\n      right: 0,\n      backgroundImage:\n        'linear-gradient(to bottom,rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6))',\n      opacity: 0.8,\n      zIndex: 1\n    }}\n  />\n)\n\nexport default function Hackathons({ data, stars }) {\n  return (\n    <CardModel\n      color=\"white\"\n      sx={{\n        backgroundColor: 'dark'\n      }}\n      stars={stars}\n      github_link=\"https://github.com/hackclub/hackathons\"\n      highlight=\"blue\"\n    >\n      <Image\n        src=\"https://cloud-issl87d62-hack-club-bot.vercel.app/0bmc_1823.jpg\"\n        sx={{\n          objectFit: 'cover',\n          position: 'absolute',\n          width: '100%',\n          height: '100%',\n          ml: -4,\n          mt: -4,\n          zIndex: 0\n        }}\n        alt=\"A crowd of hackers cheering at Epoch\"\n      />\n      <Cover />\n      <Text\n        variant=\"title\"\n        as=\"h3\"\n        sx={{ fontSize: ['36px', 4, 5], position: 'relative', zIndex: 2 }}\n      >\n        High School Hackathons\n      </Text>\n      <Grid\n        columns={[1, 1, 2]}\n        sx={{ position: 'relative', zIndex: 2, minHeight: '200px' }}\n      >\n        <Box>\n          <Text as=\"p\" variant=\"subtitle\">\n            We support the largest network of high school hackathons in the\n            world. From an online community of organizers to free stickers and\n            more!{' '}\n          </Text>\n          <Flex sx={{ flexDirection: 'column', mt: [3, 3, 4] }}>\n            <Buttons\n              id=\"19\"\n              icon=\"event-code\"\n              link=\"https://hackathons.hackclub.com\"\n              primary=\"blue\"\n            >\n              Attend a hackathon\n            </Buttons>\n            <Buttons\n              // content=\"learn more about available resources\"\n              id=\"20\"\n              icon=\"bolt\"\n              link=\"/hackathons\"\n            >\n              Organizer? Learn more.\n            </Buttons>\n          </Flex>\n        </Box>\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'flex-end',\n            alignSelf: 'flex-end',\n            position: ['absolute', 'absolute', 'relative'],\n            right: 0,\n            bottom: 0,\n            display: ['none', 'none', 'block']\n          }}\n        >\n          <Box sx={{ width: 'fit-content', float: 'right' }}>\n            <Text\n              as=\"h4\"\n              sx={{ fontSize: 'small', width: '100%', textAlign: 'center' }}\n            >\n              <Dot /> Upcoming Hackathons\n            </Text>\n            {data.slice(0, 5).map(data => (\n              <Box\n                sx={{\n                  zIndex: '1',\n                  // bg: 'rgb(255, 255, 255, 0.3)',\n                  color: 'white',\n                  textDecoration: 'none',\n                  fontWeight: 'normal',\n                  width: 'fit-content',\n                  display: 'flex',\n                  alignItems: 'center',\n                  fontSize: 'small',\n                  my: 2,\n                  a: {\n                    textDecoration: 'none',\n                    color: 'white'\n                  }\n                }}\n                key={data.name}\n              >\n                {data.logo && (\n                  <Box\n                    sx={{\n                      backgroundImage: `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,0.375) 75%), url('${data.banner}')`,\n                      display: 'flex',\n                      alignItems: 'center',\n                      justifyContent: 'center',\n                      borderRadius: 'circle',\n                      height: ['20px', '25px', '30px'],\n                      width: ['20px', '25px', '30px'],\n                      mr: '10px'\n                    }}\n                  >\n                    <Image\n                      src={data.logo}\n                      alt={`${data.name} logo`}\n                      loading=\"lazy\"\n                      sx={{\n                        height: '70%',\n                        width: '70%',\n                        objectFit: 'contain',\n                        borderRadius: 'default'\n                      }}\n                    />\n                  </Box>\n                )}\n                <Flex sx={{ flexDirection: 'column' }}>\n                  <Link\n                    href={data.website}\n                    as=\"a\"\n                    target=\"_blank\"\n                    sx={{\n                      color: 'inherit',\n                      textDecoration: 'none',\n                      fontWeight: 'bold'\n                    }}\n                  >\n                    {data.name}\n                  </Link>\n                  <Text\n                    as=\"h6\"\n                    sx={{\n                      fontWeight: '400',\n                      fontSize: '0.8em',\n                      color: 'sunken'\n                    }}\n                  >\n                    {formatDate({ format: 'mmmm d', date: data.start })}\n                  </Text>\n                </Flex>\n              </Box>\n            ))}\n          </Box>\n        </Flex>\n      </Grid>\n      <Flex\n        sx={{\n          flexDirection: 'row',\n          position: 'relative',\n          alignItems: 'center',\n          mt: 2,\n          justifyContent: 'space-between',\n          display: ['block', 'block', 'none']\n        }}\n      >\n        <Text sx={{ fontSize: 'small', color: 'white' }}>\n          Upcoming Hackathons:\n        </Text>\n        <Flex sx={{ gap: '10px' }}>\n          {data.slice(0, 2).map(data => (\n            <Box\n              sx={{\n                zIndex: '1',\n                // bg: 'rgb(255, 255, 255, 0.3)',\n                color: 'white',\n                textDecoration: 'none',\n                fontWeight: 'normal',\n                width: 'fit-content',\n                display: 'flex',\n                alignItems: 'center',\n                fontSize: 'small',\n                my: 2,\n                a: {\n                  textDecoration: 'none',\n                  color: 'white'\n                }\n              }}\n              key={data.name}\n            >\n              {data.logo && (\n                <Box\n                  sx={{\n                    backgroundImage: `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,0.375) 75%), url('${data.banner}')`,\n                    display: 'flex',\n                    alignItems: 'center',\n                    justifyContent: 'center',\n                    borderRadius: 'circle',\n                    height: ['20px', '25px', '30px'],\n                    width: ['20px', '25px', '30px'],\n                    mr: '5px'\n                  }}\n                >\n                  <Image\n                    src={data.logo}\n                    alt={`${data.name} logo`}\n                    loading=\"lazy\"\n                    sx={{\n                      height: '70%',\n                      width: '70%',\n                      objectFit: 'contain',\n                      borderRadius: 'default',\n                      fontSize: 'small'\n                    }}\n                  />\n                </Box>\n              )}\n              <Link href={data.website}>{data.name}</Link>\n            </Box>\n          ))}\n        </Flex>\n      </Flex>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/haxidraw.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Flex, Grid, Text } from 'theme-ui'\nimport Buttons from './button'\n\nexport default function Haxidraw({ stars }) {\n  return (\n    <CardModel\n      github_link=\"https://github.com/hackclub/blot/\"\n      color=\"white\"\n      sx={{\n        backgroundSize: 'cover',\n        backgroundColor: '#95C9E5',\n        backgroundImage: `linear-gradient(120deg, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.9) 30%, rgba(0, 0, 0, 0.4) 70%), url('https://cloud-1tnl6uqvw-hack-club-bot.vercel.app/0image.png')`\n      }}\n      position={[null, 'bottom', 'bottom']}\n      highlight=\"#2b27f8d9\"\n      filter=\"brightness(0.8)\"\n      stars={stars}\n    >\n      <Text variant=\"title\" as=\"h3\" sx={{ fontSize: ['36px', 4, 5] }}>\n        Blot\n      </Text>\n      <Grid columns={[1, 2]}>\n        <Box>\n          <Text\n            as=\"p\"\n            variant=\"subtitle\"\n            sx={{ zIndex: 2, position: 'relative' }}\n          >\n            Blot is an open source drawing machine and online editor, designed\n            to be a fun and beginner friendly introduction to digital\n            fabrication and generative art.\n          </Text>\n        </Box>\n        <Box>\n          <Flex sx={{ flexDirection: 'column', mt: [3, 3, 4] }}>\n            <Buttons\n              id=\"51\"\n              icon=\"align-left\"\n              link=\"https://blot.hackclub.com\"\n              primary=\"rgba(255, 255, 255, 0.9)\"\n              sx={{ color: 'black' }}\n            >\n              Learn more\n            </Buttons>\n            <Buttons\n              id=\"52\"\n              icon=\"code\"\n              link=\"https://blot.hackclub.com/editor\"\n              primary=\"rgba(255, 255, 255, 0.9)\"\n              sx={{ color: 'black' }}\n            >\n              Create something in the editor\n            </Buttons>\n            <Buttons\n              id=\"54\"\n              icon=\"slack\"\n              link=\"https://slack.hackclub.com\"\n              overrideColor=\"rgba(255, 255, 255, 0.7)\"\n              sx={{ color: 'black' }}\n            >\n              Share your creations and chat on Slack\n            </Buttons>\n          </Flex>\n        </Box>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/hcb.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Grid, Heading, Text } from 'theme-ui'\nimport Buttons from './button'\n\nexport default function Bank({ data }) {\n  return (\n    <Box sx={{ position: 'relative' }}>\n      <CardModel\n        color=\"white\"\n        sx={{\n          minHeight: ['300px', '400px', '380px'],\n          backgroundColor: 'darkless',\n          backgroundImage: `linear-gradient(to bottom,rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)), url('/home/hackathons-bg.webp')`,\n          backgroundSize: 'cover',\n          backgroundPosition: '40%',\n          color: 'snow'\n        }}\n        badge\n        text={data[0] === 'error' ? 'The coolest money thing' : data[0]}\n      >\n        <Heading\n          variant=\"title\"\n          sx={{ color: 'red', fontSize: ['36px', 4, 5], mt: [0, 3] }}\n        >\n          HCB\n        </Heading>\n        <Grid columns={[1, '1.3fr 1fr', 2]}>\n          <Box>\n            <Text as=\"p\" variant=\"subtitle\">\n              Become a 501(c)3 nonprofit and join 700+ teams using HCB to run\n              world-class events.\n            </Text>\n            <Text as=\"p\" variant=\"subtitle\">\n              This platform is built and maintained by the Hack&nbsp;Club team.\n            </Text>\n            <Buttons\n              id=\"27\"\n              icon=\"bank-account\"\n              link=\"/hcb\"\n              primary=\"red\"\n              sx={{ mt: [0, 2, 3] }}\n            >\n              Start fundraising!\n            </Buttons>\n            <Box\n              sx={{\n                position: 'relative',\n                width: '100%',\n                display: [null, 'none', 'none'],\n                mb: '-50px',\n                mt: 3\n              }}\n            >\n              <Box\n                sx={{\n                  width: '100%',\n                  height: '250px',\n                  position: 'relative',\n                  display: 'block',\n                  textAlign: 'center',\n                  '&:before': {\n                    content: '\"\"',\n                    backgroundImage: 'url(/home/hcb-mobile.webp)', // image doesn't exist\n                    backgroundSize: '100%',\n                    backgroundRepeat: 'no-repeat',\n                    width: '100%',\n                    height: '100%',\n                    marginX: 'auto',\n                    display: 'block'\n                  }\n                }}\n              >\n                {/* <Box\n                  sx={{\n                    backgroundImage: 'url(/home/hcb-screen.webp)',\n                    zIndex: 2,\n                    position: 'absolute',\n                    margin: 'auto',\n                    top: '8px',\n                    left: '35px',\n                    width: '75%',\n                    height: '70%',\n                    backgroundSize: '100%',\n                    backgroundRepeat: 'no-repeat'\n                  }}\n                ></Box> */}\n              </Box>\n            </Box>\n          </Box>\n        </Grid>\n      </CardModel>\n      <Box\n        sx={{\n          position: 'absolute',\n          right: [0, '-120px', '-30px'],\n          bottom: [0, '-30px', '-50px'],\n          display: ['none', 'block', 'block'],\n          zIndex: 3\n        }}\n      >\n        {' '}\n        <Box\n          sx={{\n            width: ['250px', '500px'],\n            height: ['180px', '360px'],\n            position: 'relative',\n            display: 'block',\n            textAlign: 'center',\n            '&:before': {\n              content: '\"\"',\n              backgroundImage: 'url(/home/hcb.webp)',\n              backgroundSize: '100%',\n              backgroundRepeat: 'no-repeat',\n              width: '100%',\n              height: '100%',\n              marginX: 'auto',\n              display: 'block'\n            }\n          }}\n        >\n          {/* <Box\n            sx={{\n              backgroundImage: 'url(/home/hcb-screen.webp)',\n              zIndex: 2,\n              position: 'absolute',\n              margin: 'auto',\n              top: '13px',\n              left: '70px',\n              width: '75%',\n              height: '80%',\n              backgroundSize: '100%',\n              backgroundRepeat: 'no-repeat'\n            }}\n          ></Box> */}\n        </Box>\n      </Box>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/hctg.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Image, Text } from 'theme-ui'\n\nexport default function HackClubTheGame() {\n  return (\n    <CardModel\n      color=\"black\"\n      sx={{\n        background: '#ffd966',\n        borderRadius: '16px',\n        position: 'relative',\n        overflow: 'hidden',\n        paddingTop: '4em !important',\n        paddingBottom: '4em !important'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      visible={true}\n    >\n      <Image\n        alt=\"sleepy orph\"\n        src=\"https://raw.githubusercontent.com/CKacha/HCTG-Photos/main/Sleepy-Orpheus.png\"\n        sx={{\n          position: 'absolute',\n          top: '10%',\n          right: '2.5%',\n          height: '75%',\n          width: 'auto',\n          objectFit: 'contain',\n          display: ['none', 'none', 'none', 'block'],\n          zIndex: 1\n        }}\n      />\n      <Box\n        sx={{\n          position: 'relative',\n          zIndex: 2,\n          paddingInline: '50px',\n          maxWidth: ['100%', '100%', '100%', '75%'],\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'space-around',\n          height: '100%'\n        }}\n      >\n        <Text\n          as=\"h1\"\n          sx={{\n            fontFamily: 'Helvetica, Arial, sans-serif',\n            fontSize: ['48px', '64px'],\n            fontWeight: 'bold',\n            display: 'block',\n            textAlign: 'left',\n            textDecoration: 'none',\n            color: '#000',\n            lineHeight: '1.2',\n            letterSpacing: '-6px'\n          }}\n        >\n          Hack Club: The Game\n        </Text>\n\n        <Text\n          variant=\"subtitle\"\n          sx={{\n            fontFamily: 'Helvetica, Arial, sans-serif',\n            color: 'black',\n            fontSize: ['18px', '24px'],\n            fontWeight: 'normal',\n            lineHeight: 1.5,\n            mb: 3,\n            display: 'block',\n            textAlign: 'left',\n            letterSpacing: '-0.05em'\n          }}\n        >\n          Build any type of project you want! Submit them, and eventually you'll\n          be able to compete in a scavenger hunt adventure game across\n          Manhattan!\n        </Text>\n        <Box\n          as=\"a\"\n          href=\"https://game.hackclub.com/\"\n          sx={{\n            display: 'inline-flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            gap: '8px',\n            background: '#000',\n            fontFamily: 'Helvetica',\n            letterSpacing: '-0.03em',\n            color: 'white',\n            border: 'none',\n            padding: '12px 32px',\n            fontWeight: 'bold',\n            cursor: 'pointer',\n            fontSize: '16px',\n            textDecoration: 'none',\n            width: 'fit-content',\n            alignSelf: 'flex-start',\n            transition: 'background 0.2s ease, color 0.2s ease',\n            '&:hover': {\n              background: '#fff',\n              color: '#000'\n            },\n            '&:active': {\n              transform: 'translateY(0) scale(1)'\n            }\n          }}\n        >\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"18\"\n            height=\"18\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth=\"2\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          >\n            <path d=\"M5 12h14\" />\n            <path d=\"m12 5 7 7-7 7\" />\n          </svg>\n          Join the Game!\n        </Box>\n      </Box>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/horizons.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Text, Box, Image, Button } from 'theme-ui'\nimport localFont from 'next/font/local'\n\nconst hypebuzz = localFont({\n  src: '../../../public/horizons/Hypebuzz.otf'\n})\nexport default function Horizons() {\n  return (\n    <CardModel\n      color=\"black\"\n      sx={{\n        background:\n          'url(https://cdn.hackclub.com/019da274-78f6-7f66-b869-df642820ac5d/horizons-bg.jpg) no-repeat center center',\n        backgroundSize: 'cover'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      visible={true}\n    >\n      <Box\n        sx={{\n          display: 'flex',\n          flexDirection: 'column',\n          alignItems: 'center',\n          width: '100%',\n          zIndex: 2,\n          gap: 2\n        }}\n      >\n        <Box\n          sx={{\n            position: 'relative',\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            textAlign: 'center',\n            gap: '16px',\n            maxWidth: '900px'\n          }}\n        >\n          <Image\n            src=\"https://cdn.hackclub.com/019da274-549f-7437-80ca-c4583c485402/horizons-title.svg\"\n            alt=\"Horizons\"\n            sx={{\n              maxWidth: '100%',\n              top: '-20px',\n              position: 'relative',\n              mt: 3\n            }}\n          />\n        </Box>\n        <Box\n          sx={{\n            position: 'relative',\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            textAlign: 'center',\n            gap: '16px',\n            mt: 2,\n            mb: 2\n          }}\n        >\n          <Text\n            className={hypebuzz.className}\n            sx={{ color: '#000000', fontSize: '1.3rem' }}\n          >\n            HIGH SCHOOL FLAGSHIP HACKATHONS ACROSS THE WORLD\n          </Text>\n        </Box>\n        <Box\n          sx={{\n            display: 'flex',\n            flexDirection: 'column',\n            gap: '6px',\n            width: ['calc(100% + 48px)', 'calc(100% + 65px)'],\n            ml: ['-24px', '-32.5px'],\n            mr: ['-24px', '-32.5px'],\n            mt: '6px'\n          }}\n        >\n          {[\n            { color: '#ffa936', height: '15px' },\n            { color: '#f86d95', height: '15px' },\n            { color: '#46467c', height: '15px' }\n          ].map(({ color, height }) => (\n            <Box\n              key={color}\n              sx={{ width: '100%', background: color, height }}\n            />\n          ))}\n        </Box>\n        <Box\n          sx={{\n            position: 'relative',\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            textAlign: 'center',\n            gap: '16px',\n            maxWidth: '700px',\n            mt: 4,\n            whiteSpace: 'nowrap'\n          }}\n        >\n          <a\n            href=\"https://horizons.hackclub.com/\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            <Button\n              sx={{\n                background: '#fba74d',\n                color: '#000000',\n                border: '2px solid #000000',\n                borderRadius: '10px',\n                padding: '10px 20px'\n              }}\n            >\n              CLICK HERE TO LEARN MORE!\n            </Button>\n          </a>\n        </Box>\n      </Box>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/jackpot.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Text, Image, Grid, Flex } from 'theme-ui'\nimport CardModel from './card-model'\n\nexport default function Jackpot() {\n  return (\n    <CardModel\n      color=\"white\"\n      sx={{\n        borderRadius: '16px',\n        boxShadow: '0 8px 24px rgba(0, 0, 0, 0.2)',\n        position: 'relative',\n        display: 'flex',\n        alignItems: 'center',\n        height: ['280px', '320px', '358.2px'],\n        backgroundColor: '#5F1212',\n        backgroundImage:\n          'url(\"https://cdn.hackclub.com/019d0244-1c96-79a6-925f-254d6da371c3/banner_1.png\")',\n        backgroundSize: 'cover',\n        backgroundPosition: '40% center'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      visible={false}\n    >\n      <Grid\n        columns={[1, 1, '1.5fr 1fr']}\n        sx={{\n          position: 'relative',\n          alignItems: 'center',\n          zIndex: 2,\n          paddingInline: '20px'\n        }}\n      >\n        <Box\n          sx={{\n            position: 'relative',\n            zIndex: 2,\n            display: 'flex',\n            flexDirection: 'column',\n            justifyContent: 'flex-start'\n          }}\n        >\n          <Image\n            src=\"https://cdn.hackclub.com/019d01dc-d676-746d-9fd9-794df0b50399/logo_draft.png\"\n            alt=\"Jackpot\"\n            sx={{\n              maxWidth: ['235px', '255px', '275px'],\n              height: ['76px', '86px', '96px'],\n              marginTop: '0px',\n              width: 'auto',\n              objectFit: 'contain'\n            }}\n          />\n          <Text\n            variant=\"subtitle\"\n            as=\"p\"\n            sx={{\n              fontFamily: 'system-ui, -apple-system, sans-serif',\n              color: 'white',\n              fontSize: ['19px', '21px', '23px'],\n              fontWeight: 600,\n              lineHeight: 1.5,\n              mb: 2,\n              maxWidth: '400px',\n              display: 'block',\n              textAlign: 'left'\n            }}\n          >\n            No hours required...enjoy a weekend hackathon in Las Vegas!\n          </Text>\n          <Box\n            as=\"a\"\n            href=\"https://jackpot.hackclub.com/?utm_source=site_card\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            sx={{\n              display: 'inline-block',\n              width: 'fit-content'\n            }}\n          >\n            <Image\n              src=\"https://cdn.hackclub.com/019d0234-3adc-7ef6-9b62-7a6a96fc42da/join_button.png\"\n              alt=\"Join Now\"\n              sx={{\n                height: ['80px', '96px', '112px'],\n                width: 'auto',\n                '&:hover': {\n                  opacity: 0.9\n                }\n              }}\n            />\n          </Box>\n        </Box>\n        <Flex sx={{ justifyContent: 'center', alignItems: 'center' }}>\n          <Box\n            sx={{\n              position: 'relative',\n              height: '200px',\n              width: '100%',\n              display: ['none', 'none', 'block', 'block'],\n              '@keyframes breathe': {\n                '0%': { transform: 'scale(1)' },\n                '50%': { transform: 'scale(1.01) rotate(3deg)' },\n                '100%': { transform: 'scale(1)' }\n              }\n            }}\n          >\n            <Image\n              alt=\"Alice\"\n              src=\"https://cdn.hackclub.com/019c7b7a-1faf-7420-9657-6e7e4323258d/alice_face.png\"\n              sx={{\n                position: 'absolute',\n                top: ['-1px', '-2px', '-3px'],\n                left: '90%',\n                marginLeft: ['-45px', '-48px', '-51px'],\n                width: ['110px', '118px', '126px'],\n                rotate: '-10deg',\n                animation: 'breathe infinite 3.5s ease',\n                '@media (prefers-reduced-motion)': {\n                  animation: 'none'\n                }\n              }}\n            />\n            <Image\n              alt=\"Heidi\"\n              src=\"https://cdn.hackclub.com/019d0234-383a-7aad-be70-ae8b12ef26d3/heidi_card_brand.png\"\n              sx={{\n                position: 'absolute',\n                bottom: ['-1px', '-2px', '-3px'],\n                left: '50%',\n                marginLeft: ['-39px', '-42px', '-45px'],\n                width: ['78px', '84px', '90px'],\n                animation: 'breathe infinite 4s 1s ease-in-out',\n                '@media (prefers-reduced-motion)': {\n                  animation: 'none'\n                },\n                rotate: '2deg'\n              }}\n            />\n          </Box>\n        </Flex>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/macondo.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Text, Image } from 'theme-ui'\nimport CardModel from './card-model'\nimport Buttons from './button'\n\nexport default function Macondo() {\n  return (\n    <CardModel\n      color=\"#EACFB3\"\n      sx={{\n        borderRadius: '16px',\n        boxShadow: '0 8px 24px rgba(0, 0, 0, 0.2)',\n        position: 'relative',\n        backgroundColor: '#684D3A',\n        backgroundImage:\n          'url(\"https://cdn.hackclub.com/019dc218-1e6a-7562-800c-d79da12bc5d1/background_logo_2.png\")',\n        backgroundSize: 'cover',\n        backgroundPosition: 'center'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      visible={true}\n    >\n      <Image\n        src=\"https://cdn.hackclub.com/019dc21b-d702-72d2-9930-487a4f7cfd9a/android-chrome-512x512.webp\"\n        alt=\"Macondo\"\n        sx={{\n          width: '300px',\n          maxWidth: '30%',\n          position: 'absolute',\n          bottom: 10,\n          right: 10,\n          height: 'auto',\n          zIndex: 10\n        }}\n      />\n\n      <Box\n        sx={{\n          position: 'relative',\n          zIndex: 2,\n          paddingInline: '20px',\n          maxWidth: ['100%', '100%', '100%', '50%'],\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'space-around',\n          height: '100%'\n        }}\n      >\n        <Image\n          src=\"https://cdn.hackclub.com/019dc215-69df-7087-9b63-73db5a7126fd/logo_macondo.png\"\n          alt=\"Macondo\"\n          sx={{\n            maxWidth: '400px',\n            marginTop: '20px',\n            width: '100%'\n          }}\n        />\n        <Text\n          variant=\"subtitle\"\n          as=\"p\"\n          sx={{\n            fontFamily: 'system-ui, -apple-system, sans-serif',\n            color: '#EACFB3',\n            fontSize: ['20px', '24px'],\n            fontWeight: 600,\n            lineHeight: 1.5,\n            mb: 4,\n            maxWidth: '500px',\n            display: 'block',\n            textAlign: 'left'\n          }}\n        >\n          Build software or hardware projects (with up to $1k in funding for\n          hardware), win prizes, and{' '}\n          <span style={{ fontWeight: 700 }}>\n            fly to Bogotá, Colombia for a hackathon!\n          </span>\n        </Text>\n        <Buttons\n          id=\"macondo-join\"\n          icon=\"enter\"\n          link=\"https://macondo.hackclub.com/?utm_source=site_card\"\n          rel=\"noopener\"\n          sx={{\n            background: '#EACFB3',\n            color: '#684D3A',\n            border: '2px solid #4A3525',\n            borderRadius: '100px',\n            px: 3,\n            py: '10px',\n            fontFamily: 'system-ui, -apple-system, sans-serif',\n            fontWeight: '600'\n          }}\n        >\n          Start Building\n        </Buttons>\n      </Box>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/mailing-list.tsx",
    "content": "import Icon from '@hackclub/icons'\nimport { useEffect, useRef, useState } from 'react'\nimport { Box, Button, Card, Flex, Grid, Input, Link, Text } from 'theme-ui'\nimport { format, parse } from 'date-fns'\nimport BGImg from '../../background-image'\nimport background from '../../../public/home/footer.png'\nimport MailCard from '../../mail-card'\n\nconst Loading = () => (\n  <Box\n    sx={{\n      display: 'flex',\n      justifyContent: 'center',\n      alignItems: 'center',\n      border: '2px solid #f3f3f3',\n      borderTop: '2px solid #ec3750',\n      borderRadius: '50%',\n      width: '16px',\n      height: '16px',\n      animation: 'spin 2s linear infinite',\n      mr: '5px',\n      '@keyframes spin': {\n        '0%': { transform: 'rotate(0deg)' },\n        '100%': { transform: 'rotate(360deg)' }\n      }\n    }}\n  ></Box>\n)\n\nconst MailingList = () => {\n  const [submitting, setSubmitting] = useState(false)\n  const [submitted, setSubmitted] = useState(false)\n  const [data, setData] = useState({ finalHtml: [], names: [] })\n  const formRef = useRef(null)\n\n  const handleSubmit = async e => {\n    e.preventDefault()\n    setSubmitting(true)\n\n    const res = await fetch('/api/mailing-list', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        name: e.target.name.value,\n        email: e.target.email.value\n      })\n    })\n\n    formRef.current.reset()\n\n    if (res.ok) {\n      setSubmitted(true)\n    }\n    setSubmitting(false)\n  }\n\n  // This lovely concoction of JavaScript basically fetches the last two newsletters from the GitHub repo,\n  // converts them to HTML, gets rid of those HTML tags, the sets all of that as the state of the component.\n  // Then, It makes a second fetch request to get the filename, so that can be used to determine the link.\n  // After that, it removes the file extension, so we can use that as the date.\n  // Finally, it sets the state of data to the final HTML and the names of the files, so we can map that later on!\n\n  useEffect(() => {\n    Promise.all([\n      fetch(\n        'https://api.github.com/repos/hackclub/leaders-newsletter/contents/updates'\n      )\n        .then(response => response.json())\n        .then(data => data.sort((a, b) => b.name.localeCompare(a.name))) // Makes sure we only get the latest two newsletters\n        .then(data => data.slice(0, 2))\n        .then(data => Promise.all(data.map(item => fetch(item.download_url)))) // Makes a separate fetch request for the content of each newsletter\n        .then(responses =>\n          Promise.all(responses.map(response => response.text()))\n        )\n        .then(markdown =>\n          import('@hackclub/markdown').then(mod =>\n            Promise.all(markdown.map(md => mod.default(md)))\n          )\n        )\n        .then(html =>\n          html.map(html =>\n            html.replace(/<[^>]*>/g, '').replace(/The Hackening/g, '')\n          )\n        ), // Chucks out all html tags + 'The Hackening'\n\n      fetch(\n        'https://api.github.com/repos/hackclub/leaders-newsletter/contents/updates'\n      )\n        .then(response => response.json())\n        .then(data => data.sort((a, b) => b.name.localeCompare(a.name)))\n        .then(data => data.map(item => item.name.split('.')[0])) // Grabs the name and gets rid of the file extension\n    ]).then(([finalHtml, names]) => setData({ finalHtml, names }))\n  }, [])\n\n  return (\n    <Box sx={{ position: 'relative', py: 6, background: 'darker' }}>\n      <Card\n        sx={{\n          maxWidth: '1050px',\n          mx: 'auto',\n          // mt: [3, 4],\n          background: 'rgb(255,255,255, 0.45)',\n          position: 'relative',\n          zIndex: 2,\n          backdropFilter: 'blur(8px)'\n        }}\n      >\n        <Flex\n          sx={{ flexDirection: ['column', 'column', 'row'], gridGap: [0, 5] }}\n        >\n          <Flex\n            sx={{\n              placeItems: 'center',\n              justifyContent: 'center',\n              alignItems: ['left', 'left', 'center'],\n              flexDirection: 'column',\n              gap: '10px',\n              width: ['100%', '100%', '75%']\n            }}\n          >\n            <Box>\n              <Text\n                variant=\"title\"\n                sx={{\n                  fontSize: [4, '36px', '42px', 6],\n                  zIndex: 2,\n                  textAlign: 'left'\n                }}\n              >\n                Join the newsletter\n              </Text>\n              <Text\n                sx={{\n                  color: 'darkless',\n                  mt: 2,\n                  fontSize: 3,\n                  textAlign: 'left'\n                }}\n                as=\"p\"\n              >\n                We&apos;ll send you an email no more than once a month, when we\n                work on something cool for you. Check out our{' '}\n                <Link\n                  href=\"https://workshops.hackclub.com/leader-newsletters/\"\n                  target=\"_blank\"\n                  rel=\"noopener norefferer\"\n                >\n                  previous issues\n                </Link>\n                .\n              </Text>\n            </Box>\n            <Grid\n              as=\"form\"\n              ref={formRef}\n              onSubmit={handleSubmit}\n              gap={[2, 3]}\n              sx={{\n                textAlign: 'center',\n                alignItems: 'end',\n                input: { bg: 'sunken' },\n                width: '100%'\n              }}\n            >\n              <Box sx={{ width: '100%' }}>\n                <Input\n                  autofillBackgroundColor=\"highlight\"\n                  type=\"text\"\n                  name=\"name\"\n                  id=\"name\"\n                  placeholder=\"Your Name\"\n                  required\n                  sx={{\n                    width: '100%',\n                    textAlign: 'center',\n                    fontSize: 2\n                  }}\n                />\n              </Box>\n              <div>\n                <Input\n                  autofillBackgroundColor=\"highlight\"\n                  type=\"email\"\n                  name=\"email\"\n                  id=\"email\"\n                  placeholder=\"Your Email\"\n                  required\n                  sx={{\n                    width: '100%',\n                    textAlign: 'center',\n                    fontSize: 2\n                  }}\n                />\n              </div>\n              <Button type=\"submit\" sx={{ mt: [2, 0], fontSize: 2 }}>\n                {submitting ? (\n                  <>\n                    <Loading /> Subscribe\n                  </>\n                ) : submitted ? (\n                  <>\n                    <Icon glyph=\"send\" /> You're on the list!\n                  </>\n                ) : (\n                  'Subscribe'\n                )}\n              </Button>\n            </Grid>\n          </Flex>\n          <Box\n            sx={{\n              display: 'grid',\n              gridGap: 4,\n              mt: [4, 0],\n              width: '100%'\n            }}\n          >\n            {data.finalHtml\n              .map((html, index) => (\n                <MailCard\n                  issue={index + 1}\n                  body={html}\n                  date={format(\n                    parse('', '', new Date(data.names[index])),\n                    'MMMM d, yyyy'\n                  )}\n                  link={data.names[index]}\n                  key={index}\n                />\n              ))\n              .reverse()}\n          </Box>\n        </Flex>\n      </Card>\n      <BGImg\n        gradient=\"linear-gradient(rgba(0,0,0,0.125), rgba(0,0,0,0.25))\"\n        src={background}\n        placeholder=\"blur\"\n        alt=\"Globe with hundreds of Hack Clubs\"\n      />\n    </Box>\n  )\n}\n\nexport default MailingList\n"
  },
  {
    "path": "components/index/cards/sinerider.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Flex, Grid, Image, Text } from 'theme-ui'\nimport Buttons from './button'\n\nexport default function Sinerider({ stars }) {\n  return (\n    <CardModel\n      github_link=\"https://github.com/hackclub/sinerider/\"\n      stars={stars}\n      color=\"white\"\n      sx={{\n        backgroundSize: 'cover',\n        backgroundColor: '#271932'\n      }}\n      position={[null, 'bottom', 'bottom']}\n      highlight=\"#271932\"\n      image=\"/home/sinerider-bg.webp\"\n    >\n      <Image\n        src=\"https://cloud-9cei11221-hack-club-bot.vercel.app/0logo_text_2.png\"\n        sx={{\n          width: ['200px', '250px', '300px'],\n          mt: ['-10px', '-20px', '-20px'],\n          position: 'relative',\n          zIndex: 2,\n          fontSize: ['36px', 4, 5],\n          color: 'white'\n        }}\n        alt=\"Sinerider\"\n      />\n      <Grid columns={[1, 1, 2]} sx={{ position: 'relative', zIndex: 2 }}>\n        <Box></Box>\n        <Box sx={{ mt: ['-40px', '-40px', '-150px'] }}>\n          <Text as=\"p\" variant=\"subtitle\">\n            SineRider is a game about love and graphing, powered by teenage\n            hackers of all kinds: artists, musicians, programmers, storytellers…\n            so if that’s you, come join us! We can always use help keeping\n            everything up to date and running smoothly.\n          </Text>\n          <Flex sx={{ flexDirection: 'column', mt: [3, 3, 4] }}>\n            <Buttons\n              icon=\"view\"\n              href=\"https://sinerider.com/\"\n              target=\"_blank\"\n              rel=\"noopener\"\n              primary=\"#CAB4D4\"\n              id=\"43\"\n              sx={{ color: '#271932' }}\n            >\n              Play now\n            </Buttons>\n            <Buttons\n              icon=\"rainbow\"\n              href=\"https://github.com/hackclub/sinerider/#readme\"\n              target=\"_blank\"\n              rel=\"noopener\"\n              id=\"44\"\n            >\n              Join the development\n            </Buttons>\n          </Flex>\n        </Box>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/slack.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Flex, Grid, Heading, Image, Link, Text } from 'theme-ui'\nimport Buttons from './button'\nimport Event from '../events'\nimport Comma from '../../comma'\n\nconst Cover = () => (\n  <Box\n    sx={{\n      position: 'absolute',\n      bottom: 0,\n      top: 0,\n      left: 0,\n      right: 0,\n      backgroundImage:\n        'linear-gradient(to bottom,rgba(0, 0, 0, 0.9), rgba(0, 0, 0, 0.95))',\n      opacity: 0.8,\n      zIndex: 1\n    }}\n  />\n)\nconst Stats = ({ data, subheading, nonMobile = false }) => (\n  <Box sx={{ display: nonMobile ? ['none', 'block'] : 'block' }}>\n    <Heading\n      variant=\"headline\"\n      as=\"h4\"\n      sx={{ mb: 0, pt: 2, fontSize: ['28px', '36px', '38px'] }}\n    >\n      <Comma>{data}</Comma>\n    </Heading>\n    <Text\n      sx={{\n        color: 'muted',\n        fontSize: ['14px', '16px', '18px'],\n        fontWeight: '400'\n      }}\n      as=\"h5\"\n    >\n      {subheading}\n    </Text>\n  </Box>\n)\nexport default function Slack({ data, events }) {\n  return (\n    <CardModel\n      color=\"white\"\n      sx={{\n        position: 'relative',\n        overflow: 'hidden',\n        backgroundImage: t => t.util.gx('cyan', 'purple'),\n        minHeight: ['500px', '400px'],\n        py: [3, 3, 4]\n      }}\n    >\n      <Image\n        src=\"/home/slack_ama.webp\"\n        sx={{\n          objectFit: 'cover',\n          position: 'absolute',\n          width: '100%',\n          height: '100%',\n          ml: ['-24px', '-32px', '-32px', '-32px'],\n          mt: ['-24px', '-32px', '-32px', '-32px']\n        }}\n        alt=\"Slack AMA\"\n      />\n      <Cover />\n      <Grid sx={{ zIndex: 2 }}>\n        <Text\n          as=\"h3\"\n          variant=\"title\"\n          sx={{\n            fontSize: ['36px', 4, 5],\n            zIndex: 2,\n            maxWidth: [null, null, '70%', null]\n          }}\n        >\n          Our Online Community\n        </Text>\n      </Grid>\n      <Grid columns={[1, 1, '1.6fr 1fr', '1.6fr 1fr']} sx={{ zIndex: 2 }}>\n        <Box\n          sx={{\n            zIndex: 2\n          }}\n        >\n          <Text\n            as=\"p\"\n            variant=\"subtitle\"\n            sx={{ fontSize: [1, '16px', '24px'] }}\n          >\n            Coding doesn't have to be a solitary activity. At Hack&nbsp;Club, we\n            make remarkable things together, and in our Slack you'll find\n            awesome people to hang out with too. Code together, find your\n            programming community, dream up something wild, or just #lounge.\n          </Text>\n          <Text as=\"p\" variant=\"subtitle\">\n            Occasionally we invite someone we really want to speak to (like Sal\n            Khan, George Hotz, and Lady Ada) and host an{' '}\n            <Link\n              href=\"/amas\"\n              target=\"_blank\"\n              rel=\"noopener\"\n              sx={{ color: 'inherit' }}\n            >\n              AMA\n            </Link>{' '}\n            with them.{' '}\n          </Text>\n          <Event events={events} />\n          <Buttons id=\"13\" link=\"/slack\" icon=\"slack\" primary=\"purple\">\n            Join our Slack\n          </Buttons>\n          <Grid\n            sx={{\n              zIndex: 2,\n              display: data?.chats_channels_count_1d > 0 ? 'block' : 'none'\n            }}\n          >\n            <Box\n              sx={{\n                background: 'rgb(0,0,0,0.6)',\n                height: ['130px', '170px', '170px', '100%'],\n                position: ['relative', 'relative', 'absolute'],\n                zIndex: 3,\n                width: ['120%', '120%', '260px'],\n                right: 0,\n                top: [null, null, 0],\n                mt: [3, 3, 0],\n                ml: ['-10%', '-10%', '-5%'],\n                mb: ['-10%', '-10%', '-5%'],\n                p: 4,\n                py: [3, 3, 2]\n              }}\n            >\n              <Flex\n                sx={{\n                  flexDirection: ['row', 'row', 'column'],\n                  justifyContent: 'space-between',\n                  flexWrap: 'wrap',\n                  textAlign: 'center'\n                }}\n              >\n                <Stats\n                  data={data.readers_count_1d}\n                  subheading=\"Currently Online\"\n                />\n                <Stats\n                  data={data.chats_channels_count_1d}\n                  subheading=\"Total Channels\"\n                  nonMobile={true}\n                />\n                <Stats\n                  data={data.messages_count_1d}\n                  subheading=\"Daily Messages\"\n                />\n                <Stats\n                  data={data.total_members_count}\n                  subheading=\"Total Members\"\n                />\n              </Flex>\n            </Box>\n          </Grid>\n        </Box>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/sleepover.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Image, Text } from 'theme-ui'\nimport CardModel from './card-model'\n\nexport default function Sleepover() {\n  return (\n    <Box sx={{ position: 'relative', my: [4, 4] }}>\n      <CardModel\n        color=\"white\"\n        sx={{\n          position: 'relative',\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          height: ['280px', '320px', '358.2px'],\n          overflow: 'hidden',\n          textAlign: 'center',\n          background:\n            'url(https://cdn.hackclub.com/019c76b9-22f2-710f-8627-5ff4190f5778/I34Drg.png)',\n          backgroundSize: 'cover',\n          backgroundPosition: 'center',\n          borderRadius: 'extra',\n          p: 0,\n          my: 0,\n          bg: 'transparent'\n        }}\n        position={[null, 'bottom', 'bottom']}\n      >\n        {/* Numbered list on the right */}\n        <Box\n          sx={{\n            zIndex: 1,\n            position: 'absolute',\n            right: ['4%', '6%', '7%'],\n            top: '50%',\n            transform: 'translateY(-50%) rotate(2deg)',\n            width: ['50%', '48%', '45%']\n          }}\n        >\n          <Box\n            as=\"ol\"\n            sx={{\n              listStyle: 'none',\n              p: 0,\n              m: 0,\n              display: 'flex',\n              flexDirection: 'column',\n              gap: [1, 2, 3]\n            }}\n          >\n            {[\n              'Spend 30 hours learning to code',\n              'Earn prizes like plushies, iPads, and more!',\n              'Fly to a slumber party themed hackathon in Chicago this April!'\n            ].map((item, i) => (\n              <Box\n                as=\"li\"\n                key={i}\n                sx={{ display: 'flex', alignItems: 'flex-start', gap: '10px' }}\n              >\n                <Text\n                  sx={{\n                    fontSize: ['10px', '16px', '22px'],\n                    fontFamily: '\"MADE Tommy Soft\", system-ui, sans-serif',\n                    fontWeight: '800',\n                    color: '#6DA4DF',\n                    WebkitTextStroke: ['2px white', '4px white', '5px white'],\n                    paintOrder: 'stroke fill',\n                    filter: 'drop-shadow(2px 3px 0px #9DC9F7)',\n                    minWidth: ['18px', '24px', '28px'],\n                    lineHeight: 1.4\n                  }}\n                >\n                  {i + 1}.\n                </Text>\n                <Text\n                  sx={{\n                    fontSize: ['10px', '18px', '28px'],\n                    fontFamily: '\"MADE Tommy Soft\", system-ui, sans-serif',\n                    fontWeight: '600',\n                    color: '#6DA4DF',\n                    WebkitTextStroke: ['2px white', '5px white', '7px white'],\n                    paintOrder: 'stroke fill',\n                    filter: 'drop-shadow(2px 3px 0px #9DC9F7)',\n                    textAlign: 'left',\n                    lineHeight: 1.4\n                  }}\n                >\n                  {item}\n                </Text>\n              </Box>\n            ))}\n          </Box>\n        </Box>\n\n        {/* Logo on the left */}\n        <Box\n          sx={{\n            zIndex: 1,\n            position: 'absolute',\n            left: ['4%', '5%', '9%'],\n            top: ['45%', 'auto', 'auto'],\n            bottom: ['auto', '5%', '8%'],\n            transform: ['translateY(-50%)', 'none', 'none'],\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            gap: [1, 2, 3]\n          }}\n        >\n          <Image\n            src=\"https://cdn.hackclub.com/019c76b7-644a-7ef7-b855-63253c99d2f8/UpZIvQ.png\"\n            alt=\"Sleepover\"\n            sx={{\n              height: ['90px', '90px', '180px'],\n              objectFit: 'contain',\n              mb: [0, 2, 3]\n            }}\n          />\n          {/* Button below logo - tablet/desktop only */}\n          <Box\n            as=\"a\"\n            href=\"https://sleepover.hackclub.com?utm_source=site_card\"\n            target=\"_blank\"\n            rel=\"noopener\"\n            sx={{ display: ['none', 'block', 'block'] }}\n          >\n            <Image\n              src=\"https://cdn.hackclub.com/019c76c5-62ea-7f3e-856b-82d4d7925054/join.png\"\n              alt=\"Join Now\"\n              sx={{\n                height: ['25px', '45px', '60px'],\n                cursor: 'pointer',\n                transition: 'transform 0.2s ease, filter 0.2s ease',\n                '&:hover': {\n                  transform: 'translateY(-4px)',\n                  filter: 'drop-shadow(0 4px 6px rgba(0,0,0,0.2))'\n                }\n              }}\n            />\n          </Box>\n        </Box>\n\n        {/* Button at bottom center - mobile only */}\n        <Box\n          as=\"a\"\n          href=\"https://sleepover.hackclub.com?utm_source=site_card\"\n          target=\"_blank\"\n          rel=\"noopener\"\n          sx={{\n            zIndex: 1,\n            position: 'absolute',\n            left: '50%',\n            bottom: '5%',\n            transform: 'translateX(-50%)',\n            display: ['block', 'none', 'none']\n          }}\n        >\n          <Image\n            src=\"https://cdn.hackclub.com/019c76c5-62ea-7f3e-856b-82d4d7925054/join.png\"\n            alt=\"Join Now\"\n            sx={{\n              height: '40px',\n              cursor: 'pointer',\n              transition: 'transform 0.2s ease, filter 0.2s ease',\n              '&:hover': {\n                transform: 'translateY(-4px)',\n                filter: 'drop-shadow(0 4px 6px rgba(0,0,0,0.2))'\n              }\n            }}\n          />\n        </Box>\n      </CardModel>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/sprig-console.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Grid, Image, Text } from 'theme-ui'\nimport Buttons from './button'\nimport CardModel from './card-model'\nimport Tilt from '../../tilt'\n\nexport default function SprigConsole({ stars, consoleCount }) {\n  return (\n    <Box sx={{ position: 'relative' }}>\n      <CardModel\n        github_link=\"https://github.com/hackclub/sprig-hardware\"\n        stars={stars}\n        color=\"white\"\n        sx={{\n          backgroundSize: 'cover',\n          backgroundColor: '#1A3C14',\n          backgroundPosition: 'center center',\n          backgroundRepeat: 'no-repeat',\n          minHeight: ['300px', '400px', '400px']\n        }}\n        highlight=\"#427A43\"\n      >\n        <Image\n          src=\"https://sprig.hackclub.com/pcb.svg\"\n          sx={{\n            objectFit: 'cover',\n            position: 'absolute',\n            width: '100%',\n            height: '120%',\n            ml: '-24px',\n            opacity: '0.4',\n            mt: '-24px',\n            zIndex: 0\n          }}\n          alt=\"Printed circuit board\"\n        />\n        <Image\n          src=\"https://cloud-8u6hh0ho9-hack-club-bot.vercel.app/0sprig_console.svg\"\n          sx={{\n            width: ['90%', '320px', '450px', '500px'],\n            mt: ['42px', 0, 0],\n            position: 'relative',\n            zIndex: 2,\n            fontSize: ['36px', 4, 5],\n            color: 'white'\n          }}\n          alt=\"Sprig console\"\n        />\n        <Text\n          as=\"p\"\n          variant=\"subheadline\"\n          sx={{\n            px: 2,\n            py: 1,\n            mt: 2,\n            width: 'fit-content',\n            borderRadius: 'extra',\n            color: 'white',\n            border: 'rgba(255,255,255,0.2) dashed 1px',\n            zIndex: 2,\n            top: ['24px', 0, '5px']\n          }}\n        >\n          Join the other {consoleCount} teenagers with Sprigs!\n        </Text>\n        <Grid\n          columns={[1, 1, '1.2fr 1fr', '1.2fr 1fr']}\n          sx={{ zIndex: 2, position: 'relative' }}\n        >\n          <Box>\n            <Image\n              src=\"https://cloud-b8z9l7ihq-hack-club-bot.vercel.app/0sprig-light-top-min.png\"\n              sx={{\n                width: ['120%', '', ''],\n                maxWidth: ['120%', '', ''],\n                ml: ['-10%', '', ''],\n                mt: ['-10px', '-30px', '', ''],\n                mb: ['-15px', '-30px', '', ''],\n                display: [null, null, 'none', 'none']\n              }}\n              alt=\"Sprig console\"\n            />\n            <Text as=\"p\" variant=\"subtitle\" mt={[0, null, null]}>\n              Play your own Sprig games on this console, which you can assemble\n              and disassemble. Each kit includes parts needed for getting\n              started with hardware engineering and embedded systems\n              programming.{' '}\n            </Text>\n            <Buttons\n              id=\"6\"\n              icon=\"emoji\"\n              link=\"https://github.com/hackclub/sprig/blob/main/docs/GET_A_SPRIG.md\"\n              primary=\"#427A43\"\n              sx={{ mt: [3, 3, 4] }}\n            >\n              Build a game and get your console\n            </Buttons>\n          </Box>\n          <Box></Box>\n        </Grid>\n      </CardModel>\n      <Tilt>\n        <Image\n          src=\"/home/sprig-console.webp\"\n          sx={{\n            position: 'absolute',\n            right: ['', '-50%', '-35%', '-25%'],\n            top: ['', '15%', '15%', '10%'],\n            width: ['', '100%', '85%', '70%'],\n            display: ['none', 'none', 'block', 'block'],\n            '&:hover': {\n              cursor: 'pointer'\n            },\n            zIndex: 3\n          }}\n          alt=\"Sprig console\"\n        />\n      </Tilt>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/sprig.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Flex, Grid, Image, Link, Text } from 'theme-ui'\nimport Buttons from './button'\nimport RelativeTime from 'react-relative-time'\n\nfunction Game({ game, gameImage, gameImage1, ...props }) {\n  return (\n    <Box\n      as=\"div\"\n      sx={{\n        position: 'relative',\n        display: 'flex',\n        flexDirection: 'column',\n        width: '14rem',\n        background: 'rgba(54, 66, 85, 0.75)',\n        borderStyle: 'solid',\n        borderWidth: '4px',\n        boxSizing: 'border-box',\n        borderImageRepeat: 'stretch',\n        borderImageSlice: '3',\n        borderImageWidth: '3',\n        borderImageSource: `url('data:image/svg+xml;utf8,<?xml version=\"1.0\" encoding=\"UTF-8\" ?><svg version=\"1.1\" width=\"8\" height=\"8\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3 1 h1 v1 h-1 z M4 1 h1 v1 h-1 z M2 2 h1 v1 h-1 z M5 2 h1 v1 h-1 z M1 3 h1 v1 h-1 z M6 3 h1 v1 h-1 z M1 4 h1 v1 h-1 z M6 4 h1 v1 h-1 z M2 5 h1 v1 h-1 z M5 5 h1 v1 h-1 z M3 6 h1 v1 h-1 z M4 6 h1 v1 h-1 z\" fill=\"rgb(118, 118, 143)\" /></svg>')`,\n        borderImageOutset: '2',\n        boxShadow: '0 8px 8px rgba(0, 0, 0, 0.2)',\n        '&:hover': {\n          transform: 'scale(1.05)',\n          background: 'rgba(77, 90, 114, 0.8)'\n        }\n      }}\n      {...props}\n    >\n      <Box\n        as=\"a\"\n        href={`https://editor.sprig.hackclub.com/?file=https://raw.githubusercontent.com/hackclub/sprig/main/games/${game?.filename}.js`}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        sx={{\n          borderStyle: 'solid',\n          borderWidth: '4px',\n          padding: '0.6rem 0.6rem 0 0.6rem',\n          borderImageRepeat: 'stretch',\n          borderImageSlice: '3',\n          borderImageWidth: '3',\n          borderImageSource: `url('data:image/svg+xml;utf8,<?xml version=\"1.0\" encoding=\"UTF-8\" ?><svg version=\"1.1\" width=\"8\" height=\"8\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3 1 h1 v1 h-1 z M4 1 h1 v1 h-1 z M2 2 h1 v1 h-1 z M5 2 h1 v1 h-1 z M1 3 h1 v1 h-1 z M6 3 h1 v1 h-1 z M1 4 h1 v1 h-1 z M6 4 h1 v1 h-1 z M2 5 h1 v1 h-1 z M5 5 h1 v1 h-1 z M3 6 h1 v1 h-1 z M4 6 h1 v1 h-1 z\" fill=\"rgb(167, 171, 185)\" /></svg>')`,\n          borderImageOutset: '2',\n          height: '100%',\n          textDecoration: 'none'\n        }}\n      >\n        {/* <Box\n          sx={{\n            width: '100%',\n            height: '65%',\n            paddingBottom: 'calc(100%-8px)',\n            border: '4px solid rgb(118, 118, 143)',\n            margin: 0,\n            position: 'relative',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n            background: 'white',\n            boxShadow: '0 4px 0px rgba(0, 0, 0, 0.1)',\n            '&:after': {\n              content: '\"\"',\n              position: 'absolute',\n              top: 0,\n              height: '100%',\n              width: '8px',\n              backgroundImage:\n                'linear-gradient(rgb(167, 171, 185) 5px, rgb(167, 171, 185) 5px)',\n              backgroundSize: '8px 8px',\n              backgroundPosition: 'top center',\n              backgroundRepeat: 'no-repeat',\n              zIndex: 2,\n              left: 0\n            },\n            '&:before': {\n              content: '\"\"',\n              position: 'absolute',\n              top: 0,\n              height: '100%',\n              width: '8px',\n              backgroundImage:\n                'linear-gradient(rgb(167, 171, 185) 5px, rgb(167, 171, 185) 5px)',\n              backgroundSize: '8px 8px',\n              backgroundPosition: 'bottom center',\n              backgroundRepeat: 'no-repeat',\n              zIndex: 2,\n              right: 0\n            }\n          }}\n        >\n          <img\n            src={gameImage || gameImage1}\n            alt=\"game preview\"\n            sx={{\n              position: 'absolute',\n              top: 0,\n              bottom: 0,\n              left: 0,\n              objectFit: 'contain',\n              objectPosition: 'center',\n              imageRendering: 'pixelated',\n              width: '100%',\n              height: '100%',\n              margin: 0,\n              padding: 0,\n              background: 'white'\n            }}\n          />\n        </Box> */}\n        <Box sx={{ display: 'flex', flex: '60% 40%', flexWrap: 'wrap' }}>\n          <Text\n            as=\"h3\"\n            sx={{\n              textTransform: 'lowercase',\n              textOverflow: 'ellipsis',\n              width: '100%',\n              overflow: 'hidden',\n              color: 'white',\n              whiteSpace: 'nowrap',\n              margin: '0.8rem 0 0.8rem 0',\n              fontSize: '1.4rem',\n              fontWeight: '400',\n              my: 0,\n              lineHeight: '1.4rem'\n            }}\n          >\n            {game?.title}\n          </Text>\n          <Text\n            as=\"h4\"\n            sx={{\n              fontWeight: '300',\n              fontSize: '1.1rem',\n              color: 'rgb(151, 166, 187)',\n              padding: 0,\n              textOverflow: 'ellipsis',\n              width: '100%',\n              overflow: 'hidden',\n              whiteSpace: 'nowrap',\n              mt: 0,\n              lineHeight: '1rem'\n            }}\n          >\n            by {game?.author}\n          </Text>\n          <Text\n            as=\"span\"\n            sx={{\n              fontWeight: '300',\n              fontSize: '0.8rem',\n              color: 'snow',\n              padding: 0,\n              opacity: 0.3,\n              mb: 1\n            }}\n          >\n            <RelativeTime value={game?.addedOn} titleFormat=\"YYYY-MM-DD\" />\n          </Text>\n        </Box>\n      </Box>\n    </Box>\n  )\n}\n\nexport default function Sprig({ stars, game, gameImage, gameImage1 }) {\n  return (\n    <CardModel\n      github_link=\"https://github.com/hackclub/sprig/\"\n      color=\"white\"\n      stars={stars}\n      highlight=\"#FFDE4D\"\n      sx={{ backgroundColor: '#0C0C16' }}\n      image=\"/home/sprig-bg.webp\"\n    >\n      <Image\n        src=\"/home/sprig-logo.webp\"\n        sx={{\n          width: ['150px', '180px', '220px'],\n          zIndex: 3,\n          position: 'relative',\n          fontSize: ['36px', 4, 5],\n          color: 'white'\n        }}\n        alt=\"Sprig\"\n      />\n      <Grid columns={[1, 2]}>\n        <Box>\n          <Text\n            as=\"p\"\n            variant=\"subtitle\"\n            sx={{ zIndex: 2, position: 'relative' }}\n          >\n            Draw, make music, and craft games in our web-based JavaScript game\n            editor, which has been used by 7k+ makers around the world.\n          </Text>\n          <Flex sx={{ flexDirection: 'column', mt: [3, 3, 4] }}>\n            <Buttons\n              content=\"click here to get started in our editor\"\n              id=\"6\"\n              icon=\"emoji\"\n              link=\"https://sprig.hackclub.com/editor\"\n              primary=\"#FFDE4D\"\n              sx={{ color: 'black' }}\n            >\n              Build a Sprig game\n            </Buttons>\n            <Buttons\n              content=\"learn more on our github\"\n              id=\"8\"\n              link=\"https://github.com/hackclub/sprig\"\n            >\n              Review games / build the engine\n            </Buttons>\n            <Buttons\n              // content=\"we're all hanging out in #sprig on Slack\"\n              id=\"9\"\n              icon=\"friend\"\n              link=\"https://slack.hackclub.com\"\n            >\n              Connect with other game devs\n            </Buttons>\n          </Flex>\n        </Box>\n        <Box sx={{ mt: [0, -4, -4] }}>\n          <Text\n            sx={{\n              fontStyle: 'italic',\n              fontSize: [1, '14px', '16px'],\n              position: 'relative'\n            }}\n          >\n            New from{' '}\n            <Link\n              href=\"https://sprig.hackclub.com/gallery\"\n              sx={{ textDecoration: 'none', color: 'inherit' }}\n            >\n              the gallery\n            </Link>\n            ...\n          </Text>\n          <Grid\n            columns={[1, 1, 1, 2]}\n            sx={{\n              // height: ['250px', '80%', '80%'],\n              gap: '20px',\n              mt: [2, 0, 3],\n              ml: [1, 0, 0],\n              mb: [1, 0, 0],\n              width: ['100%', '90%', '90%']\n            }}\n          >\n            <Game\n              game={game[0]}\n              // gameImage={gameImage}\n            />\n            <Game\n              game={game[1]}\n              // gameImage1={gameImage1}\n              sx={{ display: ['none', 'flex', 'flex'] }}\n            />\n            <Game\n              game={game[2]}\n              // gameImage={gameImage}\n              sx={{ display: ['none', 'none', 'flex'] }}\n            />\n            <Game\n              game={game[3]}\n              // gameImage1={gameImage1}\n              sx={{ display: ['none', 'none', 'none', 'flex'] }}\n            />\n          </Grid>\n        </Box>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/stasis.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Flex, Image, Text } from 'theme-ui'\nimport CardModel from './card-model'\n\nexport default function Stasis() {\n  return (\n    <CardModel\n      color=\"white\"\n      sx={{\n        position: 'relative',\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        fontFamily: 'system-ui, sans-serif',\n        minHeight: '350px',\n        overflow: 'hidden',\n        textAlign: 'center',\n        backgroundColor: '#272239'\n      }}\n      position={[null, 'bottom', 'bottom']}\n    >\n      <Box\n        sx={{\n          position: 'absolute',\n          inset: 0,\n          backgroundImage:\n            'url(https://cdn.hackclub.com/019c76b7-83c0-7e49-990c-e4fd28161cfb/I_mzLg.png)',\n          backgroundSize: 'cover',\n          backgroundPosition: 'center',\n          backgroundRepeat: 'no-repeat',\n          opacity: 1,\n          zIndex: 0\n        }}\n      />\n      <Flex\n        sx={{\n          flexDirection: 'column',\n          alignItems: 'center',\n          justifyContent: 'center',\n          position: 'absolute',\n          inset: 0,\n          zIndex: 1,\n          px: [3, 4]\n        }}\n      >\n        <Image\n          src=\"https://cdn.hackclub.com/019c76ba-5c45-79d9-89d6-dc4730abc0d7/yKT39g.png\"\n          alt=\"Stasis\"\n          sx={{\n            height: ['60px', '80px', '100px'],\n            objectFit: 'contain',\n            mb: 2\n          }}\n        />\n        <Image\n          src=\"https://cdn.hackclub.com/019c76b7-a9e4-7e85-bea4-86edde5d4c64/QH3hVA.png\"\n          alt=\"Stasis Info\"\n          sx={{\n            height: ['12px', '15px', '20px'],\n            objectFit: 'contain',\n            mb: 3,\n            mt: 2,\n            ml: [2, 3, 5]\n          }}\n        />\n\n        <Text\n          as=\"p\"\n          sx={{\n            color: 'black',\n            fontWeight: '700',\n            fontSize: ['9px', '8px', '8px'],\n            maxWidth: '90%',\n            lineHeight: 1.4,\n            mb: 0,\n            textShadow: '1px 1px 2px rgba(255, 255, 255, 0.2)'\n          }}\n        >\n          We're bringing 100+ hack clubbers from all over the world to Austin,\n          TX for a 4-day hardware hackathon, and we're funding your next biggest\n          hardware projects.\n        </Text>\n\n        <Box\n          as=\"a\"\n          href=\"https://stasis.hackclub.com?utm_source=site_card\"\n          target=\"_blank\"\n          rel=\"noopener\"\n          sx={{ mt: 2 }}\n        >\n          <Image\n            src=\"https://cdn.hackclub.com/019c76ba-506c-74fb-9830-7776540af717/ItRegg.png\"\n            alt=\"RSVP\"\n            sx={{\n              height: ['45px', '50px', '60px'],\n              cursor: 'pointer',\n              transition: 'transform 0.2s ease, filter 0.2s ease',\n              '&:hover': {\n                transform: 'translateY(-4px)',\n                filter: 'drop-shadow(0 4px 6px rgba(0,0,0,0.2))'\n              }\n            }}\n          />\n        </Box>\n      </Flex>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/cards/workshops.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport CardModel from './card-model'\nimport { Box, Card, Flex, Grid, Heading, Image, Text } from 'theme-ui'\nimport Buttons from './button'\n\nconst WorkshopCard = ({\n  slug,\n  name,\n  description,\n  img,\n  height,\n  section,\n  ...props\n}) => (\n  <Card\n    href={`https://workshops.hackclub.com/${slug}`}\n    as=\"a\"\n    variant=\"interactive\"\n    target=\"_blank\"\n    rel=\"noopener\"\n    sx={{\n      color: 'text',\n      textDecoration: 'none',\n      p: [0, 0],\n      lineHeight: 0,\n      display: 'flex',\n      flexDirection: 'column',\n      maxWidth: '250px',\n      height: '250px'\n    }}\n    {...props}\n  >\n    <Box sx={{ p: 3, lineHeight: 'body' }}>\n      <Heading as=\"h4\" sx={{ my: 1 }}>\n        {name}\n      </Heading>\n      <Text variant=\"caption\">{description}</Text>\n    </Box>\n    <Box\n      sx={{\n        width: '100%',\n        height: '100%'\n      }}\n    >\n      <Image\n        alt={`${name} demo`}\n        src={img}\n        sx={{ width: '100%', height: 'auto' }}\n      />\n    </Box>\n  </Card>\n)\n\nexport default function Workshops({ stars }) {\n  return (\n    <CardModel\n      color=\"white\"\n      sx={{\n        backgroundColor: 'elevated',\n        background:\n          'linear-gradient(32deg, rgba(51, 142, 218, 0.9) 0%, rgba(51, 214, 166, 0.9) 100%)',\n        height: 'fit-content'\n      }}\n      github_link=\"https://github.com/hackclub/workshops\"\n      stars={stars}\n      highlight=\"blue\"\n    >\n      <Text variant=\"title\" as=\"h3\" sx={{ fontSize: ['36px', 4, 5] }}>\n        Workshops\n      </Text>\n      <Grid columns={[1, 2, 2]} sx={{ gap: 4, height: 'fit-content' }}>\n        <Flex sx={{ flexDirection: 'column', height: 'fit-content' }}>\n          <Text as=\"p\" variant=\"subtitle\">\n            100+ community-contributed, self-guided coding tutorials and ideas.\n            Learn to code by building, one project at a time.\n          </Text>\n          <Buttons\n            id=\"14\"\n            link=\"https://workshops.hackclub.com\"\n            icon=\"code\"\n            primary=\"white\"\n            sx={{ color: 'blue', mt: [3, 3, 4] }}\n          >\n            Browse The Workshops\n          </Buttons>\n          <Buttons\n            // content=\"click to learn more about how to submit a workshop\"\n            id=\"13\"\n            link=\"https://workshops.hackclub.com/submit-a-workshop/\"\n            icon=\"event-add\"\n          >\n            Build A Workshop\n          </Buttons>\n        </Flex>\n        <Grid sx={{ display: ['none', 'grid', 'grid'] }} columns={[1, 1, 1, 2]}>\n          <WorkshopCard\n            key=\"splatter_paint\"\n            slug=\"splatter_paint\"\n            name=\"Splatter Paint\"\n            description=\"Crazy colorful splatter paint in your browser with Paper.js\"\n            img=\"/home/workshops/splatter_paint.png\"\n          />\n          <WorkshopCard\n            key=\"particle_physics\"\n            slug=\"particle_physics\"\n            name=\"Particle Physics\"\n            description=\"Create a particle physics simulation and with p5.js\"\n            img=\"/home/workshops/particle_physics.png\"\n            sx={{ display: ['none', 'none', 'none', 'flex'] }}\n          />\n        </Grid>\n      </Grid>\n    </CardModel>\n  )\n}\n"
  },
  {
    "path": "components/index/carousel-cards.tsx",
    "content": "import { Box, Card, Image, Link, Text } from 'theme-ui'\nimport Icon from '../icon'\n\nexport default function CarouselCards({\n  background,\n  backgroundImage,\n  backgroundSize,\n  titleColor,\n  descriptionColor,\n  title,\n  description,\n  img,\n  link\n}) {\n  return (\n    <Box\n      sx={{\n        position: 'relative',\n        display: 'inline-block',\n        transition: 'transform .125s ease-in-out, box-shadow .125s ease-in-out',\n        '&:hover': { transform: 'scale(1.0625)' },\n        '.icon': {\n          transition: 'transform 0.25s ease-in-out, opacity 0.43s ease-in-out'\n        },\n        ':hover,:focus': {\n          '.icon': {\n            transform: 'translateX(28px) translateY(-28px)',\n            opacity: 0\n          }\n        }\n      }}\n    >\n      <Link\n        sx={{\n          textDecoration: 'none',\n          '&:hover': { cursor: 'pointer' },\n          '&:hover svg': { opacity: 0.5 }\n        }}\n        href={link}\n        target=\"_blank\"\n        rel=\"noopener\"\n      >\n        <Image\n          src={img}\n          alt=\"carousel card\"\n          sx={{\n            position: 'absolute',\n            top: ['-26px', '-30px', '-35px'],\n            left: ['10px', '12px', '15px'],\n            zIndex: 2,\n            width: ['42px', '50px', '58px'],\n            height: ['42px', '50px', '58px']\n          }}\n        />\n        <Card\n          // variant=\"interactive\"\n          sx={{\n            mr: 3,\n            background,\n            backgroundImage,\n            backgroundSize,\n            position: 'relative',\n            color: 'white',\n            width: ['200px', '300px', '300px'],\n            padding: ['12px !important', '16px !important', '20px !important'],\n            paddingTop: [\n              '14px !important',\n              '20px !important',\n              '24px !important'\n            ],\n            height: '100%'\n          }}\n        >\n          <Text\n            as=\"h3\"\n            sx={{ color: titleColor, fontSize: ['20px', '21px', '22px'] }}\n          >\n            {title}\n          </Text>\n          <Text\n            as=\"p\"\n            sx={{ color: descriptionColor, fontSize: [1, '16px', '20px'] }}\n          >\n            {description}\n          </Text>\n          <Icon\n            glyph=\"external\"\n            size={32}\n            color=\"#E9E9E9\"\n            sx={{\n              position: 'absolute',\n              top: 2,\n              right: 2,\n              opacity: 0.3,\n              fontSize: [1, '16px', '20px']\n            }}\n            className=\"icon\"\n          />\n        </Card>\n      </Link>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/index/carousel.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Text } from 'theme-ui'\nimport CarouselCards from './carousel-cards'\nimport React, { useState } from 'react'\nimport Ticker from 'react-ticker'\nimport PageVisibility from 'react-page-visibility'\n\nexport default function Carousel({ cards }) {\n  const [speed, setSpeed] = useState(5)\n\n  const [pageIsVisible, setPageIsVisible] = useState(true)\n\n  const handleVisibilityChange = isVisible => {\n    setPageIsVisible(isVisible)\n  }\n\n  return (\n    <PageVisibility onChange={handleVisibilityChange}>\n      {pageIsVisible && (\n        <Box sx={{ mt: 4 }}>\n          <Text\n            variant=\"eyebrow\"\n            as=\"h4\"\n            sx={{\n              fontSize: ['22px', 2, 3],\n              mt: [4, 4, 5],\n              maxWidth: 'layout',\n              width: '90vw',\n              margin: 'auto'\n            }}\n          >\n            Here are a few projects you could get involved in:\n          </Text>\n          <Ticker speed={speed} sx={{ overflowX: 'hidden' }}>\n            {() => (\n              <Box\n                as=\"div\"\n                sx={{ display: 'flex', py: [4, 5, 5] }}\n                onMouseOver={() => setSpeed(2)}\n                onMouseOut={() => setSpeed(6)}\n              >\n                {cards.map((card, idx) => (\n                  <CarouselCards key={idx} {...card} />\n                ))}\n              </Box>\n            )}\n          </Ticker>\n        </Box>\n      )}\n    </PageVisibility>\n  )\n}\n"
  },
  {
    "path": "components/index/ctas.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Text, Image, Card } from 'theme-ui'\nimport React, { useState } from 'react'\nimport PageVisibility from 'react-page-visibility'\n\nexport default function CTAS({ cards }) {\n  const [pageIsVisible, setPageIsVisible] = useState(true)\n\n  const handleVisibilityChange = isVisible => {\n    setPageIsVisible(isVisible)\n  }\n\n  return (\n    <PageVisibility onChange={handleVisibilityChange}>\n      {pageIsVisible && (\n        <Box\n          as=\"div\"\n          sx={{\n            //1 row flexbox of cards - wrap when needed, no scroll\n            display: 'flex',\n            flexDirection: 'row',\n            flexWrap: 'wrap',\n            gap: 2,\n            justifyContent: ['center', 'center', 'flex-start'],\n            mt: 1,\n            pt: 3\n          }}\n        >\n          {cards.map((card, idx) => {\n            const {\n              background,\n              backgroundImage,\n              backgroundSize,\n              gridBackground,\n              stickerImage,\n              stickerImageScale,\n              buttonImage,\n              animatedStickers,\n\n              description,\n              descriptionColor,\n\n              title,\n              logo,\n              logoScale,\n\n              link\n            } = card\n\n            return (\n              <Box\n                key={idx}\n                as=\"a\"\n                href={link}\n                target=\"_blank\"\n                rel=\"noreferrer\"\n                sx={{\n                  position: 'relative',\n                  display: 'inline-block',\n                  flex: ['0 0 100%', '0 0 100%', '0 0 240px'],\n                  width: ['100%', '100%', '240px'],\n                  minWidth: ['100%', '100%', '240px'],\n                  boxShadow: '0 4px 8px rgba(0, 0, 0, 0.125)',\n                  transition:\n                    'transform .125s ease-in-out, box-shadow .125s ease-in-out',\n                  textDecoration: 'none',\n                  overflow: animatedStickers ? 'visible' : undefined,\n                  '&:hover': { transform: 'scale(1.0625)' },\n                  '.icon': {\n                    transition:\n                      'transform 0.25s ease-in-out, opacity 0.43s ease-in-out'\n                  },\n                  ':hover,:focus': {\n                    '.icon': {\n                      transform: 'translateX(28px) translateY(-28px)',\n                      opacity: 0\n                    }\n                  }\n                }}\n              >\n                {animatedStickers && (\n                  <Box\n                    sx={{\n                      position: 'absolute',\n                      bottom: 0,\n                      right: 0,\n                      width: '100%',\n                      height: '100%',\n                      pointerEvents: 'none',\n                      zIndex: 10,\n                      '@keyframes breathe': {\n                        '0%': { transform: 'scale(1)' },\n                        '50%': { transform: 'scale(1.15) rotate(10deg)' },\n                        '100%': { transform: 'scale(1)' }\n                      }\n                    }}\n                  >\n                    {animatedStickers.map((sticker, i) => (\n                      <Image\n                        key={i}\n                        src={sticker.src}\n                        alt=\"\"\n                        sx={{\n                          position: 'absolute',\n                          ...(sticker.top !== undefined && {\n                            top: sticker.top\n                          }),\n                          ...(sticker.bottom !== undefined && {\n                            bottom: sticker.bottom\n                          }),\n                          ...(sticker.right !== undefined && {\n                            right: sticker.right\n                          }),\n                          ...(sticker.left !== undefined && {\n                            left: sticker.left\n                          }),\n                          width: sticker.width || '120px',\n                          height: 'auto',\n                          transform: `rotate(${sticker.rotate || '15deg'})`,\n                          animation: `breathe infinite ${3.5 + i * 0.5}s ${sticker.delay || '0s'} ease-in-out`,\n                          '@media (prefers-reduced-motion)': {\n                            animation: 'none'\n                          }\n                        }}\n                      />\n                    ))}\n                  </Box>\n                )}\n                {stickerImage && !animatedStickers && (\n                  <Image\n                    src={stickerImage}\n                    alt=\"Sticker\"\n                    sx={{\n                      position: 'absolute',\n                      bottom: '-30px',\n                      right: '-30px',\n                      width:\n                        stickerImageScale !== null &&\n                        stickerImageScale !== undefined\n                          ? [\n                              `${120 * stickerImageScale}px`,\n                              `${140 * stickerImageScale}px`,\n                              `${160 * stickerImageScale}px`\n                            ]\n                          : '120px',\n                      height: 'auto',\n                      zIndex: 10,\n                      transform: 'rotate(15deg)',\n                      pointerEvents: 'none'\n                    }}\n                  />\n                )}\n                <Card\n                  // variant=\"interactive\"\n                  sx={{\n                    background,\n                    backgroundImage: gridBackground\n                      ? 'linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px)'\n                      : backgroundImage,\n                    backgroundSize: gridBackground\n                      ? '50px 50px'\n                      : backgroundSize,\n                    backgroundPosition: gridBackground ? '0 0, 0 0' : undefined,\n                    position: 'relative',\n                    color: 'white',\n                    width: ['100%', '100%', '240px'],\n                    minWidth: ['100%', '100%', 'initial'],\n                    padding: [\n                      '12px !important',\n                      '16px !important',\n                      '20px !important'\n                    ],\n                    paddingTop: [\n                      '14px !important',\n                      '20px !important',\n                      '24px !important'\n                    ],\n                    height: '100%',\n                    display: 'flex',\n                    flexDirection: 'column',\n                    alignItems: 'flex-start',\n                    '&:hover': { cursor: 'pointer' },\n                    '&:hover svg': { opacity: 0.5 }\n                  }}\n                >\n                  <Image\n                    src={logo}\n                    alt={title}\n                    sx={{\n                      zIndex: 2,\n                      height: '40px',\n                      objectFit: 'contain',\n                      transform: logoScale ? `scale(${logoScale})` : undefined\n                    }}\n                  />\n                  <Text\n                    as=\"p\"\n                    sx={{\n                      color: descriptionColor,\n                      fontSize: [1, '16px', '18px'],\n                      my: 2,\n                      whiteSpace: 'pre-line'\n                    }}\n                  >\n                    {description}\n                  </Text>\n                  {buttonImage && (\n                    <Image\n                      src={buttonImage}\n                      alt=\"Join\"\n                      sx={{\n                        mt: 2,\n                        height: '36px',\n                        width: 'auto',\n                        objectFit: 'contain'\n                      }}\n                    />\n                  )}\n                </Card>\n              </Box>\n            )\n          })}\n        </Box>\n      )}\n    </PageVisibility>\n  )\n}\n"
  },
  {
    "path": "components/index/events.tsx",
    "content": "import { Box, Text, Grid, Badge, Flex, Avatar, Heading } from 'theme-ui'\nimport tt from 'tinytime'\nimport Link from 'next/link'\n\nconst past = dt => new Date(dt) < new Date()\nconst now = (start, end) =>\n  new Date() > new Date(start) && new Date() < new Date(end)\n\nconst Event = ({ id, slug, title, desc, leader, avatar, start, end, cal }) => (\n  <Link\n    href={`https://events.hackclub.com/${slug}`}\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <Box\n      sx={{\n        position: 'relative',\n        textDecoration: 'none',\n        bg: 'elevated',\n        color: 'text',\n        p: [3, 3]\n      }}\n    >\n      <Box\n        sx={{\n          bg: past(end) ? 'sunken' : 'primary',\n          color: past(end) ? 'text' : 'white',\n          lineHeight: ['subheading', 'body'],\n          m: -3,\n          py: 2,\n          px: 3,\n          mb: 3,\n          strong: { display: ['block', 'inline'] }\n        }}\n      >\n        <Text>\n          <strong>{tt('{MM} {Do}').render(new Date(start))}</strong>{' '}\n          {tt('{h}:{mm}').render(new Date(start))}–\n          {tt('{h}:{mm} {a}').render(new Date(end))}\n        </Text>\n      </Box>\n      <Heading variant=\"subheadline\" sx={{ mt: 0, mb: 1 }}>\n        {title}\n      </Heading>\n      <Flex\n        sx={{\n          alignItems: 'center',\n          color: 'muted'\n        }}\n      >\n        {now(start, end)}\n        {!avatar.includes('emoji') && (\n          <Avatar\n            src={avatar}\n            alt={`${leader} profile picture`}\n            size={24}\n            sx={{ height: 24, mr: 2 }}\n          />\n        )}\n        <Text as=\"span\">{leader}</Text>\n      </Flex>\n      {/* {now(start, end) && (\n        <Sparkles\n          aria-hidden\n          style={{\n            pointerEvents: 'none',\n            position: 'absolute !important',\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0\n          }}\n        />\n      )} */}\n    </Box>\n  </Link>\n)\n\nexport default function Events({ events }) {\n  return (\n    <Box mb={3}>\n      <Grid\n        mt={3}\n        mb={2}\n        columns={[2, 3]}\n        gap=\"1px\"\n        sx={{\n          bg: 'sunken',\n          borderRadius: 'extra',\n          overflow: 'hidden',\n          boxShadow: 'elevated'\n        }}\n      >\n        {events\n          .slice(0, 3)\n          .map(event =>\n            !past(event.end) ? <Event {...event} key={event.id} /> : <></>\n          )}\n      </Grid>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/index/github.tsx",
    "content": "import { Badge, Image, Text } from 'theme-ui'\nimport RelativeTime from 'react-relative-time'\n\ntype GitHubProps = {\n  type: 'commit' | 'issue' | 'pull_request'\n  img: string\n  user: string\n  time: string\n  message: string\n  opacity?: number\n  url?: string\n}\n\nexport default function GitHub({\n  type,\n  img,\n  user,\n  time,\n  message,\n  opacity,\n  url,\n  ...props\n}: GitHubProps) {\n  return (\n    <Badge\n      variant=\"pill\"\n      bg=\"snow\"\n      as=\"a\"\n      {...({ href: url || 'https://github.com/hackclub' } as any)}\n      target=\"_blank\"\n      rel=\"noopener\"\n      sx={{\n        color: 'black',\n        textDecoration: 'none',\n        fontWeight: '400',\n        zIndex: 4,\n        px: '4px !important',\n        py: '2px !important',\n        display: 'flex',\n        alignItems: 'center',\n        gap: 2,\n        height: '2rem',\n        width: ['fit-content', null, null, '100%'],\n        maxWidth: '30rem',\n        opacity: opacity\n      }}\n      {...props}\n    >\n      <Image\n        alt=\"GitHub user avatar\"\n        src={img}\n        sx={{ borderRadius: '100%', height: '90%', mr: 2, flexShrink: 0 }}\n      />\n      <Text\n        sx={{\n          mr: 2,\n          textOverflow: 'ellipsis',\n          overflow: 'hidden',\n          whiteSpace: 'nowrap',\n          flexShrink: 0,\n          display: ['none', 'inline-block', 'inline-block', 'inline-block']\n        }}\n      >\n        {user}\n      </Text>\n      <Text\n        sx={{\n          textOverflow: 'ellipsis',\n          maxWidth: '100%',\n          display: 'inline-block',\n          overflow: 'hidden',\n          whiteSpace: 'nowrap',\n          flexShrink: 1\n        }}\n      >\n        {message}\n      </Text>\n      <Text\n        as=\"span\"\n        sx={{\n          fontSize: ['8px', '8px', '10px'],\n          color: 'inherit',\n          mx: 2,\n          flexShrink: 0,\n          ml: 'auto'\n        }}\n      >\n        <RelativeTime value={time} titleformat=\"iso8601\" />\n      </Text>\n    </Badge>\n  )\n}\n"
  },
  {
    "path": "components/letterhead.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Avatar, Badge, Box, Container, Flex, Heading } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from './nav'\nimport Footer from './footer'\nimport ForceTheme from './force-theme'\n\nconst Authored = ({ name, avatar, url, date, ...props }) => (\n  <Flex\n    mt={3}\n    {...props}\n    sx={{\n      flexWrap: 'wrap',\n      justifyContent: 'center',\n      alignItems: 'center',\n      'a, span, time': {\n        mt: 0,\n        mb: 2,\n        color: 'muted',\n        border: '1px solid',\n        borderColor: 'background',\n        bg: 'sunken',\n        fontSize: 2,\n        fontWeight: 'body',\n        lineHeight: '36px',\n        '@media print': {\n          bg: 'transparent',\n          border: 0,\n          fontSize: 1\n        }\n      }\n    }}\n  >\n    <Badge\n      variant=\"pill\"\n      as={url ? 'a' : 'span'}\n      href={url}\n      sx={{\n        mr: [2, 3],\n        pl: 1,\n        pr: 3,\n        display: 'inline-flex',\n        alignItems: 'center',\n        textDecoration: 'none'\n      }}\n    >\n      <Avatar src={avatar} alt={name} size={36} mr={2} />\n      {name}\n    </Badge>\n    <Badge\n      variant=\"pill\"\n      as=\"time\"\n      px={3}\n      dateTime={date?.startsWith('20') ? date : undefined}\n    >\n      {date}\n    </Badge>\n  </Flex>\n)\n\nconst Letterhead = ({\n  title,\n  desc,\n  author = { name: null, avatar: null, url: null },\n  date,\n  img,\n  path,\n  includeMeta = true,\n  hideGitHub = false,\n  children,\n  ...props\n}) => (\n  <>\n    <Meta as={Head} title={title} description={desc} image={img} />\n    <Nav color=\"text\" />\n    <ForceTheme theme=\"light\" />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'sheet',\n        color: 'text',\n        pt: [5, null, null, null, 6],\n        pb: [3, null, 4],\n        textAlign: 'center'\n      }}\n    >\n      <Container variant=\"copy\">\n        <Heading as=\"h1\" variant=\"title\" sx={{ color: 'primary', mt: [2, 4] }}>\n          {title}\n        </Heading>\n        <Heading as=\"h2\" variant=\"subtitle\" sx={{ mt: 3, color: 'text' }}>\n          {desc}\n        </Heading>\n        {author?.name && <Authored {...author} date={date} />}\n      </Container>\n    </Box>\n    <Container\n      variant=\"copy\"\n      sx={{\n        py: [3, 4],\n        fontSize: [2, 3],\n        h1: {\n          textAlign: ['left', 'center'],\n          color: 'cyan',\n          my: 4,\n          a: { color: 'inherit' }\n        }\n      }}\n    >\n      {children}\n    </Container>\n    <Footer />\n  </>\n)\n\nexport default Letterhead\n"
  },
  {
    "path": "components/mail-card.tsx",
    "content": "import { Box, Card, Link, Text } from 'theme-ui'\n\nexport default function MailCard({ body, date, link, issue }) {\n  body = body.length > 130 ? body.substring(0, 130) + '...' : body\n  return (\n    <Card\n      variant=\"interactive\"\n      sx={{\n        cursor: 'pointer',\n        padding: '0 !important'\n      }}\n    >\n      <Link\n        href={`https://workshops.hackclub.com/leader-newsletters/${link}`}\n        sx={{ textDecoration: 'none' }}\n        target=\"_blank\"\n        rel=\"noopener norefferer\"\n      >\n        <Box\n          sx={{\n            height: '90%',\n            color: 'black',\n            textDecoration: 'none !important'\n          }}\n        >\n          <Box\n            sx={{\n              width: '100%',\n              height: '10px',\n              backgroundRepeat: 'repeat-x',\n              backgroundSize: '100%',\n              backgroundImage: `url('/letter-pattern.svg')`\n            }}\n          />\n          <Box\n            sx={{\n              placeItems: 'center',\n              display: 'grid',\n              height: '100%',\n              paddingY: [3, 4, 0]\n            }}\n          >\n            <Box sx={{ px: [3, 4] }}>\n              <Text>\n                {date}\n                <Text sx={{ color: '#8492a6' }}>— From Hack Club, to You</Text>\n              </Text>\n              <Text as=\"h2\" sx={{ fontWeight: 'normal' }}>\n                {body}\n              </Text>\n            </Box>\n          </Box>\n        </Box>\n      </Link>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "components/marquee.tsx",
    "content": "import {\n  useRef,\n  useEffect,\n  useState,\n  Children,\n  cloneElement,\n  isValidElement,\n  type ReactNode,\n  type ReactElement\n} from 'react'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\n\nconst scroll = keyframes`\n  from { transform: translateX(0); }\n  to { transform: translateX(-50%); }\n`\n\nconst Track = styled.div<{ duration: number }>`\n  display: flex;\n  width: max-content;\n  animation: ${scroll} ${props => props.duration}s linear infinite;\n  @media (prefers-reduced-motion: reduce) {\n    animation: none;\n  }\n`\n\ntype Props = {\n  velocity?: number\n  children: ReactNode\n  onInit?: () => void\n  onFinish?: () => void\n}\n\nexport default function Marquee({\n  velocity = 30,\n  children,\n  onInit,\n  onFinish\n}: Props) {\n  const trackRef = useRef<HTMLDivElement>(null)\n  const [duration, setDuration] = useState(20)\n\n  useEffect(() => {\n    if (trackRef.current) {\n      const width = trackRef.current.scrollWidth / 2\n      setDuration(width / velocity)\n    }\n  }, [velocity])\n\n  const childArray = Children.toArray(children)\n  const dupes = childArray.map((child, i) =>\n    isValidElement(child)\n      ? cloneElement(child as ReactElement, { key: `dup-${i}` })\n      : child\n  )\n\n  return (\n    <div style={{ overflow: 'hidden', width: '100%' }}>\n      <Track ref={trackRef} duration={duration}>\n        {childArray}\n        {dupes}\n      </Track>\n    </div>\n  )\n}\n"
  },
  {
    "path": "components/mention.tsx",
    "content": "import Image from 'next/image'\nimport Link from 'next/link'\nimport { memo } from 'react'\n\nconst StaticMention = memo(function StaticMention({\n  avatar,\n  username,\n  link\n}: {\n  avatar?: string\n  username: string\n  link: string\n}) {\n  return (\n    <Link\n      href={link}\n      className={`mention`}\n      style={{\n        display: 'inline-flex',\n        alignItems: 'baseline',\n        textDecoration: 'none'\n      }}\n    >\n      {avatar && (\n        <Image\n          src={avatar}\n          alt={username}\n          width={32}\n          height={32}\n          className=\"mention-avatar\"\n          style={{\n            borderRadius: '50%',\n            marginRight: '4px',\n            alignSelf: 'flex-end'\n          }}\n        />\n      )}\n      @{username}\n    </Link>\n  )\n})\n\nexport default StaticMention\n"
  },
  {
    "path": "components/nav.tsx",
    "content": "import React, { useEffect, useState } from 'react'\nimport styled from '@emotion/styled'\nimport { css, keyframes } from '@emotion/react'\nimport { Box, Container, Flex, Link } from 'theme-ui'\nimport theme from '../lib/theme'\nimport Icon from './icon'\nimport Flag from './flag'\nimport ScrollLock from 'react-scrolllock'\nimport NextLink from 'next/link'\nimport { useSearchParams } from 'next/navigation'\n\nconst rgbaBgColor = (props, opacity) =>\n  `rgba(\n    ${props.bgColor[0]},\n    ${props.bgColor[1]},\n    ${props.bgColor[2]},\n    ${opacity}\n  )`\n\n// const bg = (props) =>\n//   props.dark\n//     ? css`\n//         -webkit-backdrop-filter: saturate(90%) blur(20px);\n//         backdrop-filter: saturate(90%) blur(20px);\n//       `\n//     : css`\n//         -webkit-backdrop-filter: saturate(180%) blur(20px);\n//         backdrop-filter: saturate(180%) blur(20px);\n//       `\nconst fixed = props =>\n  (props.scrolled || props.toggled || props.fixed) &&\n  css`\n    background-color: ${rgbaBgColor(props, 0.96875)};\n    border-bottom: 1px solid rgba(48, 48, 48, 0.125);\n    @supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) {\n      background-color: ${props.transparent\n        ? 'transparent'\n        : rgbaBgColor(props, 0.75)};\n      -webkit-backdrop-filter: saturate(180%) blur(20px);\n      backdrop-filter: saturate(180%) blur(20px);\n      /* {bg}; to support dark mode later */\n    }\n  `\n\nconst Root = styled(Box, {\n  shouldForwardProp: prop =>\n    !['bgColor', 'scrolled', 'toggled', 'fixed', 'dark'].includes(prop)\n})`\n  position: fixed;\n  top: 0;\n  width: 100vw;\n  z-index: 1000;\n  ${fixed};\n  @media print {\n    display: none;\n  }\n`\n\nconst RootAny = Root as any\n\nexport const Content = styled(Container)`\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  position: relative;\n  z-index: 2;\n`\n\nconst hoverColor = name =>\n  ({\n    white: 'smoke',\n    smoke: 'muted',\n    muted: 'slate',\n    slate: 'black',\n    black: 'slate',\n    primary: 'error'\n  })[name] || 'black'\n\nconst slide = keyframes({\n  from: { transform: 'translateY(-25%)', opacity: 0 },\n  to: { transform: 'translateY(0)', opacity: 1 }\n})\n\nconst layout = props =>\n  props.isMobile\n    ? css`\n        display: ${props.toggled ? 'flex' : 'none'};\n        flex-direction: column;\n        overflow-y: auto;\n        text-align: left;\n        height: 100vh;\n        @media (prefers-reduced-motion: no-preference) {\n          animation: ${slide} 0.25s ease-in;\n        }\n        a {\n          color: ${theme.colors[props.dark ? 'white' : 'black']} !important;\n          margin: 0 auto;\n          height: 64px;\n          font-weight: bold;\n          font-size: ${theme.fontSizes[2]}px;\n          width: 100vw;\n          &:not(:last-child) {\n            border-bottom: 1px solid rgba(48, 48, 48, 0.125);\n          }\n          @media screen and (max-width: 22em) {\n            max-width: 16rem;\n          }\n        }\n      `\n    : css`\n        @media (min-width: 56em) {\n          display: flex;\n          justify-content: flex-end;\n        }\n        a {\n          font-size: 18px;\n          &:hover {\n            text-decoration: underline;\n            color: ${theme.colors[hoverColor(props.color)]};\n          }\n        }\n      `\nconst NavBar = styled(Box, {\n  shouldForwardProp: prop => !['isMobile', 'toggled'].includes(prop)\n})`\n  display: none;\n  ${layout};\n  a {\n    margin-left: ${theme.space[1]}px;\n    padding: ${theme.space[3]}px;\n    text-decoration: none;\n    @media (min-width: 56em) {\n      color: ${props => theme.colors[props.color] || props.color};\n    }\n  }\n`\n\nconst Navigation = props => (\n  // REMINDER: This should be no more than 7 links :)\n  <NavBar role=\"navigation\" {...props}>\n    <Link as={NextLink} href=\"/clubs\">\n      Clubs\n    </Link>\n    <Link as={NextLink} href=\"/fiscal-sponsorship\">\n      Fiscal&nbsp;Sponsorship\n    </Link>\n    <Link as={NextLink} href=\"/hackathons\">\n      Hackathons\n    </Link>\n    <Link href=\"https://slack.hackclub.com\">Join</Link>\n    <Link href=\"https://toolbox.hackclub.com/\">Toolbox</Link>\n    <Link as={NextLink} href=\"/philanthropy\">\n      Donors\n    </Link>\n  </NavBar>\n)\n\nconst ToggleContainer = styled(Flex)`\n  align-items: center;\n  justify-content: center;\n  min-width: 64px;\n  min-height: 44px;\n  cursor: pointer;\n  user-select: none;\n  margin-left: auto;\n  @media (min-width: 56em) {\n    display: none;\n  }\n`\n\ntype HeaderProps = {\n  unfixed?: boolean\n  color?: string\n  fixed?: boolean\n  dark?: boolean\n  bgColor?: string | number[]\n}\n\nexport default function Header({\n  unfixed = false,\n  color = 'white',\n  bgColor,\n  dark = false,\n  fixed = false,\n  ...props\n}: HeaderProps) {\n  const [scrolled, setScrolled] = useState(false)\n  const [toggled, setToggled] = useState(false)\n  const [mobile, setMobile] = useState(false)\n  const searchParams = useSearchParams()\n  const isKawaii = searchParams.get('uwu') != null\n\n  const onScroll = () => {\n    const newState = window.scrollY >= 16\n\n    setScrolled(newState)\n  }\n\n  const handleToggleMenu = () => {\n    setToggled(t => !t)\n  }\n\n  useEffect(() => {\n    if (typeof window !== 'undefined') {\n      if (!unfixed) {\n        window.addEventListener('scroll', onScroll)\n      }\n\n      const mobileQuery = window.matchMedia('(max-width: 48em)')\n      mobileQuery.addEventListener('change', () => {\n        setMobile(true)\n        setToggled(false)\n      })\n    }\n\n    return () => {\n      window.removeEventListener('scroll', onScroll)\n    }\n  }, [unfixed])\n\n  const baseColor = dark\n    ? color || 'white'\n    : color === 'white' && scrolled\n      ? 'black'\n      : color\n  const toggleColor = dark\n    ? color || 'snow'\n    : toggled || (color === 'white' && scrolled)\n      ? 'slate'\n      : color\n\n  return (\n    <RootAny\n      {...props}\n      fixed={fixed}\n      scrolled={scrolled}\n      toggled={toggled}\n      dark={dark}\n      bgColor={bgColor || (dark ? [32, 34, 36] : [255, 255, 255])}\n      as=\"header\"\n    >\n      <Content>\n        <Flag scrolled={scrolled || fixed} uwu={isKawaii} />\n        <Navigation\n          as=\"nav\"\n          aria-hidden={!!mobile}\n          color={baseColor}\n          dark={dark}\n        />\n        <ToggleContainer color={toggleColor} onClick={handleToggleMenu}>\n          <Icon glyph={toggled ? 'view-close' : 'menu'} />\n        </ToggleContainer>\n      </Content>\n      <Navigation\n        as=\"nav\"\n        aria-hidden={!mobile}\n        isMobile\n        toggled={toggled}\n        color={baseColor}\n        dark={dark}\n      />\n      {toggled && <ScrollLock />}\n    </RootAny>\n  )\n}\n"
  },
  {
    "path": "components/onboard/gallery-paginated.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { useEffect, useRef } from 'react'\nimport PaginationButtons from './pagination-buttons'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport { Box, Button, Flex, Grid, Heading, Text } from 'theme-ui'\nimport Item from './item'\nimport Nav from '../nav'\nimport { Slide } from '../react-reveal-compat'\n\nconst perPage = 10\n\nexport const GalleryPage = ({ currentPage, itemCount, currentProjects }) => {\n  const spotlightRef = useRef(null)\n  useEffect(() => {\n    const handler = event => {\n      spotlightRef.current.style.background = `radial-gradient(\n\t\t\t\tcircle at ${event.pageX}px ${event.pageY}px,\n\t\t\t\trgba(0, 0, 0, 0) 10px,\n\t\t\t\trgba(0, 0, 0, 0.8) 80px\n\t\t\t)`\n    }\n    window.addEventListener('mousemove', handler)\n    return () => window.removeEventListener('mousemove', handler)\n  }, [])\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Gallery\"\n        description=\"Check out the latest and greatest from the Onboard project.\"\n      ></Meta>\n      <style>{`\n\n\t\t\t\t@font-face {\n\t\t\t\t\tfont-family: 'Phantom Sans';\n\t\t\t\t\tsrc: url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff')\n\t\t\t\t\t\t\tformat('woff'),\n\t\t\t\t\t\turl('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff2')\n\t\t\t\t\t\t\tformat('woff2');\n\t\t\t\t\tfont-weight: 500;\n\t\t\t\t\tfont-style: normal;\n\t\t\t\t\tfont-display: swap;\n\t\t\t\t}\n\n\t\t\t\thtml {\n\t\t\t\t\tscroll-behavior: smooth;\n\t\t\t\t}\n\t\t\t`}</style>\n      <Head></Head>\n      <Nav />\n      <Box\n        as=\"header\"\n        sx={{\n          bg: '#000000',\n          backgroundImage: `\n\t\t\t\t\t\tlinear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)),\n\t\t\t\t\t\turl('https://cloud-dst3a9oz5-hack-club-bot.vercel.app/0image.png')\n\t\t\t\t\t`,\n          color: '#ffffff',\n          position: 'relative'\n        }}\n      >\n        <Box\n          ref={spotlightRef}\n          sx={{\n            position: 'absolute',\n            zIndex: 2,\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            bg: '#000000',\n            pointerEvents: 'none'\n          }}\n        />\n        <Flex\n          sx={{\n            p: 4,\n            flexDirection: 'column',\n            alignItems: 'center',\n            zIndex: 5,\n            position: 'relative'\n          }}\n        >\n          <Flex\n            sx={{\n              p: 4,\n              flexDirection: 'column',\n              alignItems: 'center',\n              zIndex: 5,\n              margin: '3vh auto',\n              position: 'relative'\n            }}\n          >\n            <Heading as=\"h1\" variant=\"title\" sx={{ textAlign: 'center' }}>\n              Gallery\n            </Heading>\n            <Text as=\"p\" variant=\"subtitle\" sx={{ textAlign: 'center' }}>\n              Check out the latest and greatest from the OnBoard project.\n            </Text>\n            <Flex sx={{ mt: 16, gap: 10, flexDirection: ['column', 'row'] }}>\n              <Button\n                variant=\"ctaLg\"\n                as=\"a\"\n                href=\"https://hackclub.com/onboard\"\n                target=\"_blank\"\n                sx={{\n                  background: t => t.util.gx('#60cc38', '#113b11')\n                }}\n              >\n                Make your own!\n              </Button>\n            </Flex>\n          </Flex>\n        </Flex>\n      </Box>\n      <Box\n        sx={{\n          bg: 'white',\n          py: [4, 5],\n          textAlign: 'center'\n        }}\n      >\n        <PaginationButtons\n          currentPage={currentPage}\n          itemCount={itemCount}\n          perPage={perPage}\n        />\n        <Grid\n          gap={4}\n          columns={[null, 2]}\n          sx={{\n            p: 4,\n            maxWidth: 'copyPlus',\n            mx: 'auto',\n            mt: 4,\n            mb: 5,\n            textAlign: 'center'\n          }}\n        >\n          {currentProjects.map(project => (\n            <Slide delay={10} up key={project.name}>\n              <Item key={project.name} project={project} />\n            </Slide>\n          ))}\n        </Grid>\n        <PaginationButtons\n          currentPage={currentPage}\n          itemCount={itemCount}\n          perPage={perPage}\n        />\n      </Box>\n    </>\n  )\n}\n"
  },
  {
    "path": "components/onboard/item.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Image from 'next/image'\nimport { Heading, Card } from 'theme-ui'\n\nconst Item = ({ project }) => {\n  const { name, imageTop, galleryURL } = project\n  return (\n    <Card\n      as=\"a\"\n      href={galleryURL}\n      sx={{\n        cursor: 'pointer',\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center'\n      }}\n    >\n      <Image\n        src={imageTop}\n        alt={name}\n        width={400}\n        height={300}\n        style={{ width: '100%', height: 'auto' }}\n      />\n      <Heading\n        as=\"h2\"\n        sx={{\n          textAlign: 'center',\n          mt: 3\n        }}\n      >\n        {name}\n      </Heading>\n    </Card>\n  )\n}\n\nexport default Item\n"
  },
  {
    "path": "components/onboard/pagination-buttons.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Button, Text } from 'theme-ui'\n\nconst PaginationButtons = ({ currentPage, itemCount, perPage }) => {\n  const showPreviousPage = currentPage > 1\n  const showNextPage = itemCount > currentPage * perPage\n\n  return (\n    <Box\n      sx={{\n        mt: 5,\n        textAlign: 'center'\n      }}\n    >\n      {showPreviousPage && (\n        <Button\n          as=\"a\"\n          href={`/onboard/gallery/${parseInt(currentPage) - 1}`}\n          sx={{\n            bg: 'black',\n            color: 'white',\n            ':hover': {\n              bg: 'white',\n              color: 'black'\n            }\n          }}\n        >\n          {'<'}\n        </Button>\n      )}\n      <Text\n        as=\"span\"\n        sx={{\n          mx: 3,\n          color: 'black'\n        }}\n      >\n        {currentPage}\n      </Text>\n      {showNextPage && (\n        <Button\n          as=\"a\"\n          href={`/onboard/gallery/${parseInt(currentPage) + 1}`}\n          sx={{\n            bg: 'black',\n            color: 'white',\n            ':hover': {\n              bg: 'white',\n              color: 'black'\n            }\n          }}\n        >\n          {'>'}\n        </Button>\n      )}\n    </Box>\n  )\n}\n\nexport default PaginationButtons\n"
  },
  {
    "path": "components/onboard/recap.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { useEffect, useRef } from 'react'\nimport usePrefersReducedMotion from '../../lib/use-prefers-reduced-motion'\nimport { Box, Grid } from 'theme-ui'\nimport sleep from '../../lib/sleep'\n\nconst dimBg = '#151515'\n\n// \"LET'S RECAP\" pixel art (exported from Piskel)\n// Original: https://doggo.ninja/fiK0nk.piskel\nconst recapWidth = 71\nconst recapHeight = 10\nconst recapPixels = [\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff\n]\n\nconst Recap = () => {\n  const prefersReducedMotion = usePrefersReducedMotion()\n  // Fancy lights animation\n  const lightsScrollTrigger = useRef(null)\n  const lightsAnimated = useRef(false)\n  useEffect(() => {\n    let canceled = false\n\n    const setAtIndex = (i, color) => {\n      if (canceled) return\n\n      // Going outside of React for performance\n      const el = document.getElementById(`pixel-${i}`)\n      if (!el) return\n\n      if (recapPixels[i]) {\n        el.style.background = color\n        el.style.boxShadow = `0 0 10px ${color}`\n      } else {\n        el.style.background = dimBg\n        el.style.boxShadow = 'none'\n      }\n    }\n    const setAll = color => {\n      for (let i = 0; i < recapPixels.length; i++) setAtIndex(i, color)\n    }\n\n    const animate = async () => {\n      if (lightsAnimated.current) return\n      lightsAnimated.current = true\n\n      // Illuminate lights in diagonal lines starting with only top left.\n      for (\n        let curColumn = 0;\n        curColumn < recapWidth + recapHeight;\n        curColumn++\n      ) {\n        for (\n          let offset = curColumn;\n          offset >= Math.max(0, curColumn - recapHeight);\n          offset--\n        ) {\n          const i = curColumn * recapWidth + offset - offset * recapWidth\n          setAtIndex(i, '#ffffff')\n          if (!recapPixels[i]) await sleep(4)\n          if (canceled) return\n        }\n        // await sleep(2); if (canceled) return\n      }\n\n      // Flash the lights twice\n      await sleep(600)\n      if (canceled) return\n\n      setAll(dimBg)\n      await sleep(80)\n      if (canceled) return\n\n      setAll('#aaaaaa')\n      await sleep(20)\n      if (canceled) return\n\n      setAll(dimBg)\n      await sleep(30)\n      if (canceled) return\n\n      setAll('#aaaaaa')\n      await sleep(100)\n      if (canceled) return\n\n      setAll(dimBg)\n      await sleep(200)\n      if (canceled) return\n\n      // Animate rainbow 2-column increments\n      for (let x = 0; x < recapWidth; x++) {\n        const color = `hsl(${(x * 360) / recapWidth}, 100%, 65%)`\n        for (let y = 0; y < recapHeight; y++) {\n          const i = y * recapWidth + x\n          setAtIndex(i, color)\n        }\n        if (x % 2 === 1) await sleep(35)\n      }\n    }\n\n    if (prefersReducedMotion) {\n      if (!lightsAnimated.current) setAll('#ffffff')\n      return () => (canceled = true)\n    } else {\n      const observer = new IntersectionObserver(\n        ([entry]) => {\n          if (entry.isIntersecting) animate()\n        },\n        { threshold: 0.5 }\n      )\n      observer.observe(lightsScrollTrigger.current)\n      return () => {\n        canceled = true\n        observer.disconnect()\n      }\n    }\n  }, [prefersReducedMotion])\n\n  return (\n    <Grid\n      ref={lightsScrollTrigger}\n      gap={['2px', '3px', '4px']}\n      columns={recapWidth}\n      sx={{ width: '100%', maxWidth: 800 }}\n    >\n      {recapPixels.map((_, i) => (\n        <Box id={`pixel-${i}`} key={i} sx={{ bg: dimBg, paddingTop: '100%' }} />\n      ))}\n    </Grid>\n  )\n}\n\nexport default Recap\n"
  },
  {
    "path": "components/onboard/youtube-video.tsx",
    "content": "import { useMemo } from 'react'\n\nconst YoutubeVideo = ({\n  'youtube-id': youtubeID = 'dQw4w9WgXcQ',\n  list,\n  title = 'YouTube video player',\n  width,\n  height\n}) => {\n  const src = useMemo(() => {\n    const url = new URL(`https://www.youtube.com/embed/${youtubeID}`)\n    if (list) {\n      url.searchParams.set('list', list)\n    }\n    return url\n  }, [youtubeID, list])\n\n  const allowlist = [\n    'accelerometer',\n    'autoplay',\n    'clipboard-write',\n    'encrypted-media',\n    'gyroscope',\n    'picture-in-picture',\n    'web-share',\n    'fullscreen'\n  ].join('; ')\n\n  return (\n    <iframe\n      src={src.toString()}\n      title={title}\n      width={width}\n      height={height}\n      allow={allowlist}\n      allowFullScreen\n    ></iframe>\n  )\n}\n\nexport default YoutubeVideo\n"
  },
  {
    "path": "components/particles.tsx",
    "content": "import Particles from 'react-tsparticles'\nimport React from 'react'\n\nconst Particle = React.memo(function Particle() {\n  return (\n    <Particles\n      id=\"tsparticles\"\n      options={{\n        fpsLimit: 60,\n        interactivity: {\n          events: {\n            onClick: {\n              enable: true,\n              mode: 'push'\n            },\n            onHover: {\n              enable: true,\n              mode: 'repulse'\n            },\n            resize: true\n          },\n          modes: {\n            bubble: {\n              distance: 200,\n              duration: 2,\n              opacity: 0.5,\n              size: 40\n            },\n            push: {\n              quantity: 2\n            },\n            repulse: {\n              distance: 100,\n              duration: 0.5\n            }\n          }\n        },\n        particles: {\n          color: {\n            value: '#CDAEFB'\n          },\n          links: {\n            color: '#82A9F9',\n            distance: 200,\n            enable: true,\n            opacity: 0.2,\n            width: 1\n          },\n          collisions: {\n            enable: false\n          },\n          move: {\n            direction: 'none',\n            enable: true,\n            outMode: 'bounce',\n            random: false,\n            speed: 1,\n            straight: false\n          },\n          number: {\n            density: {\n              enable: true,\n              area: 500\n            },\n            value: 50\n          },\n          opacity: {\n            value: 0.25\n          },\n          shape: {\n            type: 'circle'\n          },\n          size: {\n            random: true,\n            value: 1.5\n          }\n        },\n        detectRetina: true\n      }}\n    />\n  )\n})\n\nexport default Particle\n"
  },
  {
    "path": "components/photo.tsx",
    "content": "import styled from '@emotion/styled'\nimport { Card, Text } from 'theme-ui'\nimport Image, { StaticImageData } from 'next/image'\nimport theme from '../lib/theme'\nimport React, { ReactNode } from 'react'\n\nconst Caption = styled(Text)`\n  display: block;\n  font-size: ${theme.fontSizes[1]}px;\n  line-height: ${theme.lineHeights.body};\n  padding: ${theme.space[2]}px ${theme.space[3]}px;\n  position: absolute;\n  bottom: 0;\n  border-radius: 0 0 ${theme.radii.extra}px ${theme.radii.extra}px;\n  width: 100%;\n  max-width: 100%;\n  z-index: 0;\n`\n\ntype PhotoProps = {\n  src: string | StaticImageData\n  width?: number\n  height?: number\n  alt?: string\n  caption?: ReactNode\n  showAlt?: boolean\n  dark?: boolean\n  loading?: 'eager' | 'lazy'\n  unoptimized?: boolean\n  sx?: any\n}\n\nconst Photo = React.forwardRef<HTMLDivElement, PhotoProps>(function Photo(\n  {\n    src,\n    width,\n    height,\n    alt,\n    caption,\n    showAlt,\n    dark,\n    unoptimized = false,\n    loading,\n    ...props\n  }: PhotoProps,\n  ref\n) {\n  const showCaption = showAlt && alt\n  return (\n    <Card\n      {...props}\n      as=\"figure\"\n      ref={ref}\n      sx={{\n        p: [0, 0, 0],\n        boxShadow: 'elevated',\n        borderRadius: 'extra',\n        position: 'relative',\n        maxWidth: '100%',\n        lineHeight: 0,\n        height: '100%',\n        ...props.sx,\n        img: { objectFit: 'cover', objectPosition: 'center' }\n      }}\n    >\n      <Image\n        src={src}\n        alt={alt}\n        width={width}\n        height={height}\n        loading={loading || 'lazy'}\n        unoptimized={unoptimized}\n        style={{\n          width: '100%',\n          height: '100%',\n          objectFit: 'cover'\n        }}\n      />\n      {showCaption && (\n        <Caption\n          as=\"figcaption\"\n          variant={dark ? 'cards.translucentDark' : 'cards.translucent'}\n        >\n          {caption ?? alt}\n        </Caption>\n      )}\n    </Card>\n  )\n})\n\nexport default Photo\n"
  },
  {
    "path": "components/posts/emoji.tsx",
    "content": "import { memo, useState, useEffect } from 'react'\nimport Image from 'next/image'\n\nconst stripColons = str => {\n  const colonIndex = str.indexOf(':')\n  if (colonIndex > -1) {\n    // :emoji:\n    if (colonIndex === str.length - 1) {\n      str = str.substring(0, colonIndex)\n      return stripColons(str)\n    } else {\n      str = str.substr(colonIndex + 1)\n      return stripColons(str)\n    }\n  }\n  return str\n}\n\nexport const EmojiImg = ({\n  name,\n  ...props\n}: {\n  name: string\n  src: string\n  [key: string]: any\n}) => (\n  <Image\n    alt={name + ' emoji'}\n    loading=\"lazy\"\n    className=\"post-emoji\"\n    width={20}\n    height={20}\n    {...props}\n    style={{\n      maxWidth: '100%',\n      height: 'auto'\n    }}\n  />\n)\n\ntype CustomEmojiProps = {\n  name: string\n}\n\nconst CustomEmoji = memo(function CustomEmoji({ name }: CustomEmojiProps) {\n  const emoji = stripColons(name)\n  const [image, setImage] = useState<string>(null)\n\n  useEffect(() => {\n    fetch('https://scrapbook.hackclub.com/api/emoji')\n      .then(r => r.json())\n      .then(emojis => {\n        if (emojis[emoji]) {\n          setImage(emojis[emoji])\n          return\n        }\n        setImage(\n          'https://emoji.slack-edge.com/T0266FRGM/parrot/c9f4fddc5e03d762.gif'\n        )\n      })\n      .catch(console.error)\n  }, [emoji])\n\n  return image ? (\n    <EmojiImg className=\"post-emoji\" src={image} name={emoji} />\n  ) : (\n    <span>:{emoji}:</span>\n  )\n})\n\nexport default CustomEmoji\n"
  },
  {
    "path": "components/posts/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Button, Box, Card, Text, Grid, Avatar, Flex } from 'theme-ui'\nimport { formatDate } from '../../lib/dates'\nimport { Fragment } from 'react'\nimport { last, filter } from 'lodash'\nimport Masonry from 'react-masonry-css'\nimport Mention from './mention'\nimport Emoji from './emoji'\nimport Image from 'next/image'\n\nconst dataDetector =\n  /(<.+?[|]?\\S+>)|(@\\S+)|(`{3}[\\S\\s]+`{3})|(`[^`]+`)|(_[^_]+_)|(\\*[^*]+\\*)|(:[^ .,;`\\u2013~!@#$%^&*(){}=\\\\:\"<>?|A-Z]+:)/\n\nexport const formatText = text =>\n  text.split(dataDetector).map((chunk, i) => {\n    if (chunk?.startsWith(':') && chunk?.endsWith(':')) {\n      return <Emoji name={chunk} key={i} />\n    }\n    if (chunk?.startsWith('@') || chunk?.startsWith('<@')) {\n      const punct = /([,!:.'\"’”]|’s|'s|\\))+$/g\n      const username = chunk.replace(/[@<>]/g, '').replace(punct, '')\n      return (\n        <Fragment key={i}>\n          <Mention username={username} />\n          {chunk.match(punct)}\n        </Fragment>\n      )\n    }\n    if (chunk?.startsWith('<')) {\n      const parts = chunk.match(/<(([^|]+)[|])?([^>]+?)>/)\n      const url = parts?.[2] || last(parts)\n      const children = last(parts)\n        ?.replace(/https?:\\/\\//, '')\n        .replace(/\\/$/, '')\n      return (\n        <a href={url} target=\"_blank\" rel=\"noreferrer\" key={i}>\n          {children}\n        </a>\n      )\n    }\n    if (chunk?.startsWith('```')) {\n      return <pre key={i}>{chunk.replace(/```/g, '')}</pre>\n    }\n    if (chunk?.startsWith('`')) {\n      return <code key={i}>{chunk.replace(/`/g, '')}</code>\n    }\n    if (chunk?.startsWith('*')) {\n      return <strong key={i}>{chunk.replace(/\\*/g, '')}</strong>\n    }\n    if (chunk?.startsWith('_')) {\n      return <i key={i}>{chunk.replace(/_/g, '')}</i>\n    }\n    return <Fragment key={i}>{chunk?.replace(/&amp;/g, '&')}</Fragment>\n  })\n\nconst Post = ({\n  user = {\n    username: 'abc',\n    avatar: '',\n    streakDisplay: false,\n    streakCount: 0\n  },\n  text,\n  attachments = [],\n  postedAt\n}) => (\n  <Card className=\"post\" sx={{ p: [3, 3], width: '100%', bg: 'elevated' }}>\n    <Flex\n      as=\"a\"\n      href={`https://scrapbook.hackclub.com/${user.username}`}\n      sx={{\n        color: 'inherit',\n        textDecoration: 'none',\n        alignItems: 'center',\n        mb: 2\n      }}\n    >\n      <Avatar loading=\"lazy\" src={user.avatar} alt={user.username} mr={2} />\n      <Box>\n        <Text variant=\"subheadline\" my={0} fontSize={[1, 1]}>\n          @{user.username}\n        </Text>\n        <Text as=\"time\" variant=\"caption\" fontSize={0}>\n          {formatDate({ format: 'mmmm d yyyy', date: postedAt })}\n        </Text>\n      </Box>\n    </Flex>\n    <Text\n      as=\"p\"\n      sx={{\n        fontSize: 2,\n        a: {\n          color: 'primary',\n          wordBreak: 'break-all',\n          wordWrap: 'break-word'\n        },\n        '> div': { width: 18, height: 18 }\n      }}\n    >\n      {formatText(text)}\n    </Text>\n    {attachments.length > 0 && (\n      <>\n        <Grid\n          gap={2}\n          columns={2}\n          sx={{\n            alignItems: 'center',\n            textAlign: 'center',\n            mt: 2,\n            div: {\n              maxWidth: '100%',\n              maxHeight: 256,\n              bg: 'sunken',\n              gridColumn: attachments.length === 1 ? 'span 2' : null\n            },\n            img: { objectFit: 'cover', width: '100%' }\n          }}\n        >\n          {filter(attachments, a =>\n            ['jpg', 'jpeg', 'png'].includes(\n              a.split('.')[a.split('.').length - 1]\n            )\n          ).map(img => (\n            <Image\n              key={img}\n              alt={img}\n              src={img}\n              width={800}\n              height={600}\n              style={{ width: '100%', height: '100%' }}\n            />\n          ))}\n        </Grid>\n      </>\n    )}\n  </Card>\n)\n\nexport default function Posts({ data = [] }) {\n  return (\n    <Box as=\"section\" sx={{ position: 'relative' }}>\n      <Masonry\n        breakpointCols={{\n          10000: 4,\n          1024: 3,\n          640: 2,\n          480: 1,\n          default: 1\n        }}\n        className=\"masonry-posts\"\n        columnClassName=\"masonry-posts-column\"\n      >\n        {data.map(post => (\n          <Post key={post.id} {...post} />\n        ))}\n      </Masonry>\n      <Box\n        sx={{\n          paddingBottom: '30px',\n          textAlign: 'center'\n        }}\n      >\n        <Text as=\"p\" variant=\"headline\" sx={{ color: 'white', mb: 3 }}>\n          These are just a few posts…\n        </Text>\n        <Button as=\"a\" variant=\"cta\" href=\"https://scrapbook.hackclub.com/\">\n          Keep exploring →\n        </Button>\n      </Box>\n      <style>{`\n      .masonry-posts {\n        display: flex;\n        width: 100%;\n        max-width: 100%;\n      }\n\n      .masonry-posts-column {\n        background-clip: padding-box;\n      }\n\n      .post {\n        margin-bottom: 16px;\n      }\n\n      @media (max-width: 32em) {\n        .post:nth-child(8) ~ .post {\n          display: none;\n        }\n      }\n\n      @media (min-width: 32em) {\n        .masonry-posts {\n          padding-right: 12px;\n        }\n\n        .masonry-posts-column {\n          padding-left: 12px;\n        }\n\n        .post {\n          border-radius: 12px;\n          margin-bottom: 12px;\n        }\n      }\n\n      @media (min-width: 64em) {\n        .masonry-posts {\n          padding-right: 24px;\n        }\n\n        .masonry-posts-column {\n          padding-left: 24px;\n        }\n\n        .post {\n          margin-bottom: 24px;\n        }\n      }\n\n    `}</style>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/posts/mention.tsx",
    "content": "import { Link, Avatar } from 'theme-ui'\nimport { memo, useState, useEffect } from 'react'\nimport { trim } from 'lodash'\n\nconst Mention = memo(function Mention({ username }: { username: string }) {\n  const [img, setImg] = useState(null)\n\n  useEffect(() => {\n    fetch(`https://scrapbook.hackclub.com/api/profiles/${trim(username)}`)\n      .then(r => r.json())\n      .then(profile => setImg(profile.avatar))\n      .catch(console.error)\n  }, [username])\n\n  return (\n    <Link\n      href={`https://scrapbook.hackclub.com/${username}`}\n      sx={{\n        display: 'inline-flex',\n        alignItems: 'baseline',\n        textDecoration: 'none'\n      }}\n    >\n      {img && (\n        <Avatar\n          src={img}\n          alt={username}\n          width={24}\n          height={24}\n          sx={{ mr: 1, alignSelf: 'flex-end' }}\n        />\n      )}\n      @{username}\n    </Link>\n  )\n})\n\nexport default Mention\n"
  },
  {
    "path": "components/press.mdx",
    "content": "import { Grid } from 'theme-ui'\n\nHack Club is a global nonprofit network of high school makers & student-led coding clubs where young people build the agency, the network, & the technical talent to think big & do big things in the world. Founded in 2014 by 16-year-old Zach Latta, Hack Clubs are now in nearly 400 high schools with 10,000 students each year.\n\nHack Club has been profiled on the TODAY Show, in the Wall Street Journal, and in many other publications around the country. If you are writing a story or have other press inquires, please contact Hack Club Co-founder Christina Asquith: [christina@hackclub.com](mailto:christina@hackclub.com).\n\n## Photos\n\n<Grid columns={[2, 3]} gap={3} sx={{ p: { m: 0, lineHeight: 0 }, img: { borderRadius: 'default' } }}>\n\n![Group photo at Assemble, our Summer 2022 hackathon](https://cloud-n8nzmcqp1-hack-club-bot.vercel.app/0assemble-group-min.png)\n\n![Student leading a workshop at Assemble](https://cloud-n8nzmcqp1-hack-club-bot.vercel.app/1assemble2-min.jpg)\n\n![Students wih hands raised at Flagship](https://cloud-n8nzmcqp1-hack-club-bot.vercel.app/2flagship4-min.jpg)\n\n![Group photo at Outernet, our Summer 2023 hackathon](https://cloud-n8nzmcqp1-hack-club-bot.vercel.app/3outernet-group-min.jpg)\n\n![Students coding at Outernet](https://cloud-n8nzmcqp1-hack-club-bot.vercel.app/4outernet1-min.jpg)\n\n![Students demonstrating a flame thrower at Outernet](https://cloud-ciha944cc-hack-club-bot.vercel.app/0outernet.png)\n\n</Grid>\n"
  },
  {
    "path": "components/react-reveal-compat.tsx",
    "content": "import React from 'react'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\n\nconst kFade = keyframes({ from: { opacity: 0 }, to: { opacity: 1 } })\nconst kFadeLeft = keyframes({\n  from: { opacity: 0, transform: 'translateX(-30px)' },\n  to: { opacity: 1, transform: 'translateX(0)' }\n})\nconst kFadeRight = keyframes({\n  from: { opacity: 0, transform: 'translateX(30px)' },\n  to: { opacity: 1, transform: 'translateX(0)' }\n})\nconst kFadeUp = keyframes({\n  from: { opacity: 0, transform: 'translateY(30px)' },\n  to: { opacity: 1, transform: 'translateY(0)' }\n})\nconst kFadeDown = keyframes({\n  from: { opacity: 0, transform: 'translateY(-30px)' },\n  to: { opacity: 1, transform: 'translateY(0)' }\n})\nconst kSlideLeft = keyframes({\n  from: { opacity: 0, transform: 'translateX(-80px)' },\n  to: { opacity: 1, transform: 'translateX(0)' }\n})\nconst kSlideRight = keyframes({\n  from: { opacity: 0, transform: 'translateX(80px)' },\n  to: { opacity: 1, transform: 'translateX(0)' }\n})\nconst kSlideUp = keyframes({\n  from: { opacity: 0, transform: 'translateY(60px)' },\n  to: { opacity: 1, transform: 'translateY(0)' }\n})\nconst kSlideDown = keyframes({\n  from: { opacity: 0, transform: 'translateY(-60px)' },\n  to: { opacity: 1, transform: 'translateY(0)' }\n})\nconst kZoom = keyframes({\n  from: { opacity: 0, transform: 'scale(0.85)' },\n  to: { opacity: 1, transform: 'scale(1)' }\n})\n\nconst Wrapper = styled.div<{\n  $anim: ReturnType<typeof keyframes>\n  $delay: number\n  $duration: number\n}>`\n  animation: ${p => p.$anim} ${p => p.$duration}ms ease-out ${p => p.$delay}ms\n    both;\n  @media (prefers-reduced-motion: reduce) {\n    animation: none;\n  }\n`\n\ntype RevealProps = {\n  children?: React.ReactNode\n  left?: boolean\n  right?: boolean\n  up?: boolean\n  down?: boolean\n  top?: boolean\n  bottom?: boolean\n  delay?: number | string\n  duration?: number | string\n  cascade?: boolean\n  style?: React.CSSProperties\n  className?: string\n}\n\nfunction RevealWrap({\n  children,\n  anim,\n  delay,\n  duration\n}: {\n  children: React.ReactNode\n  anim: ReturnType<typeof keyframes>\n  delay: number\n  duration: number\n}) {\n  return (\n    <Wrapper $anim={anim} $delay={delay} $duration={duration}>\n      {children}\n    </Wrapper>\n  )\n}\n\nexport function Fade({\n  children,\n  left,\n  right,\n  up,\n  down,\n  delay = 0,\n  duration = 500,\n  cascade\n}: RevealProps) {\n  const anim = left\n    ? kFadeLeft\n    : right\n      ? kFadeRight\n      : up\n        ? kFadeUp\n        : down\n          ? kFadeDown\n          : kFade\n  const d = Number(delay)\n  const dur = Number(duration)\n  if (cascade) {\n    return (\n      <>\n        {React.Children.map(children, (child, i) => (\n          <RevealWrap key={i} anim={anim} delay={d + i * 150} duration={dur}>\n            {child}\n          </RevealWrap>\n        ))}\n      </>\n    )\n  }\n  return (\n    <RevealWrap anim={anim} delay={d} duration={dur}>\n      {children}\n    </RevealWrap>\n  )\n}\n\nexport function Slide({\n  children,\n  left,\n  right,\n  top,\n  up,\n  delay = 0,\n  duration = 500\n}: RevealProps) {\n  const anim = left\n    ? kSlideLeft\n    : right\n      ? kSlideRight\n      : top\n        ? kSlideDown\n        : kSlideUp\n  return (\n    <RevealWrap anim={anim} delay={Number(delay)} duration={Number(duration)}>\n      {children}\n    </RevealWrap>\n  )\n}\n\nexport function Zoom({ children, delay = 0, duration = 500 }: RevealProps) {\n  return (\n    <RevealWrap anim={kZoom} delay={Number(delay)} duration={Number(duration)}>\n      {children}\n    </RevealWrap>\n  )\n}\n\nexport default Fade\n"
  },
  {
    "path": "components/react-tooltip.ts",
    "content": "import dynamic from 'next/dynamic'\n\nconst ReactTooltip = dynamic(() => import('react-tooltip'), {\n  ssr: false\n})\n\nexport default ReactTooltip\n"
  },
  {
    "path": "components/replit/scale-up.tsx",
    "content": "import React, { useState, useEffect, useRef } from 'react'\n\nconst easeInOutExpo = x =>\n  x === 0\n    ? 0\n    : x === 1\n      ? 1\n      : x < 0.5\n        ? Math.pow(2, 20 * x - 10) / 2\n        : (2 - Math.pow(2, -20 * x + 10)) / 2\n\nconst ScaleUp = ({ number, from = 0 }) => {\n  const [displayNumber, setDisplayNumber] = useState(from)\n  const previousNumberRef = useRef(from)\n\n  useEffect(() => {\n    const startValue = previousNumberRef.current\n    const duration = 2000\n    const startTime = performance.now()\n\n    const animate = () => {\n      const time = performance.now() - startTime\n      const progress = time / duration\n      const easedProgress = easeInOutExpo(progress)\n      const currentValue = startValue + (number - startValue) * easedProgress\n      setDisplayNumber(Math.round(currentValue))\n\n      if (progress < 1) {\n        requestAnimationFrame(animate)\n      } else {\n        setDisplayNumber(number)\n        previousNumberRef.current = number\n      }\n    }\n\n    if (startValue !== number) {\n      requestAnimationFrame(animate)\n    }\n  }, [number])\n\n  return <span>{displayNumber}</span>\n}\n\nexport default ScaleUp\n"
  },
  {
    "path": "components/replit/token-instructions.tsx",
    "content": "'use client'\n\nimport Icon from '@hackclub/icons'\nimport { useState } from 'react'\nimport { Box, Card, Text, Image, Heading, Button } from 'theme-ui'\n\nconst TokenInstructions = () => {\n  const [currentStep, setCurrentStep] = useState(0)\n\n  const tokenSteps = [\n    {\n      image: '/replit/replit-homepage.png',\n      desc: 'Go to replit.com, and sign in.'\n    },\n    {\n      image: '/replit/aarc1.gif',\n      desc: \"Open your browser's developer tools. You can do this by right-clicking on the page and selecting 'Inspect' or by pressing F12 on your keyboard.\"\n    },\n    {\n      image: '/replit/aarc2.gif',\n      desc: 'Select the application tab in the devtools'\n    },\n    {\n      image: '/replit/aarc3.gif',\n      desc: \"Make sure replit.com cookies are selected, then scroll down to find 'connect.sid'. Copy the entire token & paste it in the form at the top of this page.\"\n    }\n  ]\n\n  return (\n    <Card sx={{ maxWidth: '100%', mx: 'auto', p: 4 }}>\n      <Box\n        sx={{\n          display: 'flex',\n          // justifyContent: 'space-between',\n          alignItems: 'center',\n          gap: '2rem',\n          mb: 3,\n          marginX: 'auto',\n          width: 'fit-content'\n        }}\n      >\n        <Button\n          onClick={() => {\n            setCurrentStep(prev => Math.max(prev - 1, 0))\n          }}\n          sx={{\n            bg: 'hsl(23, 94%, 32%)',\n            opacity: currentStep === 0 ? 0.5 : 1,\n            pointerEvents: currentStep === 0 ? 'none' : 'auto'\n          }}\n        >\n          <Box sx={{ lineHeight: 0, marginRight: '-8px' }}>\n            <Icon glyph=\"view-back\" />\n          </Box>\n        </Button>\n\n        <Heading as=\"h3\">\n          Step {currentStep + 1} of {tokenSteps.length}\n        </Heading>\n\n        <Button\n          onClick={() =>\n            setCurrentStep(prev => Math.min(prev + 1, tokenSteps.length - 1))\n          }\n          sx={{\n            bg: 'hsl(23, 94%, 32%)',\n            opacity: currentStep === tokenSteps.length - 1 ? 0.5 : 1,\n            pointerEvents:\n              currentStep === tokenSteps.length - 1 ? 'none' : 'auto'\n          }}\n        >\n          <Box sx={{ rotate: '180deg', lineHeight: 0, marginLeft: '-8px' }}>\n            <Icon glyph=\"view-back\" />\n          </Box>\n        </Button>\n      </Box>\n\n      <Box>\n        <Text\n          as=\"p\"\n          sx={{\n            marginY: '1rem',\n            fontSize: '1.2rem',\n            textAlign: 'center',\n            textWrap: 'balance'\n          }}\n        >\n          {tokenSteps[currentStep].desc}\n        </Text>\n        <Image\n          src={tokenSteps[currentStep].image}\n          alt={`Step ${currentStep + 1}`}\n          sx={{ width: '100%', height: 'auto', borderRadius: '0.25rem' }}\n        />\n      </Box>\n\n      <Box sx={{ display: 'flex', width: '100%', justifyContent: 'center' }}>\n        <Button\n          onClick={() =>\n            setCurrentStep(prev => Math.min(prev + 1, tokenSteps.length - 1))\n          }\n          sx={{\n            bg: 'hsl(23, 94%, 32%)',\n            display: currentStep === tokenSteps.length - 1 ? 'none' : 'block',\n            pointerEvents:\n              currentStep === tokenSteps.length - 1 ? 'none' : 'auto',\n            fontSize: '0.8em'\n          }}\n        >\n          Next step\n        </Button>\n      </Box>\n    </Card>\n  )\n}\n\nexport default TokenInstructions\n"
  },
  {
    "path": "components/scroll-hint.tsx",
    "content": "import { Box } from 'theme-ui'\nimport { animate } from 'animejs'\n\nconst handleClick = () => {\n  const scroll = { x: document.scrollingElement.scrollTop }\n\n  animate(scroll, {\n    x: window.innerHeight,\n    ease: 'outExpo',\n    duration: 800,\n    onUpdate: () => {\n      document.scrollingElement.scrollTop = scroll.x\n    }\n  })\n}\nconst ScrollHint = ({ ...props }) => (\n  <Box\n    sx={{\n      display: 'block',\n      position: 'relative',\n      height: '32px',\n      width: '32px',\n      margin: '0 auto',\n      borderBottom: '2px solid #fff',\n      borderRight: '2px solid #fff',\n      transform: 'rotate(45deg)',\n      opacity: '.6',\n      cursor: 'pointer',\n      transition: 'transform .3s',\n\n      '&:hover': { transform: 'translateY(4px) rotate(45deg)' },\n      '&:active': { transform: ' translateY(6px) rotate(45deg)' }\n    }}\n    onClick={handleClick}\n    {...props}\n  ></Box>\n)\n\nexport default ScrollHint\n"
  },
  {
    "path": "components/secret.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Text } from 'theme-ui'\nimport { useState, useEffect } from 'react'\nimport Image from 'next/image'\n\nexport default function Secret({ reveal, ...props }) {\n  const [img, setImage] = useState('')\n\n  useEffect(() => {\n    setImage('https://github.com/hackclub/dinosaurs/raw/main/club_dinosaur.png')\n  }, [])\n\n  return (\n    <Box\n      sx={{\n        position: 'fixed',\n        right: 5,\n        bottom: 0,\n        transform: `${reveal ? 'translateY(0)' : 'translateY(100%)'}`,\n        transition: '2s',\n        zIndex: 3\n      }}\n      {...props}\n    >\n      <Box\n        as=\"div\"\n        sx={{\n          height: '200px',\n          width: '300px',\n          backgroundColor: 'black',\n          position: 'relative',\n          display: 'flex',\n          justifyContent: 'center',\n          zIndex: 0,\n          '&:hover > .lid-one': {\n            transform: 'rotateX(90deg)',\n            transitionDelay: '0s'\n          },\n          '&:hover > .lid-two': {\n            transform: 'rotateX(180deg)',\n            transitionDelay: '0.25s'\n          },\n          '&:hover > .letter': {\n            transform: 'translateY(-50px)',\n            transitionDelay: '0.5s'\n          }\n        }}\n      >\n        <Box\n          as=\"div\"\n          className=\"lid-one\"\n          sx={{\n            position: 'absolute',\n            height: '100%',\n            width: '100%',\n            top: 0,\n            left: 0,\n            borderRight: '150px solid transparent',\n            borderBottom: '100px solid transparent',\n            borderLeft: '150px solid transparent',\n            transformOrigin: 'top',\n            transition: 'transform 0.25s linear',\n            borderTop: '100px solid #8492a6',\n            transform: 'rotateX(0deg)',\n            zIndex: 3,\n            transitionDelay: '0.75s'\n          }}\n        ></Box>\n        <Box\n          as=\"div\"\n          className=\"lid-two\"\n          sx={{\n            position: 'absolute',\n            height: '100%',\n            width: '100%',\n            top: 0,\n            left: 0,\n            borderRight: '150px solid transparent',\n            borderBottom: '100px solid transparent',\n            borderLeft: '150px solid transparent',\n            transformOrigin: 'top',\n            transition: 'transform 0.25s linear',\n            borderTop: '100px solid #8492a6',\n            transform: 'rotateX(90deg)',\n            zIndex: 1,\n            transitionDelay: '0.5s'\n          }}\n        ></Box>\n        <Box\n          as=\"div\"\n          className=\"envelope\"\n          sx={{\n            position: 'absolute',\n            height: '100%',\n            width: '100%',\n            top: 0,\n            left: 0,\n            borderTop: '100px solid transparent',\n            borderRight: '150px solid #f9fafc',\n            borderBottom: '150px solid #f9fafc',\n            borderLeft: '150px solid #f9fafc',\n            zIndex: 3\n          }}\n        ></Box>\n        <Box\n          as=\"div\"\n          className=\"letter\"\n          sx={{\n            position: 'absolute',\n            top: 0,\n            width: '80%',\n            height: '80%',\n            backgroundColor: 'white',\n            borderRadius: '5px',\n            border: '3px solid #e0e6ed',\n            zIndex: 2,\n            transition: '0.5s',\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            mt: 3\n          }}\n        >\n          <Image\n            src={img}\n            width={120}\n            height={120}\n            style={{ margin: 'auto' }}\n            alt=\"a secret dino!\"\n          />\n          <Text>print kc</Text>\n        </Box>\n      </Box>\n    </Box>\n  )\n}\n\n// credits: https://codepen.io/Coding-Star/pen/WNpbvwB\n"
  },
  {
    "path": "components/ship/why.mdx",
    "content": "import { Card } from 'theme-ui'\n\n<Card>\n\n## Your first ship your first day.\n\nStudents in many traditional computer science classes are lucky to make a single project. At Hack Clubs, every member makes & ships their first website their very first meeting.\n\n</Card>\n\n<Card>\n\n## Keeping your eyes on the prize.\n\nInstead of learning programming concepts in isolation, learning by shipping means you focus on what you need to build real projects. It’s more fun & leads to better learning.\n\n</Card>\n"
  },
  {
    "path": "components/signature.tsx",
    "content": "import { Image, useColorMode } from 'theme-ui'\n\nconst Signature = ({ fname, lname, width }) => {\n  // enforce a sane color mode (typescript should do this in the future)\n  let [colorMode] = useColorMode()\n  colorMode = colorMode === 'dark' ? 'light' : 'dark'\n  return (\n    <Image\n      src={`/signatures/${fname}_${lname}-${colorMode}.png`.toLowerCase()}\n      width={width || 96}\n      alt={`${fname} ${lname}'s signature`}\n      sx={{ '+ p': { mt: 0 } }}\n    />\n  )\n}\n\nexport default Signature\n"
  },
  {
    "path": "components/signatures.tsx",
    "content": "import { Image, useColorMode } from 'theme-ui'\n\nconst Signatures = ({ fileName, width }) => {\n  // enforce a sane color mode (typescript should do this in the future)\n  let [colorMode] = useColorMode()\n  colorMode = colorMode === 'dark' ? 'light' : 'dark'\n  return (\n    <Image\n      src={`/signatures/${fileName}-${colorMode}.png`.toLowerCase()}\n      width={width || 96}\n      alt={`${fileName}'s signature`}\n      sx={{ '+ p': { mt: 0 } }}\n    />\n  )\n}\n\nexport default Signatures\n"
  },
  {
    "path": "components/slack.tsx",
    "content": "import { Button, Box, Container, Heading, Text } from 'theme-ui'\nimport styled from '@emotion/styled'\nimport usePrefersMotion from '../lib/use-prefers-motion'\nimport useHasMounted from '../lib/use-has-mounted'\nimport { formatted } from '../lib/members'\nimport Link from 'next/link'\n\nlet Highlight = styled(Text)`\n  color: inherit;\n  border-radius: 1em 0 1em 0;\n  background: linear-gradient(\n    -100deg,\n    rgba(250, 247, 133, 0.33),\n    rgba(250, 247, 133, 0.66) 95%,\n    rgba(250, 247, 133, 0.1)\n  );\n`\nHighlight = Highlight.withComponent('mark')\n\nconst Content = () => (\n  <Container\n    sx={{\n      zIndex: 999,\n      py: 6,\n      color: 'white',\n      'h2,p': { textShadow: 'text' },\n      textAlign: [null, 'center'],\n      position: 'relative',\n      overflow: 'hidden'\n    }}\n  >\n    <Text as=\"p\" variant=\"eyebrow\" sx={{ color: 'white', opacity: 0.75 }}>\n      ~ The Hack Club Slack ~\n    </Text>\n    <Heading as=\"h2\" variant=\"title\">\n      Come for the skills, <br /> stay for the people.\n    </Heading>\n    <Text as=\"p\" variant=\"lead\" sx={{ maxWidth: 'copyPlus', mx: 'auto' }}>\n      Communication and planning for our open source projects happen in the\n      Slack. Coding is often seen as an isolating activity. Plenty of groups\n      exist for kids who are interested in sports, theater, or chess, but the\n      stereotype of a programmer is a person who sits alone in a dark room.{' '}\n      <strong>It doesn't have to be this way</strong>—in the Hack Club Slack\n      (Discord-style online groupchat), you'll find a group of {formatted}+{' '}\n      <Highlight>fabulous people</Highlight> to talk to, active at all hours.\n    </Text>\n    <Link href=\"https://slack.hackclub.com\">\n      <Button\n        variant=\"ctaLg\"\n        sx={{\n          background: 'linear-gradient(-132deg, #338eda 14%, #33d6a6 82%)'\n        }}\n      >\n        Join our Slack →\n      </Button>\n    </Link>\n  </Container>\n)\n\nconst Cover = () => (\n  <Box\n    sx={{\n      position: 'absolute',\n      bottom: 0,\n      top: 0,\n      left: 0,\n      right: 0,\n      backgroundImage: (t: any) => t.util.gx('cyan', 'purple'),\n      opacity: 0.825,\n      zIndex: 1\n    }}\n  />\n)\n\nconst Static = ({\n  img = 'https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/02020-07-25_a1tcva4ch6mmr6j2cfmcb4e9ync3yhar.png'\n  // img=\"https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/12020-07-25_hn13qhejqrzu4n1jy9yacxxgrgp3wf5u.png\"\n}) => (\n  <Box\n    as=\"section\"\n    id=\"slack\"\n    sx={{\n      position: 'relative',\n      overflow: 'hidden',\n      backgroundImage: `url(${img})`,\n      backgroundSize: 'cover'\n    }}\n  >\n    <Cover />\n    <Content />\n  </Box>\n)\n\nconst Slack = () => {\n  const hasMounted = useHasMounted()\n  const prefersMotion = usePrefersMotion()\n  if (hasMounted && prefersMotion) {\n    return (\n      <Box\n        as=\"section\"\n        id=\"slack\"\n        sx={{ overflow: 'hidden', position: 'relative' }}\n      >\n        <Box\n          as=\"video\"\n          {...({\n            autoPlay: true,\n            muted: true,\n            loop: true,\n            playsInline: true,\n            poster:\n              'https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/02020-07-25_a1tcva4ch6mmr6j2cfmcb4e9ync3yhar.png',\n            duration: 2000\n          } as object)}\n          sx={{\n            position: 'absolute',\n            bottom: 0,\n            top: 0,\n            left: 0,\n            right: 0,\n            height: '100%',\n            zIndex: -1,\n            width: '100vw',\n            objectFit: 'cover'\n          }}\n        >\n          <source\n            src=\"https://cdn.glitch.com/2d637c98-ed35-417a-bf89-cecc165d7398%2Foutput-no-duplicate-frames.hecv.mp4?v=1590780967658\"\n            type=\"video/mp4; codecs=hevc\"\n          />\n          <source\n            src=\"https://cdn.glitch.com/2d637c98-ed35-417a-bf89-cecc165d7398%2Foutput-no-duplicate-frames.webm?v=1590781698834\"\n            type=\"video/webm; codecs=vp9,opus\"\n          />\n          <source\n            src=\"https://cdn.glitch.com/2d637c98-ed35-417a-bf89-cecc165d7398%2Foutput-no-duplicate-frames.mov?v=1590781491717\"\n            type=\"video/quicktime\"\n          />\n        </Box>\n        <Cover />\n        <Content />\n      </Box>\n    )\n  } else {\n    return <Static />\n  }\n}\n\nexport default Slack\n"
  },
  {
    "path": "components/slide-down.tsx",
    "content": "import React from 'react'\nimport { Box } from 'theme-ui'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\n\nconst slideDown = keyframes({\n  from: { transform: 'translateY(-100%)', opacity: 0 },\n  to: { transform: 'translateY(0)', opacity: 1 }\n})\n\nconst Wrapper = styled(Box)`\n  @media (prefers-reduced-motion: no-preference) {\n    animation-name: ${slideDown};\n    animation-fill-mode: backwards;\n  }\n`\n\nconst SlideDown = ({ duration = 500, delay = 0, ...props }) => (\n  <Wrapper\n    {...props}\n    style={{\n      ...(props.style || {}),\n      animationDuration: duration + 'ms',\n      animationDelay: delay + 'ms'\n    }}\n  />\n)\n\nexport default SlideDown\n"
  },
  {
    "path": "components/slide-up.tsx",
    "content": "import React from 'react'\nimport { Box } from 'theme-ui'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\n\nconst slideUp = keyframes({\n  from: { transform: 'translateY(100%)', opacity: 0 },\n  to: { transform: 'translateY(0)', opacity: 1 }\n})\n\nconst Wrapper = styled(Box)`\n  @media (prefers-reduced-motion: no-preference) {\n    animation-name: ${slideUp};\n    animation-fill-mode: backwards;\n  }\n`\n\nconst SlideUp = ({ duration = 500, delay = 0, ...props }) => (\n  <Wrapper\n    {...props}\n    style={{\n      ...(props.style || {}),\n      animationDuration: duration + 'ms',\n      animationDelay: delay + 'ms'\n    }}\n  />\n)\n\nexport default SlideUp\n"
  },
  {
    "path": "components/sparkles/index.tsx",
    "content": "// Full credit to https://joshwcomeau.com/react/animated-sparkles-in-react/\nimport { useState } from 'react'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\nimport { range, sample, random } from 'lodash'\nimport { Text } from 'theme-ui'\nimport theme from '@hackclub/theme'\nimport useRandomInterval from '../../lib/use-random-interval'\nimport usePrefersReducedMotion from '../../lib/use-prefers-reduced-motion'\n\nconst generateSparkle = color => {\n  const sparkle = {\n    id: String(random(10000, 99999)),\n    createdAt: Date.now(),\n    color,\n    size: random(10, 20),\n    style: {\n      top: random(0, 100) + '%',\n      left: random(0, 100) + '%'\n    }\n  }\n  return sparkle\n}\n\ntype SparklesProps = {\n  colors?: string[]\n  children: React.ReactNode\n  sx?: any\n  props?: any\n}\n\nconst Sparkles = ({\n  colors = ['orange', 'yellow', 'green'],\n  children,\n  sx,\n  props,\n  ...delegated\n}: SparklesProps) => {\n  const allColors = colors.map(n => theme.colors[n])\n  const getColor = () => sample(allColors)\n  const [sparkles, setSparkles] = useState(() => {\n    return range(3).map(() => generateSparkle(getColor()))\n  })\n  const prefersReducedMotion = usePrefersReducedMotion()\n  useRandomInterval(\n    () => {\n      const sparkle = generateSparkle(getColor())\n      const now = Date.now()\n      const nextSparkles = sparkles.filter(sp => {\n        const delta = now - sp.createdAt\n        return delta < 750\n      })\n      nextSparkles.push(sparkle)\n      setSparkles(nextSparkles)\n    },\n    prefersReducedMotion ? null : 50,\n    prefersReducedMotion ? null : 450\n  )\n\n  return (\n    <Wrapper {...delegated}>\n      {sparkles.map(sparkle => (\n        <Sparkle\n          key={sparkle.id}\n          color={sparkle.color}\n          size={sparkle.size}\n          style={sparkle.style}\n        />\n      ))}\n      <ChildWrapper as=\"strong\" sx={sx} {...props}>\n        {children}\n      </ChildWrapper>\n    </Wrapper>\n  )\n}\n\nconst Sparkle = ({ size, color, style }) => {\n  const path =\n    'M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z'\n  return (\n    <SparkleWrapper style={style}>\n      <SparkleSvg width={size} height={size} viewBox=\"0 0 68 68\" fill=\"none\">\n        <path d={path} fill={color} />\n      </SparkleSvg>\n    </SparkleWrapper>\n  )\n}\n\nconst comeInOut = keyframes`\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    transform: scale(1);\n  }\n  100% {\n    transform: scale(0);\n  }\n`\nconst spin = keyframes`\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(180deg);\n  }\n`\nconst Wrapper = styled.span`\n  display: inline-block;\n  position: relative;\n`\nconst SparkleWrapper = styled.span`\n  position: absolute;\n  display: block;\n  @media (prefers-reduced-motion: no-preference) {\n    animation: ${comeInOut} 1000ms forwards;\n  }\n`\nconst SparkleSvg = styled.svg`\n  display: block;\n  @media (prefers-reduced-motion: no-preference) {\n    animation: ${spin} 1250ms linear;\n  }\n`\nconst ChildWrapper = styled(Text)`\n  position: relative;\n  z-index: 1;\n  font-weight: bold;\n`\n\nexport default Sparkles\n"
  },
  {
    "path": "components/sparkles/money.tsx",
    "content": "// Full credit to https://joshwcomeau.com/react/animated-sparkles-in-react/\nimport { useState } from 'react'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\nimport { range, sample, random } from 'lodash'\nimport { Text } from 'theme-ui'\nimport theme from '@hackclub/theme'\nimport useRandomInterval from '../../lib/use-random-interval'\nimport usePrefersReducedMotion from '../../lib/use-prefers-reduced-motion'\n\nconst generateSparkle = color => {\n  const sparkle = {\n    id: String(random(10000, 99999)),\n    createdAt: Date.now(),\n    color,\n    size: random(10, 25),\n    style: {\n      top: random(-10, 100) + '%',\n      left: random(-10, 100) + '%'\n    }\n  }\n  return sparkle\n}\n\ntype MSparklesProps = {\n  colors?: string[]\n  children: React.ReactNode\n  sx?: any\n  path?: string\n  viewBox?: string\n  props?: any\n}\n\nconst MSparkles = ({\n  colors = ['orange', 'yellow', 'green'],\n  children,\n  sx,\n  path,\n  viewBox,\n  props,\n  ...delegated\n}: MSparklesProps) => {\n  const allColors = colors.map(n => theme.colors[n])\n  const getColor = () => sample(allColors)\n  const [sparkles, setSparkles] = useState(() => {\n    return range(3).map(() => generateSparkle(getColor()))\n  })\n  const prefersReducedMotion = usePrefersReducedMotion()\n  useRandomInterval(\n    () => {\n      const sparkle = generateSparkle(getColor())\n      const now = Date.now()\n      const nextSparkles = sparkles.filter(sp => {\n        const delta = now - sp.createdAt\n        return delta < 750\n      })\n      nextSparkles.push(sparkle)\n      setSparkles(nextSparkles)\n    },\n    prefersReducedMotion ? null : 250,\n    prefersReducedMotion ? null : 150\n  )\n\n  return (\n    <Wrapper {...delegated}>\n      {sparkles.map(sparkle => (\n        <Sparkle\n          key={sparkle.id}\n          color={sparkle.color}\n          size={sparkle.size}\n          style={sparkle.style}\n          path={path}\n          viewBox={viewBox}\n        />\n      ))}\n      <ChildWrapper as=\"strong\" sx={sx} {...props}>\n        {children}\n      </ChildWrapper>\n    </Wrapper>\n  )\n}\n\nconst Sparkle = ({ size, color, style, path, viewBox }) => {\n  if (!path)\n    path =\n      'M27 0H18V7.44119C8.56638 8.96454 2.608 15.2023 2.608 24.168C2.608 34.4553 10.2396 38.3636 18 41.2862V60.3901C14.2364 58.7919 11.8724 55.3359 11.536 50.088H0.591999C0.999374 61.0056 7.97574 68.051 18 69.933V80H27V70.2565C37.6237 69.0685 44.656 62.1891 44.656 51.912C44.656 40.3121 35.4657 36.7574 27 33.8641V16.9739C30.363 18.3007 32.5185 21.3983 32.656 26.76H43.312C43.228 15.2519 36.6759 8.81537 27 7.38614V0ZM18 16.871C14.8637 17.9425 13.072 20.2358 13.072 23.304C13.072 26.6134 15.0429 28.7127 18 30.3352V16.871ZM27 44.7132V61.0707C31.4416 60.1212 34.192 57.2657 34.192 53.16C34.192 48.9744 31.1721 46.6064 27 44.7132Z'\n  return (\n    <SparkleWrapper style={style}>\n      <SparkleSvg\n        width={size}\n        height={size}\n        viewBox={viewBox || '0 0 82 82'}\n        fill=\"none\"\n      >\n        <path fillRule=\"evenodd\" clipRule=\"evenodd\" d={path} fill={color} />\n      </SparkleSvg>\n    </SparkleWrapper>\n  )\n}\n\nconst comeInOut = keyframes`\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    transform: scale(1);\n  }\n  100% {\n    transform: scale(0);\n  }\n`\nconst spin = keyframes`\n  0% {\n    transform: rotate(0deg);\n  }\n  50% {\n    transform: rotate(20deg);\n  }\n  100% {\n    transform: rotate(0deg)\n  }\n`\nconst Wrapper = styled.span`\n  display: inline-block;\n  position: relative;\n`\nconst SparkleWrapper = styled.span`\n  position: absolute;\n  display: block;\n  @media (prefers-reduced-motion: no-preference) {\n    animation: ${comeInOut} 1000ms forwards;\n  }\n`\nconst SparkleSvg = styled.svg`\n  display: block;\n  @media (prefers-reduced-motion: no-preference) {\n    animation: ${spin} 2250ms linear;\n  }\n`\nconst ChildWrapper = styled(Text)`\n  position: relative;\n  z-index: 1;\n  font-weight: bold;\n`\n\nexport default MSparkles\n"
  },
  {
    "path": "components/stage.tsx",
    "content": "import { Box, Heading, Text, ThemeUIStyleObject } from 'theme-ui'\nimport Icon from './icon'\n\ntype StageProps = {\n  icon: string\n  color: string\n  name: string\n  desc: string\n  children?: React.ReactNode\n  sx?: ThemeUIStyleObject\n}\n\nexport default function Stage({\n  icon,\n  color,\n  name,\n  desc,\n  children,\n  ...props\n}: StageProps) {\n  return (\n    <Box {...props}>\n      {children || (\n        <Box\n          as=\"span\"\n          sx={{\n            width: 'fit-content',\n            bg: color,\n            borderRadius: 18,\n            lineHeight: 0,\n            p: 2,\n            mb: 1,\n            display: 'inline-block',\n            transform: ['scale(0.75)', 'none'],\n            transformOrigin: 'bottom left',\n            boxShadow:\n              'inset 2px 2px 6px rgba(255,255,255,0.2), inset -2px -2px 6px rgba(0,0,0,0.1), 0 1px 4px rgba(0,0,0,0.1), 0 4px 8px rgba(0,0,0,0.1)'\n          }}\n        >\n          <Icon glyph={icon} size={48} />\n        </Box>\n      )}\n      <Box>\n        <Heading as=\"h3\" variant=\"headline\" mb={2}>\n          {name}\n        </Heading>\n        <Text\n          as=\"p\"\n          variant=\"subtitle\"\n          sx={{ mt: 0, pb: 2, a: { variant: 'styles.a', color: 'blue' } }}\n        >\n          {desc}\n        </Text>\n      </Box>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/stat.tsx",
    "content": "import { Flex, Text } from 'theme-ui'\nimport { isEmpty } from 'lodash'\n\ntype StatProps = {\n  value: string | number\n  label?: string\n  unit?: string\n  color?: string\n  of?: string | number\n  center?: boolean\n  reversed?: boolean\n  half?: boolean\n  lg?: boolean\n  sm?: boolean\n  sx?: any\n}\n\nconst Stat = ({\n  value,\n  label,\n  unit = '',\n  color = 'text',\n  of,\n  center = false,\n  reversed = false,\n  half = false,\n  lg = false,\n  sm = false,\n  ...props\n}: StatProps) => (\n  <Flex\n    {...props}\n    sx={{\n      fontFamily: 'heading',\n      flexDirection: reversed ? 'column-reverse' : 'column',\n      lineHeight: 1,\n      ...props.sx\n    }}\n  >\n    <Flex\n      sx={{\n        alignItems: 'center',\n        justifyContent: center ? 'center' : 'start',\n        position: 'relative'\n      }}\n    >\n      <Text\n        as=\"span\"\n        sx={{\n          color,\n          fontSize: lg ? [5, 6, 7] : sm ? [3, 4] : [5, 6],\n          fontWeight: 'heading',\n          letterSpacing: 'title',\n          my: 0\n        }}\n      >\n        {value || '—'}\n      </Text>\n      {!isEmpty(unit) && (\n        <Text\n          as=\"sup\"\n          sx={{\n            fontSize: lg ? [2, 3] : sm ? [1, 1] : [1, 2],\n            color: color === 'text' ? 'secondary' : color,\n            ml: [null, unit === '%' ? 1 : null],\n            mr: [null, 1],\n            pt: [null, 1]\n          }}\n        >\n          {unit}\n        </Text>\n      )}\n      {!isEmpty(of) && (\n        <Text\n          as=\"sup\"\n          sx={{\n            fontSize: lg ? [2, 3] : [1, 2],\n            color: 'muted',\n            ml: [null, 1],\n            pt: [null, 1],\n            '::before': {\n              content: '\"/\"'\n            }\n          }}\n        >\n          {of}\n        </Text>\n      )}\n    </Flex>\n    {!isEmpty(label) && (\n      <Text\n        as=\"span\"\n        variant=\"caption\"\n        sx={{\n          fontSize: lg ? [1, 2, 3] : 1,\n          letterSpacing: 'headline',\n          textTransform: 'uppercase'\n        }}\n      >\n        {label}\n      </Text>\n    )}\n  </Flex>\n)\n\nexport default Stat\n"
  },
  {
    "path": "components/submit.tsx",
    "content": "import { Button } from 'theme-ui'\nimport theme from '../lib/theme'\n\nconst bg = {\n  default: {\n    bg: 'blue',\n    backgroundImage: theme.util.gx('cyan', 'blue')\n  },\n  submitting: {\n    bg: 'blue',\n    backgroundImage: theme.util.gx('cyan', 'blue')\n  },\n  success: {\n    bg: 'green',\n    backgroundImage: theme.util.gx('yellow', 'green')\n  },\n  error: {\n    bg: 'orange',\n    backgroundImage: theme.util.gx('orange', 'red'),\n    boxShadow: `0 0 0 1px ${theme.colors.white}, 0 0 0 4px ${theme.colors.primary}`\n  },\n  disabled: {\n    bg: 'gray',\n    backgroundImage: theme.util.gx('gray', 'gray')\n  }\n}\n\nconst submitting = {\n  ...bg.default,\n  opacity: 0.5,\n  pointerEvents: 'none',\n  cursor: 'not-allowed'\n}\n\nconst Submit = ({\n  status,\n  labels = {\n    default: 'Submit',\n    error: 'Error!',\n    success: 'Check your email!'\n  },\n  width = '100%',\n  sx,\n  disabled,\n  ...props\n}) => (\n  <Button\n    as=\"button\"\n    type=\"submit\"\n    sx={{\n      py: 2,\n      px: 3,\n      mt: 3,\n      fontSize: 2,\n      width,\n      ...(disabled\n        ? bg['disabled']\n        : status === 'submitting'\n          ? submitting\n          : bg[status]),\n      ...sx\n    }}\n    disabled={status === 'submitting' || disabled}\n    {...props}\n  >\n    {status === 'submitting' ? 'Submitting…' : labels[status]}\n  </Button>\n)\n\nexport default Submit\n"
  },
  {
    "path": "components/tilt.tsx",
    "content": "import React, { useEffect, useRef } from 'react'\nimport VanillaTilt from 'vanilla-tilt'\nimport useMedia from '../lib/use-media'\n\n// NOTE(@lachlanjc): only pass one child!\nconst Tilt = ({ options = {}, children, ...props }) => {\n  const root = useRef(null)\n\n  const { matches: enabled } = useMedia('(hover: hover)')\n\n  useEffect(() => {\n    if (enabled) {\n      VanillaTilt.init(root.current, {\n        max: 7.5,\n        scale: 1.05,\n        speed: 400,\n        glare: true,\n        'max-glare': 0.25,\n        gyroscope: false,\n        ...options\n      })\n    }\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    return () => root.current?.vanillaTilt?.destroy()\n  }, [options, enabled])\n\n  return React.cloneElement(children, { ref: root })\n}\n\nexport default Tilt\n"
  },
  {
    "path": "components/winter/breakdown-box.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Card, Heading, Text } from 'theme-ui'\nimport { Zoom } from '../react-reveal-compat'\nimport Icon from '@hackclub/icons'\n\nfunction BreakdownBox({\n  subtitle,\n  icon,\n  text,\n  description,\n  delay,\n  href,\n  color,\n  bg\n}) {\n  return (\n    <Zoom delay={delay}>\n      <Card\n        sx={{\n          color: 'white',\n          background: 'rgba(225,225,225,0.2)',\n          height: '100%',\n          cursor: `${href ? 'pointer' : 'default'}`,\n          display: 'flex',\n          flexDirection: 'column'\n          // justifyContent: 'flex-end'\n        }}\n        variant=\"interactive\"\n        as={href ? 'a' : 'div'}\n        href={href}\n      >\n        {subtitle ? (\n          <Text\n            as=\"h1\"\n            sx={{\n              fontSize: [2, 3, 4]\n            }}\n          >\n            {subtitle}\n          </Text>\n        ) : (\n          <Box\n            as=\"span\"\n            sx={{\n              width: 'fit-content',\n              bg: bg || 'white',\n              borderRadius: 18,\n              lineHeight: 0,\n              p: 2,\n              mb: 1,\n              display: 'inline-block',\n              transform: ['scale(0.75)', 'none'],\n              transformOrigin: 'bottom left',\n              boxShadow:\n                'inset 2px 2px 6px rgba(255,255,255,0.2), inset -2px -2px 6px rgba(0,0,0,0.1), 0 1px 4px rgba(0,0,0,0.1), 0 4px 8px rgba(0,0,0,0.1)'\n            }}\n          >\n            <Icon glyph={icon} size={48} color={color || 'white'} />\n          </Box>\n        )}\n        <Heading\n          sx={{\n            fontSize: [3, 4, 5]\n          }}\n        >\n          {text}\n        </Heading>\n        <Text\n          as=\"p\"\n          sx={{\n            fontSize: [2, 3]\n          }}\n        >\n          {description}\n        </Text>\n      </Card>\n    </Zoom>\n  )\n}\n\nexport default BreakdownBox\n"
  },
  {
    "path": "components/winter/breakdown.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Container, Heading, Grid } from 'theme-ui'\nimport { Fade, Slide } from '../react-reveal-compat'\nimport BreakdownBox from './breakdown-box'\n\nfunction Breakdown() {\n  return (\n    <>\n      <Box\n        sx={{\n          pt: 3,\n          pb: 5,\n          background: 'linear-gradient(180deg, #579AC9 0%, #338EDA 100%)'\n        }}\n      >\n        <Container>\n          <Slide>\n            <Heading\n              variant=\"headline\"\n              sx={{\n                textShadow: '0px 0px 21px #E1F1FF',\n                color: 'white',\n                fontStyle: 'italic'\n              }}\n            >\n              <Fade>Dear high school hacker, we have a challenge for you:</Fade>\n            </Heading>\n            <Heading\n              variant=\"headline\"\n              sx={{\n                textShadow: '0px 0px 21px #E1F1FF',\n                color: 'white',\n                fontSize: [4, 5, 6],\n                pb: 4,\n                mt: 0\n              }}\n            >\n              <Fade>What will you make this winter?</Fade>\n            </Heading>\n          </Slide>\n          <Fade>\n            <Heading\n              variant=\"headline\"\n              sx={{\n                // textShadow: '0px 0px 21px #E1F1FF',\n                color: '#338eda',\n                background: 'white',\n                px: 3,\n                py: 2,\n                borderRadius: '10px',\n                width: 'fit-content'\n              }}\n            >\n              Join Hack Clubbers in a winter of making with\n            </Heading>\n          </Fade>\n\n          <Grid gap={[2, 2, 3]} columns={[1, 1, 3, 3]} py={3}>\n            <BreakdownBox\n              icon=\"friend\"\n              color=\"#5bc0de\"\n              text=\"Friends\"\n              description=\"Find support from our community of 20k+ teenagers in the Hack Club Slack.\"\n              delay=\"300\"\n              href=\"https://slack.hackclub.com\"\n            />\n            <BreakdownBox\n              icon=\"event-code\"\n              color=\"#5bc0de\"\n              text=\"Daily progress\"\n              description={\n                <>\n                  From <strong>Feb 14-23</strong>, work on your project, share\n                  short photo/video updates each day.\n                </>\n              }\n              delay=\"100\"\n              href=\"https://scrapbook.hackclub.com/r/10daysinpublic\"\n            />\n            <BreakdownBox\n              icon=\"settings\"\n              color=\"#5bc0de\"\n              text=\"Free hardware\"\n              description=\"We'll pay for up to $250 of your hardware to build your project.\"\n              delay=\"200\"\n            />\n          </Grid>\n        </Container>\n      </Box>\n    </>\n  )\n}\n\nexport default Breakdown\n"
  },
  {
    "path": "components/winter/footer.tsx",
    "content": "import { Box, Heading, Text, Link } from 'theme-ui'\nimport Footer from '../footer'\n\nconst Description = () => (\n  <Box sx={{ a: { color: 'blue' }, pb: 4 }}>\n    <Heading as=\"h3\" variant=\"subheadline\" mb={2}>\n      A project by <a href=\"https://hackclub.com/\">Hack Club</a>.\n    </Heading>\n    <Text as=\"p\" variant=\"caption\" mb={3} sx={{ width: ['85%', '75%', '60%'] }}>\n      Hack Club is a registered 501(c)3 nonprofit organization that supports a\n      network of 20k+ technical high schoolers. We believe you learn best by\n      building so we're removing barriers to hardware access so any teenager can\n      explore. In the past few years, we've{' '}\n      <Link href=\"https://summer.hackclub.com\" target=\"_blank\">\n        partnered with GitHub to give away $50k of hardware\n      </Link>\n      ,{' '}\n      <Link\n        href=\"https://github.com/hackclub/the-hacker-zephyr\"\n        target=\"_blank\"\n      >\n        hosted the world's longest hackathon on land\n      </Link>\n      , and{' '}\n      <Link href=\"https://github.com/hackclub/assemble\" target=\"_blank\">\n        brought 183 teenagers to SF for a hackathon\n      </Link>\n      .\n    </Text>\n    <Text as=\"p\" variant=\"caption\" mb={1}>\n      Illustrations by Ripley.\n    </Text>\n  </Box>\n)\n\nconst WinterFooter = () => {\n  return (\n    <Footer>\n      <Description />\n    </Footer>\n  )\n}\n\nexport default WinterFooter\n"
  },
  {
    "path": "components/winter/info.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport {\n  Card,\n  Grid,\n  Box,\n  Container,\n  Heading,\n  Text,\n  Flex,\n  Avatar\n} from 'theme-ui'\nimport Icon from '../icon'\nimport Tilt from '../tilt'\nimport { Zoom } from '../react-reveal-compat'\n\nexport default function InfoGrid() {\n  return (\n    <Container py={4}>\n      <Grid\n        sx={{\n          gridTemplateColumns: ['1fr', '1fr', '1fr 1fr', '1fr 1fr 1fr'],\n          gap: 3,\n          h: 'fit-content'\n        }}\n      >\n        <Zoom delay={100}>\n          <Box\n            sx={{\n              display: 'flex',\n              flexDirection: 'column',\n              height: ['100%']\n            }}\n          >\n            <Card\n              variant=\"translucent\"\n              sx={{ borderRadius: 'default', px: 4, py: [2, 3, 5] }}\n            >\n              <Text variant=\"lead\" as=\"p\">\n                A deeper look at\n              </Text>\n              <Heading as=\"h2\" variant=\"title\">\n                Free hardware for your project\n              </Heading>\n            </Card>\n          </Box>\n        </Zoom>\n        <Box\n          sx={{\n            display: 'flex',\n            flexDirection: 'column',\n            height: '100%'\n          }}\n        >\n          <Zoom delay={300}>\n            <Card\n              variant=\"translucent\"\n              sx={{\n                borderRadius: 'default',\n                px: 4,\n                py: 3,\n                mb: 3\n              }}\n            >\n              <Heading variant=\"headline\">To qualify:</Heading>\n              <BulletItem iconGlyph=\"checkmark\" iconColor=\"#5BC0DE\">\n                Be a high schooler (or younger)\n              </BulletItem>\n              <Text sx={{ color: 'muted' }}>\n                If you qualify, share your idea! We're giving out as many grants\n                as possible!\n              </Text>\n            </Card>\n          </Zoom>\n          <Zoom delay={400}>\n            <Card\n              variant=\"translucent\"\n              sx={{\n                borderRadius: 'default',\n                px: 4,\n                py: 4,\n                display: 'flex',\n                flexDirection: 'column',\n                height: 'fit-content'\n              }}\n            >\n              <Heading variant=\"headline\">\n                Once you have a project idea,\n              </Heading>\n              <Text as=\"p\">\n                figure out the hardware you need and where you can buy it. Share\n                that with us and we'll give you a grant of up to $250.\n              </Text>\n              <Text as=\"p\" mt={3}>\n                It could be your first ever electronics project or your tenth,\n                we want to support you in building whatever you want.\n              </Text>\n            </Card>\n          </Zoom>\n        </Box>\n        <Box\n          sx={{\n            display: 'flex',\n            flexDirection: 'column',\n            height: '100%'\n          }}\n        >\n          <Zoom delay={600}>\n            <Card\n              variant=\"translucent\"\n              sx={{\n                borderRadius: 'default',\n                px: 4,\n                py: 3,\n                mb: 3\n              }}\n            >\n              <Heading variant=\"headline\">\n                Receive and spend the grant through HCB.\n              </Heading>\n              <BulletItem iconGlyph=\"bank-account\" iconColor=\"#5BC0DE\">\n                Full history and balance, viewed on a powerful web dashbaord\n              </BulletItem>\n              <BulletItem iconGlyph=\"card\" iconColor=\"#5BC0DE\">\n                Issue yourself a debit card to spend the funds\n              </BulletItem>\n              <BulletItem iconGlyph=\"explore\" iconColor=\"#5BC0DE\">\n                Use transparency mode to spend it in public\n              </BulletItem>\n            </Card>\n          </Zoom>\n          <Zoom delay={800}>\n            <Tilt>\n              <Card\n                as=\"div\"\n                sx={{\n                  backgroundColor: 'transparent',\n                  backgroundImage:\n                    'url(\"https://cloud-ehtgzdn7u-hack-club-bot.vercel.app/0card.png\")',\n                  height: ['300px', '500px', '100%', '230px'],\n                  backgroundSize: '100%',\n                  backgroundRepeat: 'no-repeat',\n                  boxShadow: '0 8px 32px rgba(255, 255, 255, 0.0625)',\n                  display: ['block', 'block', 'none', 'block']\n                }}\n              />\n            </Tilt>\n          </Zoom>\n        </Box>\n        <Tilt>\n          <Card\n            as=\"div\"\n            sx={{\n              backgroundColor: 'transparent',\n              backgroundImage:\n                'url(\"https://cloud-ehtgzdn7u-hack-club-bot.vercel.app/0card.png\")',\n              height: ['300px', '500px', '100%', '230px'],\n              backgroundSize: '100%',\n              backgroundRepeat: 'no-repeat',\n              boxShadow: '0 8px 32px rgba(255, 255, 255, 0.0625)',\n              display: ['none', 'none', 'block', 'none']\n            }}\n          />\n        </Tilt>\n      </Grid>\n    </Container>\n  )\n}\n\nfunction BulletItem({ children, iconGlyph, iconColor, iconSize }) {\n  return (\n    <Flex\n      sx={{\n        flexDirection: 'row',\n        alignItems: 'center',\n        my: 2\n      }}\n    >\n      <Icon\n        glyph={iconGlyph}\n        size={iconSize || 36}\n        color={iconColor || 'text'}\n        sx={{\n          flexShrink: '0'\n        }}\n      />\n      <Text sx={{ ml: 1 }}>{children}</Text>\n    </Flex>\n  )\n}\n"
  },
  {
    "path": "components/winter/landing.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Heading, Button, Link, Text, Container } from 'theme-ui'\nimport Snowfall from 'react-snowfall'\nimport { Fade } from '../react-reveal-compat'\n\nexport default function Landing() {\n  return (\n    <Box sx={{ position: 'relative' }}>\n      <Box\n        sx={{\n          background:\n            'url(https://cdn.hackclub.com/019d2f1a-6419-75bd-b60b-6df8e8136c96/w.webp), linear-gradient(0deg, #3561A4 0%, #338EDA 100%)',\n          backgroundPosition: 'bottom center',\n          backgroundSize: ['200%', '150%', '100%'],\n          backgroundRepeat: 'no-repeat',\n          height: '85vh',\n          minHeight: [null, '750px'],\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          textAlign: 'center',\n          zIndex: 2\n        }}\n      >\n        <Snowfall />\n        <Container>\n          <Box\n            sx={{\n              backdropFilter: 'blur(1.5px)',\n              maxWidth: 'container'\n            }}\n          >\n            <Fade left cascade>\n              <Heading\n                variant=\"eyebrow\"\n                sx={{\n                  color: 'sunken'\n                }}\n              >\n                a hacker's\n              </Heading>\n            </Fade>\n            <Fade left cascade>\n              <Heading\n                as=\"h1\"\n                variant=\"ultratitle\"\n                sx={{\n                  color: 'white',\n                  textShadow: '0 0 16px rgba(0, 0, 0, 0.2)'\n                }}\n                id=\"rsvp\"\n              >\n                Winter Hardware <br />\n                Wonderland\n              </Heading>\n            </Fade>\n            <Text\n              variant=\"subtitle\"\n              as=\"p\"\n              sx={{\n                color: 'white',\n                textShadow: '2px 2px 10px rgba(0, 0, 0, 1)',\n                pt: 2,\n                maxWidth: '50ch',\n                margin: 'auto',\n                my: 3\n              }}\n            >\n              This event has ended. Hundreds of amazing projects were built\n              together by the{' '}\n              <Link\n                href=\"https://slack.hackclub.com\"\n                target=\"_blank\"\n                sx={{\n                  color: 'blue',\n                  textShadow: '2px 2px 10px rgba(255, 255, 255, 1)'\n                }}\n              >\n                Hack Club Slack\n              </Link>\n              .\n            </Text>\n            <Button\n              as=\"a\"\n              variant=\"cta\"\n              href=\"https://github.com/hackclub/winter\"\n              sx={{\n                background:\n                  'linear-gradient(32deg, rgba(51, 142, 218, 0.9) 0%, rgba(51, 214, 166, 0.9) 100%)',\n                mt: 2\n              }}\n            >\n              {' '}\n              View the projects\n            </Button>\n          </Box>\n        </Container>\n      </Box>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/winter/projects.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { useState } from 'react'\nimport styled from '@emotion/styled'\nimport {\n  Box,\n  Button,\n  Container,\n  Flex,\n  Heading,\n  Card,\n  Grid,\n  Link as A,\n  Text,\n  Avatar,\n  Image\n} from 'theme-ui'\nimport NextImage from 'next/image'\nimport Marquee from '../marquee'\nimport Photo1 from '../../public/winter/1.jpeg'\nimport Photo2 from '../../public/winter/2.png'\nimport Photo3 from '../../public/winter/3.jpeg'\nimport Photo4 from '../../public/winter/4.jpeg'\nimport Photo5 from '../../public/winter/5.jpeg'\nimport Photo6 from '../../public/winter/6.jpeg'\nimport Photo7 from '../../public/winter/7.jpeg'\nimport Photo8 from '../../public/winter/8.jpeg'\nimport Photo9 from '../../public/winter/9.jpeg'\nimport Photo10 from '../../public/winter/10.jpeg'\nimport Photo12 from '../../public/winter/12.jpeg'\nimport Photo13 from '../../public/winter/13.jpeg'\nimport Photo14 from '../../public/winter/14.jpeg'\nimport Photo15 from '../../public/winter/15.jpeg'\nimport Photo16 from '../../public/winter/16.jpeg'\nimport Photo17 from '../../public/winter/17.jpeg'\nimport Photo18 from '../../public/winter/18.jpeg'\nimport Photo19 from '../../public/winter/19.jpeg'\nimport Photo20 from '../../public/winter/20.jpeg'\nimport Photo21 from '../../public/winter/21.jpeg'\n\n/** @jsxImportSource theme-ui */\n\nconst Header = styled(Box)`\n  background: url('/pattern.svg');\n`\n\nconst Sheet = styled(Card)`\n  position: relative;\n  overflow: hidden;\n  border-radius: 8px;\n  width: 100%;\n  color: white;\n  max-width: 52rem;\n  font-size: 20px;\n  padding: 32px;\n  color: white;\n`\nconst PhotoRow = ({ photos }) => (\n  <Box sx={{ height: '200px', overflow: 'hidden' }}>\n    <Box sx={{ display: ['block', 'block', 'block', 'block', 'none'] }}>\n      <Marquee velocity={12} onInit={() => {}} onFinish={() => {}}>\n        {photos.map((photo, index) => (\n          <NextImage\n            placeholder=\"blur\"\n            src={photo}\n            className=\"next-image\"\n            height=\"200px\"\n            width=\"300px\"\n            alt=\"Hack Club students\"\n            key={'image-' + index}\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'cover'\n            }}\n          />\n        ))}\n      </Marquee>\n    </Box>\n    <Box sx={{ display: ['none', 'none', 'none', 'none', 'block'] }}>\n      <Marquee velocity={12} onInit={() => {}} onFinish={() => {}}>\n        {photos.map((photo, index) => (\n          <NextImage\n            placeholder=\"blur\"\n            src={photo}\n            className=\"next-image\"\n            height=\"200px\"\n            width=\"600px\"\n            key={'image-' + index}\n            alt=\"Hack Club students\"\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'cover'\n            }}\n          />\n        ))}\n      </Marquee>\n    </Box>\n  </Box>\n)\n\nconst Cards = ({ avatar, username, description, image }) => {\n  return (\n    <Card\n      className=\"post\"\n      sx={{ p: [3, 3], width: '100%', background: 'rgba(225,225,225,0.9)' }}\n    >\n      <Flex\n        as=\"a\"\n        href={\n          username !== 'cjmika110'\n            ? `https://scrapbook.hackclub.com/${username}`\n            : 'https://scrapbook.hackclub.com'\n        }\n        sx={{\n          color: 'inherit',\n          textDecoration: 'none',\n          alignItems: 'center',\n          mb: 2\n        }}\n      >\n        <Avatar loading=\"lazy\" src={avatar} alt=\"\" mr={2} />\n        <Box>\n          <Text variant=\"subheadline\" my={0} fontSize={[1, 1]}>\n            @{username}\n          </Text>\n        </Box>\n      </Flex>\n      <Text\n        as=\"p\"\n        sx={{\n          fontSize: 1,\n          textAlign: 'left',\n          mb: 2,\n          a: {\n            color: 'primary',\n            wordBreak: 'break-all',\n            wordWrap: 'break-word'\n          },\n          '> div': { width: 18, height: 18 }\n        }}\n      >\n        {description}\n      </Text>\n      <Box\n        sx={{\n          position: 'relative',\n          width: '100%',\n          height: '200px',\n          overflow: 'hidden',\n          backgroundImage: `url('${image}')`,\n          backgroundSize: '100%',\n          backgroundPosition: 'bottom center',\n          backgroundRepeat: 'no-repeat'\n        }}\n      >\n        {/* <img src={image} sx={{ width: '100%' }} /> */}\n      </Box>\n    </Card>\n  )\n}\n\nexport default function Projects() {\n  const [count, setCount] = useState(0)\n\n  const list = [\n    'drawing robot',\n    'drone',\n    'CNC machine',\n    'pixel art display',\n    'camera',\n    '3D printer'\n  ]\n\n  if (count === list.length - 1) {\n    setCount(0)\n  }\n\n  const project_idea = list[count]\n\n  return (\n    <Box>\n      <Header sx={{ position: 'relative' }}>\n        <Box\n          sx={{\n            background: 'rgba(0,0,0, 0.8)',\n            zIndex: 1,\n            position: 'relative',\n            color: 'white!important',\n            height: ['auto', '800px', '800px']\n          }}\n          pt={[5, 5, '50px']}\n          pb={[5, 0, 0]}\n        >\n          <Box\n            sx={{\n              maxWidth: '64rem',\n              mx: 'auto',\n              zIndex: 1,\n              position: 'relative'\n            }}\n            align=\"center\"\n            py={2}\n            px={[1, 3]}\n          >\n            <Container sx={{ maxWidth: '48rem' }}>\n              <Heading\n                variant=\"title\"\n                sx={{\n                  textShadow: '0px 0px 21px #E1F1FF',\n                  color: 'white',\n                  fontSize: [4, 5, 6],\n                  display: 'flex',\n                  flexDirection: 'column',\n                  alignItems: 'center',\n                  gap: 1\n                }}\n              >\n                <Text>You could be building a</Text>\n                <Text\n                  sx={{\n                    backgroundColor: '#406BAB',\n                    py: 2,\n                    px: 3,\n                    borderRadius: 10,\n                    position: 'relative',\n                    width: 'fit-content',\n                    height: 'min-content',\n                    cursor: 'pointer',\n                    userSelect: 'none'\n                  }}\n                  onClick={() => setCount(count + 1)}\n                >\n                  <Box as=\"span\" sx={{ whiteSpace: 'nowrap' }}>\n                    {project_idea}\n                  </Box>\n                  <Image\n                    src=\"https://cloud-ohzuz4m3t-hack-club-bot.vercel.app/0click_me.svg\"\n                    alt=\"click me\"\n                    sx={{\n                      position: 'absolute',\n                      top: [null, -3, -3],\n                      bottom: [-3, null, null],\n                      right: [0, '-40px', '-40px'],\n                      transform: 'rotate(-12deg)'\n                    }}\n                  />\n                </Text>\n              </Heading>\n              <Grid columns={[1, 3, 3]} mt={4} mx={['5vw', 'auto', 'auto']}>\n                <Cards\n                  avatar=\"https://cachet.dunkirk.sh/users/USNPNJXNX/r\"\n                  username=\"sampoder\"\n                  description=\"today i presented.. the *CLIMATATOR*! it’s a 4D interactive media experience / climate change simulator that showcases the effects of climate change to a younger audience...\"\n                  image=\"https://cdn.hackclub.com/019d2f14-433c-7867-b58e-5444fc14d58d/420210303_154846%20(1).jpg\"\n                />\n                <Cards\n                  avatar=\"https://cdn.hackclub.com/019d2f16-b0f2-773e-9ca6-bf44894a57ce/3865494839057_a471d7e9c871ca9121ea_192.jpg\"\n                  username=\"maggie\"\n                  description=\"working on something…\"\n                  image=\"https://cdn.hackclub.com/019d2f14-956e-7123-ab83-4bb493216b39/thumbnail%20(1).jpg\"\n                />\n                <Cards\n                  avatar=\"https://cdn.hackclub.com/019d2f15-3d56-750e-adeb-6a5cafff308a/04484b2178b8fd17c5a529c54614e14c%20(1).png\"\n                  username=\"cjmika110\"\n                  description=\"Tired of QWERTY keyboards? Is typing too intuitive for you? Karl the Keyboard is a portable, squishable, fun, easy- to-use binary keyboard! Instead of pressing keys, you move a joystick up and down to represent ones...\"\n                  image=\"https://cdn.hackclub.com/019d2f15-f781-7303-86e5-10e641bb9777/a34cbf72-7023-424a-8239-abf4146529e8-Untitled%20drawing%20(1).jpg\"\n                />\n              </Grid>\n              <Button\n                as=\"a\"\n                variant=\"cta\"\n                href=\"https://scrapbook.hackclub.com/\"\n                sx={{\n                  background:\n                    'linear-gradient(32deg, rgba(51, 142, 218, 0.9) 0%, rgba(51, 214, 166, 0.9) 100%)',\n                  mt: 2\n                }}\n              >\n                Keep exploring →\n              </Button>\n            </Container>\n          </Box>\n        </Box>\n        <Box\n          sx={{\n            position: 'absolute',\n            top: 0,\n            zIndex: 0,\n            width: '100%',\n            display: ['none', 'block', 'block']\n          }}\n        >\n          <PhotoRow photos={[Photo1, Photo2, Photo3, Photo4, Photo5]} />\n          <PhotoRow photos={[Photo6, Photo7, Photo8, Photo9, Photo10]} />\n          <PhotoRow photos={[Photo21, Photo12, Photo13, Photo14, Photo15]} />\n          <PhotoRow photos={[Photo16, Photo17, Photo18, Photo19, Photo20]} />\n        </Box>\n      </Header>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "components/winter/recap.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Button, Container, Heading, Grid, Card, Text } from 'theme-ui'\nimport { Slide, Zoom } from '../react-reveal-compat'\nimport BreakdownBox from './breakdown-box'\n\nfunction Recap() {\n  return (\n    <>\n      <Container sx={{ py: 5 }}>\n        <Slide>\n          <Heading\n            variant=\"headline\"\n            sx={{\n              textShadow: '0px 0px 21px #E1F1FF',\n              color: 'white',\n              fontSize: [3, 4, 5],\n              pb: 4,\n              maxWidth: '90%'\n            }}\n          >\n            Make your ideas real this winter, with electronics and Hack Club\n            friends.\n          </Heading>\n        </Slide>\n        <Grid gap={[2, 2, 3]} columns={[1, 1, 3, 3]} pb={4}>\n          <BreakdownBox\n            icon=\"event-code\"\n            text=\"10 days\"\n            description=\"of building with other teenagers around the world\"\n            delay=\"100\"\n            bg=\"blue\"\n          />\n          <BreakdownBox\n            icon=\"payment-transfer\"\n            text=\"$250\"\n            description=\"grants instantly transferred through HCB\"\n            delay=\"200\"\n            bg=\"blue\"\n          />\n          <Zoom delay=\"300\">\n            <Card\n              variant=\"translucent\"\n              sx={{\n                borderRadius: 'default',\n                px: 3,\n                pb: 4,\n                pt: 2,\n                display: 'flex',\n                flexDirection: 'column'\n              }}\n            >\n              <Text\n                variant=\"subtitle\"\n                sx={{\n                  fontWeight: 'bold',\n                  color: 'blue',\n                  textShadow: '0px 0px 21px #ffffff'\n                }}\n              >\n                This event has ended\n              </Text>\n              <Text variant=\"caption\">\n                Winter Hardware Wonderland is no longer accepting signups. Check\n                out the projects that were built on GitHub!\n              </Text>\n            </Card>\n          </Zoom>\n        </Grid>\n        <Button\n          variant=\"ctaLg\"\n          as=\"a\"\n          href=\"https://github.com/hackclub/winter\"\n          sx={{\n            zIndex: '100',\n            textAlign: 'center'\n          }}\n        >\n          View Projects\n        </Button>\n      </Container>\n    </>\n  )\n}\n\nexport default Recap\n"
  },
  {
    "path": "components/winter/timeline.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Flex, Container, Text, Badge, Link } from 'theme-ui'\nimport { Slide } from '../react-reveal-compat'\nimport Icon from '../icon'\n\nfunction TimelineStep({ children }) {\n  return (\n    <Flex\n      sx={{\n        paddingY: 4,\n        flexDirection: 'row',\n        alignItems: 'center',\n        '&:before': {\n          content: '\"\"',\n          background: 'snow',\n          height: ['420px', '320px', '320px'],\n          width: '4px',\n          marginLeft: 36,\n          position: 'absolute',\n          zIndex: 0\n        },\n        '&:first-of-type:before': {\n          top: [0, null, 'auto'],\n          width: [0, null, 0],\n          left: [0, null, 0]\n        },\n        '&:last-of-type:before': {\n          bottom: [0, null, 'auto'],\n          left: [0, null, 0],\n          width: [0, null, 0]\n        }\n      }}\n    >\n      {children}\n    </Flex>\n  )\n}\n\nfunction Circle({ children }) {\n  return (\n    <Box\n      sx={{\n        p: 14,\n        background: 'red',\n\n        color: 'white',\n        backgroundImage:\n          'radial-gradient(ellipse farthest-corner at top left, #5bc0de, #338eda)',\n        borderRadius: '100%',\n        display: 'inline-block',\n        lineHeight: 0,\n        position: 'relative',\n        zIndex: 999\n      }}\n    >\n      {children}\n    </Box>\n  )\n}\n\nfunction Step({ icon, name, duration, href }) {\n  return (\n    <TimelineStep sx={{ pb: 1 }}>\n      <Slide left>\n        <Circle>\n          {href ? (\n            <Link href={href} sx={{ cursor: 'pointer', zIndex: 999 }}>\n              <Icon glyph={icon} size={48} color=\"white\" />\n            </Link>\n          ) : (\n            <Icon glyph={icon} size={48} />\n          )}\n        </Circle>\n        <Container\n          sx={{\n            mt: 0,\n            display: 'flex',\n            justifyContent: 'left',\n            flexDirection: 'column',\n            textAlign: 'left'\n          }}\n        >\n          <Badge\n            variant=\"pill\"\n            sx={{\n              bg: 'smoke',\n              color: 'darker',\n              fontWeight: 'normal',\n              textTransform: 'uppercase',\n              width: 'fit-content',\n              fontSize: 18,\n              px: 3\n            }}\n          >\n            {duration}\n          </Badge>\n          <Text\n            sx={{\n              color: 'white',\n              fontSize: [2, 3],\n              maxWidth: [300, null, 550]\n            }}\n          >\n            {name}\n          </Text>\n        </Container>\n      </Slide>\n    </TimelineStep>\n  )\n}\n\nexport default function RealTimeline() {\n  return (\n    <Flex sx={{ flexDirection: 'column', justifyContent: 'center', pb: 4 }}>\n      <Step\n        icon=\"post\"\n        name={\n          <>\n            RSVPs are closed. Have a question? Here are the{' '}\n            <Link\n              target=\"_blank\"\n              sx={{ color: 'inherit' }}\n              href=\"https://github.com/hackclub/winter/blob/main/docs/faq.md\"\n            >\n              FAQs\n            </Link>\n            .\n          </>\n        }\n        duration=\"RSVP\"\n      />\n      <Step\n        icon=\"send\"\n        name=\"Deadline for hardware plans submission (Jan 15) has arrived, we are no longer accepting new projects.\"\n        duration=\"Share your plan\"\n      />\n      <Step\n        icon=\"slack\"\n        name=\"From Feb 14-23, join a 10 days building in public challenge where you share daily updates of your hardware project.\"\n        duration=\"Build\"\n      />\n    </Flex>\n  )\n}\n"
  },
  {
    "path": "eslint.config.mts",
    "content": "import { defineConfig, globalIgnores } from 'eslint/config'\nimport nextVitals from 'eslint-config-next/core-web-vitals'\nimport nextTs from 'eslint-config-next/typescript'\n\nexport default defineConfig([\n  ...nextVitals,\n  ...nextTs,\n  {\n    rules: {\n      'react/react-in-jsx-scope': 'off',\n      'react/prop-types': 'off',\n      'react/no-unescaped-entities': 'off',\n      'react/no-unknown-property': 'off',\n      '@typescript-eslint/no-explicit-any': 'off',\n      '@typescript-eslint/no-unused-vars': 'off',\n      '@typescript-eslint/no-unused-expressions': 'off',\n      '@typescript-eslint/ban-ts-comment': 'off',\n      '@typescript-eslint/no-require-imports': 'off',\n      'react-hooks/set-state-in-effect': 'off',\n      'react-hooks/purity': 'off',\n      'react-hooks/immutability': 'off'\n    }\n  },\n  globalIgnores([\n    '.next/**',\n    'out/**',\n    'build/**',\n    'next-env.d.ts',\n    'public/**'\n  ])\n])\n"
  },
  {
    "path": "lib/cached-hcb-orgs.ts",
    "content": "const CACHE_FILENAME = 'hcb-orgs-cache.json'\n\nexport async function fetchAllOrganizations() {\n  const fs = require('fs')\n  const path = require('path')\n  const cacheFile = path.join(process.cwd(), '.next', CACHE_FILENAME)\n\n  try {\n    return JSON.parse(fs.readFileSync(cacheFile, 'utf8'))\n  } catch (e) {\n    // Cache miss\n  }\n\n  let lastLength = 100\n  let total = []\n  let page = 1\n  while (lastLength >= 100) {\n    const json = await fetch(\n      'https://hcb.hackclub.com/api/v3/directory/organizations?per_page=100&page=' +\n        page\n    ).then(res => res.json())\n    lastLength = json.length\n    page++\n    total = [...total, ...json]\n  }\n\n  try {\n    fs.mkdirSync(path.dirname(cacheFile), { recursive: true })\n    fs.writeFileSync(cacheFile, JSON.stringify(total))\n  } catch (e) {\n    console.error('Failed to write cache file:', e)\n  }\n\n  return total\n}\n"
  },
  {
    "path": "lib/countries.json",
    "content": "{\n  \"countries\": [\n    \"United States of America (US)\",\n    \"Canada (CA)\",\n    \"United Kingdom of Great Britain and Northern Ireland (GB)\",\n    \"Afghanistan (AF)\",\n    \"Åland Islands (AX)\",\n    \"Albania (AL)\",\n    \"Algeria (DZ)\",\n    \"American Samoa (AS)\",\n    \"Andorra (AD)\",\n    \"Angola (AO)\",\n    \"Anguilla (AI)\",\n    \"Antarctica (AQ)\",\n    \"Antigua and Barbuda (AG)\",\n    \"Argentina (AR)\",\n    \"Armenia (AM)\",\n    \"Aruba (AW)\",\n    \"Australia (AU)\",\n    \"Austria (AT)\",\n    \"Azerbaijan (AZ)\",\n    \"Bahamas (BS)\",\n    \"Bahrain (BH)\",\n    \"Bangladesh (BD)\",\n    \"Barbados (BB)\",\n    \"Belarus (BY)\",\n    \"Belgium (BE)\",\n    \"Belize (BZ)\",\n    \"Benin (BJ)\",\n    \"Bermuda (BM)\",\n    \"Bhutan (BT)\",\n    \"Bolivia  (BO)\",\n    \"Bonaire (BQ)\",\n    \"Bosnia and Herzegovina (BA)\",\n    \"Botswana (BW)\",\n    \"Bouvet Island (BV)\",\n    \"Brazil (BR)\",\n    \"British Indian Ocean Territory (IO)\",\n    \"Brunei Darussalam (BN)\",\n    \"Bulgaria (BG)\",\n    \"Burkina Faso (BF)\",\n    \"Burundi (BI)\",\n    \"Cabo Verde (CV)\",\n    \"Cambodia (KH)\",\n    \"Cameroon (CM)\",\n    \"Cayman Islands (KY)\",\n    \"Central African Republic (CF)\",\n    \"Chad (TD)\",\n    \"Chile (CL)\",\n    \"China (CN)\",\n    \"Christmas Island (CX)\",\n    \"Cocos (Keeling) Islands (CC)\",\n    \"Colombia (CO)\",\n    \"Comoros (KM)\",\n    \"Congo (the Democratic Republic of the) (CD)\",\n    \"Congo (the) (CG)\",\n    \"Cook Islands (CK)\",\n    \"Costa Rica (CR)\",\n    \"Côte d'Ivoire (CI)\",\n    \"Croatia (HR)\",\n    \"Cuba (CU)\",\n    \"Curaçao (CW)\",\n    \"Cyprus (CY)\",\n    \"Czechia (CZ)\",\n    \"Denmark (DK)\",\n    \"Djibouti (DJ)\",\n    \"Dominica (DM)\",\n    \"Dominican Republic (DO)\",\n    \"Ecuador (EC)\",\n    \"Egypt (EG)\",\n    \"El Salvador (SV)\",\n    \"Equatorial Guinea (GQ)\",\n    \"Eritrea (ER)\",\n    \"Estonia (EE)\",\n    \"Eswatini (SZ)\",\n    \"Ethiopia (ET)\",\n    \"Falkland Islands (FK)\",\n    \"Faroe Islands (FO)\",\n    \"Fiji (FJ)\",\n    \"Finland (FI)\",\n    \"France (FR)\",\n    \"French Guiana (GF)\",\n    \"French Polynesia (PF)\",\n    \"French Southern Territories (TF)\",\n    \"Gabon (GA)\",\n    \"Gambia (GM)\",\n    \"Georgia (GE)\",\n    \"Germany (DE)\",\n    \"Ghana (GH)\",\n    \"Gibraltar (GI)\",\n    \"Greece (GR)\",\n    \"Greenland (GL)\",\n    \"Grenada (GD)\",\n    \"Guadeloupe (GP)\",\n    \"Guam (GU)\",\n    \"Guatemala (GT)\",\n    \"Guernsey (GG)\",\n    \"Guinea (GN)\",\n    \"Guinea-Bissau (GW)\",\n    \"Guyana (GY)\",\n    \"Haiti (HT)\",\n    \"Heard Island and McDonald Islands (HM)\",\n    \"Holy See (VA)\",\n    \"Honduras (HN)\",\n    \"Hong Kong (HK)\",\n    \"Hungary (HU)\",\n    \"Iceland (IS)\",\n    \"India (IN)\",\n    \"Indonesia (ID)\",\n    \"Iran (IR)\",\n    \"Iraq (IQ)\",\n    \"Ireland (IE)\",\n    \"Isle of Man (IM)\",\n    \"Israel (IL)\",\n    \"Italy (IT)\",\n    \"Jamaica (JM)\",\n    \"Japan (JP)\",\n    \"Jersey (JE)\",\n    \"Jordan (JO)\",\n    \"Kazakhstan (KZ)\",\n    \"Kenya (KE)\",\n    \"Kiribati (KI)\",\n    \"Korea (the Democratic People's Republic of) (KP)\",\n    \"Korea (the Republic of) (KR)\",\n    \"Kuwait (KW)\",\n    \"Lao People's Democratic Republic (LA)\",\n    \"Latvia (LV)\",\n    \"Lebanon (LB)\",\n    \"Lesotho (LS)\",\n    \"Liberia (LR)\",\n    \"Libya (LY)\",\n    \"Liechtenstein (LI)\",\n    \"Lithuania (LT)\",\n    \"Luxembourg (LU)\",\n    \"Macao (MO)\",\n    \"Macedonia (the former Yugoslav Republic of) (MK)\",\n    \"Madagascar (MG)\",\n    \"Malawi (MW)\",\n    \"Malaysia (MY)\",\n    \"Maldives (MV)\",\n    \"Mali (ML)\",\n    \"Malta (MT)\",\n    \"Marshall Islands (MH)\",\n    \"Martinique (MQ)\",\n    \"Mauritania (MR)\",\n    \"Mauritius (MU)\",\n    \"Mayotte (YT)\",\n    \"Mexico (MX)\",\n    \"Micronesia (FM)\",\n    \"Moldova (MD)\",\n    \"Monaco (MC)\",\n    \"Mongolia (MN)\",\n    \"Montenegro (ME)\",\n    \"Montserrat (MS)\",\n    \"Morocco (MA)\",\n    \"Mozambique (MZ)\",\n    \"Myanmar (MM)\",\n    \"Namibia (NA)\",\n    \"Nauru (NR)\",\n    \"Nepal (NP)\",\n    \"Netherlands (NL)\",\n    \"New Caledonia (NC)\",\n    \"New Zealand (NZ)\",\n    \"Nicaragua (NI)\",\n    \"Niger (NE)\",\n    \"Nigeria (NG)\",\n    \"Niue (NU)\",\n    \"Norfolk Island (NF)\",\n    \"Northern Mariana Islands (MP)\",\n    \"Norway (NO)\",\n    \"Oman (OM)\",\n    \"Pakistan (PK)\",\n    \"Palau (PW)\",\n    \"Palestine (PS)\",\n    \"Panama (PA)\",\n    \"Papua New Guinea (PG)\",\n    \"Paraguay (PY)\",\n    \"Peru (PE)\",\n    \"Philippines (PH)\",\n    \"Pitcairn (PN)\",\n    \"Poland (PL)\",\n    \"Portugal (PT)\",\n    \"Puerto Rico (PR)\",\n    \"Qatar (QA)\",\n    \"Réunion (RE)\",\n    \"Romania (RO)\",\n    \"Russian Federation (RU)\",\n    \"Rwanda (RW)\",\n    \"Saint Barthélemy (BL)\",\n    \"Saint Helena, Ascension and Tristan da Cunha (SH)\",\n    \"Saint Kitts and Nevis (KN)\",\n    \"Saint Lucia (LC)\",\n    \"Saint Martin (MF)\",\n    \"Saint Pierre and Miquelon (PM)\",\n    \"Saint Vincent and the Grenadines (VC)\",\n    \"Samoa (WS)\",\n    \"San Marino (SM)\",\n    \"Sao Tome and Principe (ST)\",\n    \"Saudi Arabia (SA)\",\n    \"Senegal (SN)\",\n    \"Serbia (RS)\",\n    \"Seychelles (SC)\",\n    \"Sierra Leone (SL)\",\n    \"Singapore (SG)\",\n    \"Sint Maarten (SX)\",\n    \"Slovakia (SK)\",\n    \"Slovenia (SI)\",\n    \"Solomon Islands (SB)\",\n    \"Somalia (SO)\",\n    \"South Africa (ZA)\",\n    \"South Georgia and the South Sandwich Islands (GS)\",\n    \"South Sudan (SS)\",\n    \"Spain (ES)\",\n    \"Sri Lanka (LK)\",\n    \"Sudan (the) (SD)\",\n    \"Suriname (SR)\",\n    \"Svalbard (SJ)\",\n    \"Sweden (SE)\",\n    \"Switzerland (CH)\",\n    \"Syrian Arab Republic (SY)\",\n    \"Taiwan (TW)\",\n    \"Tajikistan (TJ)\",\n    \"Tanzania, United Republic of (TZ)\",\n    \"Thailand (TH)\",\n    \"Timor-Leste (TL)\",\n    \"Togo (TG)\",\n    \"Tokelau (TK)\",\n    \"Tonga (TO)\",\n    \"Trinidad and Tobago (TT)\",\n    \"Tunisia (TN)\",\n    \"Turkey (TR)\",\n    \"Turkmenistan (TM)\",\n    \"Turks and Caicos Islands (TC)\",\n    \"Tuvalu (TV)\",\n    \"Uganda (UG)\",\n    \"Ukraine (UA)\",\n    \"United Arab Emirates (AE)\",\n    \"United States Minor Outlying Islands (UM)\",\n    \"Uruguay (UY)\",\n    \"Uzbekistan (UZ)\",\n    \"Vanuatu (VU)\",\n    \"Venezuela (VE)\",\n    \"Viet Nam (VN)\",\n    \"Virgin Islands (British) (VG)\",\n    \"Virgin Islands (U.S.) (VI)\",\n    \"Wallis and Futuna (WF)\",\n    \"Western Sahara (EH)\",\n    \"Yemen (YE)\",\n    \"Zambia (ZM)\",\n    \"Zimbabwe (ZW)\"\n  ]\n}\n"
  },
  {
    "path": "lib/cta.json",
    "content": "[\n  {\n    \"title\": \"Flavortown\",\n    \"logo\": \"https://cdn.hackclub.com/019c76b8-4f54-7de9-ae34-90b2190c2440/TeQ27w.png\",\n    \"background\": \"#7B4942\",\n    \"stickerImage\": \"https://cdn.hackclub.com/019c76b5-b513-7f5a-8718-bea38d4abb80/DM6Ztg.avif\",\n    \"description\": \"Cook tasty personal projects, win free prizes!\",\n    \"descriptionColor\": \"white\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"#AD7858\",\n    \"link\": \"https://flavortown.hackclub.com/?ref=site-0\"\n  },\n  {\n    \"title\": \"Stasis\",\n    \"logo\": \"/stasis-logo-centered.png\",\n    \"logoScale\": 1.1,\n    \"background\": \"#dad2bf\",\n    \"backgroundImage\": \"url(/stasis-grid.png)\",\n    \"backgroundSize\": \"64px 64px\",\n    \"description\": \"Design hardware projects, get them funded, and come to a hackathon in Austin, TX!\",\n    \"descriptionColor\": \"white\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"#D95D39\",\n    \"link\": \"https://stasis.hackclub.com/?utm_source=cta\"\n  },\n  {\n    \"title\": \"Macondo\",\n    \"logo\": \"https://cdn.hackclub.com/019dc215-69df-7087-9b63-73db5a7126fd/logo_macondo.png\",\n    \"logoScale\": 1.2,\n    \"stickerImage\": \"https://cdn.hackclub.com/019dc21b-d702-72d2-9930-487a4f7cfd9a/android-chrome-512x512.webp\",\n    \"stickerImageScale\": 0.5,\n    \"background\": \"#684D3A\",\n    \"backgroundImage\": \"url(https://cdn.hackclub.com/019dc218-1e6a-7562-800c-d79da12bc5d1/background_logo_2.png)\",\n    \"backgroundSize\": \"480px 240px\",\n    \"description\": \"Make hardware or software projects and win free prizes! Fly to Bogotá, Colombia for a hackathon!\",\n    \"descriptionColor\": \"#EACFB3\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"#EACFB3\",\n    \"link\": \"https://macondo.hackclub.com/?utm_source=cta\"\n  },\n  {\n    \"title\": \"Sleepover\",\n    \"logo\": \"https://cdn.hackclub.com/019c76b7-644a-7ef7-b855-63253c99d2f8/UpZIvQ.png\",\n    \"background\": \"#B5AAE7\",\n    \"stickerImage\": \"https://cdn.hackclub.com/019c76b5-f328-725e-9d6d-4f5368685ab5/tNACWw.png\",\n    \"description\": \"Learn to code and fly to an all girls slumber party hackathon!\",\n    \"descriptionColor\": \"white\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"#9DC9F7\",\n    \"link\": \"https://sleepover.hackclub.com/?utm_source=site_cta\"\n  },\n  {\n    \"title\": \"Hack Club: The Game\",\n    \"logo\": \"https://cdn.hackclub.com/019d0899-f270-7530-b145-19d1e53f113f/hctg-text-logo.png\",\n    \"description\": \"Build projects, then join a scavenger hunt in Manhattan!\",\n    \"background\": \"#FECB0D\",\n    \"descriptionColor\": \"#000\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"black\",\n    \"link\": \"https://game.hackclub.com/?utm_source=site_cta\"\n  },\n  {\n    \"title\": \"Jackpot\",\n    \"logo\": \"https://cdn.hackclub.com/019d01dc-d676-746d-9fd9-794df0b50399/logo_draft.png\",\n    \"background\": \"#5F1212\",\n    \"logoScale\": 1,\n    \"stickerImage\": \"https://cdn.hackclub.com/019d01dd-6b56-748a-8386-8f77bad07d46/meow.png\",\n    \"stickerImageScale\": 0.7,\n    \"description\": \"No hours required...\\nenjoy a weekend hackathon\\nin Las Vegas!\",\n    \"descriptionColor\": \"white\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"#FAD10B\",\n    \"link\": \"https://jackpot.hackclub.com\"\n  },\n  {\n    \"title\": \"Fallout\",\n    \"logo\": \"https://cdn.hackclub.com/019cdfd0-6f09-7c8c-bd01-d0349e421c32/logo2.svg\",\n    \"background\": \"#39c9ff\",\n    \"logoScale\": 1,\n    \"stickerImage\": \"https://cdn.hackclub.com/019d36f6-2170-792f-9487-db64bce4cf65/koifish.webp\",\n    \"stickerImageScale\": 0.7,\n    \"description\": \"Build hardware projects, get build funding, and fly to a Shenzhen hackathon!\",\n    \"descriptionColor\": \"white\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"#FAD10B\",\n    \"link\": \"https://fallout.hackclub.com\"\n  },\n  {\n    \"title\": \"Beest\",\n    \"logo\": \"https://cdn.hackclub.com/019d87e3-965d-75b0-83dd-c73469f47911/beest-cropped.png\",\n    \"logoScale\": 1,\n    \"background\": \"#A7C1D6\",\n    \"backgroundImage\": \"url(https://cdn.hackclub.com/019d87bd-fdf5-725a-a552-7207ebceaf06/bg.png)\",\n    \"stickerImage\": \"https://cdn.hackclub.com/019d87b5-6865-7985-b88d-12a4c528cc86/beest-sticker.webp\",\n    \"stickerImageScale\": 0.65,\n    \"description\": \"Code a project, fly to the Netherlands, build a mechanical animal!\",\n    \"backgroundSize\": \"auto 131%\",\n    \"descriptionColor\": \"#4C483C\",\n    \"buttonText\": \"JOIN NOW\",\n    \"buttonColor\": \"#D95D39\",\n    \"link\": \"https://beest.hackclub.com/?utm_source=cta\"\n  }\n]\n"
  },
  {
    "path": "lib/dates.ts",
    "content": "export const dt = d => new Date(d).toLocaleDateString()\n\nconst year = new Date().getFullYear()\nexport const tinyDt = d => dt(d).replace(`/${year}`, '').replace(`${year}-`, '')\n\n// based on https://github.com/withspectrum/spectrum/blob/alpha/src/helpers/utils.js#L146\nexport const timeSince = (\n  previous,\n  absoluteDuration = false,\n  longForm = false,\n  current = new Date().toISOString()\n) => {\n  const msPerMinute = 60 * 1000\n  const msPerHour = msPerMinute * 60\n  const msPerDay = msPerHour * 24\n  const msPerWeek = msPerDay * 7\n  const msPerMonth = msPerDay * 30 * 2\n  const msPerYear = msPerDay * 365\n\n  const future = new Date(previous).getTime() - new Date(current).getTime()\n  const past = new Date(current).getTime() - new Date(previous).getTime()\n  const elapsed = [future, past].sort((a, b) => a - b)[1]\n\n  let humanizedTime\n  if (elapsed < msPerMinute) {\n    humanizedTime = '< 1m'\n  } else if (elapsed < msPerHour) {\n    const now = Math.round(elapsed / msPerMinute)\n    humanizedTime = longForm ? `${now} minutes` : `${now}m`\n  } else if (elapsed < msPerDay) {\n    const now = Math.round(elapsed / msPerHour)\n    humanizedTime = longForm ? `${now} hours` : `${now}h`\n  } else if (elapsed < msPerWeek) {\n    const now = Math.round(elapsed / msPerDay)\n    humanizedTime = longForm ? `${now} days` : `${now}d`\n  } else if (elapsed < msPerMonth) {\n    const now = Math.round(elapsed / msPerWeek)\n    humanizedTime = longForm ? `${now} weeks` : `${now}w`\n  } else if (elapsed < msPerYear) {\n    const now = Math.round(elapsed / msPerMonth)\n    humanizedTime = longForm ? `${now} months` : `${now}mo`\n  } else {\n    const now = Math.round(elapsed / msPerYear)\n    humanizedTime = longForm ? `${now} years` : `${now}y`\n  }\n\n  if (absoluteDuration) {\n    return humanizedTime\n  } else {\n    return elapsed > 0 ? `${humanizedTime} ago` : `in ${humanizedTime}`\n  }\n}\n\nfunction formatChunk(type, date) {\n  const days = [\n    'Sunday',\n    'Monday',\n    'Tuesday',\n    'Wednesday',\n    'Thursday',\n    'Friday',\n    'Saturday'\n  ]\n  const months = [\n    'January',\n    'Febuary',\n    'March',\n    'April',\n    'May',\n    'June',\n    'July',\n    'August',\n    'September',\n    'October',\n    'November',\n    'December'\n  ]\n  switch (type) {\n    case 'dddd':\n      return days[date.getDay()]\n    case 'ddd':\n      return formatChunk('dddd', date).slice(0, 3)\n    case 'dd':\n      return ('00' + formatChunk('d', date)).slice(-2)\n    case 'd':\n      return date.getDate()\n    case 'mmmm':\n      return months[date.getMonth()]\n    case 'mmm':\n      return formatChunk('mmmm', date).slice(0, 3)\n    case 'mm':\n      return ('00' + formatChunk('m', date)).slice(-2)\n    case 'm':\n      return (date.getMonth() + 1).toString()\n    case 'yyyy':\n      return date.getFullYear().toString()\n    case 'yy':\n      return formatChunk('yyyy', date).slice(-2)\n    default:\n      return null\n  }\n}\n\ntype FormatDate = {\n  format?: string\n  date: string\n  divider?: string\n}\n\nexport const formatDate = ({ format, date, divider = ' ' }: FormatDate) => {\n  return format\n    .split(divider)\n    .map(chunk => formatChunk(chunk, new Date(date)))\n    .join(divider)\n}\n"
  },
  {
    "path": "lib/fetcher.ts",
    "content": "/**\n * useSWR() fetcher\n */\nexport default async function fetcher(...args: Parameters<typeof fetch>) {\n  const res = await fetch(...args)\n  return await res.json()\n}\n"
  },
  {
    "path": "lib/git-info.ts",
    "content": "export const getGitSha = (): string => {\n  return process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA || 'dev'\n}\n\nexport const getGitShaShort = (): string => {\n  const sha = getGitSha()\n  return sha === 'dev' ? 'dev' : sha.substring(0, 7)\n}\n"
  },
  {
    "path": "lib/helpers.ts",
    "content": "export const dt = d => new Date(d).toLocaleDateString()\n\nconst year = new Date().getFullYear()\nexport const tinyDt = d => dt(d).replace(`/${year}`, '').replace(`${year}-`, '')\n\nexport const formatAddress = (city, stateCode, country, countryCode) => {\n  const firstHalf = city\n  const secondHalf = countryCode === 'US' ? stateCode : country\n\n  // Handle case where city or country is null\n  const final = [firstHalf, secondHalf].filter(e => e).join(', ')\n\n  // Handle case where an event's location is outside the US and is so long that\n  // it overflows the card when rendering. If the total length of the location\n  // is over 16 characters and outside the US, then just show the country name.\n  if (countryCode !== 'US' && final.length > 16) {\n    return country\n  } else {\n    return final\n  }\n}\n\nconst humanizedMonth = date =>\n  date.toLocaleString('en', { month: 'long', timeZone: 'UTC' })\n\nconst shortHumanizedMonth = date =>\n  date.toLocaleString('en', { month: 'short', timeZone: 'UTC' })\n\nexport const humanizedDateRange = (start, end) => {\n  let result\n  // the substrings make sure that the dates aren't affected by dumb time zone bs\n  const startDate = new Date(start.substr(0, 10))\n  const endDate = new Date(end.substr(0, 10))\n  if (startDate.getUTCMonth() === endDate.getUTCMonth()) {\n    if (startDate.getUTCDate() === endDate.getUTCDate()) {\n      // Same day and month means we can return the date\n      result = `${humanizedMonth(startDate)} ${startDate.getUTCDate()}`\n    } else {\n      result = `${humanizedMonth(\n        startDate\n      )} ${startDate.getUTCDate()}–${endDate.getUTCDate()}`\n    }\n  } else {\n    result = `${shortHumanizedMonth(\n      startDate\n    )} ${startDate.getUTCDate()}–${shortHumanizedMonth(\n      endDate\n    )} ${endDate.getUTCDate()}`\n  }\n  if (new Date().getUTCFullYear() !== startDate.getUTCFullYear()) {\n    result += `, ${startDate.getUTCFullYear()}`\n  }\n  return result\n}\n\n// based on https://github.com/withspectrum/spectrum/blob/alpha/src/helpers/utils.js#L146\nexport const timeSince = (\n  previous,\n  absoluteDuration = false,\n  longForm = false,\n  current = new Date()\n) => {\n  const msPerMinute = 60 * 1000\n  const msPerHour = msPerMinute * 60\n  const msPerDay = msPerHour * 24\n  const msPerWeek = msPerDay * 7\n  const msPerMonth = msPerDay * 30 * 2\n  const msPerYear = msPerDay * 365\n\n  const elapsed = new Date(current).getTime() - new Date(previous).getTime()\n\n  let humanizedTime\n  if (elapsed < msPerMinute) {\n    humanizedTime = '< 1m'\n  } else if (elapsed < msPerHour) {\n    const now = Math.round(elapsed / msPerMinute)\n    humanizedTime = longForm ? `${now} minute${now > 1 ? 's' : ''}` : `${now}m`\n  } else if (elapsed < msPerDay) {\n    const now = Math.round(elapsed / msPerHour)\n    humanizedTime = longForm ? `${now} hour${now > 1 ? 's' : ''}` : `${now}h`\n  } else if (elapsed < msPerWeek) {\n    const now = Math.round(elapsed / msPerDay)\n    humanizedTime = longForm ? `${now} day${now > 1 ? 's' : ''}` : `${now}d`\n  } else if (elapsed < msPerMonth) {\n    const now = Math.round(elapsed / msPerWeek)\n    humanizedTime = longForm ? `${now} week${now > 1 ? 's' : ''}` : `${now}w`\n  } else if (elapsed < msPerYear) {\n    const now = Math.round(elapsed / msPerMonth)\n    humanizedTime = longForm ? `${now} month${now > 1 ? 's' : ''}` : `${now}mo`\n  } else {\n    const now = Math.round(elapsed / msPerYear)\n    humanizedTime = longForm ? `${now} year${now > 1 ? 's' : ''}` : `${now}y`\n  }\n\n  if (absoluteDuration) {\n    return humanizedTime\n  } else {\n    return elapsed > 0 ? `${humanizedTime} ago` : `in ${humanizedTime}`\n  }\n}\n\n// NOTE(@lachlanjc): I know this is bad, I’m trying to get it out the door okay???\nexport const timeTo = (time, current = new Date(), longForm = true) => {\n  const msPerMinute = 60 * 1000\n  const msPerHour = msPerMinute * 60\n  const msPerDay = msPerHour * 64 // getting close to a day\n  const msPerYear = msPerDay * 365\n\n  const elapsed = new Date(time).getTime() - new Date(current).getTime()\n\n  let humanizedTime\n  if (elapsed < msPerMinute) {\n    humanizedTime = '< 1m'\n  } else if (elapsed < msPerHour) {\n    const now = Math.round(elapsed / msPerMinute)\n    humanizedTime = longForm ? `${now} more minutes` : `${now}m`\n  } else if (elapsed < msPerDay) {\n    const now = Math.round(elapsed / msPerHour)\n    humanizedTime = longForm ? `${now} more hours` : `${now}h`\n  } else if (elapsed < msPerYear) {\n    const now = Math.round(elapsed / msPerDay)\n    humanizedTime = longForm ? `${now} days` : `${now}d`\n  } else {\n    const now = Math.round(elapsed / msPerYear)\n    humanizedTime = longForm ? `${now} years` : `${now}y`\n  }\n\n  return humanizedTime\n}\n\nfunction formatChunk(type, date) {\n  const days = [\n    'Sunday',\n    'Monday',\n    'Tuesday',\n    'Wednesday',\n    'Thursday',\n    'Friday',\n    'Saturday'\n  ]\n  const months = [\n    'January',\n    'Febuary',\n    'March',\n    'April',\n    'May',\n    'June',\n    'July',\n    'August',\n    'September',\n    'October',\n    'November',\n    'December'\n  ]\n  switch (type) {\n    case 'dddd':\n      return days[date.getDay()]\n    case 'ddd':\n      return formatChunk('dddd', date).slice(0, 3)\n    case 'dd':\n      return ('00' + formatChunk('d', date)).slice(-2)\n    case 'd':\n      return date.getDate()\n    case 'mmmm':\n      return months[date.getMonth()]\n    case 'mmm':\n      return formatChunk('mmmm', date).slice(0, 3)\n    case 'mm':\n      return ('00' + formatChunk('m', date)).slice(-2)\n    case 'm':\n      return (date.getMonth() + 1).toString()\n    case 'yyyy':\n      return date.getFullYear().toString()\n    case 'yy':\n      return formatChunk('yyyy', date).slice(-2)\n    default:\n      return null\n  }\n}\nexport const formatDate = (format, date, divider = ' ') => {\n  return format\n    .split(divider)\n    .map(chunk => formatChunk(chunk, new Date(date)))\n    .join(divider)\n}\n\nexport const normalizeGitHubCommitUrl = url => {\n  return url\n    .replace('api.', '')\n    .replace('/repos', '')\n    .replace('commits', 'commit')\n}\n\nexport const decodeHtmlEntities = str =>\n  str\n    ?.replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n    .replace(/&amp;/g, '&')\n"
  },
  {
    "path": "lib/members.ts",
    "content": "// this could use the slackData lib, but apparently top level awaits are risky\nexport const count: number = 103897\nexport const formatted = count.toLocaleString('en-US')\nexport const thousands = Math.round(count / 1000)\n"
  },
  {
    "path": "lib/organization.ts",
    "content": "import GeoPattern from 'geopattern'\n/**\n * Represents an organization.\n */\nexport class Organization {\n  public raw: any\n\n  /**\n   * Creates an instance of Organization.\n   * @param {object} rawOrganization - The raw organization data.\n   */\n  constructor(rawOrganization: any) {\n    /**\n     * The raw organization data.\n     * @type {object}\n     */\n    this.raw = rawOrganization\n  }\n\n  /**\n   * Gets the ID of the organization.\n   * @type {string}\n   */\n  get id() {\n    return this.raw.id\n  }\n\n  /**\n   * Gets the name of the organization.\n   * @type {string}\n   */\n  get name() {\n    return this.raw.name\n  }\n\n  /**\n   * Gets the slug of the organization.\n   * @type {string}\n   */\n  get slug() {\n    return this.raw.slug\n  }\n\n  /**\n   * Checks if the organization is transparent.\n   * @type {boolean}\n   */\n  get isTransparent() {\n    return this.raw.transparent\n  }\n\n  /**\n   * Checks if the organization is in demo mode.\n   * @type {boolean}\n   */\n  get isDemo() {\n    return this.raw.demo_mode\n  }\n\n  /**\n   * Gets the number of users in the organization.\n   * @type {number}\n   */\n  get users() {\n    return this.raw.users.length\n  }\n\n  /**\n   * Checks if the organization accepts donations.\n   * @type {boolean}\n   */\n  get acceptsDonations() {\n    return this.raw.donation_link !== null\n  }\n\n  /**\n   * Gets the branding information of the organization.\n   * @type {object}\n   * @property {string} logo - The logo of the organization.\n   * @property {string} donationHeader - The donation header of the organization.\n   * @property {string} backgroundImage - The background image of the organization.\n   * @property {string} publicMessage - The public message of the organization.\n   */\n  get branding() {\n    return {\n      logo: this.raw.logo,\n      donationHeader: this.raw.donation_header,\n      backgroundImage:\n        this.raw.background_image ||\n        GeoPattern.generate(this.raw.name).toDataUri(),\n      description: this.raw.description\n    }\n  }\n\n  /**\n   * Gets the tags of the organization.\n   * @type {object}\n   * @property {string} type - The type of the organization.\n   * @property {string} category - The category of the organization.\n   * @property {string[]} badges - The badges of the organization.\n   */\n  get tags() {\n    return {\n      type: this.raw.category,\n      category: 'Coding',\n      badges: []\n    }\n  }\n\n  /**\n   * Gets the creation date of the organization.\n   * @type {Date}\n   */\n  get createdAt() {\n    return new Date(this.raw.created_at)\n  }\n\n  /**\n   * Gets the links associated with the organization.\n   * @type {object}\n   * @property {string} website - The website link of the organization.\n   * @property {string} donations - The donation link of the organization (if it accepts donations).\n   * @property {string} financials - The financials link of the organization (if it is transparent).\n   */\n  get links() {\n    const links: { website: string; donations?: string; financials?: string } =\n      {\n        website: this.raw.website\n      }\n\n    if (this.acceptsDonations) links.donations = this.raw.donation_link\n    if (this.isTransparent)\n      links.financials = `https://hcb.hackclub.com/${this.slug}`\n\n    return links\n  }\n\n  /**\n   * Gets the location of the organization.\n   * @type {object}\n   * @property {string} country - The country of the organization.\n   * @property {string} continent - The continent of the organization.\n   * @property {string} countryCode - The country code of the organization.\n   */\n  get location() {\n    return {\n      country: this.raw.location.country,\n      continent: this.raw.location.continent,\n      countryCode: this.raw.location.country_code\n    }\n  }\n\n  /**\n   * Updates the organization data by making an API call.\n   * @returns {Organization} The updated Organization instance.\n   */\n  async update() {\n    const response = await fetch(this.raw.href)\n    const json = await response.json()\n    this.raw = json\n\n    return this\n  }\n}\n"
  },
  {
    "path": "lib/slackData.ts",
    "content": "type SlackData = {\n  active_users_28d?: number\n  full_members_count?: number\n  total_members_count?: number\n  ds?: string\n}\n\nexport const slackData = async () =>\n  (await fetch('https://slack-data.hackclub.dev/full')\n    .then(r => r.json())\n    .then(d => d.stats?.sort((a, b) => b.ds.localeCompare(a.ds))[0] ?? {})\n    .catch(() => ({}))) as SlackData\n"
  },
  {
    "path": "lib/sleep.ts",
    "content": "// Beloved classic utility function :3\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))\n\nexport default sleep\n"
  },
  {
    "path": "lib/theme.ts",
    "content": "import base from '@hackclub/theme'\nimport { merge } from 'lodash'\n\nconst theme = base\n\ntheme.config.useColorSchemeMediaQuery = false\n\ntheme.buttons.primary = merge(theme.buttons.primary, {\n  textTransform: 'uppercase'\n})\n\ntheme.layout.copy.maxWidth = [null, null, 'copyPlus']\n\ntheme.text.title.fontSize = [5, 6]\n\nexport default theme\n"
  },
  {
    "path": "lib/use-form.ts",
    "content": "import { useState, useEffect } from 'react'\n\nconst useForm = (\n  submitURL = '/',\n  callback,\n  options = { clearOnSubmit: 5000, method: 'POST', initData: {}, bearer: null }\n) => {\n  const [status, setStatus] = useState('default')\n  const [data, setData] = useState({ ...options.initData })\n  const [touched, setTouched] = useState({})\n\n  const onFieldChange = (e, name, type) => {\n    e.persist()\n    const value = e.target[type === 'checkbox' ? 'checked' : 'value']\n    setData(data => ({ ...options.initData, ...data, [name]: value }))\n  }\n\n  useEffect(() => {\n    setTouched(Object.keys(data))\n  }, [data])\n\n  const useField = (name, type = 'text', ...props) => {\n    const checkbox = type === 'checkbox'\n    const empty = checkbox ? false : ''\n    const onChange = e => onFieldChange(e, name, type)\n    const value = data[name] || options.initData[name]\n    return {\n      name,\n      type: name === 'email' ? 'email' : type,\n      [checkbox ? 'checked' : 'value']: value || empty,\n      onChange,\n      ...props\n    }\n  }\n\n  const { method = 'POST' } = options\n  const action = submitURL\n\n  const onSubmit = e => {\n    e.preventDefault()\n    setStatus('submitting')\n    let header = {}\n    if (options.bearer) {\n      header = {\n        Authorization: `Bearer ${options.bearer}`\n      }\n    }\n    fetch(action, {\n      method,\n      headers: {\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n        ...header\n      },\n      body: JSON.stringify(data)\n    })\n      .then(async r => {\n        const response = await r.json()\n        if (r.ok) {\n          setStatus('success')\n          if (callback) callback(response)\n          if (options.clearOnSubmit) {\n            setTimeout(() => {\n              setData({})\n              setStatus('default')\n            }, options.clearOnSubmit)\n          }\n        } else {\n          setStatus('error')\n          console.error(response)\n        }\n      })\n      .catch(e => {\n        console.error(e)\n        setStatus('error')\n      })\n  }\n\n  const formProps = { onSubmit }\n\n  return { status, data, touched, useField, formProps }\n}\n\nexport default useForm\n"
  },
  {
    "path": "lib/use-has-mounted.ts",
    "content": "// Full credit to https://joshwcomeau.com/snippets/react-hooks/use-has-mounted\nimport React from 'react'\n\nfunction useHasMounted() {\n  const [hasMounted, setHasMounted] = React.useState(false)\n  React.useEffect(() => {\n    setHasMounted(true)\n  }, [])\n  return hasMounted\n}\n\nexport default useHasMounted\n"
  },
  {
    "path": "lib/use-media.ts",
    "content": "import { useState, useEffect } from 'react'\n\nexport default function useMedia(query) {\n  const [matches, setMatches] = useState(false)\n\n  useEffect(() => {\n    const onChange = e => setMatches(e.matches)\n    const mq = window.matchMedia(query)\n    setMatches(mq.matches)\n    mq.addEventListener('change', onChange)\n\n    return () => mq.removeEventListener('change', onChange)\n  }, [query])\n\n  return { matches }\n}\n"
  },
  {
    "path": "lib/use-prefers-motion.ts",
    "content": "// Inspired by https://joshwcomeau.com/snippets/react-hooks/use-prefers-reduced-motion\nimport React from 'react'\n\nconst QUERY = '(prefers-reduced-motion: no-preference)'\nconst isRenderingOnServer = typeof window === 'undefined'\n\nconst getInitialState = () => {\n  // For our initial server render, we won't know if the user\n  // prefers reduced motion, but it doesn't matter. This value\n  // will be overwritten on the client, before any animations\n  // occur.\n  return isRenderingOnServer ? false : window.matchMedia(QUERY).matches\n}\n\nfunction usePrefersMotion() {\n  const [prefersMotion, setPrefersMotion] = React.useState(getInitialState)\n  React.useEffect(() => {\n    const mediaQueryList = window.matchMedia(QUERY)\n    const listener = (event: MediaQueryListEvent) => {\n      setPrefersMotion(!event.matches)\n    }\n    mediaQueryList.addEventListener('change', listener)\n    return () => {\n      mediaQueryList.removeEventListener('change', listener)\n    }\n  }, [])\n  return prefersMotion\n}\n\nexport default usePrefersMotion\n"
  },
  {
    "path": "lib/use-prefers-reduced-motion.ts",
    "content": "// Full credit to https://joshwcomeau.com/snippets/react-hooks/use-prefers-reduced-motion\nimport React from 'react'\n\nconst QUERY = '(prefers-reduced-motion: no-preference)'\nconst isRenderingOnServer = typeof window === 'undefined'\n\nconst getInitialState = () => {\n  // For our initial server render, we won't know if the user\n  // prefers reduced motion, but it doesn't matter. This value\n  // will be overwritten on the client, before any animations\n  // occur.\n  return isRenderingOnServer ? true : !window.matchMedia(QUERY).matches\n}\n\nfunction usePrefersReducedMotion() {\n  const [prefersReducedMotion, setPrefersReducedMotion] =\n    React.useState(getInitialState)\n  React.useEffect(() => {\n    const mediaQueryList = window.matchMedia(QUERY)\n    const listener = (event: MediaQueryListEvent) => {\n      setPrefersReducedMotion(!event.matches)\n    }\n    mediaQueryList.addEventListener('change', listener)\n    return () => {\n      mediaQueryList.removeEventListener('change', listener)\n    }\n  }, [])\n  return prefersReducedMotion\n}\n\nexport default usePrefersReducedMotion\n"
  },
  {
    "path": "lib/use-random-interval.ts",
    "content": "// Full credit to https://joshwcomeau.com/snippets/react-hooks/use-random-interval\nimport React from 'react'\n\n// Utility helper for random number generation\nconst random = (min, max) => Math.floor(Math.random() * (max - min)) + min\n\nconst useRandomInterval = (callback, minDelay, maxDelay) => {\n  const timeoutId = React.useRef(null)\n  const savedCallback = React.useRef(callback)\n  React.useEffect(() => {\n    savedCallback.current = callback\n  })\n  React.useEffect(() => {\n    const isEnabled =\n      typeof minDelay === 'number' && typeof maxDelay === 'number'\n    if (isEnabled) {\n      const handleTick = () => {\n        const nextTickAt = random(minDelay, maxDelay)\n        timeoutId.current = window.setTimeout(() => {\n          savedCallback.current()\n          handleTick()\n        }, nextTickAt)\n      }\n      handleTick()\n    }\n    return () => window.clearTimeout(timeoutId.current)\n  }, [minDelay, maxDelay])\n  const cancel = React.useCallback(function () {\n    window.clearTimeout(timeoutId.current)\n  }, [])\n  return cancel\n}\n\nexport default useRandomInterval\n"
  },
  {
    "path": "next.config.ts",
    "content": "import withMDX from '@next/mdx'\nimport type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n  reactStrictMode: true,\n  trailingSlash: true,\n  pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'mdx'],\n  images: {\n    remotePatterns: [\n      { protocol: 'https', hostname: 'hackclub.com' },\n      { protocol: 'https', hostname: 'dl.airtable.com' },\n      { protocol: 'https', hostname: 'emoji.slack-edge.com' },\n      { protocol: 'https', hostname: 'cdn.glitch.com' },\n      { protocol: 'https', hostname: 'scrapbook.hackclub.com' },\n      { protocol: 'https', hostname: 'assets.hackclub.com' },\n      { protocol: 'https', hostname: 'v5.airtableusercontent.com' },\n      { protocol: 'https', hostname: 'hcb.hackclub.com' },\n      { protocol: 'https', hostname: 'cdn.hackclub.com' },\n      { protocol: 'https', hostname: 'hc-cdn.hel1.your-objectstorage.com' },\n      { protocol: 'https', hostname: 'cdn.prod.website-files.com' },\n      { protocol: 'https', hostname: 'cloud-*-hack-club-bot.vercel.app' },\n      { protocol: 'https', hostname: 'cdn.hack.pet' },\n      { protocol: 'https', hostname: 'cdn.hackclubber.dev' },\n      { protocol: 'https', hostname: 'github.com' },\n      { protocol: 'https', hostname: 'avatars1.githubusercontent.com' },\n      { protocol: 'https', hostname: 'ca.slack-edge.com' },\n      {\n        protocol: 'https',\n        hostname: 'scrapbook-into-the-redwoods.s3.us-east-1.amazonaws.com'\n      },\n      { protocol: 'https', hostname: 'cloud-5v0kfmsva.vercel.app' }\n    ]\n  },\n  async redirects() {\n    return [\n      {\n        source: '/bank/:path*',\n        destination: '/hcb/:path*',\n        permanent: true\n      },\n      {\n        source: '/hcb/fiscal-sponsorship/',\n        destination: '/fiscal-sponsorship/about/',\n        permanent: false\n      },\n      {\n        source: '/hcb/:path*',\n        destination: '/fiscal-sponsorship/:path*',\n        permanent: false\n      },\n      {\n        source: '/fiscal-sponsorship/apply/',\n        destination: 'https://hcb.hackclub.com/applications/new',\n        permanent: false\n      },\n      { source: '/grant/', destination: '/hackathons/grant', permanent: false },\n      {\n        source: '/privacy/',\n        destination: '/privacy-and-terms/',\n        permanent: true\n      },\n      {\n        source: '/sprig/',\n        destination: 'https://sprig.hackclub.com',\n        permanent: true\n      },\n      { source: '/start/', destination: '/', permanent: false },\n      { source: '/repl/', destination: '/', permanent: true },\n      { source: '/c9/', destination: '/deprecated/cloud9/', permanent: true },\n      {\n        source: '/cloud9_setup/',\n        destination: '/deprecated/cloud9/',\n        permanent: true\n      },\n      {\n        source: '/redeem_tech_domain/',\n        destination: '/deprecated/tech_domains/',\n        permanent: true\n      },\n      {\n        source: '/challenge/',\n        destination: '/deprecated/challenge/',\n        permanent: true\n      },\n      {\n        source: '/slack_invite/',\n        destination: 'https://slack.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/first/',\n        destination: '/bank/first/',\n        permanent: false\n      },\n      {\n        source: '/bank/frc/',\n        destination: '/bank/first/',\n        permanent: false\n      },\n      {\n        source: '/bank/ftc/',\n        destination: '/bank/first/',\n        permanent: false\n      },\n      {\n        source: '/bank/fll/',\n        destination: '/bank/first/',\n        permanent: false\n      },\n      {\n        source: '/wom/',\n        destination: '/winter/',\n        permanent: false\n      },\n      {\n        source: '/workshops/slack/',\n        destination: 'https://slack.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/community/',\n        destination: 'https://slack.hackclub.com',\n        permanent: true\n      },\n      { source: '/hack_camp/', destination: '/camp/', permanent: true },\n      { source: '/branding/', destination: '/brand/', permanent: true },\n      { source: '/ama/', destination: '/amas/', permanent: false },\n      { source: '/geohot', destination: '/amas/geohot/', permanent: false },\n      { source: '/sal', destination: '/amas/sal/', permanent: false },\n      { source: '/vitalik', destination: '/amas/vitalik/', permanent: false },\n      {\n        source: '/open-source/',\n        destination: '/opensource/',\n        permanent: false\n      },\n      { source: '/coc/', destination: '/conduct/', permanent: true },\n      {\n        source: '/code_of_conduct/',\n        destination: '/conduct/',\n        permanent: true\n      },\n      {\n        source: '/finder/',\n        destination: 'https://finder.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/camp/',\n        destination: 'https://camp.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/apply/',\n        destination: 'https://apply.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/icons/',\n        destination: 'https://icons.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/updates/',\n        destination:\n          'https://www.youtube.com/playlist?list=PLbNbddgD-XxEC5-_KQTye6nFPBLtI_mds',\n        permanent: false\n      },\n      {\n        source: '/workshops/',\n        destination: 'https://workshops.hackclub.com/',\n        permanent: false\n      },\n      {\n        source: '/workshops/([a-z_]+)/',\n        destination: 'https://workshops.hackclub.com/$1/',\n        permanent: true\n      },\n      {\n        source: '/daysofservice/',\n        destination: 'https://daysofservice.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/blot/',\n        destination: 'https://blot.hackclub.com',\n        permanent: false\n      },\n      {\n        source: '/donate',\n        destination: '/philanthropy',\n        permanent: false\n      },\n      {\n        source: '/github',\n        destination: 'https://github.com/hackclub',\n        permanent: true\n      },\n      {\n        source: '/nest',\n        destination: 'https://hackclub.app',\n        permanent: true\n      },\n      {\n        source: '/security',\n        destination: 'https://security.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/congressional-app-challenge',\n        destination: 'https://finalist.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/hardware',\n        destination: 'https://blueprint.hackclub.com',\n        permanent: true\n      },\n      {\n        source: '/slack',\n        destination: 'https://slack.hackclub.com',\n        permanent: true\n      }\n    ]\n  },\n  async rewrites() {\n    return [\n      {\n        source: '/fiscal-sponsorship/mobile-app/',\n        destination: '/fiscal-sponsorship/mobile/'\n      },\n      {\n        source: '/clubs/leaders-letters',\n        destination: 'https://leaders-letters.vercel.app/'\n      },\n      {\n        source: '/letters',\n        destination: 'https://leaders-letters.vercel.app/'\n      },\n      {\n        source: '/clubs/leaders-letters/:path*',\n        destination: 'https://leaders-letters.vercel.app/:path*'\n      },\n      {\n        source: '/letter/:path*',\n        destination: 'https://leaders-letters.vercel.app/letter/:path*'\n      },\n      {\n        source: '/clubs/leaders-letters/_next/:path*',\n        destination: 'https://leaders-letters.vercel.app/_next/:path*'\n      },\n      {\n        source: '/workshops/_next/:path*',\n        destination: 'https://workshops.hackclub.com/_next/:path*'\n      },\n      {\n        source: '/summer/_next/:path*',\n        destination: 'https://summer.hackclub.com/_next/:path*'\n      },\n      {\n        source: '/sponsorship/',\n        destination: '/content/sponsorship/'\n      },\n      {\n        source: '/bin/beta',\n        destination: '/bin/landing-new/'\n      },\n      {\n        source: '/covid19/',\n        destination: '/content/covid19/'\n      },\n      {\n        source: '/it-admins/',\n        destination: '/content/it-admins/'\n      },\n      {\n        source: '/sunsetting-som/',\n        destination: '/content/sunsetting-som/'\n      },\n      {\n        source: '/banner/',\n        destination: 'https://workshops.hackclub.com/banner/'\n      },\n      {\n        source: '/conduct/',\n        destination: 'https://workshops.hackclub.com/conduct/'\n      },\n      {\n        source: '/privacy-and-terms/',\n        destination: 'https://workshops.hackclub.com/privacy-and-terms/'\n      },\n      {\n        source: '/safeguarding-policy/',\n        destination: 'https://workshops.hackclub.com/safeguarding-policy/'\n      },\n      {\n        source: '/workshop-bounty/',\n        destination: 'https://workshops.hackclub.com/workshop-bounty/'\n      },\n      {\n        source: '/vip-newsletters/',\n        destination: 'https://workshops.hackclub.com/vip-newsletters/'\n      },\n      {\n        source: '/vip-newsletters/(.*)',\n        destination: 'https://workshops.hackclub.com/vip-newsletters/$1'\n      },\n      {\n        source: '/newsletter/',\n        destination: 'https://workshops.hackclub.com/newsletter/'\n      },\n      {\n        source: '/newsletter/(.*)',\n        destination: 'https://workshops.hackclub.com/newsletter/$1'\n      },\n      {\n        source: '/transparency/may-2020/',\n        destination: '/content/transparency/may-2020/'\n      },\n      {\n        source: '/map/',\n        destination: 'https://map.hackclub.dev/'\n      },\n      {\n        source: '/map/(.*)',\n        destination: 'https://map.hackclub.dev/$1'\n      },\n      {\n        source: '/how-to-organize-a-hackathon',\n        destination: 'https://expandables.hackclub.dev/organizing.html'\n      },\n      {\n        source: '/how-to-organize-a-hackathon/style.css',\n        destination: 'https://expandables.hackclub.dev/style.css'\n      },\n      {\n        source: '/bin/',\n        destination: '/bin/index.html'\n      },\n      {\n        source: '/bin/:path*',\n        destination: '/bin/:path*'\n      },\n      {\n        source: '/bin/selector/',\n        destination: '/bin/selector/index.html'\n      },\n      {\n        source: '/arcade/:path+',\n        destination: '/arcade'\n      }\n    ]\n  },\n  async headers() {\n    return [\n      {\n        source: '/banners/(.*)',\n        headers: [{ key: 'Access-Control-Allow-Origin', value: '*' }]\n      },\n      {\n        source: '/fonts/(.*)',\n        headers: [{ key: 'Access-Control-Allow-Origin', value: '*' }]\n      },\n      {\n        source: '/api/(.+)',\n        headers: [\n          { key: 'Access-Control-Allow-Origin', value: '*' },\n          {\n            key: 'Access-Control-Allow-Methods',\n            value: 'GET, POST, OPTIONS'\n          },\n          { key: 'Access-Control-Allow-Headers', value: 'Content-Type' }\n        ]\n      },\n      {\n        source: '/api/bin/wokwi/(.+)',\n        headers: [\n          { key: 'Access-Control-Allow-Origin', value: '*' },\n          {\n            key: 'Access-Control-Allow-Methods',\n            value: 'GET, POST, OPTIONS'\n          },\n          { key: 'Access-Control-Allow-Headers', value: 'Content-Type' }\n        ]\n      },\n      {\n        source: '/api/onboard/svg/(.+)',\n        headers: [\n          {\n            key: 'content-type',\n            value: 'image/svg+xml'\n          }\n        ]\n      }\n    ]\n  }\n}\n\nexport default withMDX({ extension: /\\.mdx?$/ })(nextConfig)\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@hackclub/v3\",\n  \"version\": \"0.0.1\",\n  \"author\": \"Lachlan Campbell <lachlan@hackclub.com>\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"packageManager\": \"bun@1.3.8\",\n  \"scripts\": {\n    \"dev\": \"next\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"eslint .\",\n    \"lint:errors\": \"eslint . --quiet\",\n    \"lint:fix\": \"eslint . --fix\",\n    \"format\": \"prettier --write .\",\n    \"format:check\": \"prettier --check .\"\n  },\n  \"dependencies\": {\n    \"@emotion/react\": \"^11.14.0\",\n    \"@emotion/styled\": \"^11.14.1\",\n    \"@hackclub/icons\": \"^0.2.1\",\n    \"@hackclub/markdown\": \"^0.1.3\",\n    \"@hackclub/meta\": \"^1.2.0\",\n    \"@hackclub/theme\": \"^1.0.0\",\n    \"@next/mdx\": \"^16.1.6\",\n    \"@octokit/auth-app\": \"^8.2.0\",\n    \"@octokit/rest\": \"^20.1.2\",\n    \"@sendgrid/mail\": \"^8.1.6\",\n    \"@tracespace/core\": \"^5.0.0-alpha.0\",\n    \"@tracespace/identify-layers\": \"^5.0.0-alpha.0\",\n    \"@tracespace/parser\": \"^5.0.0-next.0\",\n    \"@tracespace/plotter\": \"^5.0.0-alpha.0\",\n    \"@tracespace/renderer\": \"^5.0.0-alpha.0\",\n    \"@tracespace/xml-id\": \"^4.2.7\",\n    \"@vercel/analytics\": \"^2.0.1\",\n    \"@vercel/speed-insights\": \"^2.0.0\",\n    \"airtable-plus\": \"^1.0.4\",\n    \"animejs\": \"^4.3.6\",\n    \"camelcase\": \"^9.0.0\",\n    \"cookies-next\": \"^4.3.0\",\n    \"date-fns\": \"^4.1.0\",\n    \"fuzzysort\": \"^2.0.4\",\n    \"geopattern\": \"^1.2.3\",\n    \"js-confetti\": \"^0.13.1\",\n    \"jszip\": \"^3.10.1\",\n    \"lodash\": \"^4.17.23\",\n    \"next\": \"^16.1.6\",\n    \"react\": \"^19.2.4\",\n    \"react-before-after-slider-component\": \"^1.1.8\",\n    \"react-datepicker\": \"^9.1.0\",\n    \"react-dom\": \"^19.2.4\",\n    \"react-masonry-css\": \"^1.0.16\",\n    \"react-page-visibility\": \"^7.0.0\",\n    \"react-relative-time\": \"^0.0.9\",\n    \"react-responsive-carousel\": \"^3.2.23\",\n    \"react-scrolllock\": \"^5.0.1\",\n    \"react-snowfall\": \"^2.4.0\",\n    \"react-ticker\": \"^1.3.2\",\n    \"react-tooltip\": \"^4.5.1\",\n    \"react-tsparticles\": \"^2.12.2\",\n    \"react-type-animation\": \"^3.2.0\",\n    \"react-wrap-balancer\": \"^1.1.1\",\n    \"recharts\": \"^3.8.0\",\n    \"remark\": \"^15.0.1\",\n    \"remark-html\": \"^16.0.1\",\n    \"theme-ui\": \"^0.14.7\",\n    \"tinytime\": \"^0.2.6\",\n    \"vanilla-tilt\": \"^1.8.1\"\n  },\n  \"devDependencies\": {\n    \"@mdx-js/loader\": \"^3.1.1\",\n    \"@types/node\": \"^25.4.0\",\n    \"@types/react\": \"^19.2.14\",\n    \"@types/react-dom\": \"^19.2.3\",\n    \"eslint\": \"^9.39.4\",\n    \"eslint-config-next\": \"^16.1.6\",\n    \"jiti\": \"^2.6.1\",\n    \"prettier\": \"^3.8.1\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n"
  },
  {
    "path": "pages/404.tsx",
    "content": "import React from 'react'\nimport styled from '@emotion/styled'\nimport { keyframes } from '@emotion/react'\nimport { Heading, Container, Button, Text, Image } from 'theme-ui'\nimport NextLink from 'next/link'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport theme from '../lib/theme'\nimport ForceTheme from '../components/force-theme'\nimport Nav from '../components/nav'\nimport Icon from '../components/icon'\nimport Footer from '../components/footer'\n\n// Credit for animation from https://codepen.io/igli/pen/mPMqGz?html-preprocessor=none\nconst animation1 = keyframes`\n  0% {\n    clip: rect(62px, 9999px, 68px, 0);\n  }\n  5% {\n    clip: rect(45px, 9999px, 9px, 0);\n  }\n  10% {\n    clip: rect(9px, 9999px, 76px, 0);\n  }\n  15% {\n    clip: rect(89px, 9999px, 83px, 0);\n  }\n  20% {\n    clip: rect(44px, 9999px, 8px, 0);\n  }\n  25% {\n    clip: rect(59px, 9999px, 24px, 0);\n  }\n  30% {\n    clip: rect(96px, 9999px, 51px, 0);\n  }\n  35% {\n    clip: rect(38px, 9999px, 28px, 0);\n  }\n  40% {\n    clip: rect(92px, 9999px, 1px, 0);\n  }\n  45% {\n    clip: rect(63px, 9999px, 80px, 0);\n  }\n  50% {\n    clip: rect(1px, 9999px, 49px, 0);\n  }\n  55% {\n    clip: rect(7px, 9999px, 49px, 0);\n  }\n  60% {\n    clip: rect(35px, 9999px, 16px, 0);\n  }\n  65% {\n    clip: rect(93px, 9999px, 72px, 0);\n  }\n  70% {\n    clip: rect(55px, 9999px, 52px, 0);\n  }\n  75% {\n    clip: rect(58px, 9999px, 68px, 0);\n  }\n  80% {\n    clip: rect(94px, 9999px, 95px, 0);\n  }\n  85% {\n    clip: rect(81px, 9999px, 24px, 0);\n  }\n  90% {\n    clip: rect(98px, 9999px, 12px, 0);\n  }\n  95% {\n    clip: rect(2px, 9999px, 96px, 0);\n  }\n  100% {\n    clip: rect(95px, 9999px, 47px, 0);\n  }\n`\nconst animation2 = keyframes`\n  0% {\n    clip: rect(57px, 9999px, 7px, 0);\n  }\n  5% {\n    clip: rect(61px, 9999px, 22px, 0);\n  }\n  10% {\n    clip: rect(34px, 9999px, 47px, 0);\n  }\n  15% {\n    clip: rect(92px, 9999px, 40px, 0);\n  }\n  20% {\n    clip: rect(6px, 9999px, 40px, 0);\n  }\n  25% {\n    clip: rect(39px, 9999px, 46px, 0);\n  }\n  30% {\n    clip: rect(33px, 9999px, 17px, 0);\n  }\n  35% {\n    clip: rect(5px, 9999px, 17px, 0);\n  }\n  40% {\n    clip: rect(40px, 9999px, 70px, 0);\n  }\n  45% {\n    clip: rect(14px, 9999px, 34px, 0);\n  }\n  50% {\n    clip: rect(26px, 9999px, 30px, 0);\n  }\n  55% {\n    clip: rect(15px, 9999px, 100px, 0);\n  }\n  60% {\n    clip: rect(10px, 9999px, 32px, 0);\n  }\n  65% {\n    clip: rect(49px, 9999px, 61px, 0);\n  }\n  70% {\n    clip: rect(61px, 9999px, 22px, 0);\n  }\n  75% {\n    clip: rect(85px, 9999px, 36px, 0);\n  }\n  80% {\n    clip: rect(38px, 9999px, 59px, 0);\n  }\n  85% {\n    clip: rect(21px, 9999px, 88px, 0);\n  }\n  90% {\n    clip: rect(46px, 9999px, 16px, 0);\n  }\n  95% {\n    clip: rect(13px, 9999px, 35px, 0);\n  }\n  100% {\n    clip: rect(75px, 9999px, 13px, 0);\n  }\n`\n\nconst Blinking = styled(Heading)`\n  position: relative;\n  display: inline-block;\n  line-height: 1;\n  &:before,\n  &:after {\n    content: '404!';\n    position: absolute;\n    top: 0;\n    color: ${theme.colors.smoke};\n    background: ${theme.colors.dark};\n    overflow: hidden;\n    clip: rect(0, 512px, 0, 0);\n  }\n  &:after {\n    left: 2px;\n    text-shadow: -2px 0 ${theme.colors.red};\n    animation: ${animation1} 2s infinite steps(2, jump-end) alternate-reverse;\n  }\n  &:before {\n    left: -2px;\n    text-shadow: -2px 0 ${theme.colors.cyan};\n    animation: ${animation2} 4s infinite steps(2, jump-end) alternate-reverse;\n  }\n`\n\nconst Spinning = styled(Image)`\n  @keyframes spin {\n    from {\n      transform: rotate(0deg);\n    }\n    to {\n      transform: rotate(360deg);\n    }\n  }\n\n  animation-name: spin;\n  animation-duration: 10000ms;\n  animation-iteration-count: infinite;\n  animation-timing-function: linear;\n  @media (prefers-reduced-motion) {\n    animation: none;\n  }\n\n  aspect-ratio: 1;\n`\n\nconst NotFoundPage = () => (\n  <>\n    <Meta as={Head} title=\"404\" />\n    <ForceTheme theme=\"dark\" />\n    <Nav color=\"primary\" dark />\n    <Container variant=\"narrow\" sx={{ py: [5, 6], textAlign: 'center' }}>\n      <Spinning\n        sx={{ fontSize: [128, 256], textAlign: 'center', height: '1lh' }}\n        src=\"/404/dinobox.svg\"\n      ></Spinning>\n      <br />\n      <Blinking as=\"h1\" variant=\"title\" sx={{ fontSize: [64, 128] }}>\n        404!\n      </Blinking>\n      <Text\n        mt={2}\n        mb={4}\n        color=\"muted\"\n        variant=\"lead\"\n        sx={{ display: 'block' }}\n      >\n        We&nbsp;couldn’t&nbsp;find&nbsp;that&nbsp;page.\n      </Text>\n      <NextLink href=\"/\">\n        <Button variant=\"cta\">\n          <Icon glyph=\"home\" size={32} />\n          Go Home\n        </Button>\n      </NextLink>\n    </Container>\n    <Footer dark />\n  </>\n)\n\nexport default NotFoundPage\n"
  },
  {
    "path": "pages/_app.tsx",
    "content": "import Head from 'next/head'\n\nimport Analytics from '../components/analytics'\nimport { Analytics as VercelAnalytics } from '@vercel/analytics/react'\nimport { SpeedInsights } from '@vercel/speed-insights/react'\n\nimport Meta from '@hackclub/meta'\nimport '@hackclub/theme/fonts/reg-bold.css'\nimport theme from '../lib/theme'\nimport { ThemeProvider, Theme } from 'theme-ui'\nimport { Provider as BalancerProvider } from 'react-wrap-balancer'\n\nconst App = ({ Component, pageProps }) => (\n  <ThemeProvider theme={theme as Theme}>\n    <Meta as={Head}>\n      <meta\n        name=\"google-site-verification\"\n        content=\"7zE7h5foPaxIcnv5Frq6BkcUb9-3UzVc8q3P_cexf9I\"\n      />\n    </Meta>\n    <BalancerProvider>\n      <Component {...pageProps} />\n    </BalancerProvider>\n    <Analytics />\n    <VercelAnalytics />\n    <SpeedInsights />\n  </ThemeProvider>\n)\n\nexport default App\n"
  },
  {
    "path": "pages/_document.tsx",
    "content": "import Document, { Html, Head, Main, NextScript } from 'next/document'\n\nconst org = {\n  '@context': 'http://schema.org',\n  '@type': 'Organization',\n  name: 'Hack Club',\n  url: 'https://hackclub.com/',\n  logo: 'https://hackclub.com/social.png',\n  sameAs: [\n    'https://twitter.com/hackclub',\n    'https://github.com/hackclub',\n    'https://www.instagram.com/starthackclub',\n    'https://www.facebook.com/Hack-Club-741805665870458',\n    'https://www.youtube.com/channel/UCQzO0jpcRkP-9eWKMpJyB0w'\n  ],\n  contactPoint: [\n    {\n      '@type': 'ContactPoint',\n      email: 'team@hackclub.com',\n      contactType: 'customer support',\n      url: 'https://hackclub.com/'\n    }\n  ]\n}\n\nexport default class MyDocument extends Document {\n  static async getInitialProps(ctx) {\n    const initialProps = await Document.getInitialProps(ctx)\n    return { ...initialProps }\n  }\n\n  render() {\n    return (\n      <Html lang=\"en\">\n        <Head>\n          <meta name=\"format-detection\" content=\"telephone=no\" />\n          <script\n            type=\"application/ld+json\"\n            dangerouslySetInnerHTML={{ __html: JSON.stringify(org) }}\n          />\n        </Head>\n        <body>\n          <Main />\n          <NextScript />\n        </body>\n      </Html>\n    )\n  }\n}\n"
  },
  {
    "path": "pages/acknowledged.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Container, Grid, Text } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport Nav from '../components/nav'\nimport Footer from '../components/footer'\nimport Bio from '../components/bio'\nimport ForceTheme from '../components/force-theme'\nimport { fetchAcknowledged } from './api/team'\n\nexport default function Acknowleged({ team }) {\n  return (\n    <>\n      <Box as=\"main\" key=\"main\" pb={5}>\n        <ForceTheme theme=\"light\" />\n        <Nav />\n        <Meta\n          as={Head}\n          title=\"Team\"\n          description=\"Meet the team that runs Hack Club, a global nonprofit network of high school computer science clubs.\"\n        />\n        <Box\n          pt={6}\n          pb={5}\n          px={[2, 4]}\n          sx={{\n            backgroundImage:\n              'radial-gradient(ellipse farthest-corner at top left,rgb(36 181 165 / 70%),rgb(30 151 137 / 70%)), url(https://user-cdn.hackclub-assets.com/019c76b9-a4c2-7dd4-b6bb-e497530e43cf/GfkVjA.jpg)',\n            backgroundSize: 'cover',\n            backgroundPosition: '25% 15%'\n          }}\n        >\n          <Container>\n            <Text variant=\"ultratitle\" color=\"snow\">\n              By the students,\n              <br /> for the students.\n            </Text>\n\n            <Text\n              as=\"div\"\n              variant=\"lead\"\n              color=\"smoke\"\n              sx={{ maxWidth: '650px' }}\n            >\n              We believe in a world where every young person is empowered to be\n              the change they want to see around them. At Hack Club, we’re\n              working hard to make it reality.\n            </Text>\n          </Container>\n        </Box>\n        <Container>\n          <Box sx={{ textAlign: 'center', mt: 100, mb: [3, 4] }}>\n            <Text\n              variant=\"title\"\n              color=\"orange\"\n              sx={{ lineHeight: '1em', fontSize: [4, 5, 6] }}\n              as=\"h2\"\n            >\n              Acknowledgements\n            </Text>\n            <Text\n              variant=\"title\"\n              color=\"text\"\n              sx={{\n                lineHeight: '1.2',\n                fontSize: [1, 3, 4],\n                my: [3, 0, 0],\n                fontWeight: 400,\n                maxWidth: '600px',\n                width: '100%',\n                margin: 'auto'\n              }}\n              as=\"h2\"\n            >\n              Thank you to everyone who helped shape Hack Club into what it is\n              today...\n            </Text>\n          </Box>\n          <Grid columns={[1, null, 2, 3]} gap={3}>\n            {team.acknowledged?.map(member => (\n              <Bio\n                name={member.name}\n                teamRole={member.role}\n                text={member.bio}\n                pronouns={member.pronouns}\n                key={member.name}\n                href={member.website}\n              />\n            ))}\n          </Grid>\n        </Container>\n      </Box>\n      <Footer light key=\"footer\" />\n    </>\n  )\n}\n\nexport const getStaticProps = async () => {\n  try {\n    const acknowledged = await fetchAcknowledged()\n    return { props: { team: { acknowledged } } }\n  } catch (e) {\n    return { props: { team: {} } }\n  }\n}\n"
  },
  {
    "path": "pages/amas/geohot.tsx",
    "content": "import { Box, Button, Image, Grid, Text, Link } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport React, { useEffect, useState } from 'react'\nimport tt from 'tinytime'\nimport { thousands } from '../../lib/members'\n\nexport default function Geohot() {\n  const minutes = 1\n  const milliseconds = minutes * 60000\n\n  if (typeof window !== 'undefined') {\n    setTimeout(function () {\n      window.location.reload()\n    }, milliseconds)\n  }\n\n  const calculateTimeLeft = () => {\n    const difference = +new Date(`2022-11-11T23:00:00.000Z`) - +new Date()\n\n    let timeLeft = {}\n\n    if (difference > 0) {\n      timeLeft = {\n        days: Math.floor(difference / (1000 * 60 * 60 * 24)),\n        hours: Math.floor((difference / (1000 * 60 * 60)) % 24),\n        min: Math.floor((difference / 1000 / 60) % 60),\n        sec: Math.floor((difference / 1000) % 60)\n      }\n    }\n\n    return timeLeft\n  }\n\n  const [timeLeft, setTimeLeft] = useState(calculateTimeLeft())\n\n  useEffect(() => {\n    const timer = setTimeout(() => {\n      setTimeLeft(calculateTimeLeft())\n    }, 1000)\n\n    return () => clearTimeout(timer)\n  })\n\n  const timer = []\n\n  Object.keys(timeLeft).forEach(e => {\n    if (!timeLeft[e]) {\n      if (e === 'days') {\n        return\n      } else if (e === 'hours') {\n        if (!timeLeft['days']) {\n          return\n        }\n      } else if (e === 'min') {\n        if (!timeLeft['days'] && !timeLeft['hours']) {\n          return\n        }\n      } else {\n        if (!timeLeft['days'] && !timeLeft['hours'] && !timeLeft['min']) {\n          return\n        }\n      }\n    }\n\n    let name: string\n\n    if (e === 'days') {\n      if (timeLeft[e] === 1 || timeLeft[e] === 0) {\n        name = 'day'\n      } else {\n        name = 'days'\n      }\n    } else if (e === 'hours') {\n      if (timeLeft[e] === 1 || timeLeft[e] === 0) {\n        name = 'hour'\n      } else {\n        name = 'hours'\n      }\n    } else if (e === 'min') {\n      name = 'min'\n    } else {\n      name = 'sec'\n    }\n\n    timer.push(\n      <Box\n        sx={(t: any) => ({\n          color: 'primary',\n          ...t.util.gxText('#00FF15', '#00FF15'),\n          position: 'relative',\n          width: ['16vw', '15vw', '15vw'],\n          height: ['15vh', '20vh', '35vh'],\n          borderRadius: '5px',\n          border: ['none', '1.5px solid'],\n          borderColor: t.util.gxText('#00FF15', '#00FF15'),\n          fontSize: [4, 5, 7],\n          fontWeight: 'bold',\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'center',\n          textAlign: 'center'\n        })}\n      >\n        <Box>\n          <Text\n            sx={(t: any) => ({\n              color: 'primary',\n              ...t.util.gxText('#00FF15', '#00FF15')\n            })}\n          >\n            {timeLeft[e]}{' '}\n          </Text>\n          <Text\n            sx={(t: any) => ({\n              color: 'primary',\n              ...t.util.gxText('#00FF15', '#00FF15'),\n              position: 'relative',\n              fontSize: [1, 3, 4],\n              fontWeight: 'bold',\n              display: 'block',\n              pb: '15px'\n            })}\n          >\n            {name}\n          </Text>\n        </Box>\n      </Box>\n    )\n  })\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"George Hotz | AMA\"\n        description=\"We’re excited to welcome George Hotz (Founder of comma.ai) to speak to teenagers at Hack Club!\"\n        image=\"/ama/geohotEmbed.jpeg\"\n      />\n      <Head>\n        <meta name=\"theme-color\" content=\"#00FF15\" />\n      </Head>\n\n      <Box\n        sx={{\n          minHeight: '100vh',\n          width: '100vw',\n          bg: '#0f0f0f',\n          position: 'relative',\n          zIndex: '0',\n          overflow: 'hidden'\n        }}\n      >\n        <Link href=\"https://hackclub.com\" target=\"_blank\" color=\"inherit\">\n          <Image\n            src={`/ama/logo-green.svg`}\n            width={150}\n            height={75}\n            sx={{\n              position: 'absolute',\n              top: '0',\n              left: ['10vw', '5vw']\n            }}\n            alt=\"Hackclub flag green\"\n          />\n        </Link>\n        <Box>\n          <Box sx={{ position: 'absolute', top: '10px', right: '5%' }}>\n            <Text\n              sx={(t: any) => ({\n                color: 'primary',\n                ...t.util.gxText('#00FF15', '#00FF15'),\n                mt: [3, 4],\n                px: '10px',\n                py: '5px',\n                borderRadius: '5px',\n                border: '1px solid',\n                fontSize: [1, 2],\n                display: 'block',\n                fontWeight: 'bold'\n              })}\n            >\n              {tt('{MM} {Do} {h}:{mm} {a}').render(\n                new Date(`2022-11-11T23:00:00.000Z`)\n              )}\n            </Text>\n            <Text\n              sx={(t: any) => ({\n                color: 'primary',\n                ...t.util.gxText('#00FF15', '#00FF15'),\n                display: 'block'\n              })}\n            >\n              in your local date/time\n            </Text>\n          </Box>\n        </Box>\n        <Box\n          sx={{\n            p: ['15vh 20px 0 20px', '100px 50px 0 50px'],\n            height: '80%',\n            width: '90%',\n            bg: 'transparent',\n            position: 'relative',\n            left: '5%',\n            top: '10%'\n          }}\n        >\n          <Image\n            src={`/ama/geohotName.svg`}\n            width={700}\n            height={500}\n            sx={{ display: ['none', 'block'], pb: '50px' }}\n            alt=\"George Hotz\"\n          />\n          <Image\n            src={`/ama/geohotNameMobile.svg`}\n            width={250}\n            height={200}\n            sx={{ display: ['block', 'none'], pt: '20px', pb: '10px' }}\n            alt=\"George Hotz\"\n          />\n\n          {timer.length ? (\n            <Grid\n              key=\"{e}\"\n              gap={[1, 2, 4]}\n              columns={[\n                '1fr 1fr 1fr 1fr',\n                '1fr 1fr 1fr 1fr',\n                '1fr 1fr 1fr 1fr 1fr'\n              ]}\n              sx={{\n                width: ['100%', '100%']\n              }}\n            >\n              {timer}\n            </Grid>\n          ) : (\n            <Box\n              sx={{\n                border: ['none', '#00FF15 1.6px solid'],\n                my: ['30px', 0],\n                px: ['0px', '40px', '40px'],\n                py: ['0px', '40px', '40px'],\n                width: ['100%', '70%'],\n                borderRadius: '10px'\n              }}\n            >\n              <Text\n                sx={(t: any) => ({\n                  color: 'primary',\n                  ...t.util.gxText('#00FF15', '#00FF15'),\n                  fontSize: [3, 4, 5],\n                  fontWeight: 'bold'\n                })}\n              >\n                The AMA has ended. Thank you to George Hotz and everyone for\n                joining us!\n              </Text>\n              <Box>\n                <Link href=\"https://hack.af/geohot-livestream\">\n                  <Button\n                    sx={{\n                      background: '#00FF15',\n                      margin: ['10px', '15px'],\n                      marginLeft: '0',\n                      color: '#222222',\n                      display: 'inline-block'\n                    }}\n                  >\n                    Watch Recording\n                  </Button>\n                </Link>\n              </Box>\n            </Box>\n          )}\n          {timer.length ? (\n            <Box\n              sx={{\n                color: '#f9fafc',\n                width: ['25vw', '50vw', '50vw'],\n                pt: ['10px', '50px'],\n                zIndex: '2',\n                fontSize: ['12px', 1, 2],\n                '@media screen and (min-width: 768px) and (max-width: 1200px)':\n                  {\n                    fontSize: '15px'\n                  }\n              }}\n            >\n              <Text>\n                <strong>Teenager? New here? Welcome!</strong>{' '}\n                <Link\n                  href=\"https://hackclub.com\"\n                  target=\"_blank\"\n                  color=\"inherit\"\n                >\n                  Hack Club\n                </Link>{' '}\n                is a global community of high school makers & student-led coding\n                clubs. We’ve got a 24/7 Slack chatroom of {thousands}k+\n                teenagers learning to code & building amazing projects, & you’ll\n                fit right in.\n              </Text>\n            </Box>\n          ) : (\n            <Box\n              sx={{\n                color: '#f9fafc',\n                width: ['80vw', '50vw'],\n                pt: ['10px', '50px'],\n                zIndex: '2',\n                fontSize: ['15px', 1, 2],\n                '@media screen and (min-width: 768px) and (max-width: 1200px)':\n                  {\n                    fontSize: '15px'\n                  }\n              }}\n            >\n              <Text>\n                <strong>Teenager? New here? Welcome!</strong>{' '}\n                <Link\n                  href=\"https://hackclub.com\"\n                  target=\"_blank\"\n                  color=\"inherit\"\n                >\n                  Hack Club\n                </Link>{' '}\n                is a global community of high school makers & student-led coding\n                clubs. We’ve got a 24/7 Slack chatroom of {thousands}k+\n                teenagers learning to code & building amazing projects, & you’ll\n                fit right in.\n              </Text>\n            </Box>\n          )}\n        </Box>\n        <Box\n          sx={{\n            position: 'absolute',\n            bottom: '0',\n            right: '0',\n            marginRight: ['-100px', '-50px', '-50px'],\n            width: ['100vw', '70vw', '40vw'],\n            zIndex: '-30'\n          }}\n        >\n          {timer.length ? (\n            <>\n              <Image\n                src={`/ama/geohot.png`}\n                sx={{ display: ['none', 'block'] }}\n                alt=\"Image of George Hotz\"\n              />\n              <Image\n                src={`/ama/geohot.png`}\n                // layout=\"fill\"\n                width={400}\n                height={400}\n                sx={{ display: ['block', 'none'] }}\n                alt=\"Image of George Hotz\"\n              />\n            </>\n          ) : (\n            <>\n              <Image\n                src={`/ama/geohot.png`}\n                sx={{ display: ['none', 'block'] }}\n                alt=\"Image of George Hotz\"\n              />\n            </>\n          )}\n        </Box>\n        <Image\n          src={`/ama/geohotBg.svg`}\n          alt=\"Grid pattern\"\n          width={1500}\n          height={750}\n          sx={{\n            position: 'absolute',\n            bottom: '5vw',\n            left: ['10vw', '20vw'],\n            zIndex: '-2000'\n          }}\n        />\n      </Box>\n    </>\n  )\n}\n"
  },
  {
    "path": "pages/amas/index.tsx",
    "content": "import { Box, Button, Card, Flex, Grid, Heading, Link, Text } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport ForceTheme from '../../components/force-theme'\nimport BGImg from '../../components/background-image'\nimport NextLink from 'next/link'\nimport Image from 'next/image'\nimport Nav from '../../components/nav'\nimport SlideDown from '../../components/slide-down'\nimport Footer from '../../components/footer'\nimport { dt } from '../../lib/dates'\nimport Sal from '../../public/ama/sal.png'\n\nconst Page = ({ upcoming, past }) => (\n  <>\n    <Meta\n      as={Head}\n      title=\"AMAs\"\n      description=\"Every month, the Hack Club community gets on a Zoom call with someone awesome for a 1-hour AMA. Past guests have included George Hotz, Elon Musk, Limor Fried, Tom Preston-Werner, & more.\"\n      image=\"https://cloud-n6i5i4zb9-hack-club-bot.vercel.app/62020-07-24_03dp4nhf5acfeyhvg84whafyhe1q30zq.jpeg\"\n    />\n    <ForceTheme theme=\"dark\" />\n    <Nav dark />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'dark',\n        textAlign: 'center',\n        position: 'relative',\n        overflow: 'hidden'\n      }}\n    >\n      <BGImg\n        gradient=\"linear-gradient(rgba(0,0,0,0.25),rgba(0,0,0,0.625))\"\n        src={Sal}\n        alt=\"Screenshot of Elon Musk AMA on Zoom\"\n      />\n      <SlideDown\n        variant=\"layout.narrow\"\n        duration={768}\n        sx={{ py: [5, 6], color: 'white', textShadow: 'text' }}\n      >\n        <Text as=\"p\" variant=\"eyebrow\" sx={{ color: 'white', opacity: 0.875 }}>\n          Lights, webcam…\n        </Text>\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{ fontSize: [6, 8, 9], lineHeight: 'limit' }}\n        >\n          AMAs\n        </Heading>\n        <Text as=\"p\" variant=\"subtitle\" sx={{ a: { color: 'inherit' } }}>\n          We call someone we’ve always wanted to talk to—and the entire\n          Hack&nbsp;Club Slack community is invited to ask questions & chat with\n          the guest live. No vetting questions. No endorsements. Conversations\n          are streamed live publicly on{' '}\n          <Link href=\"https://www.youtube.com/c/HackClubHQ\">YouTube</Link>.\n        </Text>\n        <Button\n          variant=\"lg\"\n          as=\"a\"\n          {...({ href: 'https://slack.hackclub.com', target: '_blank' } as any)}\n          sx={{ mt: [3, 4], mx: [1, 2], color: 'black', bg: 'white' }}\n        >\n          Join Slack\n        </Button>\n        <Button\n          variant=\"outlineLg\"\n          as=\"a\"\n          {...({\n            href: 'https://www.youtube.com/watch?v=O1J1pwGPQXY',\n            target: '_blank'\n          } as any)}\n          sx={{ mt: [3, 4], mx: [1, 2], color: 'white', bg: 'rgba(0,0,0,0.5)' }}\n        >\n          Watch our highlights\n        </Button>\n      </SlideDown>\n    </Box>\n    <Box\n      as=\"section\"\n      sx={{ py: 5, bg: 'dark', color: 'white', textAlign: 'center' }}\n    >\n      {upcoming.length > 0 && (\n        <>\n          <Heading as=\"h2\" variant=\"title\" px={3}>\n            Upcoming guests\n          </Heading>\n          <Flex\n            variant=\"layout.container\"\n            sx={{\n              py: 4,\n              flexWrap: 'wrap',\n              placeContent: 'center'\n            }}\n          >\n            {upcoming\n              .sort((x, y) => {\n                return new Date(y.start).getTime() - new Date(x.start).getTime()\n              })\n              .map(event => (\n                <Card\n                  as=\"a\"\n                  {...({\n                    href: `https://events.hackclub.com/${event.slug}`\n                  } as any)}\n                  variant=\"interactive\"\n                  m={[2, 3]}\n                  sx={{\n                    img: {\n                      width: [96, 128],\n                      height: [96, 128],\n                      borderRadius: 'circle'\n                    }\n                  }}\n                  key={event.id}\n                >\n                  <Image\n                    width={128}\n                    height={128}\n                    src={event.amaAvatar}\n                    alt={event.title}\n                    style={{\n                      maxWidth: '100%',\n                      height: 'auto'\n                    }}\n                  />\n                  <Heading as=\"h3\" variant=\"subheadline\" my={2}>\n                    {event.title.replace('AMA with ', '')}\n                  </Heading>\n                  <Text as=\"p\" variant=\"caption\" mb={3}>\n                    {dt(event.start)}\n                  </Text>\n                  <Button as=\"strong\" variant=\"outline\" sx={{ py: 0 }}>\n                    RSVP\n                  </Button>\n                </Card>\n              ))}\n          </Flex>\n        </>\n      )}\n      <Link\n        href=\"https://events.hackclub.com/\"\n        sx={{ display: 'block', px: 3, fontSize: [2, 3] }}\n      >\n        See all upcoming events »\n      </Link>\n    </Box>\n    <Box as=\"section\" sx={{ py: 5, bg: 'darker', textAlign: 'center' }}>\n      <Heading as=\"h2\" variant=\"title\" px={3} id=\"past-amas\">\n        Past AMAs\n      </Heading>\n      <Grid\n        columns={[null, 2, 3]}\n        gap={[3, 4]}\n        variant=\"layout.container\"\n        sx={{ pt: 4, textAlign: 'left' }}\n      >\n        {past\n          .sort((x, y) => {\n            return new Date(y.start).getTime() - new Date(x.start).getTime()\n          })\n          .map(event => (\n            <Card\n              as={event.youtube ? 'a' : 'section'}\n              {...({ href: event.youtube } as any)}\n              variant=\"interactive\"\n              sx={{\n                display: 'flex',\n                alignItems: 'center',\n                p: [0, 0],\n                img: { borderRadius: 'extra' }\n              }}\n              key={event.id}\n            >\n              <Image\n                width={128}\n                height={128}\n                unoptimized={true}\n                src={event.amaAvatar}\n                alt={event.title}\n                style={{\n                  maxWidth: '100%',\n                  height: 'auto'\n                }}\n              />\n              <Box ml={3}>\n                <Heading as=\"h3\" variant=\"subheadline\" mb={1}>\n                  {event.title.replace('AMA with ', '')}\n                </Heading>\n                <Text as=\"p\" variant=\"caption\" mb={2} suppressHydrationWarning>\n                  {' '}\n                  {/* hydration ignored cause different date formats */}\n                  {dt(event.start)}\n                </Text>\n                {event.youtube && (\n                  <Text as=\"span\" variant=\"styles.a\">\n                    Watch now »\n                  </Text>\n                )}\n              </Box>\n            </Card>\n          ))}\n      </Grid>\n    </Box>\n    <Footer dark />\n  </>\n)\n\nexport default Page\n\nexport const getStaticProps = async () => {\n  const { filter } = require('lodash')\n  let upcoming = []\n  let past = []\n  const d = dt => new Date(new Date(dt).toISOString().substring(0, 10))\n  const today = d(new Date())\n  await fetch('https://events.hackclub.com/api/amas')\n    .then(r => r.json())\n    .then(events => {\n      upcoming = filter(events, e => d(e.start) >= today)\n      past = filter(events, e => d(e.start) < today)\n    })\n    .catch(e => console.error(e, 'Failed to fetch AMAs'))\n  return { props: { upcoming, past }, revalidate: 10 }\n}\n"
  },
  {
    "path": "pages/amas/sal.tsx",
    "content": "import { Box, Button, Image, Grid, Text, Link } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport React, { useEffect, useState } from 'react'\nimport tt from 'tinytime'\nimport { thousands } from '../../lib/members'\n\nexport default function Sal() {\n  const minutes = 1\n  const milliseconds = minutes * 60000\n\n  if (typeof window !== 'undefined') {\n    setTimeout(function () {\n      window.location.reload()\n    }, milliseconds)\n  }\n\n  const calculateTimeLeft = () => {\n    const difference = +new Date(`2022-10-28T23:00:00.000Z`) - +new Date()\n\n    let timeLeft = {}\n\n    if (difference > 0) {\n      timeLeft = {\n        days: Math.floor(difference / (1000 * 60 * 60 * 24)),\n        hours: Math.floor((difference / (1000 * 60 * 60)) % 24),\n        min: Math.floor((difference / 1000 / 60) % 60),\n        sec: Math.floor((difference / 1000) % 60)\n      }\n    }\n\n    return timeLeft\n  }\n\n  const [timeLeft, setTimeLeft] = useState(calculateTimeLeft())\n\n  useEffect(() => {\n    const timer = setTimeout(() => {\n      setTimeLeft(calculateTimeLeft())\n    }, 1000)\n\n    return () => clearTimeout(timer)\n  })\n\n  const timer = []\n\n  Object.keys(timeLeft).forEach(e => {\n    if (!timeLeft[e]) {\n      if (e === 'days') {\n        return\n      } else if (e === 'hours') {\n        if (!timeLeft['days']) {\n          return\n        }\n      } else if (e === 'min') {\n        if (!timeLeft['days'] && !timeLeft['hours']) {\n          return\n        }\n      } else {\n        if (!timeLeft['days'] && !timeLeft['hours'] && !timeLeft['min']) {\n          return\n        }\n      }\n    }\n\n    let name: string\n\n    if (e === 'days') {\n      if (timeLeft[e] === 1 || timeLeft[e] === 0) {\n        name = 'day'\n      } else {\n        name = 'days'\n      }\n    } else if (e === 'hours') {\n      if (timeLeft[e] === 1 || timeLeft[e] === 0) {\n        name = 'hour'\n      } else {\n        name = 'hours'\n      }\n    } else if (e === 'min') {\n      name = 'min'\n    } else {\n      name = 'sec'\n    }\n\n    timer.push(\n      <Box\n        sx={(t: any) => ({\n          color: 'primary',\n          ...t.util.gxText('#ffffff', '#ffffff'),\n          position: 'relative',\n          width: '100%',\n          height: ['125%', '125%', '150%'],\n          borderRadius: '5px',\n          border: ['none', '1.5px solid'],\n          borderColor: t.util.gxText('#14BF96', '#14BF96'),\n          fontSize: [4, 5, 7],\n          fontWeight: 'bold',\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'center',\n          textAlign: 'center'\n        })}\n      >\n        <Box>\n          <Text\n            sx={(t: any) => ({\n              color: 'primary',\n              ...t.util.gxText('#14BF96', '#14BF96')\n            })}\n          >\n            {timeLeft[e]}{' '}\n          </Text>\n          <Text\n            sx={(t: any) => ({\n              color: 'primary',\n              ...t.util.gxText('#14BF96', '#14BF96'),\n              position: 'relative',\n              fontSize: [1, 3, 4],\n              fontWeight: 'bold',\n              display: 'block',\n              pb: '15px'\n            })}\n          >\n            {name}\n          </Text>\n        </Box>\n      </Box>\n    )\n  })\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Sal Khan | AMA\"\n        description=\"We’re excited to welcome Sal Khan (founder of Khan Academy) to speak to teenagers at Hack Club!\"\n        image=\"https://cloud-4vmtnc0af-hack-club-bot.vercel.app/0sal_ama__7_.png\"\n      />\n      <Head>\n        <meta name=\"theme-color\" content=\"#14BF96\" />\n      </Head>\n\n      <Box\n        sx={{\n          minHeight: '100vh',\n          width: '100vw',\n          backgroundImage:\n            'url(https://cloud-72izs50b1-hack-club-bot.vercel.app/0sal_ama__4_.png)',\n          position: 'relative',\n          zIndex: '0',\n          overflow: 'hidden',\n          display: 'flex',\n          alignItems: ['flex-start', 'flex-start', 'center']\n        }}\n      >\n        <Link href=\"https://hackclub.com\" target=\"_blank\" color=\"inherit\">\n          <Image\n            src={\n              'https://cloud-2pnucywiu-hack-club-bot.vercel.app/0group__8_.png'\n            }\n            width={150}\n            height={75}\n            sx={{\n              position: 'absolute',\n              top: '0',\n              left: ['10vw', '5vw']\n            }}\n            alt=\"Green Hack Club Flag\"\n          />\n        </Link>\n        <Box>\n          <Box sx={{ position: 'absolute', top: '10px', right: '5%' }}>\n            <Text\n              sx={(t: any) => ({\n                color: 'primary',\n                ...t.util.gxText('#14BF96', '#14BF96'),\n                mt: [3, 4],\n                px: '10px',\n                py: '5px',\n                borderRadius: '5px',\n                border: '1px solid #14BF96',\n                fontSize: [1, 2],\n                display: 'block',\n                fontWeight: 'bold'\n              })}\n            >\n              {tt('{MM} {Do} {h}:{mm} {a}').render(\n                new Date(`2022-10-28T23:00:00.000Z`)\n              )}\n            </Text>\n            <Text\n              sx={(t: any) => ({\n                color: 'primary',\n                ...t.util.gxText('#14BF96', '#14BF96'),\n                display: 'block'\n              })}\n            >\n              in your local date/time\n            </Text>\n          </Box>\n        </Box>\n        <Box\n          sx={{\n            p: ['15vh 20px 0 20px', '100px 50px 0 50px'],\n            height: '80%',\n            width: '90%',\n            bg: 'transparent',\n            position: 'relative',\n            left: '5%',\n            top: '10%'\n          }}\n        >\n          <Image\n            src={`https://cloud-cvi8ihfcw-hack-club-bot.vercel.app/0vector__4_.svg`}\n            width={700}\n            height={500}\n            sx={{ display: ['none', 'block'], pb: '50px' }}\n            alt=\"Sal Khan\"\n          />\n          <Image\n            src={`https://cloud-cvi8ihfcw-hack-club-bot.vercel.app/0vector__4_.svg`}\n            width={250}\n            height={200}\n            sx={{ display: ['block', 'none'], pt: '20px', pb: '10px' }}\n            alt=\"Sal Khan\"\n          />\n\n          {timer.length ? (\n            <Grid\n              key=\"{e}\"\n              gap={[1, 2, 4]}\n              columns={[\n                '1fr 1fr 1fr 1fr',\n                '1fr 1fr 1fr',\n                '1fr 1fr 1fr',\n                '1fr 1fr 1fr 1fr 1fr'\n              ]}\n              sx={{\n                width: ['100%', '100%']\n              }}\n            >\n              {timer}\n            </Grid>\n          ) : (\n            <Box\n              sx={{\n                border: ['none', '#FFFFFF 1.6px solid'],\n                my: ['30px', 0],\n                px: ['0px', '40px', '40px'],\n                py: ['0px', '40px', '40px'],\n                width: ['100%', '70%'],\n                borderRadius: '10px'\n              }}\n            >\n              <Text\n                sx={(t: any) => ({\n                  color: 'primary',\n                  ...t.util.gxText('#ffffff', '#ffffff'),\n                  fontSize: [3, 4, 5],\n                  fontWeight: 'bold'\n                })}\n              >\n                The livestream has ended. Thank you to everyone for joining us!\n              </Text>\n              <Box>\n                <Link href=\"https://hack.af/sal-livestream\">\n                  <Button\n                    sx={{\n                      background: '#14BF96',\n                      margin: ['10px', '15px'],\n                      marginLeft: '0',\n                      color: '#222222',\n                      display: 'inline-block'\n                    }}\n                  >\n                    Watch recording\n                  </Button>\n                </Link>\n              </Box>\n            </Box>\n          )}\n          <Box\n            sx={{\n              color: '#ffffff',\n              width: ['70vw', '60vw', '60vw'],\n              py: ['20px', '100px', '120px'],\n              zIndex: '2',\n              fontSize: ['12px', 1, 2],\n              '@media screen and (min-width: 768px) and (max-width: 1200px)': {\n                fontSize: '15px'\n              }\n            }}\n          >\n            <Text>\n              <strong>Teenager? New here? Welcome!</strong>{' '}\n              <Link href=\"https://hackclub.com\" target=\"_blank\" color=\"inherit\">\n                Hack Club\n              </Link>{' '}\n              is a global community of high school makers & student-led coding\n              clubs. We’ve got a 24/7 Slack chatroom of {thousands}k+ teenagers\n              learning to code & building amazing projects, & you’ll fit right\n              in.\n            </Text>\n          </Box>\n        </Box>\n        <Box\n          sx={{\n            position: 'absolute',\n            bottom: '0',\n            right: '0',\n            width: ['100vw', '80vw', '70vw', '60vw']\n          }}\n        >\n          {timer.length ? (\n            <>\n              <Image\n                src={`https://cloud-oik8els6y-hack-club-bot.vercel.app/0frame_54__1_.png`}\n                alt=\"Image of Sal Khan\"\n                sx={{ position: 'absolute', bottom: 0 }}\n              />\n            </>\n          ) : (\n            <>\n              <Image\n                src={`https://cloud-oik8els6y-hack-club-bot.vercel.app/0frame_54__1_.png`}\n                sx={{ display: ['none', 'block'] }}\n                alt=\"Image of Sal Khan\"\n              />\n            </>\n          )}\n        </Box>\n      </Box>\n    </>\n  )\n}\n"
  },
  {
    "path": "pages/amas/vitalik.tsx",
    "content": "import { Box, Button, Image, Grid, Text, Link } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport React, { useEffect, useState } from 'react'\nimport tt from 'tinytime'\nimport Particle from '../../components/particles'\nimport { thousands } from '../../lib/members'\n\nexport default function Vitalik() {\n  const calculateTimeLeft = () => {\n    const difference = +new Date(`2022-02-04T01:00:00.000Z`) - +new Date()\n\n    let timeLeft = {}\n\n    if (difference > 0) {\n      timeLeft = {\n        days: Math.floor(difference / (1000 * 60 * 60 * 24)),\n        hours: Math.floor((difference / (1000 * 60 * 60)) % 24),\n        min: Math.floor((difference / 1000 / 60) % 60),\n        sec: Math.floor((difference / 1000) % 60)\n      }\n    }\n\n    return timeLeft\n  }\n\n  const [timeLeft, setTimeLeft] = useState(calculateTimeLeft())\n\n  useEffect(() => {\n    const timer = setTimeout(() => {\n      setTimeLeft(calculateTimeLeft())\n    }, 1000)\n\n    return () => clearTimeout(timer)\n  })\n\n  const timer = []\n\n  Object.keys(timeLeft).forEach(e => {\n    if (!timeLeft[e]) {\n      if (e === 'days') {\n        return\n      } else if (e === 'hours') {\n        if (!timeLeft['days']) {\n          return\n        }\n      } else if (e === 'min') {\n        if (!timeLeft['days'] && !timeLeft['hours']) {\n          return\n        }\n      } else {\n        if (!timeLeft['days'] && !timeLeft['hours'] && !timeLeft['min']) {\n          return\n        }\n      }\n    }\n\n    let name: string\n\n    if (e === 'days') {\n      if (timeLeft[e] === 1 || timeLeft[e] === 0) {\n        name = 'day'\n      } else {\n        name = 'days'\n      }\n    } else if (e === 'hours') {\n      if (timeLeft[e] === 1 || timeLeft[e] === 0) {\n        name = 'hour'\n      } else {\n        name = 'hours'\n      }\n    } else if (e === 'min') {\n      name = 'min'\n    } else {\n      name = 'sec'\n    }\n\n    timer.push(\n      <Box\n        sx={(t: any) => ({\n          color: 'primary',\n          ...t.util.gxText('#CDAEFB', '#82A9F9'),\n          position: 'relative',\n          width: ['16vw', '15vw', '15vw'],\n          height: ['15vh', '20vh', '35vh'],\n          borderRadius: '5px',\n          border: ['none', '1.5px solid'],\n          borderColor: t.util.gxText('#CDAEFB', '#82A9F9'),\n          fontSize: [4, 5, 7],\n          fontWeight: 'bold',\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'center',\n          textAlign: 'center'\n        })}\n      >\n        <Box>\n          <Text\n            sx={(t: any) => ({\n              color: 'primary',\n              ...t.util.gxText('#CDAEFB', '#82A9F9')\n            })}\n          >\n            {timeLeft[e]}{' '}\n          </Text>\n          <Text\n            sx={(t: any) => ({\n              color: 'primary',\n              ...t.util.gxText('#CDAEFB', '#82A9F9'),\n              position: 'relative',\n              fontSize: [1, 3, 4],\n              fontWeight: 'bold',\n              display: 'block',\n              pb: '15px'\n            })}\n          >\n            {name}\n          </Text>\n        </Box>\n      </Box>\n    )\n  })\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Vitalik Buterin | AMA\"\n        description=\"We’re excited to welcome Vitalik Buterin (Co-creator of Ethereum) to speak to teenagers at Hack Club!\"\n        image=\"https://cloud-je16il79h-hack-club-bot.vercel.app/0slack.png\"\n      />\n      <Head>\n        <meta name=\"theme-color\" content=\"#CDAEFB\" />\n      </Head>\n\n      <Box\n        sx={{\n          minHeight: '100vh',\n          width: '100vw',\n          bg: '#222222',\n          position: 'relative',\n          zIndex: '0',\n          overflow: 'hidden'\n        }}\n      >\n        <Link href=\"https://hackclub.com\" target=\"_blank\" color=\"inherit\">\n          <Image\n            src={`/ama/logo-purple.svg`}\n            width={150}\n            height={75}\n            sx={{\n              position: 'absolute',\n              top: '0',\n              left: ['10vw', '5vw']\n            }}\n            alt=\"Purple Ethereum logo\"\n          />\n        </Link>\n        <Particle />\n        <Box>\n          <Box sx={{ position: 'absolute', top: '10px', right: '5%' }}>\n            <Text\n              sx={(t: any) => ({\n                color: 'primary',\n                ...t.util.gxText('#CDAEFB', '#82A9F9'),\n                mt: [3, 4],\n                px: '10px',\n                py: '5px',\n                borderRadius: '5px',\n                border: '1px solid',\n                fontSize: [1, 2],\n                display: 'block',\n                fontWeight: 'bold'\n              })}\n            >\n              {tt('{MM} {Do} {h}:{mm} {a}').render(\n                new Date(`2022-02-04T01:00:00.000Z`)\n              )}\n            </Text>\n            <Text\n              sx={(t: any) => ({\n                color: 'primary',\n                ...t.util.gxText('#CDAEFB', '#82A9F9'),\n                display: 'block'\n              })}\n            >\n              in your local date/time\n            </Text>\n          </Box>\n        </Box>\n        <Box\n          sx={{\n            p: ['15vh 20px 0 20px', '100px 50px 0 50px'],\n            height: '80%',\n            width: '90%',\n            bg: 'transparent',\n            position: 'relative',\n            left: '5%',\n            top: '10%'\n          }}\n        >\n          <Image\n            src={`/ama/vitalikName2.svg`}\n            width={700}\n            height={500}\n            sx={{ display: ['none', 'block'], pb: '50px' }}\n            alt=\"Vitalik Buterin\"\n          />\n          <Image\n            src={`/ama/vitalikNameMobile.svg`}\n            width={250}\n            height={200}\n            sx={{ display: ['block', 'none'], pt: '20px', pb: '10px' }}\n            alt=\"Vitalik Buterin\"\n          />\n\n          {timer.length ? (\n            <Grid\n              key=\"{e}\"\n              gap={[1, 2, 4]}\n              columns={[\n                '1fr 1fr 1fr 1fr',\n                '1fr 1fr 1fr 1fr',\n                '1fr 1fr 1fr 1fr 1fr'\n              ]}\n              sx={{\n                width: ['100%', '100%']\n              }}\n            >\n              {timer}\n            </Grid>\n          ) : (\n            <Box\n              sx={{\n                border: ['none', '#CDAEFB 1.6px solid'],\n                my: ['30px', 0],\n                px: ['0px', '40px', '40px'],\n                py: ['0px', '40px', '40px'],\n                width: ['100%', '70%'],\n                borderRadius: '10px'\n              }}\n            >\n              <Text\n                sx={(t: any) => ({\n                  color: 'primary',\n                  ...t.util.gxText('#CDAEFB', '#82A9F9'),\n                  fontSize: [3, 4, 5],\n                  fontWeight: 'bold'\n                })}\n              >\n                The AMA has ended. Thank you to Vitalik and everyone for joining\n                us!\n              </Text>\n              <Box>\n                <Link href=\"https://hack.af/vitalik-livestream\">\n                  <Button\n                    sx={{\n                      background: '#CDAEFB',\n                      margin: ['10px', '15px'],\n                      marginLeft: '0',\n                      color: '#222222',\n                      display: 'inline-block'\n                    }}\n                  >\n                    Watch Recording\n                  </Button>\n                </Link>\n              </Box>\n            </Box>\n          )}\n          {timer.length ? (\n            <Box\n              sx={{\n                color: '#82A9F9',\n                width: ['25vw', '50vw', '50vw'],\n                pt: ['10px', '50px'],\n                zIndex: '2',\n                fontSize: ['12px', 1, 2],\n                '@media screen and (min-width: 768px) and (max-width: 1200px)':\n                  {\n                    fontSize: '15px'\n                  }\n              }}\n            >\n              <Text>\n                <strong>Teenager? New here? Welcome!</strong>{' '}\n                <Link\n                  href=\"https://hackclub.com\"\n                  target=\"_blank\"\n                  color=\"inherit\"\n                >\n                  Hack Club\n                </Link>{' '}\n                is a global community of high school makers & student-led coding\n                clubs. We’ve got a 24/7 Slack chatroom of {thousands}k+\n                teenagers learning to code & building amazing projects, & you’ll\n                fit right in.\n              </Text>\n            </Box>\n          ) : (\n            <Box\n              sx={{\n                color: '#82A9F9',\n                width: ['80vw', '50vw'],\n                pt: ['10px', '50px'],\n                zIndex: '2',\n                fontSize: ['15px', 1, 2],\n                '@media screen and (min-width: 768px) and (max-width: 1200px)':\n                  {\n                    fontSize: '15px'\n                  }\n              }}\n            >\n              <Text>\n                <strong>Teenager? New here? Welcome!</strong>{' '}\n                <Link\n                  href=\"https://hackclub.com\"\n                  target=\"_blank\"\n                  color=\"inherit\"\n                >\n                  Hack Club\n                </Link>{' '}\n                is a global community of high school makers & student-led coding\n                clubs. We’ve got a 24/7 Slack chatroom of {thousands}k+\n                teenagers learning to code & building amazing projects, & you’ll\n                fit right in.\n              </Text>\n            </Box>\n          )}\n        </Box>\n        <Box\n          sx={{\n            position: 'absolute',\n            bottom: '0',\n            right: '0',\n            marginRight: ['-100px', '-50px', '-50px'],\n            width: ['100vw', '70vw', '40vw']\n          }}\n        >\n          {timer.length ? (\n            <>\n              <Image\n                src={`/ama/vitalikImage.svg`}\n                sx={{ display: ['none', 'block'] }}\n                alt=\"Image of Vitalik Buterin\"\n              />\n              <Image\n                src={`/ama/vitalikImageMobile.svg`}\n                width={400}\n                height={400}\n                sx={{ display: ['block', 'none'] }}\n                alt=\"Image of Vitalik Buterin\"\n              />\n            </>\n          ) : (\n            <>\n              <Image\n                src={`/ama/vitalikImage.svg`}\n                sx={{ display: ['none', 'block'] }}\n                alt=\"Image of Vitalik Buterin\"\n              />\n            </>\n          )}\n        </Box>\n      </Box>\n    </>\n  )\n}\n"
  },
  {
    "path": "pages/api/arcade/hack-hour/inventory.ts",
    "content": "import AirtablePlus from 'airtable-plus'\n\nconst flavorText = async () => {\n  const airtable = new AirtablePlus({\n    apiKey: process.env.AIRTABLE_API_KEY,\n    baseID: 'app3ODCEuTL5iGjb3',\n    tableName: 'Flavor Text'\n  })\n\n  const records = airtable.read()\n  return records\n}\n\nconst inventoryParts = async () => {\n  const airtable = new AirtablePlus({\n    apiKey: process.env.AIRTABLE_API_KEY,\n    baseID: 'app3ODCEuTL5iGjb3',\n    tableName: 'Inventory'\n  })\n\n  const records = await airtable.read()\n  return records\n}\n\ntype InventoryRecord = {\n  fields: {\n    Name: string\n    'Name Small Text': string\n    Hours: number\n    'Image URL': string\n    'Order Form URL': string\n    Description: string\n    'Flavor text'?: string[]\n    Enabled: boolean\n  }\n}\n\ntype FlavorRecord = {\n  id: string\n  fields: {\n    Message: string\n    Character: string\n    characterURL: string\n    'Image URL': string\n    'Self Click': boolean\n    'Character (from Shopkeepers)'?: string[]\n    'Image Link (from Shopkeepers)'?: string[]\n  }\n}\n\nexport default async function handler(req, res) {\n  const data: { inventory?: InventoryRecord[]; flavor?: FlavorRecord[] } = {}\n  await Promise.all([\n    inventoryParts().then((d: InventoryRecord[]) => {\n      data.inventory = d\n    }),\n    flavorText().then((d: FlavorRecord[]) => {\n      data.flavor = d\n    })\n  ])\n\n  const inventoryResults = data.inventory\n    .filter(record => record.fields['Enabled'])\n    .map(record => {\n      return {\n        name: record.fields['Name'],\n        smallName: record.fields['Name Small Text'],\n        hours: record.fields['Hours'],\n        imageURL: record.fields['Image URL'],\n        formURL: record.fields['Order Form URL'],\n        description: record.fields['Description'],\n        flavorText: record?.fields['Flavor text']?.map(recordID => {\n          const flavorRecord = data.flavor.find(f => f.id === recordID)\n          const result = {\n            message: flavorRecord.fields['Message'],\n            character: flavorRecord.fields['Character'],\n            imageURL: flavorRecord.fields['Image URL'],\n            characterURL: ''\n          }\n          if (flavorRecord.fields['Shopkeepers']) {\n            result.characterURL =\n              flavorRecord.fields['Image Link (from Shopkeepers)'][0]\n            result.character =\n              flavorRecord.fields['Character (from Shopkeepers)'][0]\n          }\n          return result\n        })\n      }\n    })\n\n  const selfClicks = {}\n  data.flavor\n    .filter(f => f.fields['Self Click'])\n    .forEach(record => {\n      const char = record.fields['Character (from Shopkeepers)'][0]\n      const charURL = record.fields['Image Link (from Shopkeepers)'][0]\n      const charMsg = record.fields['Message']\n      selfClicks[char] = selfClicks[char] || []\n      selfClicks[char].push({\n        message: charMsg,\n        characterURL: charURL,\n        character: char\n      })\n    })\n\n  res.status(200).json({ inventory: inventoryResults, selfClicks })\n}\n"
  },
  {
    "path": "pages/api/arcade/shop.ts",
    "content": "import AirtablePlus from 'airtable-plus'\n\nexport const shopParts = async () => {\n  const baseID = 'app4kCWulfB02bV8Q'\n  const shopItemsTable = new AirtablePlus({\n    apiKey: process.env.AIRTABLE_API_KEY,\n    baseID,\n    tableName: 'Shop Items'\n  })\n\n  const records = await shopItemsTable.read()\n  const newRecordsPromise = records.map(async record => {\n    const fields = record.fields\n    let stock = fields['Stock']\n\n    if (stock && fields['Count of Orders Fulfilled']) {\n      stock -= fields['Count of Orders Fulfilled']\n    }\n    return {\n      id: record.id,\n      ...record.fields,\n      Stock: stock === null ? null : stock >= 0 ? stock : 0\n    }\n  })\n\n  const newRecords = await Promise.all(newRecordsPromise)\n\n  return newRecords\n}\n\nexport default async function handler(req, res) {\n  const data = await shopParts()\n\n  const filteredData = data\n    .filter(record => record['Enabled'])\n    .map(record => {\n      return {\n        name: record['Name'],\n        smallName: record['Small Name'],\n        description: record['Description'],\n        hours: record['Cost Hours'],\n        imageURL: record['Image URL'],\n        stock: record['Stock']\n      }\n    })\n\n  return res.json(filteredData)\n}\n"
  },
  {
    "path": "pages/api/bin/gallery/posts.ts",
    "content": "import AirtablePlus from 'airtable-plus'\n\nconst fetchPosts = async () => {\n  try {\n    const airtable = new AirtablePlus({\n      apiKey: process.env.AIRTABLE_API_KEY,\n      baseID: 'appKjALSnOoA0EmPk',\n      tableName: 'Main'\n    })\n\n    const records = await airtable.read()\n\n    const posts = records.map(record => {\n      return {\n        ID: record.id,\n        title: record.fields.Title,\n        desc: record.fields['What will you be building?'],\n        slack: record.fields['Slack Handle'],\n        link: record.fields['Wokwi Share link'],\n        status: record.fields.Status,\n        hide: record.fields['Hide From Gallery'],\n        created: record.fields['Created At'],\n        parts: record.fields['Parts List']\n      }\n    })\n\n    return posts\n  } catch (error) {\n    console.error('Error fetching posts:', error)\n    throw error\n  }\n}\n\nexport default async function handler(req, res) {\n  try {\n    const data = await fetchPosts()\n    res.status(200).json(data)\n  } catch (error) {\n    res.status(500).json({ error: 'Failed to fetch posts' })\n  }\n}\n"
  },
  {
    "path": "pages/api/bin/gallery/tags.ts",
    "content": "import AirtablePlus from 'airtable-plus'\n\nconst fetchTags = async () => {\n  try {\n    const airtable = new AirtablePlus({\n      apiKey: process.env.AIRTABLE_API_KEY,\n      baseID: 'appKjALSnOoA0EmPk',\n      tableName: 'Supported Parts'\n    })\n\n    const records = await airtable.read()\n\n    const tags = records.map(record => {\n      return {\n        ID: record.id,\n        hide: record.fields['Hide From Gallery']\n      }\n    })\n\n    console.log('tags', tags)\n    return tags\n  } catch (error) {\n    console.error('Error fetching tags:', error)\n    throw error\n  }\n}\n\nexport default async function handler(req, res) {\n  try {\n    const data = await fetchTags()\n    res.status(200).json(data)\n  } catch (error) {\n    res.status(500).json({ error: 'Failed to fetch tags' })\n  }\n}\n"
  },
  {
    "path": "pages/api/bin/rsvp.ts",
    "content": "// https://airtable.com/appKjALSnOoA0EmPk/tblYYhxN9TaPPMMRV/viwJFvTlmRNHj0Toh?blocks=hide\nimport AirtablePlus from 'airtable-plus'\n\nlet rsvpsTable\n\n// only fetch if apiKey present\nif (process.env.AIRTABLE_WRITE_API_KEY) {\n  rsvpsTable = new AirtablePlus({\n    apiKey: process.env.AIRTABLE_WRITE_API_KEY,\n    baseID: 'appKjALSnOoA0EmPk',\n    tableName: 'RSVPs'\n  })\n} else {\n  console.warn(\n    'No AIRTABLE_WRITE_API_KEY environment variable found, the bin RSVP will not be fetched'\n  )\n}\n\nexport default async function handler(req, res) {\n  if (req.method === 'POST') {\n    const { email, high_schooler, stickers, address_line_1, address_zip } =\n      req.body\n\n    const fields = {\n      Email: email,\n      'High Schooler': '' + high_schooler,\n      Stickers: '' + stickers,\n      'Address (line 1)': address_line_1,\n      'Address (zip code)': address_zip\n    }\n\n    await rsvpsTable.create(fields)\n\n    res.status(200).json({ success: true })\n  } else if (req.method === 'GET') {\n    if (!rsvpsTable) return res.status(200).json(0)\n    const result = await rsvpsTable.read()\n\n    res.status(200).json(result.length)\n  }\n}\n"
  },
  {
    "path": "pages/api/bin/wokwi/new/[parts].ts",
    "content": "import { findOrCreateProject } from '.'\n\nexport default async function handler(req, res) {\n  const parts = req.query.parts.split('|')\n  const shareLink = await findOrCreateProject(parts)\n  res.redirect(shareLink)\n}\n"
  },
  {
    "path": "pages/api/bin/wokwi/new/index.ts",
    "content": "import AirtablePlus from 'airtable-plus'\n\nexport const findOrCreateProject = async (partsList = []) => {\n  const airtable = new AirtablePlus({\n    apiKey: process.env.AIRTABLE_WRITE_API_KEY,\n    baseID: 'appKjALSnOoA0EmPk',\n    tableName: 'Cached Projects'\n  })\n\n  const cacheName = partsList.sort().join(',')\n\n  const existingProject = await airtable.read({\n    filterByFormula: `{Name}=\"${cacheName}\"`,\n    maxRecords: 1\n  })\n\n  if (existingProject.length > 0) {\n    return existingProject[0].fields['Share Link']\n  } else {\n    const shareLink = await createProject(partsList)\n    if (shareLink) {\n      await airtable.create({\n        Name: cacheName,\n        'Share Link': shareLink\n      })\n      return shareLink\n    } else {\n      return null\n    }\n  }\n}\n\nconst createProject = async (partsList = []) => {\n  const airtable = new AirtablePlus({\n    apiKey: process.env.AIRTABLE_WRITE_API_KEY,\n    baseID: 'appKjALSnOoA0EmPk',\n    tableName: 'Supported Parts'\n  })\n\n  // adjust these to taste:\n  const PADDING = 30\n  const MAX_WIDTH = 320 // big question mark on this one\n  const ROW_HEIGHT = 215 // close enough for jazz, keypad is too big for this but ¯\\_(ツ)_/¯\n\n  const parts = [\n    { type: 'board-pi-pico-w', id: 'pico', top: 0, left: 0, attrs: {} }\n  ]\n  let x = 88 + PADDING // for already included Pico\n  let y = 0\n  await Promise.all(\n    partsList.map(async part => {\n      const airPart = await airtable.read({\n        filterByFormula: `{Wokwi Name}= \"${part}\"`,\n        maxRecords: 1\n      })\n      return airPart[0].fields['Wokwi Name'].split(',').forEach((name, i) => {\n        const width = airPart[0].fields['Wokwi X-Offset']\n        const attrs = airPart[0].fields['attrs']\n        if (x + width + PADDING > MAX_WIDTH) {\n          x = 0\n          y += ROW_HEIGHT\n        }\n        parts.push({\n          type: name,\n          id: name + '--' + i,\n          left: x,\n          top: y,\n          attrs: attrs\n        })\n        x += width + PADDING\n      })\n    })\n  )\n\n  const body = JSON.stringify({\n    name: 'The Bin!',\n    unlisted: true,\n    files: [\n      {\n        name: 'help.md',\n        content: `# Welcome to The Bin! 🦝\n\nNow that you've thrown some parts into The Bin, it's time to turn that trash into treasure! 🗑️➡️💎\n\nWire up your parts and write some code to make them work together. If you need\nhelp with a part, click the \"?\" above it.\n\nIf you want to see examples, check here:\nhttps://hack.club/bin-example\n\nYou can get help by chatting with other high schoolers on the Hack Club Slack in\nthe #electronics channel:\n👉 https://slack.hackclub.com 👈\n\nOnce you're ready build your design IRL, click the \"Share\" button and submit\nyour design:\nhttps://hack.club/bin-submit\n    `\n      },\n      {\n        name: 'sketch.ino',\n        content: `// Now turn this trash into treasure!\n\nvoid setup() {\n  // put your setup code here, to run once:\n  Serial1.begin(115200);\n  Serial1.println(\"Hello, Raspberry Pi Pico W!\");\n}\nvoid loop() {\n  // put your main code here, to run repeatedly:\n  delay(1); // this speeds up the simulation\n}`\n      },\n      {\n        name: 'diagram.json',\n        content: JSON.stringify(\n          {\n            version: 1,\n            author: 'The Bin - Hack Club',\n            editor: 'wokwi',\n            parts: parts,\n            connections: [\n              ['pico:GP0', '$serialMonitor:RX', '', []],\n              ['pico:GP1', '$serialMonitor:TX', '', []]\n            ],\n            dependencies: {}\n          },\n          null,\n          2\n        )\n      }\n    ]\n  })\n\n  const response = await fetch('https://wokwi.com/api/projects/save', {\n    method: 'POST',\n    mode: 'no-cors',\n    headers: {\n      'Content-Type': 'application/json',\n      Referer: 'https://wokwi.com/projects/new/pi-pico-w',\n      'User-Agent': 'Hack Club - contact max@hackclub.com for any complaints!'\n    },\n    body\n  }).catch(e => {\n    console.log(e)\n  })\n\n  if (!response) return null\n  const data = await response.json()\n  const { projectId } = data\n\n  return `https://wokwi.com/projects/${projectId}`\n}\n\nexport default async function handler(req, res) {\n  if (req.method === 'POST') {\n    const { parts } = req.body\n\n    const shareLink = await findOrCreateProject(parts)\n    if (shareLink) {\n      res.status(200).json({ shareLink })\n    } else {\n      res.status(500).json({ error: 'Failed to create project' })\n    }\n  }\n}\n"
  },
  {
    "path": "pages/api/bin/wokwi/parts.ts",
    "content": "import AirtablePlus from 'airtable-plus'\nimport camelcase from 'camelcase'\n\nconst camelizeObject = obj => {\n  Object.keys(obj).forEach(key => {\n    obj[camelcase(key)] = obj[key]\n    if (key !== camelcase(key)) {\n      delete obj[key]\n    }\n  })\n  return obj\n}\n\nconst wokwiParts = async () => {\n  const airtable = new AirtablePlus({\n    apiKey: process.env.AIRTABLE_API_KEY,\n    baseID: 'appKjALSnOoA0EmPk',\n    tableName: 'Supported Parts'\n  })\n\n  const records = await airtable.read()\n  const parts = records.map(record => camelizeObject(record.fields))\n  return parts\n}\n\nexport default async function handler(req, res) {\n  const data = await wokwiParts()\n  res.status(200).json(data)\n}\n"
  },
  {
    "path": "pages/api/bucky.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next'\n\nexport default async function handler(\n  req: NextApiRequest,\n  res: NextApiResponse\n) {\n  const result = await fetch('https://bucky.hackclub.com', {\n    method: 'POST',\n    body: req.body,\n    headers: {\n      'Content-Type': req.headers['content-type']\n    }\n  }).then(r => r.text())\n  res.status(200).json({ result })\n}\n"
  },
  {
    "path": "pages/api/channels/resolve.ts",
    "content": "export default async function handler(req, res) {\n  // get a public channel name by id\n  const channelDataReq = await fetch(\n    `https://slack.com/api/conversations.info?channel=${req.query.id}`,\n    {\n      headers: {\n        Authorization: `Bearer ${process.env.SLACK_BOT_TOKEN}`\n      }\n    }\n  )\n\n  if (!channelDataReq.ok) {\n    console.warn(await channelDataReq.text())\n    return res.status(503).end()\n  }\n\n  const channelData = await channelDataReq.json()\n  if (!channelData.ok) {\n    console.warn(channelData)\n    return res.status(400).end()\n  }\n\n  res.status(200).send({ name: channelData.channel.name })\n}\n"
  },
  {
    "path": "pages/api/contribute.ts",
    "content": "import { graphql } from '@octokit/graphql'\nimport { createAppAuth } from '@octokit/auth-app'\nimport { NextApiRequest, NextApiResponse } from 'next'\n\ninterface OrgQueryResponse {\n  organization: Record<string, any>\n}\n\nconst auth = createAppAuth({\n  appId: process.env.GITHUB_APP_ID as string,\n  privateKey: process.env.GITHUB_PRIVATE_KEY as string,\n  installationId: process.env.GITHUB_INSTALLATION_ID as string\n})\n\nexport default async function handler(\n  req: NextApiRequest,\n  res: NextApiResponse\n) {\n  const { organization } = await graphql<OrgQueryResponse>(\n    !req.query.admin\n      ? `\n    query orgQuery($login: String!) {\n      organization(login: $login) {\n        repositories(first: 50, privacy: PUBLIC, orderBy: {\n          field: PUSHED_AT, direction: DESC\n        }){\n          nodes {\n            name\n            description\n            languages(first: 1) {\n              nodes {\n                name\n              }\n            }\n            pushedAt\n            url\n            issues(states: OPEN) {\n              totalCount\n            }\n          }\n        }\n      }\n    }`\n      : `query orgQuery($login: String!) {\n      organization(login: $login) {\n        repositories(first: 100, privacy: PUBLIC, orderBy: {\n          field: PUSHED_AT, direction: DESC\n        }){\n          nodes {\n            name\n            description\n            isArchived\n            languages(first: 1) {\n              nodes {\n                name\n              }\n            }\n            pushedAt\n            url\n            pullRequests(first: 50, states: OPEN) {\n              nodes {\n                title,\n                url,\n                number,\n                repository {\n                  id,\n                  name\n                }\n              }\n            }\n          }\n        }\n      }\n    }`,\n    {\n      login: 'hackclub',\n      request: {\n        hook: auth.hook\n      }\n    }\n  )\n  res.status(200).json(organization)\n}\n"
  },
  {
    "path": "pages/api/first-team.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next'\n\nexport default async function handler(\n  req: NextApiRequest,\n  res: NextApiResponse\n) {\n  try {\n    const response = await fetch(\n      `https://thebluealliance.com/api/v3/team/frc${encodeURIComponent(\n        Array.isArray(req.query.teamNumber)\n          ? req.query.teamNumber[0]\n          : req.query.teamNumber\n      )}`,\n      { headers: { 'X-TBA-Auth-Key': process.env.TBA_API_KEY } }\n    )\n    const data = await response.json()\n    res.json(data)\n  } catch (e) {\n    res.status(404).json({ ok: false })\n  }\n}\n"
  },
  {
    "path": "pages/api/games.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next'\n\nexport async function getGames() {\n  try {\n    const games = await fetch(\n      'https://sprig.hackclub.com/api/gallery?new'\n    ).then(res => res.json())\n\n    return games\n  } catch (e) {\n    console.error(e)\n    return []\n  }\n}\n\nexport default async function Games(\n  _req: NextApiRequest,\n  res: NextApiResponse\n) {\n  const games = await getGames()\n  res.json(games)\n}\n"
  },
  {
    "path": "pages/api/github.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next/dist/shared/lib/utils'\nimport { normalizeGitHubCommitUrl } from '../../lib/helpers'\n\nconst isRelevantEventType = type =>\n  ['PushEvent', 'PullRequestEvent', 'WatchEvent'].includes(type)\n\nconst getMessage = (type, payload, repo) => {\n  switch (type) {\n    case 'PushEvent':\n      return payload.commits?.[0]?.message || 'No commit message'\n    case 'PullRequestEvent':\n      return payload.pull_request.title\n    case 'WatchEvent':\n      return `starred ${repo.name}`\n    default:\n      return null\n  }\n}\n\nconst getUrl = (type, payload, repo) => {\n  switch (type) {\n    case 'PushEvent':\n      return payload.commits?.[0]?.url\n        ? normalizeGitHubCommitUrl(payload.commits[0].url)\n        : 'https://github.com/hackclub'\n    case 'PullRequestEvent':\n      return payload.pull_request.html_url\n    case 'WatchEvent':\n      return `https://github.com/${repo.name}`\n    default:\n      return `https://github.com/hackclub`\n  }\n}\n\nexport async function fetchGitHub() {\n  try {\n    const initialGitHubData = await fetch(\n      'https://api.github.com/orgs/hackclub/events'\n    ).then(r => r.json())\n\n    const gitHubData = initialGitHubData\n      .filter(({ type }) => isRelevantEventType(type))\n      .map(({ type, actor, payload, repo, created_at }) => ({\n        type,\n        user: actor.login,\n        userImage: actor.avatar_url,\n        url: getUrl(type, payload, repo),\n        message: getMessage(type, payload, repo),\n        time: created_at\n      }))\n\n    return gitHubData\n  } catch (error) {\n    console.error(error)\n    return []\n  }\n}\n\nexport default async function github(\n  _req: NextApiRequest,\n  res: NextApiResponse\n) {\n  const git = await fetchGitHub()\n  res.json(git)\n}\n"
  },
  {
    "path": "pages/api/join.ts",
    "content": "import AirtablePlus from 'airtable-plus'\nimport { NextApiRequest, NextApiResponse } from 'next/dist/shared/lib/utils'\n\nconst sgMail = require('@sendgrid/mail')\n\nsgMail.setApiKey(process.env.SENDGRID_API_KEY)\n\nconst joinTable = new AirtablePlus({\n  apiKey: process.env.AIRTABLE_WRITE_API_KEY,\n  baseID: 'appaqcJtn33vb59Au',\n  tableName: 'Join Requests'\n})\n\nasync function postData(url = '', data = {}, headers = {}) {\n  const response = await fetch(url, {\n    method: 'POST',\n    mode: 'cors',\n    cache: 'no-cache',\n    credentials: 'same-origin',\n    headers: {\n      'Content-Type': 'application/json',\n      ...headers\n    },\n    redirect: 'follow',\n    referrerPolicy: 'no-referrer',\n    body: JSON.stringify(data)\n  })\n  return response.text()\n}\n\nexport default async function handler(\n  req: NextApiRequest,\n  res: NextApiResponse\n) {\n  switch (req.method) {\n    case 'OPTIONS':\n      return res.status(200).send('YIPPE YAY. YOU HAVE CLEARANCE TO PROCEED.')\n    case 'GET':\n      return res\n        .status(405)\n        .json({ error: '*GET outta here!* (Method not allowed, use POST)' })\n    case 'PUT':\n      return res.status(405).json({\n        error: '*PUT that request away!* (Method not allowed, use POST)'\n      })\n    case 'POST':\n      console.log('POST request received. WOO!')\n      break\n    default:\n      return res.status(405).json({ error: 'Method not allowed, use POST' })\n  }\n\n  const data = req.body || {}\n  const open = process.env.NEXT_PUBLIC_OPEN === 'true'\n  const waitlist = !open\n  const isAdult = data.year === 'tertiary'\n\n  if (isAdult) {\n    const mail = {\n      to: data.email,\n      from: 'Hack Club Slack <team@hackclub.com>',\n      subject: 'Slack Waiting List update',\n      text: 'Hello world',\n      html: \"Hey! Thanks for your interest in the Hack Club Slack. <br/> Our online community is for minors, and thus only pre-approved adults are permitted.\\nTo find out more about what all we do, check out our <a href='https://github.com/hackclub'>Github</a>. If you're a parent or educator & want to talk to a member of our team, send us a email at <a href='mailto:team@hackclub.com'>team@hackclub.com</a>.\",\n      imageUrl: 'https://assets.hackclub.com/icon-rounded.png'\n    }\n\n    sgMail.send(mail)\n  }\n\n  const secrets = (process.env.NAUGHTY || '').split(',')\n\n  const forwardedFor = Array.isArray(req.headers['x-forwarded-for'])\n    ? req.headers['x-forwarded-for'][0]\n    : req.headers['x-forwarded-for']\n  if (secrets.includes(forwardedFor)) {\n    return res.json({\n      status: 'success',\n      message: 'You’ve been invited to Slack!'\n    })\n  }\n\n  const airtablePromise = joinTable.create({\n    'Full Name': data.name,\n    'Email Address': data.email,\n    Minor: !isAdult,\n    Reason: data.reason,\n    Invited: !waitlist,\n    Club: data.club ? data.club : '',\n    Event: data.event ? data.event : '',\n    IP: req.headers['x-forwarded-for'] || req.socket.remoteAddress\n  })\n\n  if (waitlist) {\n    return res.json({\n      status: 'success',\n      message: 'Your request will be reviewed soon.'\n    })\n  }\n\n  const slackPromise = postData(\n    'https://toriel.hackclub.com/slack-invite',\n    {\n      email: !isAdult ? data.email : null,\n      ip: req.headers['x-forwarded-for'] || req.socket.remoteAddress,\n      continent: data.continent,\n      teen: !isAdult,\n      educationLevel: data.educationLevel,\n      reason: data.reason,\n      event: data.event,\n      userAgent: req.headers['user-agent']\n    },\n    { authorization: `Bearer ${process.env.TORIEL_KEY}` }\n  )\n\n  Promise.all([airtablePromise, slackPromise])\n    .then(() =>\n      res.json({ status: 'success', message: 'You’ve been invited to Slack!' })\n    )\n    .catch(error => {\n      console.error(error)\n      res.status(500).json({ error })\n    })\n}\n"
  },
  {
    "path": "pages/api/mailing-list.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next'\n\nexport default async function submit(\n  req: NextApiRequest,\n  res: NextApiResponse\n) {\n  if (req.method === 'POST') {\n    const data = req.body\n\n    const resp = await fetch('https://postal.hackclub.com/subscribe', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded'\n      },\n      body: new URLSearchParams({\n        api_key: process.env.POSTAL_API_KEY,\n        name: data.name,\n        email: data.email,\n        list: process.env.POSTAL_LIST_ID,\n        boolean: 'true'\n      }).toString()\n    }).then(r => r.text())\n    res.json(resp)\n  }\n}\n"
  },
  {
    "path": "pages/api/onboard/p/[project]/index.ts",
    "content": "// return a project's metadata\n\nimport { getAllOnboardProjects } from '..'\n\nasync function getReadmeData(url) {\n  const readme = await fetch(url)\n  const text = await readme.text()\n  // parse YAML frontmatter\n  const lines = text.split('\\n')\n  const frontmatter = {}\n  let i = 0\n  for (; i < lines.length; i++) {\n    if (lines[i].startsWith('---')) {\n      break\n    }\n  }\n  for (i++; i < lines.length; i++) {\n    if (lines[i].startsWith('---')) {\n      break\n    }\n    const [key, value] = lines[i].split(': ')\n    frontmatter[key] = value || null\n  }\n  const description = lines.slice(i + 1).join('\\n')\n  return {\n    frontmatter,\n    description\n  }\n}\n\nexport const getOnboardProject = async name => {\n  // this is not performant to call all projects every time, but we're doing it for now while things load quickly enough\n  // TODO: Speed this up\n  try {\n    const project = (await getAllOnboardProjects()).find(p => p.name === name)\n    const readmeData = await getReadmeData(project.readmeURL)\n\n    const result = { ...project, readmeData }\n\n    return result\n  } catch (e) {\n    console.error(e)\n    return null\n  }\n}\n\nexport default async function handler(req, res) {\n  const { name } = req.query\n  if (!name) {\n    return res.status(400).json({ status: 400, error: 'Must provide name' })\n  }\n  const project = await getOnboardProject(name)\n  if (!project) {\n    return res.status(404).json({ status: 404, error: 'Project not found' })\n  }\n  return res.status(200).json(project)\n}\n"
  },
  {
    "path": "pages/api/onboard/p/count.ts",
    "content": "import { getAllOnboardProjects } from '.'\n\nexport async function onboardProjectCount() {\n  const projects = await getAllOnboardProjects()\n  return projects.length\n}\n\nexport default async function handler(req, res) {\n  const count = await onboardProjectCount()\n\n  res.json({ count })\n}\n"
  },
  {
    "path": "pages/api/onboard/p/index.ts",
    "content": "// returns a list of all projects\n\nexport const getAllOnboardProjects = async () => {\n  const url = 'https://api.github.com/repos/hackclub/onboard/contents/projects'\n  const fetchOptions = {\n    headers: {}\n  }\n  if (process.env.GITHUB_TOKEN) {\n    // this field is optional because we do heavy caching in production, but nice to have for local development\n    fetchOptions.headers = {\n      Authorization: `Bearer ${process.env.GITHUB_TOKEN}`\n    }\n  }\n\n  let res\n  try {\n    res = await fetch(url, fetchOptions).then(r => r.json())\n  } catch (e) {\n    console.error('Failed to fetch projects from GitHub', e)\n    return []\n  }\n\n  if (res.message && res.message.startsWith('API rate limit exceeded')) {\n    console.error('GitHub API rate limit exceeded')\n    return []\n  }\n  if (!res || !Array.isArray(res)) return []\n\n  const projects = []\n\n  res.forEach(p => {\n    if (p.type !== 'dir') {\n      return\n    }\n    if (p.name[0] === '.') {\n      return\n    }\n    if (p.name[0] === '!') {\n      return\n    }\n\n    const projectData = {\n      name: p.name,\n      url: `https://github.com/hackclub/OnBoard/tree/main/projects/${p.name}/README.md`,\n      galleryURL: `/onboard/board/${p.name}`,\n      githubURL: p.html_url,\n      readmeURL: `https://raw.githubusercontent.com/hackclub/OnBoard/main/projects/${p.name}/README.md`,\n      schematicURL: `https://raw.githubusercontent.com/hackclub/OnBoard/main/projects/${p.name}/schematic.pdf`,\n      gerberURL: `https://raw.githubusercontent.com/hackclub/OnBoard/main/projects/${p.name}/gerber.zip`,\n      imageTop: `/api/onboard/svg/${encodeURIComponent(`https://raw.githubusercontent.com/hackclub/OnBoard/main/projects/${p.name}/gerber.zip`)}/top`,\n      imageBottom: `/api/onboard/svg/${encodeURIComponent(`https://raw.githubusercontent.com/hackclub/OnBoard/main/projects/${p.name}/gerber.zip`)}/bottom`\n    }\n\n    projects.push(projectData)\n  })\n\n  return projects\n}\n\nexport default async function handler(req, res) {\n  const projects = await getAllOnboardProjects()\n\n  res.json(projects)\n}\n"
  },
  {
    "path": "pages/api/onboard/svg/[board_url]/bottom.ts",
    "content": "// test me with: curl http://localhost:3000/api/board/svg/https%3A%2F%2Fgithub.com%2Fhackclub%2FOnBoard%2Fraw%2Fmain%2Fprojects%2F2_Switch_Keyboard%2Fgerber.zip/bottom\n\nimport { gerberToSvg } from '.'\n\nexport default async function handler(req, res) {\n  const { board_url } = req.query\n  if (!board_url) {\n    return res.status(404).json({ status: 404, error: 'Must provide file' })\n  }\n  // ensure valid file url is included\n  const parsed_url = new URL(decodeURI(board_url))\n  if (!parsed_url) {\n    return res.status(404).json({ status: 404, error: 'Invalid file' })\n  }\n  const svg = await gerberToSvg(parsed_url)\n  return res.status(200).send(svg.bottom)\n}\n"
  },
  {
    "path": "pages/api/onboard/svg/[board_url]/index.ts",
    "content": "import JSZip from 'jszip'\nimport {\n  read,\n  plot,\n  renderLayers,\n  renderBoard,\n  stringifySvg\n} from '@tracespace/core'\nimport fs from 'fs'\n\nexport const gerberToSvg = async gerberURL => {\n  const data = await fetch(gerberURL).then(res => {\n    return { status: res.status, arrayBuffer: res.arrayBuffer() }\n  })\n  if (data.status !== 200) {\n    return { status: data.status, error: 'Failed to fetch gerber file' }\n  }\n  const files = []\n  const zip = new JSZip()\n\n  const zippedData = await new Promise<JSZip>((resolve, _reject) => {\n    zip.loadAsync(data.arrayBuffer).then(resolve, e => {\n      console.error(e)\n      resolve(new JSZip()) // TODO: actually handle this error (bad or nonexistent gerber.zip)\n    })\n  })\n\n  const allowedExtensions = [\n    'gbr', // gerber\n    'drl', // drillfile\n    'gko', // gerber board outline\n    'gbl', // gerber bottom layer\n    'gbp', // gerber bottom paste\n    'gbs', // gerber bottom solder mask\n    'gbo', // gerber bottom silk\n    'gtl', // gerber top layer\n    'gto', // gerber top silk\n    'gts' // gerber top soldermask\n  ]\n  const unzipJobs = Object.entries(zippedData.files).map(\n    async ([filename, file]) => {\n      const extension = filename.split('.').pop().toLowerCase()\n      if (allowedExtensions.includes(extension)) {\n        const filePath = `/tmp/${filename}`\n        await new Promise<void>((resolve, _reject) => {\n          file.async('uint8array').then(function (fileData) {\n            fs.writeFileSync(filePath, fileData)\n            files.push(filePath)\n            resolve()\n          })\n        })\n      }\n    }\n  )\n\n  await Promise.all(unzipJobs)\n\n  let readResult\n  try {\n    readResult = await read(files)\n  } catch (e) {\n    console.error(e)\n    return {}\n  }\n  const plotResult = plot(readResult)\n  const renderLayersResult = renderLayers(plotResult)\n  const renderBoardResult = renderBoard(renderLayersResult)\n  for (const file of files) {\n    if (fs.existsSync(file)) {\n      fs.unlinkSync(file)\n    }\n  }\n  return {\n    top: stringifySvg(renderBoardResult.top),\n    bottom: stringifySvg(renderBoardResult.bottom)\n    // all: stringifySvg(renderLayersResult)\n  }\n}\n\nexport default async function handler(req, res) {\n  const { file, format } = req.query\n  if (!file) {\n    return res.status(400).json({ status: 400, error: 'Must provide file' })\n  }\n  // ensure valid file url is included\n  const url = new URL(decodeURI(file))\n  const svg = await gerberToSvg(url)\n  if (format === 'top') {\n    res.contentType('image/svg')\n    return res.status(200).send(svg.top)\n  }\n  if (format === 'json') return res.status(200).json(svg)\n\n  return res.status(200).json(svg)\n}\n// test me with: curl http://localhost:3000/api/board/svg/https%3A%2F%2Fgithub.com%2Fhackclub%2FOnBoard%2Fraw%2Fmain%2Fprojects%2F2_Switch_Keyboard%2Fgerber.zip\n"
  },
  {
    "path": "pages/api/onboard/svg/[board_url]/top.ts",
    "content": "// test me with: curl http://localhost:3000/api/board/svg/https%3A%2F%2Fgithub.com%2Fhackclub%2FOnBoard%2Fraw%2Fmain%2Fprojects%2F2_Switch_Keyboard%2Fgerber.zip/top\n\nimport { gerberToSvg } from '.'\n\nexport default async function handler(req, res) {\n  const { board_url } = req.query\n  if (!board_url) {\n    return res.status(404).json({ status: 404, error: 'Must provide file' })\n  }\n  // ensure valid file url is included\n  const parsed_url = new URL(decodeURI(board_url))\n  if (!parsed_url) {\n    return res.status(404).json({ status: 404, error: 'Invalid file' })\n  }\n  const svg = await gerberToSvg(parsed_url)\n  if (svg.error) {\n    return res.status(svg.status).send(svg.error)\n  }\n  return res.status(200).send(svg.top)\n}\n"
  },
  {
    "path": "pages/api/replit/signup.ts",
    "content": "export default async function handler(req, res) {\n  if (req.method === 'POST') {\n    try {\n      const { token, email } = req.body\n\n      const url = new URL('http://takeout.hackclub.com/signup')\n      url.searchParams.append('token', token)\n      url.searchParams.append('email', email)\n\n      const response = await fetch(url, { method: 'POST' })\n\n      if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`)\n      }\n\n      const data = await response.json()\n\n      // Send the response from the replit-takeout service back to the client\n      res.status(200).json(data)\n    } catch (error) {\n      console.error('Error processing signup:', error)\n      res\n        .status(500)\n        .json({ message: 'Error processing signup', error: error.message })\n    }\n  } else {\n    // Handle any non-POST requests\n    res.setHeader('Allow', ['POST'])\n    res.status(405).end(`Method ${req.method} Not Allowed`)\n  }\n}\n"
  },
  {
    "path": "pages/api/sprig-console.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next'\n\nfunction check(val: any) {\n  return val === 'Pending' || val === 'Approved'\n}\n\nexport async function getConsoles() {\n  try {\n    const response = await fetch(\n      'https://airbridge.hackclub.com/v0.1/Sprig%20Waitlist/Requests'\n    )\n\n    if (!response.ok) {\n      return 100\n    }\n\n    const data = await response.json()\n\n    const consoleCount = Array.isArray(data)\n      ? data.filter(console => check(console.fields.Status)).length\n      : 100\n\n    return consoleCount\n  } catch (error) {\n    console.error('Error fetching console data:', error)\n    return 100\n  }\n}\n\nexport default async function SprigConsoles(\n  _req: NextApiRequest,\n  res: NextApiResponse\n) {\n  let consoleCount = 100\n  try {\n    consoleCount = await getConsoles()\n  } catch (error) {\n    console.error(error)\n  }\n  res.json(consoleCount)\n}\n"
  },
  {
    "path": "pages/api/stars.ts",
    "content": "import { graphql } from '@octokit/graphql'\nimport { NextApiRequest, NextApiResponse } from 'next/dist/shared/lib/utils'\n\ninterface GitHubStarsResponse {\n  organization: {\n    blot: { stargazerCount: number }\n    sinerider: { stargazerCount: number }\n    sprig: { stargazerCount: number }\n    hackclub: { stargazerCount: number }\n    hackathons: { stargazerCount: number }\n    sprigHardware: { stargazerCount: number }\n    onboard: { stargazerCount: number }\n  }\n}\n\nexport async function fetchStars() {\n  const emptyStats = {\n    sprig: { stargazerCount: 0 },\n    sinerider: { stargazerCount: 0 },\n    sprigHardware: { stargazerCount: 0 },\n    hackclub: { stargazerCount: 0 },\n    hackathons: { stargazerCount: 0 },\n    blot: { stargazerCount: 0 },\n    onboard: { stargazerCount: 0 }\n  }\n\n  if (!process.env.GITHUB_TOKEN) {\n    console.warn(\n      'Note - GITHUB_TOKEN not defined, stars will not be fetched from github'\n    )\n    return emptyStats\n  }\n\n  try {\n    const { organization } = await graphql<GitHubStarsResponse>(\n      `\n        {\n          organization(login: \"hackclub\") {\n            blot: repository(name: \"blot\") {\n              stargazerCount\n            }\n            sinerider: repository(name: \"sinerider\") {\n              stargazerCount\n            }\n            sprig: repository(name: \"sprig\") {\n              stargazerCount\n            }\n            hackclub: repository(name: \"hackclub\") {\n              stargazerCount\n            }\n            hackathons: repository(name: \"hackathons\") {\n              stargazerCount\n            }\n            sprigHardware: repository(name: \"sprig-hardware\") {\n              stargazerCount\n            }\n            onboard: repository(name: \"onboard\") {\n              stargazerCount\n            }\n          }\n        }\n      `,\n      {\n        headers: {\n          authorization: `token ${process.env.GITHUB_TOKEN}`\n        }\n      }\n    )\n    return organization\n  } catch (error) {\n    console.error('Error fetching stars:', error)\n    return emptyStats\n  }\n}\n\nexport default async function Stars(\n  _req: NextApiRequest,\n  res: NextApiResponse\n) {\n  res.status(200).json(await fetchStars())\n}\n"
  },
  {
    "path": "pages/api/steve.ts",
    "content": "import type { NextApiRequest, NextApiResponse } from 'next'\n\nconst steveApiHandler = async (_req: NextApiRequest, res: NextApiResponse) => {\n  const calendarId =\n    'c_e7c63a427761b0f300ede97f432ba4af24033daad26be86da0551b40b7968f00@group.calendar.google.com'\n\n  //This API key is for google calendar and has only read access to Steve\n  const apiKey = 'AIzaSyD_8dEnTDle3WmaoOTvEW6L1GW540FU_wg'\n\n  const allBusyDays = new Set<string>()\n\n  try {\n    const currentDateTime = new Date()\n    const adjustedDateTime = new Date(\n      currentDateTime.getTime() +\n        (currentDateTime.getTimezoneOffset() + 240) * 60 * 1000\n    ) // Adjust to GMT-04\n    const startTime = adjustedDateTime.toISOString()\n    const endTime = new Date(\n      adjustedDateTime.getTime() + 30 * 24 * 60 * 60 * 1000\n    ).toISOString()\n\n    const response = await fetch(\n      `https://www.googleapis.com/calendar/v3/freeBusy?key=${apiKey}`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify({\n          timeMin: startTime,\n          timeMax: endTime,\n          items: [{ id: calendarId }]\n        })\n      }\n    )\n\n    const data = await response.json()\n\n    if (data.error) {\n      return res.status(400).json({ error: data.error.message })\n    }\n\n    // Assuming there are time ranges where the calendar is busy:\n    const busyTimes = data.calendars[calendarId].busy\n\n    // For each busy time range, extract all days that are busy:\n    for (const busy of busyTimes) {\n      let startDate = new Date(busy.start)\n      let endDate = new Date(busy.end)\n\n      // Adjust dates to GMT-04\n      startDate = new Date(\n        startDate.getTime() + (startDate.getTimezoneOffset() + 240) * 60 * 1000\n      )\n      endDate = new Date(\n        endDate.getTime() + (endDate.getTimezoneOffset() + 240) * 60 * 1000\n      )\n\n      while (startDate < endDate) {\n        allBusyDays.add(startDate.toISOString().split('T')[0])\n        startDate = new Date(startDate.getTime() + 24 * 60 * 60 * 1000) // Adding 24 hours for the next date\n      }\n    }\n\n    return res.status(200).json(Array.from(allBusyDays))\n  } catch (error) {\n    return res.status(500).json({ error: 'Failed to fetch busy times.' })\n  }\n}\n\nexport default steveApiHandler\n"
  },
  {
    "path": "pages/api/stickers.ts",
    "content": "import AirtablePlus from 'airtable-plus'\nimport { NextApiRequest, NextApiResponse } from 'next'\n\nconst peopleTable = new AirtablePlus({\n  apiKey: process.env.AIRTABLE_WRITE_API_KEY,\n  baseID: 'apptEEFG5HTfGQE7h',\n  tableName: 'People'\n})\nconst addressesTable = new AirtablePlus({\n  apiKey: process.env.AIRTABLE_WRITE_API_KEY,\n  baseID: 'apptEEFG5HTfGQE7h',\n  tableName: 'Addresses'\n})\n\nexport default async function handler(\n  req: NextApiRequest,\n  res: NextApiResponse\n) {\n  if (req.method === 'POST') {\n    const data = req.body\n\n    let personRecord = (\n      await peopleTable.read({\n        filterByFormula: `{Email} = '${data.email}'`\n      })\n    )[0]\n    if (!personRecord) {\n      personRecord = await peopleTable.create({\n        'Full Name': data.name,\n        Email: data.email\n      })\n    }\n\n    let address = (\n      await addressesTable.read({\n        filterByFormula: `AND({Email} = '${data.email}', {Is Valid?} = '1', {Club} = '')`\n      })\n    )[0]\n\n    if (!address) {\n      address = await addressesTable.create({\n        'Street (First Line)': data.addressFirst,\n        'Street (Second Line)': data.addressSecond,\n        City: data.city,\n        'State/Province': data.state,\n        'Postal Code': data.zipCode,\n        Country: data.country,\n        Person: [personRecord.id]\n      })\n    }\n\n    if (\n      !(\n        address.fields['Street (First Line)'].toLowerCase() ===\n        data.addressFirst.toLowerCase()\n      )\n    ) {\n      address = await addressesTable.create({\n        'Street (First Line)': data.addressFirst,\n        'Street (Second Line)': data.addressSecond,\n        City: data.city,\n        'State/Province': data.state,\n        'Postal Code': data.zipCode,\n        Country: data.country,\n        Person: [personRecord.id]\n      })\n    }\n\n    const url = process.env.MAIL_MISSION_WEBHOOK\n    const body = JSON.stringify({\n      test: false,\n      scenarioRecordID: 'recNDwjb7Zr04Szix',\n      receiverAddressRecordID: address.id,\n      missionNotes: 'Requested via hackclub.com'\n    })\n    fetch(url, {\n      body,\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    })\n      .then(r => {\n        res.json({ status: 'success' })\n      })\n      .catch(error => {\n        console.error(error)\n        res.json({ status: 'error', error })\n      })\n  } else {\n    res.status(405).json({ status: 'error', error: 'Must send POST request' })\n  }\n}\n"
  },
  {
    "path": "pages/api/stuff.ts",
    "content": "import type { NextApiRequest, NextApiResponse } from 'next'\n\nexport default async function stuff(\n  _req: NextApiRequest,\n  res: NextApiResponse\n) {\n  const formData = new FormData()\n\n  formData.append(\n    'token',\n    'xoxc-2210535565-1329510668482-3738018363764-a06090b7e70cef57099ae10c6d18f80013869ef9be48fcc389e5a40c90df2624'\n  )\n  formData.append('date_range', '30d')\n\n  const data = await fetch(\n    'https://hackclub.slack.com/api/team.stats.timeSeries',\n    {\n      method: 'POST',\n      body: formData,\n      headers: {\n        Cookie:\n          'd=xoxd-52SpoJa3LK%2BF%2FZA3OwTuxIhUHfsXCx%2Fq1hpcu1VdiH2OUhPuonSeXAYYGJefTNiJUZE8SjAIEfASlHsdYHeGkg%2FFZ584%2B7JbekY8Mz%2FbOEgEJxhGjRW7miVyqQvbPq3oQlSfwNoXb507TnD5VYOCLYUh3OuK2tc2GnfwC0MgPl9ZsAoDc1caaA%3D%3D'\n      }\n    }\n  ).then(r => r.json())\n\n  res.json(\n    data.stats\n      .sort((a: { ds: number }, b: { ds: number }) => a.ds - b.ds)\n      .reverse()[0]\n  )\n}\n"
  },
  {
    "path": "pages/api/team.ts",
    "content": "import teamMembers from '../../public/team.json'\nimport acknowledgedMembers from '../../public/acknowledged.json'\nimport type { NextApiRequest, NextApiResponse } from 'next'\n\nexport interface TeamMember {\n  name: string\n  department: string\n  role: string | string[]\n  acknowledged?: boolean\n  bio: string\n  slackId: string\n  overrideAvatar: string\n  email: string\n  website: string\n  pronouns: string\n  avatar: string\n  staff?: boolean\n  gapyear?: boolean\n}\n\nexport async function fetchTeam() {\n  return teamMembers as TeamMember[]\n}\n\nexport async function fetchAcknowledged() {\n  return acknowledgedMembers as TeamMember[]\n}\n\nexport default async function handler(\n  _req: NextApiRequest,\n  res: NextApiResponse\n) {\n  res.status(200).json(await fetchTeam())\n}\n"
  },
  {
    "path": "pages/api/winter-rsvp.ts",
    "content": "import type { NextApiRequest, NextApiResponse } from 'next'\nimport AirtablePlus from 'airtable-plus'\n\nconst airtable = new AirtablePlus({\n  baseID: 'app1o9tRo6XulLnsr',\n  apiKey: process.env.AIRTABLE_WRITE_API_KEY,\n  tableName: 'rsvp'\n})\n\nexport default async function handler(\n  req: NextApiRequest,\n  res: NextApiResponse\n) {\n  if (req.method === 'POST') {\n    const rsvp = await airtable.create({\n      Name: req.body.Name,\n      Email: req.body.Email,\n      Age: req.body.Age,\n      IP: req.headers['x-forwarded-for'] || req.socket.remoteAddress\n    })\n    const url = process.env.WOM_SLACK_WEBHOOK_URL\n    const body = JSON.stringify({\n      rsvp\n    })\n    fetch(url, {\n      body,\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    })\n      .then(() => res.status(200).json({ success: true }))\n      .catch(error => {\n        console.error(error)\n        res.json({ status: 'Something went wrong', error })\n      })\n  } else {\n    res.status(405).json({ status: 'error', error: 'Must send POST request' })\n  }\n}\n"
  },
  {
    "path": "pages/arcade/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport React, { useState } from 'react'\nimport { useRouter } from 'next/router'\nimport Head from 'next/head'\nimport Nav from '../../components/nav'\nimport Meta from '@hackclub/meta'\nimport { Box, Text, Flex, Grid, Card, Close, Divider, Heading } from 'theme-ui'\nimport Image from 'next/image'\nimport fs from 'fs'\nimport path from 'path'\nimport { startCase } from 'lodash'\nimport Projects from '../../components/arcade/projects'\n\nimport Ticker from 'react-ticker'\nimport PageVisibility from 'react-page-visibility'\nimport ArcadeFooter from '../../components/arcade/footer'\nimport Balancer from 'react-wrap-balancer'\nimport { Fade } from '../../components/react-reveal-compat'\nimport Announcement from '../../components/announcement'\nimport Link from 'next/link'\nimport { shopParts } from '../api/arcade/shop'\n\nconst styled = `\n@import url(https://fonts.googleapis.com/css2?family=Slackey&family=Emblema+One&family=Gaegu&display=swap);\nbody, html {\n  overflow-x: hidden;\n  }\n.slackey {\n  font-family: \"Slackey\", sans-serif;\n }\n\n .arcade {\n  text-shadow: -4px -4px#FAEFD6,-3px -3px #FAEFD6, -2px -2px #FAEFD6,\n    -2px -2px #FAEFD6, -1px -1px #FAEFD6, -1px -1px #FAEFD6,\n    -1px -1px #FAEFD6, 1px 1px #FAEFD6, 1px 1px #FAEFD6,\n    1px 1px #FAEFD6, 2px 2px #FAEFD6, 4px 4px #FAEFD6,\n    3px 3px #FAEFD6, -8px -8px #09AFB4, -6px -6px #09AFB4,\n    -5px -5px #09AFB4, -4px -4px #09AFB4, -3px -3px #09AFB4,\n    -2px -2px #09AFB4, 2px 2px #09AFB4, 3px 3px #09AFB4,\n    5px 5px #09AFB4, 4px 4px #09AFB4, 7px 7px #09AFB4,\n    6px 6px #09AFB4, 8px 8px #09AFB4, -8px -8px #09AFB4, 9px 9px #09AFB4, -9px -9px #09AFB4, 10px 10px #09AFB4, -10px -10px #09AFB4;\n }\n\n .arcade2 {\n  text-shadow: -4px -4px#FAEFD6,-3px -3px #FAEFD6, -2px -2px #FAEFD6,\n    -2px -2px #FAEFD6, -1px -1px #FAEFD6, -1px -1px #FAEFD6,\n    -1px -1px #FAEFD6, 1px 1px #FAEFD6, 1px 1px #FAEFD6,\n    1px 1px #FAEFD6, 2px 2px #FAEFD6, 4px 4px #FAEFD6,\n    3px 3px #FAEFD6, -8px -8px #09AFB4, -6px -6px #09AFB4,\n    -5px -5px #09AFB4, -4px -4px #09AFB4, -3px -3px #09AFB4,\n    -2px -2px #09AFB4, 2px 2px #09AFB4, 3px 3px #09AFB4,\n    5px 5px #09AFB4, 4px 4px #09AFB4, 7px 7px #09AFB4,\n    6px 6px #09AFB4;\n }\n\n .arcade3 {\n  text-shadow: -4px -4px#FAEFD6,-3px -3px #FAEFD6, -2px -2px #FAEFD6,\n    -2px -2px #FAEFD6, -1px -1px #FAEFD6, -1px -1px #FAEFD6,\n    -1px -1px #FAEFD6, 1px 1px #FAEFD6, 1px 1px #FAEFD6,\n    1px 1px #FAEFD6, 2px 2px #FAEFD6, 4px 4px #FAEFD6,\n    3px 3px #FAEFD6, -8px -8px #09AFB4, -6px -6px #09AFB4,\n    -5px -5px #09AFB4, -4px -4px #09AFB4, -3px -3px #09AFB4,\n    -2px -2px #09AFB4, 2px 2px #09AFB4, 3px 3px #09AFB4,\n    5px 5px #09AFB4, 4px 4px #09AFB4, 7px 7px #09AFB4,\n    6px 6px #09AFB4;\n }\n .emblema {\n    font-family: \"Emblema One\", system-ui;\n }\n\n .gaegu {\n    font-family: \"Gaegu\", sans-serif;\n }\n\n body {\n    background-color: #FAEFD6;\n }\n  \n /* CSS from https://codepen.io/quadbaup/details/rKOKQv */\n.thought {\n    display: flex;\n    background-color: #F8F3F3;\n    padding: 20px;\n    border-radius: 30px;\n    min-width: 40px;\n    max-width: 180px;\n    opacity: 0;\n    height: 100px;\n    margin: 20px;\n    margin-left: -10px;\n    position: relative;\n    align-items: center;\n    justify-content: center;\n    font-size: 12px;\n    /* text-align:center; */\n}\n\n.thought:before,\n.thought:after {\n    content: \"\";\n    background-color: #F8F3F3;\n    border-radius: 50%;\n    display: block;\n    position: absolute;\n    z-index: -1;\n}\n\n.thought:before {\n    width: 44px;\n    height: 44px;\n    top: -12px;\n    left: 28px;\n    box-shadow: -50px 30px 0 -12px #F8F3F3;\n}\n\n.thought:after {\n    bottom: -10px;\n    right: 26px;\n    width: 30px;\n    height: 30px;\n    box-shadow: 40px -34px 0 0 #F8F3F3,\n        -28px -6px 0 -2px #F8F3F3,\n        -24px 17px 0 -6px #F8F3F3,\n        -5px 25px 0 -10px #F8F3F3;\n}\n\n#generate-project-idea {\n  margin-top: -100px;\n}\n\n.talking {\n  animation: talking 1s infinite;\n}\n@keyframes talking {\n  0% {\n      transform: translateY(0px);\n  }\n\n  50% {\n      transform: translateY(-10px);\n  }\n\n  100% {\n      transform: translateY(0px);\n  }\n}\n\n.floaty {\n  animation: float 6s ease-in-out infinite;\n}\n\n@keyframes float {\n\n  from,\n  to {\n      transform: translate(0%, -37%) rotate(-2deg);\n  }\n\n  25% {\n      transform: translate(-2%, -40%) rotate(2deg);\n  }\n\n  50% {\n      transform: translate(0%, -43%) rotate(-1deg);\n  }\n\n  75% {\n      transform: translate(-1%, -40%) rotate(-1deg);\n  }\n}\n\na {\n  color: inherit;\n}\n`\n\nconst Powerups = ({\n  img,\n  text,\n  subtext,\n  fullName,\n  cost,\n  description,\n  fulfillmentDescription,\n  polaroidRotation,\n  ticketRotation,\n  extraTags,\n  ...props\n}) => {\n  const parsedFulfillmentDesc = fulfillmentDescription?.replace(\n    /\\[(.*?)\\]\\((.*?)\\)/g,\n    '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n  )\n  return (\n    <Flex\n      sx={{\n        background: '#09AFB4',\n        borderRadius: '10px',\n        flexDirection: 'column',\n        padding: '20px',\n        position: 'relative',\n        transform: `rotate(${polaroidRotation}deg)`,\n        transitionDuration: '0.5s',\n        '&:hover': {\n          transform: 'scale(1.1)'\n        }\n      }}\n      {...props}\n    >\n      <Flex\n        sx={{\n          background: '#FFEEC6',\n          height: '250px',\n          justifyContent: 'center',\n          alignItems: 'center'\n        }}\n      >\n        <Image\n          src={img}\n          width={360}\n          height={250}\n          style={{ width: '100%', height: 'auto', objectFit: 'contain' }}\n          alt={text}\n        />\n      </Flex>\n      <Flex\n        sx={{\n          marginTop: '20px',\n          flexDirection: 'column'\n        }}\n      >\n        <Text\n          className=\"slackey\"\n          variant=\"headline\"\n          sx={{ color: '#FFEEC6', zIndex: 500 }}\n        >\n          {text}\n        </Text>\n        <Text\n          variant=\"subtitle\"\n          sx={{\n            color: '#FFEEC6',\n            position: 'absolute',\n            bottom: '15px',\n            right: '25px'\n          }}\n        >\n          {subtext}\n        </Text>\n      </Flex>\n      <Text\n        sx={{\n          background: '#FF8C37',\n          px: '20px',\n          color: '#FFEEC6',\n          position: 'absolute',\n          top: '-10px',\n          right: '-12px',\n          zIndex: 2,\n          transform: `rotate(${ticketRotation}deg)`\n        }}\n        variant=\"headline\"\n        className=\"gaegu\"\n      >\n        {cost} {cost === 1 ? 'ticket' : 'tickets'}\n      </Text>\n      {extraTags?.map((tag, i) => {\n        if (tag === 'Limited Supply') {\n          return (\n            <Text\n              key={tag}\n              sx={{\n                background: '#CC6CE7',\n                px: '20px',\n                color: '#FFEEC6',\n                position: 'absolute',\n                top: '-15px',\n                left: '-12px',\n                zIndex: 1,\n                transform: `rotate(${ticketRotation}deg)`\n              }}\n              variant=\"headline\"\n              className=\"gaegu\"\n            >\n              Limited!\n            </Text>\n          )\n        }\n      })}\n      <Text\n        variant=\"headline\"\n        sx={{\n          position: 'absolute',\n          bottom: '-25px',\n          right: '-10px',\n          color: '#FFEEC6',\n          '&:hover': {\n            cursor: 'pointer'\n          }\n        }}\n        onClick={() => {\n          ;(\n            document.getElementById(`${text}-info`) as HTMLDialogElement\n          ).showModal()\n        }}\n      >\n        📦\n      </Text>\n      <dialog\n        id={`${text}-info`}\n        sx={{\n          background: '#09AFB4',\n          borderRadius: '10px',\n          flexDirection: 'column',\n          padding: '30px',\n\n          border: 'none',\n          scrollbarWidth: 'none',\n          maxWidth: '400px',\n          '@media (max-width: 400px)': {\n            maxWidth: '300px'\n          }\n        }}\n      >\n        <Close\n          sx={{\n            '&:hover': { cursor: 'pointer' },\n            position: 'absolute',\n            top: '10px',\n            right: '10px',\n            zIndex: 2\n          }}\n          onClick={() => {\n            ;(\n              document.getElementById(`${text}-info`) as HTMLDialogElement\n            ).close()\n          }}\n        />\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'center',\n            justifyContent: 'center',\n            gap: '10px'\n          }}\n        >\n          <Image\n            src={img}\n            width={360}\n            height={250}\n            style={{\n              maxWidth: '360px',\n              maxHeight: '250px',\n              width: 'auto',\n              height: 'auto',\n              objectFit: 'contain'\n            }}\n            alt={text}\n          />\n          <Balancer>\n            <Text\n              className=\"slackey\"\n              variant=\"headline\"\n              sx={{ color: '#FFEEC6' }}\n            >\n              {fullName}\n            </Text>\n          </Balancer>\n          <Balancer></Balancer>\n          <Divider\n            sx={{\n              width: '50%',\n              background: '#FFEEC6',\n              height: '2px',\n              border: 'none',\n              margin: '10px 0'\n            }}\n          />\n          <Balancer>\n            <Text variant=\"subtitle\" sx={{ color: '#FFEEC6' }}>\n              {description}\n            </Text>\n          </Balancer>\n          <Text\n            variant=\"subtitle\"\n            sx={{ color: '#FFEEC6', fontStyle: 'italic' }}\n            dangerouslySetInnerHTML={{ __html: parsedFulfillmentDesc }}\n          ></Text>\n        </Flex>\n        <Text\n          sx={{\n            background: '#FF8C37',\n            px: '20px',\n            color: '#FFEEC6',\n            position: 'absolute',\n            top: '40px',\n            right: '12px',\n            transform: `rotate(${ticketRotation}deg)`\n          }}\n          variant=\"headline\"\n          className=\"gaegu\"\n        >\n          {cost} {cost === 1 ? 'ticket' : 'tickets'}\n        </Text>\n      </dialog>\n    </Flex>\n  )\n}\n\nconst Intro = ({ title, num, text, img, third, ...props }) => {\n  return (\n    <Box\n      sx={{\n        background: '#FAEFD6',\n        padding: '20px',\n        borderRadius: '5px',\n        position: 'relative',\n        color: '#35290F'\n      }}\n      {...props}\n    >\n      <Text\n        variant=\"title\"\n        className=\"gaegu\"\n        sx={{\n          display: 'block',\n          width: third === 'true' ? ['100%', '100%', '100%', '70%'] : '100%'\n        }}\n      >\n        {title}\n      </Text>\n      <Text\n        variant=\"subtitle\"\n        sx={{\n          width: [\n            'calc(100% - 80px)',\n            'calc(100% - 80px)',\n            'calc(100% - 80px)',\n            'calc(100% - 150px)'\n          ],\n          display: 'block'\n        }}\n      >\n        {text}\n      </Text>\n      <Text\n        variant=\"title\"\n        sx={{\n          position: 'absolute',\n          top: '3px',\n          right: '5px',\n          opacity: '0.2'\n        }}\n        className=\"slackey\"\n      >\n        {num}\n      </Text>\n      <Image\n        src={img}\n        alt=\"Dino drawing\"\n        width={210}\n        height={210}\n        style={{\n          height: 'auto',\n          maxWidth: '210px',\n          position: 'absolute',\n          right: '-20px',\n          bottom: '0'\n        }}\n        sx={{ width: ['35%', '35%', '35%', '50%'] }}\n      />\n    </Box>\n  )\n}\n\nconst Tickets = ({ title, num, text, link, bugEater, ...props }) => {\n  return (\n    <Card\n      variant=\"interactive\"\n      as={link ? 'a' : 'div'}\n      href={link}\n      sx={{\n        background: '#FAEFD6',\n        padding: '20px !important',\n        borderRadius: '5px',\n        position: 'relative',\n        color: '#35290F',\n        border: '3px dashed #5E3414',\n        height: '100%'\n      }}\n      {...props}\n    >\n      <Text\n        className=\"gaegu\"\n        as=\"h1\"\n        sx={{\n          display: 'block',\n          fontSize: [2, 3, 4],\n          marginTop: bugEater ? [null, null, null, '36px'] : '-10px'\n        }}\n      >\n        {title}\n      </Text>\n      <Text\n        as=\"div\"\n        sx={{\n          fontSize: [1, 2, 2],\n          display: 'block'\n        }}\n      >\n        {text}\n      </Text>\n      {bugEater && (\n        <>\n          <Box>\n            <Text\n              id=\"console\"\n              variant=\"caption\"\n              sx={{\n                textAlign: 'center',\n                display: 'block',\n                width: '100%',\n                opacity: 0\n              }}\n            >\n              Click me for ideas!\n            </Text>\n            <Text\n              variant=\"caption\"\n              id=\"console2\"\n              sx={{\n                textAlign: 'center',\n                display: 'block',\n                width: '100%'\n              }}\n            >\n              Click me for ideas!\n            </Text>\n            <Box\n              className=\"hidden\"\n              sx={{\n                textAlign: 'center',\n                color: '#5E3414',\n                transform: [\n                  'scale(1)',\n                  'scale(0.8)',\n                  'scale(0.8)',\n                  'scale(0.8)'\n                ],\n                mt: ['null', '-40px', '-20px', null]\n              }}\n            >\n              <Box\n                onClick={generateProjectIdea}\n                sx={{\n                  justifyContent: 'center',\n                  pt: ['120px', '140px', '140px', '140px'],\n                  pb: [7, 7, 7, 7],\n                  mt: ['40px', '-20px', '10px', '-50px'],\n                  mb: ['40px', '50px', '100px', '-50px'],\n                  display: 'grid',\n                  background:\n                    'url(/arcade/arcade_bg.png) no-repeat center center',\n                  backgroundSize: 'contain',\n                  cursor: 'pointer'\n                }}\n              >\n                <Text\n                  id=\"project-idea\"\n                  className=\"thought\"\n                  sx={{\n                    transform: [\n                      'scale(0.7)',\n                      'scale(1)',\n                      'scale(1)',\n                      'scale(1)'\n                    ],\n                    mb: [\n                      '-40px !important',\n                      '10px !important',\n                      '10px !important',\n                      '10px !important'\n                    ]\n                  }}\n                ></Text>\n                <Image\n                  src=\"https://cloud-ocoecqzgs-hack-club-bot.vercel.app/0screenshot_2024-06-13_at_22.01.02.png\"\n                  className=\"hoverable\"\n                  alt=\"Need an idea?\"\n                  width={400}\n                  height={300}\n                  style={{\n                    margin: '0 auto',\n                    display: 'inline',\n                    width: 'auto',\n                    height: '8em'\n                  }}\n                  sx={{\n                    mb: ['-120px', '-20px', '-30px', '-30px'],\n                    transform: [\n                      'scale(0.7)',\n                      'scale(1)',\n                      'scale(1)',\n                      'scale(1)'\n                    ]\n                  }}\n                  id=\"generate-project-idea\"\n                />\n              </Box>\n              <Box></Box>\n            </Box>\n          </Box>\n        </>\n      )}\n    </Card>\n  )\n}\n\nconst Sticker = ({ st }) => {\n  return (\n    <Box sx={{ position: 'absolute', top: '-270px', left: '0px' }}>\n      <Box\n        sx={{\n          background: '#D0BF97',\n          paddingY: '20px',\n          paddingX: '30px',\n          width: 'fit-content',\n          position: 'relative',\n          borderRadius: '5px',\n          transform: 'rotate(3deg)',\n          zIndex: 4\n        }}\n      >\n        <Flex\n          key={st}\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'center',\n            justifyContent: 'center',\n            img: {\n              objectFit: 'contain',\n              width: [128, 160],\n              height: [128, 160],\n              transition: '.25s transform ease-in-out'\n            }\n          }}\n        >\n          <Image\n            src={`/stickers/${st}`}\n            width={128}\n            height={128}\n            alt={st.split('.')[0]}\n            style={{\n              maxWidth: '100%',\n              height: 'auto'\n            }}\n          />\n          <Text\n            as=\"span\"\n            variant=\"caption\"\n            sx={{\n              fontSize: 2,\n              mt: [2, 3],\n              textAlign: 'center',\n              color: '#FAEFD6'\n            }}\n          >\n            {startCase(st.replace(/\\.(svg|png)/, ''))}\n          </Text>\n        </Flex>\n        <Box\n          sx={{\n            content: '\"hi\"',\n            position: 'absolute',\n            bottom: '-20px', // Position the triangle at the bottom\n            left: '50%',\n            transform: 'translateX(-50%)',\n            width: '0',\n            height: '0',\n            borderLeft: '10px solid transparent',\n            borderRight: '10px solid transparent',\n            borderTop: '20px solid #D0BF97' // Same color as the box background\n          }}\n        />\n      </Box>\n    </Box>\n  )\n}\n\nconst Item = ({ name, img, cost }) => {\n  return (\n    <Flex\n      sx={{\n        border: '2px solid #FAEFD6',\n        bg: 'rgb(255, 239, 214, 0.2)',\n        height: '100px',\n        width: '140px',\n        marginX: '10px',\n        position: 'relative',\n        justifyContent: 'center',\n        alignItems: 'center'\n      }}\n    >\n      <Text\n        variant=\"headline\"\n        className=\"slackey\"\n        sx={{\n          position: 'absolute',\n          bottom: '-10px',\n          left: '10px',\n          color: '#FAEFD6',\n          opacity: 0.2,\n          zIndex: 0\n        }}\n      >\n        {cost}h\n      </Text>\n      <Image\n        src={img}\n        alt={name}\n        width={300}\n        height={300}\n        style={{\n          maxHeight: '100%',\n          width: 'auto',\n          height: 'auto',\n          margin: 'auto',\n          maxWidth: '100%'\n        }}\n        sx={{\n          position: 'relative',\n          zIndex: 1\n        }}\n      />\n    </Flex>\n  )\n}\n\nconst FAQ = ({ question, answer }) => {\n  const parsedAnswer = answer?.replace(\n    /\\[(.*?)\\]\\((.*?)\\)/g,\n    '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n  )\n  return (\n    <Box\n      sx={{\n        background: '#FAEFD6',\n        padding: '20px',\n        borderRadius: '5px',\n        position: 'relative',\n        color: '#35290F',\n        pt: '5px'\n      }}\n    >\n      <Text variant=\"headline\" className=\"gaegu\" sx={{ display: 'block' }}>\n        {question}\n      </Text>\n      <Text\n        variant=\"subtitle\"\n        sx={{\n          display: 'block',\n          fontSize: [1, 2, 2]\n        }}\n        dangerouslySetInnerHTML={{ __html: parsedAnswer }}\n      />\n    </Box>\n  )\n}\nasync function generateProjectIdea() {\n  if (\n    document\n      .querySelector('#generate-project-idea')\n      .classList.contains('disabled')\n  ) {\n    return\n  }\n\n  ;(\n    document.querySelector('#generate-project-idea') as HTMLElement\n  ).style.marginTop = '0px'\n  ;(document.querySelector('#console') as HTMLElement).style.marginTop = '-50px'\n  ;(document.querySelector('#console2') as HTMLElement).style.opacity = '0'\n  ;(document.querySelector('#project-idea') as HTMLElement).style.opacity = '1'\n  document.querySelector('#project-idea').innerHTML =\n    'Arcade has ended! Thanks for playing.'\n}\n\nconst Arcade = ({ stickers = [], carousel = [], highlightedItems = [] }) => {\n  const [showComponent, setShowComponent] = useState(false)\n  const [showNum, setNum] = useState(0)\n  const [showForm, setForm] = useState(false)\n  const [formSent, setFormSent] = useState(false)\n  const [isRevealed, setIsRevealed] = useState(false)\n\n  const router = useRouter()\n  const { query } = router\n\n  const slack = query.param\n\n  const generateRandomNumber = () => {\n    const newRandomNumber = Math.floor(Math.random() * stickers.length) // Generate a random number between 0 and 99\n    setNum(newRandomNumber)\n  }\n\n  const handleMouseEnter = () => {\n    setShowComponent(true)\n  }\n\n  const handleMouseLeave = () => {\n    setShowComponent(false)\n  }\n\n  const mouseEnter = () => {\n    handleMouseEnter()\n    generateRandomNumber()\n  }\n\n  const [pageIsVisible, setPageIsVisible] = useState(true)\n  const handleVisibilityChange = isVisible => {\n    setPageIsVisible(isVisible)\n  }\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Arcade\"\n        description=\"The ultimate summer hackathon for high schoolers. Make projects. Track your hours. Redeem for Prizes.\"\n        image=\"https://cloud-249autgay-hack-club-bot.vercel.app/0frame_70.png\"\n      />\n      <Head>\n        <meta\n          property=\"og:logo\"\n          content=\"https://assets.hackclub.com/icon-rounded.png\"\n          size=\"512x512\"\n        />\n        <script\n          defer\n          data-domain=\"secret.hackclub.dev\"\n          src=\"https://plausible.io/js/script.js\"\n        ></script>\n      </Head>\n      <Nav color=\"dark\" />\n\n      <Box\n        sx={{\n          position: 'relative',\n          zIndex: 1,\n          overflowX: 'hidden',\n          overflowY: 'hidden',\n          paddingTop: '20vh',\n          paddingBottom: '20vh'\n        }}\n      >\n        {slack === 'slack' ? (\n          <Announcement\n            copy=\"You were redirected as we're running a special summer event!\"\n            caption=\"To join our Slack, join ARCADE.\"\n            href=\"/arcade/\"\n            imgSrc=\"https://cloud-gyu8zgkki-hack-club-bot.vercel.app/0_______.png\"\n          />\n        ) : (\n          <></>\n        )}\n\n        <Image\n          src=\"/arcade/beige_bg.png\"\n          alt=\"beige swirly pattern\"\n          width={1200}\n          height={1200}\n          style={{\n            position: 'absolute',\n            width: '110vw',\n            height: 'auto',\n            transform: 'rotate(-30deg)',\n            bottom: '-30vw',\n            right: '-35vw'\n          }}\n          sx={{ display: ['none', 'none', 'none', 'block'] }}\n        />\n        <Grid\n          sx={{\n            gridTemplateColumns: ['1fr', '1fr', '1fr', '1fr 1fr'],\n            pb: ['0vh', '0vh', '0vh', '20vh'],\n            width: '90vw',\n            maxWidth: '1200px',\n            margin: 'auto'\n          }}\n        >\n          <Box\n            sx={{\n              color: '#09AFB4',\n              gap: '10px'\n            }}\n          >\n            <Fade delay={150}>\n              <Box sx={{ textAlign: ['center', 'center', 'center', 'left'] }}>\n                <Image\n                  alt={'GitHub + Hack Club'}\n                  width={212}\n                  height={70}\n                  style={{\n                    height: 'auto',\n                    marginBottom: '16px',\n                    margin: 'auto'\n                  }}\n                  sx={{ width: ['112px', '112px', '212px'] }}\n                  src=\"https://cloud-e3wj9s4pe-hack-club-bot.vercel.app/00combo__1_.png\"\n                />\n              </Box>\n            </Fade>\n            <Fade delay={250}>\n              <Text\n                as=\"h1\"\n                className=\"slackey arcade\"\n                sx={{\n                  color: '#FF5C00',\n                  textAlign: ['center', 'center', 'center', 'left'],\n\n                  fontSize: ['50px', '70px', '80px', '85px']\n                }}\n              >\n                ARCADE\n              </Text>\n            </Fade>\n            {/* <Fade delay={350}>\n              <Text\n                sx={{\n                  display: 'block',\n                  textAlign: ['center', 'center', 'center', 'left'],\n                  py: ['10px', '12px', '13px'],\n                  fontSize: ['40px', '55px', '55px']\n                }}\n                variant=\"title\"\n              >\n                Build something cool.\n              </Text>\n            </Fade> */}\n            <Fade delay={450}>\n              <Text\n                sx={{\n                  display: 'block',\n                  textAlign: ['center', 'center', 'center', 'left'],\n                  py: ['10px', '12px', '13px'],\n                  fontSize: ['40px', '55px', '55px'],\n                  textWrap: 'balance'\n                }}\n                variant=\"title\"\n              >\n                The summer is yours for the making\n                {/* Get free tools\n                <br />\n                & build something cool */}\n                {/* Get free tools to build something cool. */}\n                {/* <br /> */}\n                {/* This summer is yours. */}\n              </Text>\n            </Fade>\n            <Fade delay={550}>\n              {/* <Text\n                sx={{\n                  display: 'block',\n                  textAlign: ['center', 'center', 'center', 'left'],\n                  py: ['10px', '12px', '13px'],\n                  fontSize: ['40px', '55px', '55px']\n                }}\n                variant=\"title\"\n              >\n                This summer is yours.\n              </Text> */}\n            </Fade>\n            <Fade delay={650}>\n              {showForm ? (\n                <></>\n              ) : (\n                <Text\n                  variant=\"subtitle\"\n                  className=\"gaegu\"\n                  sx={{\n                    textAlign: ['center', 'center', 'center', 'left'],\n                    width: '100%',\n                    display: 'block'\n                  }}\n                >\n                  The Arcade closed September 1st, but you can still join the{' '}\n                  <a\n                    href=\"https://slack.hackclub.com\"\n                    target=\"_blank\"\n                    sx={{ color: 'inherit' }}\n                    rel=\"noreferrer\"\n                  >\n                    Hack Club Slack\n                  </a>\n                  !\n                </Text>\n              )}\n            </Fade>\n          </Box>\n          <Flex\n            sx={{\n              position: 'relative',\n              justifyContent: 'center',\n              alignItems: 'center'\n            }}\n          >\n            <Image\n              src=\"/arcade/prizes.png\"\n              alt=\"Arcade prizes\"\n              width={800}\n              height={600}\n              style={{ height: 'auto' }}\n              sx={{\n                zIndex: 10,\n                width: ['80%', '70%', '65%', '80%'],\n                mt: ['180px', '220px', '240px', '240px'],\n                mb: ['-100px', '-150px', '-200px', '-100px']\n              }}\n              className=\"floaty\"\n            />\n          </Flex>\n        </Grid>\n      </Box>\n      <Box\n        sx={{\n          width: '100vw',\n          margin: 'auto',\n          background:\n            '#09AFB4 url(/arcade/blue_bg.svg) no-repeat center center',\n          backgroundSize: 'cover',\n          position: 'relative',\n          paddingTop: '0',\n          paddingBottom: '5vw',\n          color: '#FAEFD6',\n          zIndex: 2\n        }}\n      >\n        <Image\n          src=\"/arcade/blue_top.svg\"\n          alt=\"blue scribble pattern\"\n          width={1200}\n          height={300}\n          style={{\n            width: '100%',\n            height: 'auto',\n            position: 'absolute',\n            top: '-20vw'\n          }}\n        />\n        <Box\n          sx={{\n            width: '90vw',\n            maxWidth: '1200px',\n            margin: 'auto',\n            pt: 1\n          }}\n        >\n          {/* <Text\n            variant=\"headline\"\n            sx={{ display: 'block', textAlign: 'center' }}\n          >\n            Calling high school makers: Join{' '}\n            <Text className=\"slackey arcade3\" sx={{ color: '#5E3414' }}>\n              ARCADE\n            </Text>\n            .\n          </Text> */}\n          <Text\n            variant=\"title\"\n            sx={{ display: 'block', textAlign: 'center', pb: 3 }}\n          >\n            {/* What are you waiting for? */}\n            How to play\n          </Text>\n          <Flex\n            sx={{\n              flexDirection: 'column',\n              alignItems: 'center',\n              justifyContent: 'center',\n              gap: '30px',\n              pb: [3, 3, 6, 6]\n            }}\n          >\n            <Flex\n              sx={{\n                justifyContent: 'center',\n                width: ['100%', '100%', '50%', '50%'],\n                position: 'relative'\n              }}\n            >\n              <Intro\n                title=\"Work on projects\"\n                text=\"Hack on something cool! Examples: making your own PCB, building your own site, creating an app.\"\n                num=\"1\"\n                img=\"/arcade/o2.png\"\n              />\n              <Image\n                src=\"/arcade/a1.png\"\n                alt=\"\"\n                width={100}\n                height={100}\n                style={{\n                  width: '100px',\n                  height: 'auto',\n                  position: 'absolute',\n                  left: '-110px',\n                  bottom: '0'\n                }}\n                sx={{ display: ['none', 'none', 'block', 'block'] }}\n              />\n              <Image\n                src=\"/arcade/a2.png\"\n                alt=\"arrow\"\n                width={90}\n                height={90}\n                style={{\n                  width: '90px',\n                  height: 'auto',\n                  position: 'absolute',\n                  right: '-120px',\n                  bottom: '0'\n                }}\n                sx={{ display: ['none', 'none', 'block', 'block'] }}\n              />\n              {/* <Text\n                sx={{\n                  textAlign: 'center',\n                  fontSize: [2, 4, 5],\n                  width: '100%',\n                  display: 'block',\n                  transform: [\n                    'rotate(0deg)',\n                    'rotate(0deg)',\n                    'rotate(3deg)',\n                    'rotate(3deg)'\n                  ],\n                  position: 'absolute',\n                  left: '0vw',\n                  bottom: '-50px',\n                  zIndex: '3'\n                }}\n                className=\"gaegu\"\n              >\n                <Text sx={{ background: '#5E3414', px: 2, py: 1 }}>\n                  Hack. Rinse. Repeat.\n                </Text>\n              </Text> */}\n            </Flex>\n            <Flex\n              sx={{\n                justifyContent: 'space-between',\n                width: '100%',\n                gap: '30px',\n                flexDirection: ['column', 'column', 'row', 'row'],\n                position: 'relative'\n              }}\n            >\n              <Intro\n                title=\"Bank your hours\"\n                text={\n                  <>\n                    Join the{' '}\n                    <a\n                      href=\"https://slack.hackclub.com\"\n                      target=\"_blank\"\n                      sx={{ color: 'inherit' }}\n                      rel=\"noreferrer\"\n                    >\n                      Hack Club Slack\n                    </a>{' '}\n                    and use /hack in #arcade to log your hours! You earn a\n                    ticket for each hour spent!\n                  </>\n                }\n                num=\"2\"\n                img=\"/arcade/o1.png\"\n              />\n              <Intro\n                title=\"Redeem your Prizes\"\n                text=\"Use your tickets to buy prizes for your next project! Such as Arduino kits, drawing tablets, and more!\"\n                num=\"3\"\n                img=\"/arcade/o7.png\"\n                third=\"true\"\n              />\n              <Image\n                src=\"/arcade/a3.png\"\n                alt=\"arrow\"\n                width={250}\n                height={250}\n                style={{\n                  width: '250px',\n                  height: 'auto',\n                  position: 'absolute',\n                  left: '35vw',\n                  bottom: '-120px'\n                }}\n                sx={{ display: ['none', 'none', 'block', 'block'] }}\n              />\n            </Flex>\n          </Flex>\n          <Intro\n            title=\"Build your next project!\"\n            text=\"What will you build with the Prizes you redeemed?\"\n            num=\"4\"\n            img=\"/arcade/o4.png\"\n            sx={{\n              display: ['block', 'block', 'none', 'none'],\n              mt: '30px',\n              mb: '20px',\n              img: {\n                position: 'absolute',\n                bottom: '-10px',\n                maxWidth: '300px',\n                width: '45%'\n              }\n            }}\n          />\n          <Text\n            sx={{\n              textAlign: 'center',\n              fontSize: [2, 4, 5],\n              width: '100%',\n              display: 'block',\n              transform: [\n                'rotate(0deg)',\n                'rotate(0deg)',\n                'rotate(3deg)',\n                'rotate(3deg)'\n              ]\n            }}\n            className=\"gaegu\"\n          >\n            <Text sx={{ background: '#5E3414', px: 2, py: 1 }}>\n              Make stuff. Get stuff. Repeat.\n            </Text>\n          </Text>\n        </Box>\n        <PageVisibility onChange={handleVisibilityChange}>\n          {pageIsVisible && (\n            <Box\n              sx={{\n                transform: 'rotate(-7deg) scale(1.1)',\n                zIndex: 10,\n                position: 'relative',\n                marginBottom: ['-900px', '-820px', '-850px', '-1020px'],\n                marginTop: ['120px', '120px', '120px', '150px'],\n                width: ['110vw', '105vw']\n              }}\n            >\n              <Ticker speed={5}>\n                {() => (\n                  <Box as=\"div\" sx={{ display: 'flex', height: 'fit-content' }}>\n                    {carousel.map((item, i) => (\n                      <Item\n                        img={item.imageURL}\n                        cost={item.hours}\n                        key={i}\n                        name={item.name}\n                      />\n                    ))}\n                  </Box>\n                )}\n              </Ticker>\n            </Box>\n          )}\n        </PageVisibility>\n        <Image\n          src=\"/arcade/blue_bottom.svg\"\n          alt=\"blue triangle\"\n          width={1200}\n          height={300}\n          style={{\n            width: '100%',\n            height: 'auto',\n            position: 'absolute',\n            bottom: '-16vw'\n          }}\n        />\n      </Box>\n\n      <Flex\n        sx={{\n          width: '90vw',\n          maxWidth: '1200px',\n          margin: 'auto',\n          paddingTop: '18vw',\n          paddingBottom: '40px',\n          gap: ['10px', '10px', '10px', '8vw'],\n          flexWrap: ['wrap', 'wrap', 'wrap', 'nowrap'],\n          color: '#5E3414',\n          zIndex: 12,\n          position: 'relative'\n        }}\n      >\n        {/* <Balancer> */}\n        <Text\n          variant=\"headline\"\n          sx={{\n            lineHeight: '1.5',\n            display: 'block',\n            position: 'relative',\n            textAlign: ['center', 'center', 'center', 'left'],\n            zIndex: 3\n          }}\n        >\n          Get{' '}\n          <Text\n            onMouseEnter={mouseEnter}\n            onMouseLeave={handleMouseLeave}\n            sx={{\n              cursor: 'pointer',\n              position: 'relative',\n              bg: '#09AFB4',\n              transform: 'rotate(-3deg) scale(1.1)',\n              py: '2px',\n              px: '4px',\n              borderRadius: '2px',\n              color: '#FAEFD6',\n              display: 'inline-block',\n              mx: '6px',\n              justifyContent: 'space-between'\n            }}\n          >\n            {showComponent && <Sticker st={stickers[showNum]} />}\n            free stickers\n          </Text>{' '}\n          and code with other high schoolers!\n        </Text>\n      </Flex>\n      <Projects />\n      <Box\n        sx={{\n          background: 'linear-gradient(0deg, #A5C47F 0%, #09AFB4 100%)',\n          position: 'relative'\n        }}\n      >\n        <Box\n          sx={{\n            width: '90vw',\n            maxWidth: '1200px',\n            margin: 'auto',\n            py: '50px'\n          }}\n        >\n          <Text\n            variant=\"headline\"\n            sx={{\n              color: '#FAEFD6',\n              textAlign: 'center',\n              display: 'block',\n              fontSize: [2, 4, 5]\n            }}\n          >\n            One hour at a time,\n          </Text>\n          <Text\n            variant=\"title\"\n            sx={{ color: '#FAEFD6', textAlign: 'center', display: 'block' }}\n            className=\"gaegu\"\n          >\n            What will{' '}\n            <Text\n              sx={{\n                background: '#35290F',\n                py: '1px',\n                px: '10px',\n                pb: '5px',\n                lineHeight: '1.1em',\n                display: 'inline-block',\n                transform: 'rotate(20deg)',\n                position: 'relative'\n              }}\n            >\n              you\n            </Text>{' '}\n            make this summer?\n          </Text>\n          <Grid\n            sx={{\n              gridTemplateColumns: [\n                '1fr',\n                '1fr 1fr',\n                '1fr 1fr',\n                '1fr 1fr 1fr '\n              ],\n              marginTop: '25px',\n              py: '5vh',\n              alignItems: 'stretch'\n            }}\n          >\n            <Tickets\n              title=\"Build whatever you want!\"\n              text={\n                <>\n                  <p>\n                    Any technical project counts. You could build an AR game,\n                    pixel art display, drawing robot, and more! Anytime you work\n                    on your project, start the hack hour timer. You earn a\n                    ticket for every hour you spend on your project.\n                  </p>\n                  <Heading as=\"h4\" my={0}>\n                    Don't know where to start?\n                  </Heading>\n                  <ul>\n                    <li>\n                      <Link href=\"https://boba.hackclub.com/\" target=\"_blank\">\n                        Boba drops:\n                      </Link>{' '}\n                      Build a website, get boba!\n                    </li>\n                    <li>\n                      <Link\n                        href=\"https://jams.hackclub.com/jam/wizard-orpheus\"\n                        target=\"_blank\"\n                      >\n                        Wizard Orpheus:\n                      </Link>{' '}\n                      Build a text-based game with AI\n                    </li>\n                    <li>\n                      <Link href=\"/bin\" target=\"_blank\">\n                        The Bin:\n                      </Link>{' '}\n                      Build an online circuit, get the parts for free!\n                    </li>\n                    <li>\n                      <Link href=\"/sprig\" target=\"_blank\">\n                        Sprig:\n                      </Link>{' '}\n                      Build a JS game, play it on your own console\n                    </li>\n                    <li>\n                      <Link href=\"/onboard\" target=\"_blank\">\n                        OnBoard:\n                      </Link>{' '}\n                      Design a PCB, get a $100 grant\n                    </li>\n                    <li>\n                      <Link href=\"https://fraps.hackclub.com\" target=\"_blank\">\n                        Hackaccino:\n                      </Link>{' '}\n                      Build a 3D Website and get a free frappuccino! ☕\n                    </li>\n                    <li>\n                      <a href=\"https://blot.hackclub.com/\">Blot:</a> Write code.\n                      Make art. Get a drawing machine.\n                    </li>\n                    <li>\n                      <a href=\"https://cider.hackclub.com\">Cider:</a> Make a\n                      mobile app, get an Apple Developer account\n                    </li>\n                    <li>\n                      <a href=\"https://easel.hackclub.com/orpheus-finds-easel\">\n                        Easel:\n                      </a>{' '}\n                      Write a programming language, receive fudge!\n                    </li>\n                  </ul>\n                </>\n              }\n              num=\"Infinite\"\n              sx={{\n                gridColumn: ['', 'span 2', 'span 2', 'span 2'],\n                h1: {\n                  fontSize: [3, 4, 5]\n                },\n                p: {\n                  fontSize: [2, 2, 3],\n                  display: 'block',\n                  pb: 2\n                },\n                minHeight: ['700px', '700px', '700px', 'auto']\n              }}\n            />\n            <Tickets\n              title=\"Not sure what to make?\"\n              bugEater={true}\n              text={<>Click me for ideas!</>}\n              sx={{\n                '&ul>li': {\n                  color: 'inherit'\n                },\n                gridColumn: ['span 2', 'span 2', 'span 2', 'span 1'],\n                minHeight: 'auto'\n              }}\n            />\n            <Image\n              src=\"/arcade/r5.png\"\n              alt=\"\"\n              width={210}\n              height={210}\n              style={{\n                height: 'auto',\n                maxWidth: '210px',\n                position: 'absolute',\n                right: '10px',\n                top: '0'\n              }}\n              sx={{\n                width: ['35%', '35%', '35%', '50%'],\n                display: ['none', 'none', 'none', 'block']\n              }}\n            />\n          </Grid>\n        </Box>\n        <Image\n          src=\"/arcade/yellow_bottom.svg\"\n          alt=\"jig jag yellow design\"\n          width={1200}\n          height={200}\n          style={{\n            width: '100%',\n            height: 'auto',\n            position: 'absolute',\n            left: 0,\n            bottom: '-10vw',\n            zIndex: 3\n          }}\n        />\n      </Box>\n      <Box\n        sx={{\n          background: 'url(/arcade/brown_bg.svg) no-repeat center center',\n          backgroundSize: 'cover',\n          pt: '30vh',\n          color: '#5E3414',\n          position: 'relative'\n        }}\n      >\n        <Image\n          src=\"/arcade/o5.png\"\n          alt=\"\"\n          width={310}\n          height={310}\n          style={{\n            height: 'auto',\n            maxWidth: '310px',\n            position: 'absolute',\n            right: '10px',\n            top: '40px',\n            zIndex: 0\n          }}\n          sx={{\n            width: ['45%', '45%', '45%', '60%'],\n            display: ['none', 'none', 'none', 'block']\n          }}\n        />\n        <Image\n          src=\"/arcade/o6.png\"\n          alt=\"\"\n          width={210}\n          height={210}\n          style={{\n            height: 'auto',\n            maxWidth: '210px',\n            position: 'absolute',\n            left: '10px',\n            top: '70px',\n            zIndex: 0\n          }}\n          sx={{\n            width: ['30%', '30%', '30%', '40%'],\n            display: ['none', 'none', 'none', 'block']\n          }}\n        />\n\n        <Box\n          sx={{\n            width: '90vw',\n            maxWidth: '950px',\n            margin: 'auto',\n            textAlign: 'center',\n            mt: '-50px'\n            // pb: '50px'\n          }}\n          id=\"shop\"\n        >\n          <Balancer>\n            <Text variant=\"title\" sx={{ display: 'block' }}>\n              <Text\n                //  onClick={handleButtonClick}\n                sx={{\n                  background: '#FF8C37',\n                  color: '#FFEEC6',\n                  py: '1px',\n                  px: '10px',\n                  pb: '5px',\n                  lineHeight: '1.1em',\n                  display: 'inline-block',\n                  transform: 'rotate(-5deg)',\n                  position: 'relative'\n                }}\n              >\n                Prizes\n              </Text>{' '}\n              to powerup your next project!\n            </Text>\n          </Balancer>\n          <Text\n            variant=\"subtitle\"\n            className=\"gaegu\"\n            sx={{ mt: 2, display: 'block' }}\n          >\n            Redeem these with your tickets! For high schoolers (or younger)\n            only.\n          </Text>\n\n          {/* <Text\n            variant=\"caption\"\n            className=\"gaegu\"\n            sx={{ mt: 2, display: 'block' }}\n          >\n            All physical items only fulfillable where Amazon can be shipped\n            unless otherwise stated.\n          </Text> */}\n          <Grid\n            sx={{\n              pt: '50px',\n              gridTemplateColumns: ['1fr', '1fr 1fr', '1fr 1fr', '1fr 1fr 1fr'],\n              gap: '50px'\n            }}\n          >\n            {highlightedItems.map((item, i) => (\n              <Powerups\n                img={item['Image URL']}\n                text={item['Name']}\n                subtext={item['Small Name']}\n                fullName={item['Full Name']}\n                cost={item['Cost Hours']}\n                description={item['Description']}\n                fulfillmentDescription={item['Fulfillment Description']}\n                extraTags={item['Extra tags']}\n                polaroidRotation={\n                  (2 + Math.random() * 4) * (i % 2 === 0 ? 1 : -1)\n                }\n                ticketRotation={\n                  (12 + Math.random() * 14) * (Math.random() > 0.5 ? 1 : -1)\n                }\n                key={i}\n              />\n            ))}\n          </Grid>\n          <Box\n            as=\"a\"\n            href=\"/arcade/shop\"\n            sx={{\n              backgroundColor: '#FF8C37',\n              color: '#FAEFD6',\n              borderRadius: '5px',\n              border: 'none',\n              fontSize: ['24px', '28px', '32px'],\n              px: '20px',\n              py: '15px',\n              mt: 4,\n              display: 'block',\n              transitionDuration: '0.3s',\n              textDecoration: 'none',\n              '&:hover': {\n                transform: 'scale(1.05)'\n              }\n            }}\n            className=\"slackey\"\n          >\n            See all prizes!\n          </Box>\n          <Text\n            className=\"gaegu\"\n            variant=\"subtitle\"\n            sx={{ display: 'block', fontWeight: 'bold' }}\n          >\n            This is just a{' '}\n            <Text\n              sx={{\n                background: '#FF8C37',\n                color: '#FFEEC6',\n                py: '1px',\n                px: '10px',\n                pb: '5px',\n                lineHeight: '1.1em',\n                display: 'inline-block',\n                position: 'relative'\n              }}\n            >\n              sneak peek\n            </Text>\n            ...new items will be added over the summer!{' '}\n          </Text>\n        </Box>\n        <Box\n          sx={{\n            position: 'relative',\n            background: '#09AFB4',\n            display: 'block',\n            mt: '100px',\n            pb: '100px'\n          }}\n        >\n          <Image\n            src=\"/arcade/blue_top.png\"\n            alt=\"blue scribble pattern\"\n            width={1200}\n            height={300}\n            style={{\n              width: '100%',\n              height: 'auto',\n              position: 'absolute',\n              top: '-8vw',\n              zIndex: 0\n            }}\n          />\n          <Box\n            sx={{\n              width: '90vw',\n              maxWidth: '1200px',\n              margin: 'auto',\n              pt: 2,\n              color: '#FAEFD6'\n            }}\n          >\n            <Text\n              variant=\"title\"\n              className=\"slackey\"\n              sx={{\n                textAlign: 'center',\n                width: '100%',\n                display: 'block',\n                marginTop: '25px'\n              }}\n            >\n              F.A.Q.\n            </Text>\n            <Grid\n              sx={{\n                gridTemplateColumns: ['1fr', '1fr', '1fr', '1fr 1fr'],\n                // width: '100%',\n                width: '90vw',\n                maxWidth: '1200px',\n                margin: 'auto',\n                mt: '50px'\n              }}\n            >\n              <FAQ\n                question=\"Who is eligible?\"\n                answer=\"You need to be a high schooler (or younger). You just need a GitHub account & a Slack account to participate. Different prizes have different country restrictions.\"\n              />\n              <FAQ\n                question=\"What types of projects count?\"\n                answer=\"Projects need to be open source (ie. linked to a GitHub repo) & have a way for people to experience it (ie. a game, a website, etc). At the end, each 'scrap' of your project will be put together in a timeline, so make sure to document your progress! Check the [constitution](https://github.com/hackclub/arcade-constitution) for details on what counts.\"\n              />\n              <FAQ\n                question=\"How many projects can I build?\"\n                answer=\"You can submit as many projects as you make. We just count the hours!\"\n              />\n              <FAQ\n                question=\"How much does it cost?\"\n                answer=\"100% free – all the prizes are donated to us or paid for by us! Some shipments may have customs charges that we can't cover depending on your country.\"\n              />\n              <FAQ\n                question=\"I need help!\"\n                answer=\"Get it in the #arcade-help channel of the [Hack Club Slack](https://hackclub.com/slack). Alternatively, reach out to [arcade@hackclub.com](mailto:arcade@hackclub.com)\"\n              />\n              <FAQ\n                question=\"My hours aren't counted!\"\n                answer=\"We have human review on all your amazing work! Your 'scraps' may take a few days to review, but we'll get to it.\"\n              />\n              <FAQ\n                question=\"Does a team project count?\"\n                answer=\"We count the hours of work you put in, so make sure to post 'scraps' of your work & show that it was you doing the work.\"\n              />\n              <FAQ\n                question=\"What about school work or a job?\"\n                answer=\"The arcade is about the joy of building for the sake of building. If you're building something for school or work we can't count it.\"\n              />\n              <FAQ\n                question=\"What counts as a scrap?\"\n                answer=\"Code needs a commit! Things like sprig or blot share links also work. 3D models should also go on a host like Printables or Github.\"\n              />\n            </Grid>\n          </Box>\n          <Flex\n            sx={{\n              width: ['70vw', '50vw', '60vw', '70vw'],\n              maxWidth: '1200px',\n              ml: ['10vw'],\n\n              paddingTop: '50px',\n              marginBottom: '-50px',\n              gap: ['10px', '10px', '2vw', '0vw'],\n              flexDirection: 'column'\n            }}\n          >\n            {/* <Balancer> */}\n            <Text\n              variant=\"headline\"\n              sx={{\n                lineHeight: '1.5',\n                display: 'block',\n                textAlign: ['center', 'center', 'center', 'left'],\n                margin: ['auto', 'auto', 'auto', '0px'],\n                width: '100%',\n                color: '#FAEFD6'\n              }}\n            >\n              Join{' '}\n              <Text className=\"slackey arcade2\" sx={{ color: '#FF5C00' }}>\n                ARCADE\n              </Text>\n              .\n              <br />\n              Build real projects. <br /> Share it with friends.\n            </Text>\n          </Flex>\n          <Image\n            src=\"/arcade/r6.png\"\n            alt=\"Dino!\"\n            width={210}\n            height={210}\n            style={{\n              height: 'auto',\n              maxWidth: '210px',\n              position: 'absolute',\n              right: '20px',\n              bottom: '0'\n            }}\n            sx={{ width: ['35%', '35%', '35%', '50%'] }}\n          />\n        </Box>\n      </Box>\n      <ArcadeFooter />\n      <style>{styled}</style>\n    </>\n  )\n}\n\nexport default Arcade\n\nexport async function getStaticProps() {\n  const stickersDir = path.join(process.cwd(), 'public', 'stickers')\n  const stickers = fs\n    .readdirSync(stickersDir)\n    .filter(sticker => sticker !== 'hero.jpg')\n\n  let carousel = []\n  let highlightedItems = []\n\n  // Only fetch shop data if API key is available\n  if (process.env.AIRTABLE_API_KEY) {\n    try {\n      const items = await shopParts()\n\n      carousel = items\n        .map(record => ({\n          hours: record['Cost Hours'] || 0,\n          imageURL: record['Image URL'] || '',\n          enabledCarousel: record['Enabled Carousel'] || false\n        }))\n        .filter(item => item.enabledCarousel)\n        .filter(item => item.imageURL !== '')\n\n      highlightedItems = items\n        .filter(item => item['Enabled Highlight'])\n        .sort((_a, _b) => Math.random() - 0.5 > 0)\n        .map(record => ({\n          'Image URL': record['Image URL'] || null,\n          Name: record['Name'] || null,\n          'Small Name': record['Small Name'] || null,\n          'Full Name': record['Full Name'] || null,\n          'Cost Hours': record['Cost Hours'] || null,\n          Description: record['Description'] || null,\n          'Fulfillment Description': record['Fulfillment Description'] || null,\n          'Extra tags': record['Extra tags'] || []\n        }))\n    } catch (error) {\n      console.error('Airtable fetch failed:', error)\n    }\n  } else {\n    console.log('AIRTABLE_API_KEY not defined, using empty shop data')\n  }\n\n  return {\n    props: {\n      stickers,\n      highlightedItems,\n      carousel\n    }\n  }\n}\n"
  },
  {
    "path": "pages/bin/gallery.tsx",
    "content": "/** @jsxImportSource theme-ui */\n\nimport BinPost from '../../components/bin/GalleryPosts'\nimport styles from '../../public/bin/style/gallery.module.css'\nimport Script from 'next/script'\nimport Nav from '../../components/bin/nav'\nimport Footer from '../../components/footer'\nimport PartTag from '../../components/bin/PartTag'\nimport { useEffect, useState } from 'react'\n\nexport async function getStaticProps() {\n  const host =\n    process.env.NODE_ENV === 'development'\n      ? 'http://localhost:3000'\n      : 'https://hackclub.com'\n  const res = await fetch(`${host}/api/bin/gallery/posts/`)\n  const posts = await res.json()\n\n  const filteredPosts = Array.isArray(posts)\n    ? posts.filter(\n        post => post.status === 'Accepted' && post.parts && !post.hide\n      )\n    : []\n\n  //Tags\n  const resTag = await fetch(`${host}/api/bin/gallery/tags/`)\n  const tags = await resTag.json()\n\n  const filteredTags = Array.isArray(tags) ? tags.filter(tag => !tag.hide) : []\n  return {\n    props: { posts: filteredPosts, tags: filteredTags }\n  }\n}\n\nfunction Gallery({ posts = [], tags = [] }) {\n  const [allPosts, setAllPosts] = useState([])\n  const [filterPosts, setFilterPosts] = useState([])\n  const [filterParts, setFilterParts] = useState([])\n\n  useEffect(() => {\n    setAllPosts(posts)\n    setFilterParts([])\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [])\n\n  useEffect(() => {\n    setFilterPosts(\n      allPosts.filter(\n        post =>\n          post.parts && filterParts.every(part => post.parts.includes(part))\n      )\n    )\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [filterParts])\n\n  const addFilter = partID => {\n    setFilterParts(prevParts => {\n      if (!prevParts.includes(partID)) {\n        return [...prevParts, partID]\n      }\n      return prevParts\n    })\n  }\n\n  const removeFilter = partID => {\n    setFilterParts(prevParts => {\n      return prevParts.filter(id => id !== partID)\n    })\n  }\n\n  return (\n    <section className=\"page\">\n      <div className={styles.background}></div>\n      <Script src=\"https://awdev.codes/utils/hackclub/orph.js\"></Script>\n\n      <div className={styles.header_div}>\n        <Nav />\n        <h1 className={styles.title}>Bin Gallery</h1>\n        <p className={styles.sub_title}>A display of all of bin's projects</p>\n      </div>\n      <div className={styles.text_container}>\n        {' '}\n        <span className={styles.first}>Want to add to the gallery? </span>\n        <span\n          className={styles.second}\n          onClick={() => (window.location.href = '/bin')}\n        >\n          Create a bin project in wokwi{' '}\n        </span>\n        <span className={styles.third}>\n          and your project will be added to the gallery!\n        </span>\n        <br />\n      </div>\n      <span className={styles.tag_text}>Search By Tag:</span>\n      <div className={styles.tag_search_container}>\n        {tags.map(tag => {\n          return (\n            <PartTag\n              partID={tag.ID}\n              key={tag.ID}\n              search={true}\n              addFilter={addFilter}\n              removeFilter={removeFilter}\n            />\n          )\n        })}\n      </div>\n\n      <div className={styles.feed}>\n        {filterPosts.map(post => {\n          return (\n            <BinPost\n              key={post.ID}\n              id={post.ID}\n              title={post.title}\n              desc={post.desc}\n              slack={post.slack}\n              link={post.link}\n              date={post.created}\n              parts={post.parts}\n            />\n          )\n        })}\n      </div>\n      <Footer />\n    </section>\n  )\n}\n\nexport default Gallery\n"
  },
  {
    "path": "pages/bin/prelaunch.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport {\n  Box,\n  Container,\n  Text,\n  Heading,\n  Card,\n  Flex,\n  Image,\n  Link,\n  Button\n} from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../../components/nav'\nimport { useEffect, useState, useRef } from 'react'\nimport Footer from '../../components/footer'\nimport { keyframes } from '@emotion/react'\nimport RsvpForm from '../../components/bin/rsvp-form'\nimport ForceTheme from '../../components/force-theme'\nimport JSConfetti from 'js-confetti'\nimport Sparkles from '../../components/sparkles'\nimport Icon from '@hackclub/icons'\nimport Announcement from '../../components/announcement'\nimport { TypeAnimation } from 'react-type-animation'\n\nconst RsvpCount = () => {\n  const targetRSVPs = 500\n  const [rsvpCount, setRsvpCount] = useState(0)\n  useEffect(() => {\n    const fetchRsvpCount = async () => {\n      // const url = 'https://api2.hackclub.com/v0.1/The Bin/rsvp'  <- switch to this once we have api2 back up and running\n      const url = '/api/bin/rsvp'\n      let results = 0\n      try {\n        results = await fetch(url).then(r => r.json())\n      } catch (e) {\n        console.error('Failed to fetch bin RSVP count', e)\n      }\n      setRsvpCount(results)\n    }\n    fetchRsvpCount()\n  }, [])\n\n  if (rsvpCount < targetRSVPs) {\n    return <Text>{targetRSVPs - rsvpCount} RSVPs until the start of...</Text>\n  } else {\n    return <Text>{rsvpCount} have already RSVP'd to...</Text>\n  }\n}\n\nconst OnboardCount = () => {\n  const [onboardCount, setOnboardCount] = useState(200)\n\n  useEffect(() => {\n    const fetchOnboardCount = async () => {\n      const url = '/api/onboard/p/count'\n      const results = await fetch(url).then(r => r.json())\n      setOnboardCount(results.count)\n    }\n    fetchOnboardCount()\n  }, [])\n\n  return <Text>{onboardCount}</Text>\n}\n\nconst spin = keyframes({\n  from: { transform: 'rotate(0deg)' },\n  to: { transform: 'rotate(360deg)' }\n})\nconst wobble = keyframes({\n  '0%': { transform: 'rotate(15deg)' },\n  '50%': { transform: 'scale(1.1)' },\n  '100%': { transform: 'rotate(20deg)' }\n})\n\nconst bounce = keyframes({\n  '0%': { transform: 'scaleX(100%) scaleY(100%)' },\n  '50%': { transform: 'scaleX(115%) scaleY(90%)' },\n  '100%': { transform: 'scaleX(100%) scaleY(100%)' }\n})\n\nconst slideIn = keyframes({\n  '0%': { transform: 'translateX(-100%)', opacity: 0 },\n  '100%': { transform: 'translateX(0);', opacity: 1 }\n})\n\nconst slideOut = keyframes({\n  '100%': { transform: 'translateX(-100%)', opacity: 0 },\n  '0%': { transform: 'translateX(0);', opacity: 1 }\n})\n\nconst fadeUp = keyframes({\n  '0%': { transform: 'translateY(30px)', opacity: 0 },\n  '100%': { transform: 'translateY(0)', opacity: 1 }\n})\n\nfunction crunch() {\n  const crunchAudioUrls = [\n    'https://cloud-fwf97jf44-hack-club-bot.vercel.app/0crunch_4_audio.mp4',\n    'https://cloud-fwf97jf44-hack-club-bot.vercel.app/1crunch_3_audio.mp4',\n    'https://cloud-fwf97jf44-hack-club-bot.vercel.app/2crunch_2_audio.mp4',\n    'https://cloud-fwf97jf44-hack-club-bot.vercel.app/3crunch_1_audio.mp4'\n  ]\n  const randomCrunch =\n    crunchAudioUrls[Math.floor(Math.random() * crunchAudioUrls.length)]\n\n  const audio = new Audio(randomCrunch)\n  audio.play()\n}\n\nconst ExpiresAt = ({ children, expirationDate = new Date(Date.now() - 1) }) => {\n  console.log(expirationDate, new Date())\n  if (expirationDate.getTime() > Date.now()) {\n    return children\n  } else {\n    return null\n  }\n}\n\nfunction spinIt(el) {\n  el.classList.add('spin')\n  setTimeout(() => el.classList.remove('spin'), 500)\n}\n\nexport default function Bin() {\n  const confettiInstance = useRef(null)\n  function fireConfetti() {\n    if (!confettiInstance.current) {\n      confettiInstance.current = new JSConfetti()\n    }\n    confettiInstance.current.addConfetti({\n      emojis: [\n        '🔌',\n        '⚡️',\n        '💥',\n        '🚨',\n        '🔋',\n        '🤖',\n        '🛞',\n        '🔊',\n        '🎙️',\n        '💿',\n        '🖲️',\n        '⚙️',\n        '🛠️'\n      ]\n    })\n  }\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"The Bin\"\n        description=\"Rummage around in The Bin to get a free electronics starter kit!\"\n        image=\"https://cloud-6902szs7o-hack-club-bot.vercel.app/0og_image.png\"\n      />\n      <Nav color=\"text\" />\n      <ForceTheme theme=\"light\" />\n      <Box\n        as=\"main\"\n        sx={{\n          bg: '#ECE9E0',\n          textAlign: 'center',\n          backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3E%3Cpath fill='%239C92AC' fill-opacity='0.2' d='M1 3h1v1H1V3zm2-2h1v1H3V1z'%3E%3C/path%3E%3C/svg%3E\")`\n        }}\n      >\n        <Box\n          sx={{\n            background:\n              'url(https://cloud-jxq5r0yyp-hack-club-bot.vercel.app/0bg.png)',\n            backgroundSize: 'cover',\n            py: '3em'\n          }}\n        >\n          <Container sx={{ position: 'relative' }}>\n            <Box\n              as=\"section\"\n              sx={{ textAlign: 'center', pt: '4em', overflow: 'hidden' }}\n            >\n              <ExpiresAt expirationDate={new Date(2024, 3, 13)}>\n                <Box sx={{ mt: 3 }}>\n                  <Announcement\n                    copy=\"Please pardon our dust!\"\n                    caption=\"You found us a little early! We're still building this page, but you can RSVP early.\"\n                    iconLeft=\"welcome\"\n                  />\n                </Box>\n              </ExpiresAt>\n              <Box\n                sx={{\n                  '@media (prefers-reduced-motion: no-preference)': {\n                    animation: `${wobble} 0.5s ease-in-out infinite alternate`\n                  }\n                }}\n              >\n                <Image\n                  src=\"https://cloud-mt5wqf6f5-hack-club-bot.vercel.app/0rummaging.png\"\n                  alt=\"Rummaging through The Bin\"\n                  onClick={e => {\n                    fireConfetti()\n                    crunch()\n                    spinIt(e.target)\n                  }}\n                  sx={{\n                    cursor: 'pointer',\n                    ':active': {\n                      animation: `${bounce} 0.125s`\n                    },\n                    '&.spin': {\n                      animation: `${spin} 0.25s`\n                    }\n                  }}\n                />\n              </Box>\n              <br />\n              <RsvpCount />\n              <Box id=\"rsvp\">\n                <Sparkles>\n                  <Image\n                    src=\"https://cloud-rdlz8he4l-hack-club-bot.vercel.app/0thebin.svg\"\n                    alt=\"The Bin logo\"\n                    sx={{ maxWidth: '250px' }}\n                  />\n                </Sparkles>\n              </Box>\n              <Text sx={{ fontWeight: 'bold' }}>\n                Build{' '}\n                <em>\n                  <TypeAnimation\n                    cursor={false}\n                    sequence={[\n                      // Same substring at the start will only be typed out once, initially\n                      'a laser guided nerf gun',\n                      1000, // wait 1s before replacing \"Mice\" with \"Hamsters\"\n                      'a clap activated lamp',\n                      1000,\n                      'a temperature activated Febreze can',\n                      1000,\n                      'a flame actuated speaker',\n                      1000,\n                      'a light dependant door',\n                      1000\n                    ]}\n                    repeat={Infinity}\n                  />\n                </em>{' '}\n                with parts you pick out.\n                <br />\n                Free for high schoolers.\n                {/* with all the parts bought for you */}\n                {/* An electronics starter kit, customized for <em>your</em>&nbsp;project */}\n              </Text>\n            </Box>\n            <Box as=\"section\" sx={{ textAlign: 'center' }}>\n              <Box sx={{ animation: `${fadeUp} 0.5s ease 100ms both` }}>\n                <Card sx={{ p: 3, mt: 4, mx: 'auto', maxWidth: '50ch' }}>\n                  <Text\n                    as=\"p\"\n                    sx={{ mb: 1, mt: 0, textWrap: 'pretty', fontSize: 2 }}\n                  >\n                    Running for only 2 months.\n                    {/* High schoolers can RSVP now! */}\n                    {/* High schoolers can get a kit of electronics parts for free to\n                    build their first project. */}\n                  </Text>\n                  <Text\n                    as=\"p\"\n                    sx={{ color: 'muted', mb: 2, fontSize: 2, fontWeight: 800 }}\n                  >\n                    RSVP to get notified when orders&nbsp;open.\n                  </Text>\n                  <RsvpForm />\n                </Card>\n              </Box>\n            </Box>\n          </Container>\n        </Box>\n        <Container sx={{ position: 'relative' }}>\n          <Box\n            as=\"section\"\n            sx={{\n              textAlign: 'left',\n              pt: '4em',\n              maxWidth: 'narrow',\n              mx: 'auto'\n            }}\n          >\n            <Heading\n              as=\"h2\"\n              variant=\"title\"\n              sx={{\n                '> .hidden': {\n                  opacity: 0,\n                  animation: `${slideOut} 0.25s ease-in-out`\n                },\n                ':hover': {\n                  '> .hidden': {\n                    display: 'inline-block',\n                    animation: `${slideIn} 0.25s ease-in-out`,\n                    opacity: 1\n                  }\n                }\n              }}\n            >\n              Motors & lasers & mics,{' '}\n              <Text as=\"span\" sx={{ fontWeight: 400, fontStyle: 'italic' }}>\n                oh&nbsp;my!\n              </Text>\n              <Text\n                as=\"span\"\n                className=\"hidden\"\n                sx={{ fontWeight: 400, fontStyle: 'italic', ml: 2 }}\n              >\n                oh&nbsp;my!\n              </Text>\n            </Heading>\n            <Box sx={{ textAlign: 'left' }}>\n              <Flex sx={{ my: 4 }}>\n                <Box>\n                  <Image\n                    src=\"https://cloud-mt5wqf6f5-hack-club-bot.vercel.app/0rummaging.png\"\n                    alt=\"Rummage\"\n                  />\n                </Box>\n                <Box>\n                  <Heading as=\"p\" variant=\"headline\">\n                    <b>Rummage</b>\n                  </Heading>\n                  <Text>\n                    Dig through the bin to get a randomly generated set of parts\n                    (<em>or you can choose your own</em>). For example...\n                  </Text>\n                </Box>\n              </Flex>\n              <Image\n                src=\"https://cloud-2wkwrydc4-hack-club-bot.vercel.app/0parts.svg\"\n                alt=\"Example parts\"\n                sx={{ width: '100%' }}\n              />\n              <Flex sx={{ my: 4 }}>\n                <Box>\n                  <Image\n                    src=\"https://cloud-h7vwjlwe3-hack-club-bot.vercel.app/0frame_1__50_.png\"\n                    alt=\"Think\"\n                  />\n                </Box>\n                <Box>\n                  <Text as=\"p\" variant=\"headline\">\n                    <b>Think!</b>\n                  </Text>\n                  <Text>\n                    With your parts picked out, <b>what will you make?</b> A\n                    portable disco party? A flashlight that only turns on in the\n                    daytime?\n                  </Text>\n                </Box>\n              </Flex>\n              <Flex sx={{ my: 4 }}>\n                <Box>\n                  <Text as=\"p\" variant=\"headline\">\n                    <b>Prototype</b>\n                  </Text>\n                  <Text>\n                    Turn your idea into something almost real: simulate your\n                    project in an online editor for beginners.\n                  </Text>\n                </Box>\n                <Box>\n                  <Image\n                    src=\"https://cloud-mt5wqf6f5-hack-club-bot.vercel.app/1prototype.png\"\n                    alt=\"Prototype\"\n                  />\n                </Box>\n              </Flex>\n              <Box\n                sx={{\n                  boxShadow: 'card',\n                  borderRadius: 8,\n                  overflow: 'hidden',\n                  display: 'flex',\n                  flexDirection: 'column'\n                }}\n              >\n                <Box\n                  p={2}\n                  sx={{\n                    bg: 'dark',\n                    flexGrow: 1,\n                    textAlign: 'center',\n                    color: 'white',\n                    fontWeight: 800,\n                    borderBottom: '1px solid gray',\n                    display: 'flex',\n                    gap: 2\n                  }}\n                >\n                  <Icon glyph=\"private-outline\" height={24} />\n                  <Box sx={{ bg: 'darkless', borderRadius: 4, flexGrow: 1 }}>\n                    wokwi.com\n                  </Box>\n                  <Icon glyph=\"view-reload\" height={24} />\n                </Box>\n                <Image\n                  src=\"https://cloud-ghggsmjwa-hack-club-bot.vercel.app/0image.png\"\n                  alt=\"Screenshot\"\n                />\n              </Box>\n              <Flex sx={{ my: 4 }}>\n                <Box>\n                  <Text as=\"p\" variant=\"headline\">\n                    <b>Build it!</b>\n                  </Text>\n                  <Text>\n                    If it works in simulation,{' '}\n                    <b>we’ll send you the parts to build it in real life.</b>\n                  </Text>\n                </Box>\n              </Flex>\n              <Image\n                src=\"https://cloud-ge8yutn2q-hack-club-bot.vercel.app/0image.png\"\n                alt=\"Build it\"\n                width=\"100%\"\n              />\n            </Box>\n          </Box>\n        </Container>\n        <Container>\n          <Text as=\"h3\">Turn some trash into your treasure.</Text>\n          <br></br>\n          <a href=\"#rsvp\">\n            <Button variant=\"ctaLg\">RSVP</Button>\n          </a>\n          <br></br>\n          <br></br>\n        </Container>\n      </Box>\n      <Footer>\n        <Box sx={{ a: { color: 'blue' }, pb: 4 }}>\n          <Heading as=\"h3\" variant=\"subheadline\" mb={2}>\n            A project by <a href=\"https://hackclub.com/\">Hack Club</a>.\n          </Heading>\n          <Text\n            as=\"p\"\n            variant=\"caption\"\n            mb={3}\n            sx={{ width: ['85%', '75%', '60%'] }}\n          >\n            Hack Club is a registered 501(c)3 nonprofit organization that\n            supports a network of 20k+ technical high schoolers. We believe you\n            learn best by building so we're removing barriers to hardware access\n            so any teenager can explore. In the past few years, we{' '}\n            <Link href=\"https://onboard.hackclub.com\" target=\"_blank\">\n              fabricated custom PCBs designed by <OnboardCount /> teenagers\n            </Link>\n            ,{' '}\n            <Link\n              href=\"https://github.com/hackclub/the-hacker-zephyr\"\n              target=\"_blank\"\n            >\n              hosted the world's longest hackathon on land\n            </Link>\n            , and{' '}\n            <Link href=\"https://hackclub.com/winter\" target=\"_blank\">\n              gave away $75k of hardware\n            </Link>\n            .\n          </Text>\n        </Box>\n      </Footer>\n      <style>\n        {`\n          html {\n            scroll-behavior: smooth;\n          }\n          `}\n      </style>\n    </>\n  )\n}\n"
  },
  {
    "path": "pages/brand.tsx",
    "content": "import {\n  Box,\n  Card,\n  Container,\n  Flex,\n  Grid,\n  Heading,\n  Image as ThemeImage,\n  Input,\n  Link as A,\n  Text\n} from 'theme-ui'\nimport theme from '@hackclub/theme'\nimport Meta from '@hackclub/meta'\nimport Icon from '@hackclub/icons'\nimport Head from 'next/head'\nimport ForceTheme from '../components/force-theme'\nimport Nav from '../components/nav'\nimport Footer from '../components/footer'\nimport { startCase } from 'lodash'\nimport { AButton } from '../components/AButton'\nimport Image from 'next/image'\n\nexport const Logo = ({ name }: { name: string }) => (\n  <Card variant=\"sunken\" sx={{ p: [3, 3] }}>\n    <ThemeImage\n      src={`https://assets.hackclub.com/${name}.svg`}\n      sx={{ width: '100%', height: 96, mb: 1 }}\n      alt={startCase(name)}\n    />\n    <Text\n      as=\"div\"\n      variant=\"subheadline\"\n      sx={{ fontSize: [2, 3], mt: 2, mb: 2 }}\n    >\n      {startCase(name)\n        .replace('Flag Orpheus', 'Orpheus Flag –')\n        .replace('Bw', ' (B/W)')\n        .replace('Hcb', 'HCB')}\n    </Text>\n    <Grid\n      columns=\"repeat(3, 1fr)\"\n      gap={3}\n      sx={{\n        alignItems: 'center',\n        a: {\n          bg: 'elevated',\n          color: 'cyan',\n          boxShadow: 'none',\n          py: 1,\n          ':hover,:focus': { bg: 'cyan', color: 'white' }\n        }\n      }}\n    >\n      <AButton as=\"a\" href={`https://assets.hackclub.com/${name}.svg`}>\n        SVG\n      </AButton>\n      <AButton as=\"a\" href={`https://assets.hackclub.com/${name}.png`}>\n        PNG\n      </AButton>\n      <AButton as=\"a\" href={`https://assets.hackclub.com/${name}.pdf`}>\n        PDF\n      </AButton>\n    </Grid>\n    <Input\n      as=\"textarea\"\n      value={`https://assets.hackclub.com/${name}.svg`}\n      sx={{ mt: 2, py: 1 }}\n      disabled\n    />\n  </Card>\n)\n\nconst HTML = ({ file, html }) => (\n  <tr>\n    <td>\n      <Image\n        src={`https://assets.hackclub.com/${file}.svg`}\n        alt={startCase(file)}\n        width={96}\n        height={96}\n      />\n    </td>\n    <td>\n      <Text as=\"pre\" variant=\"styles.pre\">\n        {html}\n      </Text>\n    </td>\n  </tr>\n)\n\nconst ColorSwatch = ({ bg }) => (\n  <Card\n    sx={{\n      bg,\n      color: 'white',\n      display: 'flex',\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center'\n    }}\n  >\n    <Text variant=\"subheadline\" sx={{ my: 0 }}>\n      {bg}\n    </Text>\n    <Text>{theme.colors[bg]}</Text>\n  </Card>\n)\n\nconst Page = ({ css }) => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Branding\"\n      description=\"Download Hack Club HQ’s logos and preview our brand fonts & colors.\"\n      image=\"https://workshop-cards.hackclub.com/Branding.png?theme=dark&fontSize=350px&brand=HQ\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav color=\"text\" />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'sheet',\n        color: 'text',\n        pt: [5, null, null, null, 6],\n        pb: [3, 4, 5, null, 6],\n        textAlign: 'center'\n      }}\n    >\n      <Container variant=\"copy\">\n        <Heading as=\"h1\" variant=\"title\" sx={{ color: 'primary', mt: [2, 4] }}>\n          Hack Club Brand\n        </Heading>\n        <Heading as=\"h2\" variant=\"subtitle\" sx={{ mt: 3, color: 'text' }}>\n          Download HQ’s logos and preview our brand colors & font.\n        </Heading>\n        <p>\n          Hack Club must always be written as Hack Club, not hackclub / Hackclub\n          / HackClub / hackClub\n        </p>\n        <p>\n          Same with Hack Clubber or Hack Clubbers. It's never hackclubbers or\n          Hackclubbers\n        </p>\n        <p>\n          Important / should not be missable by anyone who is designing a\n          sticker: All sticker designs must have the text Hack Club somewhere on\n          the design. It can be subtle, but \"Hack Club\" must appear somewhere on\n          the design\n        </p>\n      </Container>\n    </Box>\n    <Container\n      sx={{\n        py: [3, 4],\n        maxWidth: [null, 'copyUltra'],\n        h2: { variant: 'text.headline' }\n      }}\n    >\n      <Heading variant=\"headline\">Logos</Heading>\n      <Grid columns={[null, 2, 3]} gap={3}>\n        {[\n          'flag-orpheus-top',\n          'flag-orpheus-left',\n          'flag-standalone',\n          'flag-orpheus-top-bw',\n          'flag-orpheus-left-bw',\n          'flag-standalone-bw',\n          'flag-standalone-wtransparent',\n          'icon-rounded',\n          'icon-square',\n          'icon-progress-rounded',\n          'icon-progress-square'\n        ].map(key => (\n          <Logo name={key} key={key} />\n        ))}\n      </Grid>\n      <AButton\n        as=\"a\"\n        href=\"https://assets.hackclub.com/2020_branding.zip\"\n        variant=\"outline\"\n        mt={3}\n        mb={[4, 5]}\n      >\n        Download all →\n      </AButton>\n\n      <Heading id=\"bank\" variant=\"headline\">\n        HCB Logos\n      </Heading>\n      <Grid columns={[null, 2, 3]} gap={3}>\n        <Logo name=\"hcb-light\" />\n        <Logo name=\"hcb-dark\" />\n      </Grid>\n      <AButton\n        as=\"a\"\n        href=\"https://hcb.hackclub.com/branding\"\n        variant=\"outline\"\n        mt={3}\n        mb={[4, 5]}\n      >\n        See all HCB logos →\n      </AButton>\n\n      <Heading id=\"banners\" variant=\"headline\">\n        HTML banners\n      </Heading>\n      <Box\n        as=\"table\"\n        sx={{\n          display: 'block',\n          overflowX: 'auto',\n          whiteSpace: 'nowrap',\n          maxWidth: '100%',\n          'td:first-of-type': { pr: 3 },\n          img: { maxWidth: 128 * 1.5 },\n          pre: { whiteSpace: 'initial' }\n        }}\n      >\n        <Box as=\"thead\" sx={{ display: 'none' }}>\n          <tr>\n            <th>Preview</th>\n            <th>HTML code</th>\n          </tr>\n        </Box>\n        <tbody>\n          <HTML\n            file=\"flag-orpheus-top\"\n            html={`<a href=\"https://hackclub.com/\"><img style=\"position: absolute; top: 0; left: 10px; border: 0; width: 256px; z-index: 999;\" src=\"https://assets.hackclub.com/flag-orpheus-top.svg\" alt=\"Hack Club\"/></a>`}\n          />\n          <HTML\n            file=\"flag-orpheus-left\"\n            html={`<a href=\"https://hackclub.com/\"><img style=\"position: absolute; top: 0; left: 10px; border: 0; width: 256px; z-index: 999;\" src=\"https://assets.hackclub.com/flag-orpheus-left.svg\" alt=\"Hack Club\"/></a>`}\n          />\n          <HTML\n            file={`banners/${new Date().getFullYear()}`}\n            html={`<a href=\"https://hackclub.com/\"><img style=\"position: absolute; top: 0; left: 10px; border: 0; width: 256px; z-index: 999;\" src=\"https://assets.hackclub.com/banners/${new Date().getFullYear()}.svg\" alt=\"Hack Club\"/></a>`}\n          />\n        </tbody>\n      </Box>\n      <AButton\n        as=\"a\"\n        href=\"https://hackclub.com/banner\"\n        variant=\"outline\"\n        mt={3}\n        mb={[4, 5]}\n      >\n        React component →\n      </AButton>\n      <Heading variant=\"headline\">Colors</Heading>\n      <Grid columns={[2, 4]} gap={3} mb={[4, 5]}>\n        {[\n          'red',\n          'orange',\n          'yellow',\n          'green',\n          'cyan',\n          'blue',\n          'purple',\n          'muted'\n        ].map(key => (\n          <ColorSwatch key={key} bg={key} />\n        ))}\n      </Grid>\n      <Heading variant=\"headline\">Fonts</Heading>\n      <Text variant=\"title\">Phantom Sans</Text>\n      <Text variant=\"subtitle\" sx={{ mb: 3, ml: 2 }}>\n        is our brand font.\n      </Text>\n      <Box as=\"details\" mb={[4, 5]}>\n        <Text as=\"summary\" sx={{ fontSize: 2, cursor: 'default' }}>\n          Webfont CSS (for HQ sites only)\n        </Text>\n        <Text as=\"pre\" variant=\"styles.pre\">\n          {css}\n        </Text>\n      </Box>\n      <Heading variant=\"headline\">Icons</Heading>\n      <Text as=\"p\" variant=\"subtitle\" sx={{ mb: 3 }}>\n        We have a custom iconset, published as{' '}\n        <A href=\"https://github.com/hackclub/icons\">@hackclub/icons</A>.\n      </Text>\n      <Flex sx={{ flexWrap: 'wrap', svg: { fill: 'muted', mr: 3, mb: 3 } }}>\n        {[\n          'clubs',\n          'bank-circle',\n          'event-code',\n          'home',\n          'transactions',\n          'bolt',\n          'photo',\n          'emoji'\n        ].map(k => (\n          <Icon glyph={k as any} key={k} size={64} />\n        ))}\n      </Flex>\n      <AButton\n        as=\"a\"\n        href=\"https://icons.hackclub.com\"\n        sx={{ mt: 3, mb: [4, 5] }}\n        variant=\"outline\"\n      >\n        Explore Hack Club Icons →\n      </AButton>\n      <Heading variant=\"headline\">UI components</Heading>\n      <Text as=\"p\" variant=\"subtitle\" sx={{ mb: 3 }}>\n        Want to make a Hack Club themed site? Use our pre-made CSS and UI\n        components to hackify your site.\n      </Text>\n      <AButton\n        as=\"a\"\n        href=\"https://theme.hackclub.com/\"\n        sx={{ mr: 3, mb: 3 }}\n        variant=\"outline\"\n      >\n        Explore Hack Club Theme →\n      </AButton>\n      <AButton\n        as=\"a\"\n        href=\"https://github.com/hackclub/theme-starter\"\n        mb={3}\n        mr={3}\n        variant=\"outline\"\n      >\n        Theme Starter on GitHub →\n      </AButton>\n      <AButton\n        as=\"a\"\n        href=\"https://github.com/hackclub/css\"\n        sx={{ mb: 3 }}\n        variant=\"outline\"\n      >\n        CSS Theme on GitHub →\n      </AButton>\n    </Container>\n    <Footer />\n  </>\n)\n\nexport default Page\n\nexport const getStaticProps = () => {\n  const fs = require('fs')\n  const css = fs.readFileSync(\n    './node_modules/@hackclub/theme/fonts/reg-ital-bold.css',\n    'utf8'\n  )\n  return { props: { css } }\n}\n"
  },
  {
    "path": "pages/clubs.tsx",
    "content": "import {\n  Badge,\n  Box,\n  Button,\n  Card,\n  Container,\n  Grid,\n  Heading,\n  Link,\n  Text\n} from 'theme-ui'\nimport styled from '@emotion/styled'\nimport Head from 'next/head'\nimport NextLink from 'next/link'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport Icon from '../components/icon'\nimport BGImg from '../components/background-image'\nimport ForceTheme from '../components/force-theme'\nimport SlideDown from '../components/slide-down'\nimport FadeIn from '../components/fade-in'\nimport Footer from '../components/footer'\nimport AssembleImgFile from '../public/home/assemble.jpg'\nimport Slack from '../components/slack'\nimport Stage from '../components/stage'\nimport { AButton } from '../components/AButton'\nimport type { ReactNode } from 'react'\n\nlet Highlight = styled(Text)`\n  color: inherit;\n  border-radius: 1em 0 1em 0;\n  background: linear-gradient(\n    -100deg,\n    rgba(250, 247, 133, 0.33),\n    rgba(250, 247, 133, 0.66) 95%,\n    rgba(250, 247, 133, 0.1)\n  );\n`\nHighlight = Highlight.withComponent('mark')\n\nconst CardAsAny = Card as any\n\nconst Feature = ({\n  icon = 'star',\n  color = 'blue',\n  name = '',\n  desc,\n  children = null,\n  sx = {},\n  ...props\n}: {\n  icon?: string\n  color?: string\n  name?: string\n  desc?: ReactNode\n  children?: ReactNode\n  sx?: any\n  [key: string]: any\n} = {}) => (\n  <Box\n    sx={{\n      display: 'grid',\n      gridGap: [0, 4],\n      gridTemplateColumns: [null, 'auto 1fr'],\n      alignItems: 'start',\n      justifyContent: 'start',\n      bg: 'rgba(224, 230, 237, 0.25)',\n      p: [3, 4],\n      mt: [1, 1],\n      borderRadius: 'extra',\n      span: { transform: 'none', width: 'min-intrinsic' },\n      svg: { color: 'white' },\n      ...sx\n    }}\n  >\n    {children || (\n      <Box\n        as=\"span\"\n        sx={{\n          width: 'fit-content',\n          bg: color,\n          borderRadius: 18,\n          lineHeight: 0,\n          p: 2,\n          mb: 1,\n          display: 'inline-block',\n          transform: ['scale(0.75)', 'none'],\n          transformOrigin: 'bottom left',\n          boxShadow:\n            'inset 2px 2px 6px rgba(255,255,255,0.2), inset -2px -2px 6px rgba(0,0,0,0.1), 0 1px 4px rgba(0,0,0,0.1), 0 4px 8px rgba(0,0,0,0.1)'\n        }}\n      >\n        <Icon glyph={icon} size={48} />\n      </Box>\n    )}\n    <Box>\n      <Heading as=\"h3\" variant=\"headline\" mb={2} mt={0}>\n        {name}\n      </Heading>\n      <Text\n        as=\"p\"\n        variant=\"subtitle\"\n        sx={{ mt: 0, pb: 2, a: { variant: 'styles.a', color: 'blue' } }}\n      >\n        {desc}\n      </Text>\n    </Box>\n  </Box>\n)\n\nconst Page = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Coding / Computer Science Clubs\"\n      description=\"Hack Club is a global nonprofit network of high school makers & student-led computer science clubs where young people build the agency, the network, & the technical talent to think big & do big things in the world.\"\n      image=\"https://cloud-epiki4yvg.vercel.app/2020-09-09_drbp62kayjuyyy0ek89mf9fwcp5t4kuz.jpeg\"\n    />\n    <Head>\n      <meta\n        property=\"og:image\"\n        content=\"https://assets.hackclub.com/icon-rounded.png\"\n      />\n    </Head>\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'dark',\n        pt: [5, 6],\n        pb: [2, 3],\n        textAlign: 'center',\n        position: 'relative',\n        overflow: 'hidden'\n      }}\n    >\n      <BGImg\n        src={AssembleImgFile}\n        alt=\"Hack Clubbers assemble at Figma HQ for the first IRL hackathon in SF since 2020: Assemble. 📸 Photo by Kunal Botla, Hack Clubber in MA!\"\n      />\n\n      <SlideDown duration={768}>\n        <Heading\n          as=\"h1\"\n          variant=\"ultratitle\"\n          sx={{\n            color: 'white',\n            textShadow: 'text',\n            filter: 'drop-shadow(0 -2px 4px rgba(0,0,0,0.5))',\n            WebkitFilter: 'drop-shadow(0 -2px 4px rgba(0,0,0,0.5))',\n            maxWidth: [null, 'copyUltra'],\n            my: [3, 4],\n            mx: 'auto',\n            zIndex: 1\n          }}\n        >\n          <Text\n            as=\"span\"\n            sx={{\n              lineHeight: 0.875,\n              display: 'block',\n              pb: 3\n            }}\n          >\n            Don’t run your coding&nbsp;club alone.{' '}\n          </Text>\n          Make it a{' '}\n          <Text\n            as=\"span\"\n            sx={{\n              WebkitTextStroke: 'currentColor',\n              WebkitTextStrokeWidth: ['2px', '3px'],\n              WebkitTextFillColor: 'transparent'\n            }}\n          >\n            Hack&nbsp;Club\n          </Text>\n          .\n        </Heading>\n      </SlideDown>\n      <FadeIn duration={1024}>\n        <Text\n          as=\"p\"\n          variant=\"lead\"\n          sx={{\n            color: 'white',\n            textShadow: 'text',\n            maxWidth: 620,\n            mt: 0,\n            mx: 'auto',\n            mb: [3, 4]\n          }}\n        >\n          Hack Club is a nonprofit network of high school computer\n          science&nbsp;clubs and makers around the world.\n        </Text>\n        <AButton\n          as=\"a\"\n          variant=\"ctaLg\"\n          href=\"https://apply.hackclub.com\"\n          target=\"_blank\"\n          rel=\"noopener\"\n        >\n          Apply now\n        </AButton>\n        <AButton\n          as=\"a\"\n          variant=\"ctaLg\"\n          href=\"https://slack.hackclub.com\"\n          sx={{\n            backgroundImage: t => t.util.gx('green', 'blue'),\n            ml: [0, 3],\n            mt: [3, 0]\n          }}\n        >\n          Join the Slack\n        </AButton>\n      </FadeIn>\n      <Box\n        sx={{\n          display: 'flex',\n          justifyContent: ['center', 'center', 'flex-end'],\n          marginRight: 2,\n          mt: [2, 2, 1]\n        }}\n      >\n        <a\n          href=\"https://www.youtube.com/watch?v=PnK4gzO6S3Q\"\n          title=\"📸 Photo by Kunal Botla, Hack Clubber in MA!\"\n        >\n          <Badge\n            variant=\"pill\"\n            sx={{\n              zIndex: '1',\n              bg: '#000',\n              color: 'white',\n              opacity: 0.5,\n              textDecoration: 'none',\n              fontWeight: 'normal',\n              ':hover': { opacity: 1 },\n              transition: '0.3s ease'\n            }}\n            title=\"📸 Photo by Kunal Botla, Hack Clubber in MA!\"\n          >\n            Hackers at Assemble in SF\n          </Badge>\n        </a>\n      </Box>\n    </Box>\n    <Box as=\"section\" sx={{ py: [4, 5], color: 'black' }}>\n      <Container>\n        <Text as=\"p\" variant=\"eyebrow\">\n          The rundown\n        </Text>\n        <Heading as=\"h2\" variant=\"title\">\n          Clubs discovering the{' '}\n          <Text\n            as=\"span\"\n            sx={{\n              borderRadius: 'default',\n              px: 2,\n              mx: [-2, 0],\n              whiteSpace: 'nowrap',\n              color: '#5d114c',\n              bg: 'rgb(255, 212, 64)'\n            }}\n          >\n            joy of code\n          </Text>\n          .\n        </Heading>\n        <Text as=\"p\" variant=\"lead\" sx={{ maxWidth: 'copyPlus' }}>\n          Hack Clubs typically meet for 1 hour each week in high schools,\n          makerspaces, community centers, churches, and any other venue where\n          teenagers can gather. As a club leader, you get members (mostly\n          beginners) started on something to learn/create, then members work at\n          their own pace, building websites, apps, & games, and presenting them\n          at the end.\n        </Text>\n        <Grid columns={[null, null, 2, '3fr 2fr']} gap={[3, 4]} pt={[3, 3]}>\n          {/* <Photo\n            src=\"https://cloud-5pdwvchgm-hack-club-bot.vercel.app/05851864a.jpg\"\n            alt=\"Summer Creek Hack Club meeting, February 2020\"\n            width={3000}\n            height={2550}\n            showAlt\n          />*/}\n          <iframe\n            width=\"100%\"\n            height=\"500px\"\n            src=\"https://www.youtube.com/embed/xXIxwV7bQTw?si=gmhvvHTcUxKTVMjt\"\n            title=\"YouTube video player\"\n            allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n            allowFullScreen\n            style={{ borderRadius: 12, border: 'hidden' }}\n          />\n          <Grid\n            columns=\"auto 1fr\"\n            sx={{\n              gridColumnGap: 3,\n              span: {\n                width: 36,\n                height: 36,\n                borderRadius: 24,\n                display: 'inline-block',\n                fontSize: 2,\n                lineHeight: '30px',\n                textAlign: 'center',\n                fontWeight: 'bold',\n                border: '3px solid currentColor'\n              },\n              p: { my: 0 },\n              strong: { display: 'block' }\n            }}\n          >\n            <Text as=\"span\" color=\"green\">\n              1\n            </Text>\n            <Text as=\"p\" variant=\"subtitle\">\n              <strong>\n                A group of teens, many beginners, gather to start coding.\n              </strong>\n              The leader (that’s you!) presents for a few minutes, getting the\n              group started building something new.\n            </Text>\n            <Text as=\"span\" color=\"cyan\">\n              2\n            </Text>\n            <Text\n              as=\"p\"\n              variant=\"subtitle\"\n              sx={{ mt: 0, a: { variant: 'styles.a', color: 'blue' } }}\n            >\n              <strong>Everyone gets hacking, individually.</strong> Not hacking\n              bank accounts, but rather being creative and{' '}\n              <Link href=\"/ship\">making something awesome</Link>.\n            </Text>\n            <Text as=\"span\" color=\"blue\">\n              3\n            </Text>\n            <Text as=\"p\" variant=\"subtitle\">\n              <strong>To end, everyone demos their work.</strong>\n              As a leader, you’re cultivating a community of makers. Each member\n              showing off their work builds momentum & motivation.\n            </Text>\n          </Grid>\n        </Grid>\n        <Grid\n          columns={[null, '1fr 2fr']}\n          mt={[3, 5]}\n          sx={{ maxWidth: 'copyUltra', mx: 'auto' }}\n        >\n          <Heading as=\"h3\" variant=\"headline\" sx={{ fontSize: [4, 5], mb: 0 }}>\n            Go beyond club meetings.\n          </Heading>\n          <Text\n            as=\"p\"\n            variant=\"lead\"\n            sx={{ mt: 0, a: { variant: 'styles.a', color: 'blue' } }}\n          >\n            Hack Clubs attend and run{' '}\n            <NextLink href=\"/hackathons\">hackathons</NextLink> like{' '}\n            <a href=\"https://daydream.hackclub.com/\">Daydream</a> &{' '}\n            <a href=\"https://scrapyard.hackclub.com/\">Scrapyard</a>, take part\n            in year long programs like{' '}\n            <NextLink href=\"https://blueprint.hackclub.com/\">\n              Blueprint\n            </NextLink>\n            , and compete in events like the{' '}\n            <a href=\"http://www.congressionalappchallenge.us\">\n              Congressional App Challenge\n            </a>\n            . The&nbsp;hack’s the limit.\n          </Text>\n        </Grid>\n      </Container>\n    </Box>\n    <Box\n      as=\"section\"\n      sx={{\n        py: 6,\n        bg: 'dark',\n        color: 'white',\n        'h2,p': { textShadow: 'text' },\n        textAlign: [null, 'center'],\n        position: 'relative',\n        overflow: 'hidden'\n      }}\n    >\n      <BGImg\n        gradient=\"linear-gradient(rgba(0,0,0,0.25),rgba(0,0,0,0.625))\"\n        src=\"https://cdn.hackclub.com/019d3f60-c241-7386-825c-68732568c4b4/image.png\"\n        alt=\"Hack Clubbers gather at the Elon Musk AMA in 2020\"\n      />\n      <Container>\n        <Text as=\"p\" variant=\"eyebrow\" sx={{ color: 'white', opacity: 0.75 }}>\n          ~ Welcome to the club ~\n        </Text>\n        <Heading as=\"h2\" variant=\"title\">\n          By the students, for the students.\n        </Heading>\n        <Text as=\"p\" variant=\"lead\" sx={{ maxWidth: 'copyPlus', mx: 'auto' }}>\n          Learning to code is like gaining a superpower — turning you from a\n          consumer of technology into a creator. It shouldn’t be taught like a\n          class — it should be a creative, inclusive space. To foster this\n          environment,{' '}\n          <Highlight>every&nbsp;Hack&nbsp;Club is student-led</Highlight> &\n          members make self-directed projects.\n        </Text>\n        <NextLink href=\"/philosophy\">\n          <Button\n            variant=\"ctaLg\"\n            sx={{\n              background: 'linear-gradient(-32deg, #6f31b7 14%, #fb558e 82%)'\n            }}\n          >\n            Our philosophy →\n          </Button>\n        </NextLink>\n      </Container>\n    </Box>\n    <Box as=\"section\" sx={{ py: [4, 5, 6], color: 'black' }}>\n      <Container\n        sx={{\n          maxWidth: [null, 'copyUltra'],\n          svg: { filter: 'drop-shadow(0 2px 3px rgba(0,0,0,.125))' }\n        }}\n      >\n        <Box as=\"header\" sx={{ textAlign: [null, 'center'], pb: [4, 5] }}>\n          <Text as=\"p\" variant=\"eyebrow\">\n            Hit the ground running\n          </Text>\n          <Heading as=\"h2\" variant=\"title\">\n            Get your club{' '}\n            <Text\n              as=\"span\"\n              sx={{\n                borderRadius: 'default',\n                px: 2,\n                mx: [-2, 0],\n                bg: 'rgb(91, 255, 205)',\n                color: '#095365',\n                display: 'inline-block',\n                whiteSpace: ['wrap', 'nowrap']\n              }}\n            >\n              going & growing\n            </Text>\n            with Hack&nbsp;Club.\n          </Heading>\n        </Box>\n        <Grid\n          columns={[null, 1]}\n          gap={[2, 3]}\n          sx={{ alignItems: 'end', span: { color: 'white' } }}\n        >\n          <Feature\n            icon=\"slack-fill\"\n            color=\"#5d114c\"\n            name=\"Chat with thousands of club leaders\"\n            desc={\n              <>\n                In our{' '}\n                <Link href=\"https://slack.hackclub.com\">Slack community</Link>,\n                you’ll be invited to a space for Hack&nbsp;Club leaders to ask\n                questions & chat, share projects, & attend weekly live events.\n              </>\n            }\n          />\n          <Feature\n            icon=\"bolt\"\n            color=\"green\"\n            name=\"Tools to hack on\"\n            desc={\n              <>\n                We build tools, such as{' '}\n                <a href=\"https://sprig.hackclub.com\">Sprig</a>, that your\n                members can use to make projects with in meetings! Build more of\n                them with us in our{' '}\n                <Link href=\"https://slack.hackclub.com\">Slack community</Link>.\n              </>\n            }\n          ></Feature>\n          <Feature\n            icon=\"docs\"\n            color=\"red\"\n            name=\"Meeting content\"\n            desc={\n              <>\n                Come prepared to every meeting with over 100{' '}\n                <a href=\"https://workshops.hackclub.com\">workshops</a> (3 years’\n                worth!) and 19 <a href=\"https://jams.hackclub.com\">Jams</a> that\n                guide your club members through making fun, creative projects.\n              </>\n            }\n          ></Feature>\n          {/* <Feature\n            name=\"A comprehensive leader guide\"\n            desc={\n              <>\n                Need help getting started? Watch real club leaders run meetings, and\n                learn how to run them in your own club, with{' '}\n                <a href=\"https://meetings.hackclub.com\">Hack Club Meetings</a>.\n              </>\n            }\n          >\n            <Photo\n              src=\"/home/meetings.png\"\n              alt=\"Claire running a workshop on Generative Art in an online meeting\"\n              width={1000}\n              height={653}\n              sx={{ maxWidth: [null, 332] }}\n            />\n          </Feature> */}\n          <Feature\n            name=\"Marketing\"\n            desc={\n              <>\n                Get <Link href=\"/stickers\">amazing stickers</Link> and posters\n                for marketing your club shipped directly to you & your club\n                members.\n              </>\n            }\n            color=\"purple\"\n            icon=\"sticker\"\n          ></Feature>\n          <Feature\n            icon=\"bank-account\"\n            color=\"black\"\n            name=\"A nonprofit fund\"\n            desc={\n              <>\n                Use our 501(c)(3) status and a restricted fund with{' '}\n                <Link href=\"/fiscal-sponsorship\">HCB</Link> to fundraise, accept\n                donations, and buy things!\n              </>\n            }\n          />\n          <Feature\n            name=\"Weekly events\"\n            desc={\n              <>\n                From{' '}\n                <Link href=\"https://events.hackclub.com/\">Lock-in calls</Link>{' '}\n                to <Link href=\"/amas\">AMAs</Link>\n                {' to '}\n                <a href=\"https://twitter.com/hackclub/status/1300494921997193217?s=21\">\n                  weirder events\n                </a>\n                , the Slack community has live events for leaders & members\n                alike every week.\n              </>\n            }\n            icon=\"event-code\"\n            color=\"blue\"\n          ></Feature>\n          <Feature\n            icon=\"purse\"\n            color=\"orange\"\n            name=\"A basket of free tools\"\n            desc={\n              <>\n                We're always building new tools for leaders, such as the{' '}\n                <a href=\"https://leaders.hackclub.com\"> Leaders Portal</a>! A\n                place to manage your club! We've also got free subscriptions to\n                Brilliant Premium, Code Crafters, and more for running a great\n                computer science club.\n              </>\n            }\n          />\n          <Feature\n            icon=\"sam\"\n            color=\"blue\"\n            name=\"Free Zoom Pro\"\n            desc=\"24/7 access to Zoom Pro enabled meeting rooms for your club (that means no time limit).\"\n          />\n        </Grid>\n        <Feature\n          icon=\"welcome\"\n          color=\"rgb(255,88,88)\"\n          name=\"Existing clubs welcome\"\n          desc={\n            <>\n              When established Computer Science clubs join, they get all the\n              Hack&nbsp;Club benefits: Zoom&nbsp;Pro, stickers, our Slack\n              community, <a href=\"https://workshops.hackclub.com/\">workshops</a>\n              , the works. They’re welcome to use the “Hack&nbsp;Club” name or\n              keep their existing one.\n            </>\n          }\n          as=\"aside\"\n          sx={{\n            display: 'grid',\n            gridGap: [0, 4],\n            gridTemplateColumns: [null, 'auto 1fr'],\n            alignItems: 'start',\n            justifyContent: 'start',\n            bg: 'rgba(255,88,88,0.125)',\n            p: [3, 4],\n            mt: [3, 4],\n            borderRadius: 'extra',\n            span: { transform: 'none', width: 'min-intrinsic' },\n            svg: { color: 'white' }\n          }}\n        />\n      </Container>\n    </Box>\n    <Slack />\n    <Box bg=\"snow\" color=\"black\" py={[5, 6]}>\n      <Container sx={{ textAlign: ['left', 'center'] }}>\n        <Text as=\"p\" variant=\"eyebrow\">\n          Next steps\n        </Text>\n        <Heading as=\"h2\" variant=\"title\">\n          Apply today to{' '}\n          <Text\n            as=\"span\"\n            sx={{\n              borderRadius: 'default',\n              px: 2,\n              ml: [-2, 0],\n              whiteSpace: ['wrap', 'nowrap'],\n              color: 'white',\n              bg: '#6f31b7'\n            }}\n          >\n            start your club\n          </Text>\n          .\n        </Heading>\n        <Text as=\"p\" variant=\"lead\" mt={3} color=\"slate\">\n          It’s all-online, free, & takes under an hour. We’ll help from there!\n        </Text>\n        <Grid\n          pt={[3, 4]}\n          pb={[4, 5]}\n          gap={[4, 3, 4]}\n          columns={[null, 3]}\n          sx={{\n            textAlign: 'left',\n            '> a, > div': {\n              borderRadius: 'extra',\n              boxShadow: 'elevated',\n              px: [3, null, 4],\n              py: [4, null, 5]\n            },\n            span: {\n              boxShadow:\n                '-2px -2px 6px rgba(255,255,255,0.125), inset 2px 2px 6px rgba(0,0,0,0.1), 2px 2px 8px rgba(0,0,0,0.0625)'\n            },\n            svg: { fill: 'currentColor' }\n          }}\n        >\n          <CardAsAny\n            as=\"a\"\n            href=\"https://apply.hackclub.com/\"\n            variant=\"interactive\"\n            sx={{\n              background:\n                'linear-gradient(32deg, rgba(51, 142, 218, 0.9) 0%, rgba(51, 214, 166, 0.9) 100%)',\n              color: 'white',\n              svg: { color: 'rgb(51, 142, 218)' }\n            }}\n          >\n            <Stage\n              icon=\"send\"\n              color=\"white\"\n              name=\"1. Application\"\n              desc=\"Start by telling us about your club & who’s leading it.\"\n            />\n          </CardAsAny>\n          <Card\n            sx={{\n              background:\n                'linear-gradient(to bottom, rgba(255, 140, 55, 0.9) 0%, rgba(236, 55, 80, 0.9) 100%)',\n              color: 'white',\n              svg: { color: 'rgb(236, 55, 80)' }\n            }}\n          >\n            <Stage\n              icon=\"person\"\n              color=\"white\"\n              name=\"2. School approval\"\n              desc=\"Get approval from your school to start your club.\"\n            />\n          </Card>\n          <Card\n            sx={{\n              background: 'linear-gradient(-32deg, #6f31b7 14%, #fb558e 82%)',\n              color: 'white',\n              svg: { color: '#fb558e' }\n            }}\n          >\n            <Stage\n              icon=\"event-check\"\n              color=\"white\"\n              name=\"3. First meeting\"\n              desc=\"Schedule your club’s first meeting & get going!\"\n            />\n          </Card>\n        </Grid>\n        <a\n          href=\"https://apply.hackclub.com/\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          <Button rel=\"noopener\" variant=\"ctaLg\">\n            Apply to Hack Club\n          </Button>\n        </a>\n      </Container>\n    </Box>\n    <Footer\n      dark\n      sx={{\n        backgroundColor: 'dark',\n        position: 'relative',\n        overflow: 'hidden',\n        textShadow: '0 1px 2px rgba(0,0,0,0.375)',\n        'h2,span,p,a': { color: 'white !important' },\n        '> div img': { objectPosition: ['left', 'center'] },\n        svg: {\n          fill: 'white',\n          filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.25))'\n        }\n      }}\n    >\n      <style>\n        {`a{\n          color: #338eda\n        }`}\n      </style>\n    </Footer>\n  </>\n)\n\nexport default Page\n"
  },
  {
    "path": "pages/content/covid19.mdx",
    "content": "import Letterhead from '../../components/letterhead'\n\n<Letterhead\ntitle=\"COVID-19\"\ndesc=\"An update from Hack Club HQ on events.\"\nimg=\"https://workshop-cards.hackclub.com/COVID-19.png?theme=dark&brand=HQ&fontSize=275px&caption=our%20official%20recommendations\"\nauthor={{\n  name: '@zrl',\n  avatar: 'https://hackclub.com/team/zach.jpg',\n  url: 'https://app.slack.com/team/U0266FRGP'\n}}\ndate=\"2020-03-12\"\npath=\"covid19.mdx\">\n\nThis is a very difficult message for me to write and I want to get straight to the point: **Hack Club HQ is officially recommending postponing all events slated to happen in March, April, and May**.\n\n- If you are running a hackathon in March, April, or May, we are officially and strongly recommending that you work with your team to postpone it ASAP.\n- Over the next few days, you and your team should identify a new month for your event. We are recommending August at the earliest.\n- By early next week, the first emails to your venue, sponsors, and attendees should go out. We are providing language to help with these emails.\n\nWe have shared resources with organizers to support communicating postponement and making sure sponsors don't withdraw their support. All of Hack Club's staff will also be on call in the Slack to support organizers through this difficult moment.\n\nCOVID-19 has passed the point of containment and now **necessitates decisive action on all levels**—including communities like Hack Club. While most who contract it become only mildly ill, it is extremely deadly for the elderly and people with chronic health problems. For young people like us who are mostly low risk, we can still contract and spread it, which threatens those who are at higher risk. All of us have a stake in this and need to be part of the solution.\n\nOur hearts break with you in this moment. Hackathons changed my life and they have changed many, many lives in this community. Each of you has put in a superhuman effort to make your events happen. We know firsthand how devastating postponement is, but ultimately it’s the right thing to do in this situation. The world needs leadership from people exactly like all of you right now.\n\nWe are crossing our fingers that the spread of COVID-19 will slow down in the summer months, which is why we are limiting our recommendation to events happening through May. We will revisit our advice and provide updates as needed in the months to come.\n\nMy inbox is open. Please do not hesitate to reach out to me via email ([zach@hackclub.com](mailto:zach@hackclub.com)) or on Slack ([@zrl](https://app.slack.com/team/U0266FRGP)) if I can be of support. I also encourage everyone to make their thinking around this public in the Slack so we can all learn and act together. You can join at https://slack.hackclub.com if you're not already on it.\n\nBest,\n\nZach Latta ([@zrl](https://app.slack.com/team/U0266FRGP))\n\n## Some suggested reading\n\n- https://twitter.com/MarkJHandley/status/1237119688578138112\n- https://docs.google.com/presentation/u/3/d/1uG8g8AW4PEevKSESfnXUaKgH-bi8O-4PVOHBcdPMp9A/edit\n- https://www.facebook.com/gweninvestor/posts/10158147740444169\n- https://slatestarcodex.com/2020/03/02/coronavirus-links-speculation-open-thread/\n\n[![Graph of coronavirus spread in each country](https://workshops.hackclub.com/covid19.png)](https://twitter.com/MarkJHandley/status/1237119688578138112)\n\n</Letterhead>\n"
  },
  {
    "path": "pages/content/it-admins.mdx",
    "content": "import Letterhead from '../../components/letterhead'\nimport Announcement from '../../components/announcement'\n\n<Letterhead\ntitle=\"Hack Club for IT Administrators\"\nimg=\"https://workshop-cards.hackclub.com/For IT Admins.png?brand=HQ&fontSize=300px\"\npath=\"filters.mdx\">\n\nIf you are reading this, you are probably an IT administrator at your organization. **Here's a quick overview of what we need from you.**\n\nPlease whitelist or unblock the following domains:\n\n- `*.hackclub.com` - Hack Club's primary domain, hosts workshops, tools and other content\n- `hack.af` - link shortener used for miscellanous links\n- `*.replit.com`, `*.cdn.replit.com`, and `*.repl.co` - Replit, a browser-based IDE used for workshops\n- `*.github.com`, `github.dev` - GitHub, an industry standard for code hosting and collaboration, owned by Microsoft.\n- `hackclub.slack.com` - Hack Club's primary communication platform\n\nFeel free to read on for more details and potential alternatives.\n\n## Hack Club Sites\n\nIf you are unable to whitelist all subdomains, please whitelist the following:\n\n- `hackclub.com`\n- `workshops.hackclub.com`\n- `jams.hackclub.com`\n- `sprig.hackclub.com`\n\n## GitHub\n\nBesides the typical HTTP(S) ports, ports 22 and 9418 need to be open for SSH and Git respectively.\n\n## Inspect Element / Developer Tools\n\nBrowser developer tools (eg. Inspect Element) are required for web development projects, so that sites can be debugged and styled.\n\n## Replit\n\nReplit provides their own [toolkit](https://docs.replit.com/teams-edu/it-administrators-toolkit) for IT administrators with further options for providing student access to Replit, including a firewalled domain.\n\nThank you for supporting your students and their interests. If you have any questions, please reach out to us at [clubs@hackclub.com](mailto:clubs@hackclub.com) and we'd be happy to address your concerns.\n\n</Letterhead>\n"
  },
  {
    "path": "pages/content/sponsorship.mdx",
    "content": "import Letterhead from '../../components/letterhead'\nimport Announcement from '../../components/announcement'\n\n<Letterhead\ntitle=\"Sponsorship\"\ndesc=\"Looking to get hackathon/nonprofit sponsorship from Hack Club? Here’s the rundown.\"\nimg=\"https://workshop-cards.hackclub.com/Sponsorship.png?brand=HQ&fontSize=300px\"\npath=\"sponsorship.mdx\">\n\n_(To summarize: we’re a donor-supported nonprofit so outside of planned grant programs, we don't provide financial support to hackathons/other nonprofits. However, there are all kinds of ways we’d love to help out your project, so read on.)_\n\n[Hack Club](https://hackclub.com/) is an independent nonprofit, supported by donors, with a responsibility to our supporters to spend our budget directly on our core programs. Therefore, as much as we’d like to, **we’re not in a position to provide financial support to hackathons/other nonprofits**. We occasionally run grant programs, like the [$500 grant for IRL high school hackathons](https://hackclub.com/hackathons/grant) which has ended as of December 31st, 2024. We wish you the best of luck in your sponsorship search—we recommend [Megan Cui’s “Meginar”](https://youtu.be/tOmXzA4reTY) and [Lachlan Campbell’s Flagship talk](https://notebook.lachlanjc.com/2020-01-19_how_to_start_your_first_hackathon/) if you’re looking for advice.\n\nIf you’re looking for [fiscal sponsorship](https://en.wikipedia.org/wiki/Fiscal_sponsorship) (aka becoming a legal nonprofit), we’ve got your back—[HCB](https://hackclub.com/fiscal-sponsorship/) will set you up with a nonprofit fund, legal entity, debit cards for your team, automated taxes/accounting, G Suite, an online donation form, ACH/check sending/receiving, discounts on stickers & software for your team, and great support. There are no upfront fees. Sign up at [https://hackclub.com/fiscal-sponsorship/](https://hackclub.com/fiscal-sponsorship/).\n\n## If you’re running a hackathon…\n\n1. Link your event on [https://hackathons.hackclub.com/](https://hackathons.hackclub.com/). There’s an application form on the website. The site has the largest email list of high school hackathon-goers, and will email all the subscribers who live within driving distance of your event. It’s also the first Google result for “high school hackathons,” so it’ll help your SEO.\n2. We’d be happy to send some Hack Club stickers to your event. Email us [team@hackclub.com](mailto:team@hackclub.com) with the name of your event, expected attendance, and the shipping address and we’ll get them in the mail.\n3. [Join our Slack community](https://slack.hackclub.com), and ask for access to the `#hackathon-organizers` channel. You can ask questions and talk to 500+ hackathon organizers from all over.\n\n## If you’re running a club…\n\nWe’re a network of [hundreds](https://hackclub.com/map/) of high school clubs around the world. We provide mentorship/coaching, stickers, curriculum, Zoom Pro access for virtual meetings/events, and more. [Learn more here.](https://hackclub.com/clubs/)\n\n---\n\nThanks for your interest, and we’re sorry not to be able to make donations. If you’ve got any questions, you can reach us here: [team@hackclub.com](mailto:team@hackclub.com). Best of luck with your project!\n\n</Letterhead>\n"
  },
  {
    "path": "pages/content/sunsetting-som.mdx",
    "content": "import Letterhead from '../../components/letterhead'\nimport Link from 'next/link'\nimport { memo, useState, useEffect } from 'react'\nimport StaticMention from '../../components/mention'\n\n<Letterhead\ntitle=\"The Sun Sets on the Summer of Making\"\ndesc=\"A bit of looking back, a lot of looking forward.\"\nimg=\"https://workshop-cards.hackclub.com/Sunsetting%20Summer%20of%20Making.png?theme=dark&brand=HQ&fontSize=215px&images=https%3A%2F%2Fgithub.com%2Fsampoder.png\"\nauthor={{\n  name: '@sampoder',\n  avatar: 'https://github.com/sampoder.png',\n  url: 'https://scrapbook.hackclub.com/sampoder'\n}}\ndate=\"2020-08-31\"\npath=\"sunsetting-som.mdx\">\n\n_Sam Poder proposed the initial idea for Summer of Making, led logistics for Hardware Party, and is a 15-year-old Hack Club leader from Singapore._\n\n**Make something amazing this summer.** At its core, that’s what [Summer of Making](https://summer.hackclub.com/landing) was. We were there to support Hack Clubbers and it was all of you who made this summer special. We set a challenge and teen hackers from 129 countries took it on!\n\nWe partnered with GitHub to fund $50,000 in hardware projects. With GitHub providing the financial backing and both Adafruit and Arduino providing discounts and community support, we funded hundreds of hardware projects, making 1,950 electronics purchases on behalf of 268 makers, the average age of whom was 16. You can see many of [their journeys on Scrapbook](http://scrapbook.hackclub.com/r/hardware).\n\nDid someone mention Scrapbook? 414 Hack Clubbers shared 5,628 unique creations on [Scrapbook](https://scrapbook.hackclub.com/), a place for sharing project updates with the Hack Club community. It kept Snapchat-like streaks, and <StaticMention username=\"caleb\" avatar=\"https://cloud-5v0kfmsva.vercel.app/image.png\" link=\"https://scrapbook.hackclub.com/caleb\" /> posted for 74 consecutive days! The most common post time was 11 PM. (If you’re interested, <StaticMention username=\"lachlanjc\" avatar=\"https://dl.airtable.com/.attachmentThumbnails/6a8e07714d446b0dbc70209ac77b2453/8e93fe10\" link=\"https://scrapbook.hackclub.com/lachlanjc\" /> [wrote about how Scrapbook works](http://notebook.lachlanjc.com/2020-07-30_how_scrapbook_works/).)\n\nBeyond Scrapbook & our hardware grants, so much more happened this summer. We ran [AMAs](https://hackclub.com/amas/)—[chatting](https://youtu.be/DvROZ-OBszU) [with](https://www.youtube.com/watch?v=IWFtj9cCaB0) [six](https://www.youtube.com/watch?v=fDKYjX37cbo) [absolutely](https://www.youtube.com/watch?v=tDtBCcLJ2xU&list=PLbNbddgD-XxFFLLLaODUtif9v99eFXub3) [remarkable](https://youtu.be/thXsjHVcxx4) [guests](https://youtu.be/KKEYTSUvsS8)—the Scrapbook CSS contest, the first ever Hack Club CTF, Open Source Fiesta, a chess tournament, a scavenger hunt on Slack, and weekly [Hack Nights](https://hackclub.com/night/). Personally, I learned Next.js, MDX, & Theme UI to make [a recap site, which is now temporarily Hack Club’s homepage](https://hackclub.com/).\n\n![GIF demoing the Smart Album Cover project](https://cloud-hdaoelc0g.vercel.app/ezgif-4-2e8542881d0b.gif)\n\n_One of my favourite projects: <StaticMention username=\"phultquist\" avatar=\"https://avatars1.githubusercontent.com/u/46694203?s=460&u=9aa5512e640c5c2c2b2847af1f95fcf77479ac7f&v=4\" link=\"https://github.com/phultquist\"/> & <StaticMention username=\"amhenikoff\" link=\"https://github.com/amhenikoff\" />’s [Smart Album Cover](https://github.com/phultquist/smart-album-cover)_\n\n### Today (Monday, August 31st) we’re drawing the Summer of Making to a close. Here’s what’s next.\n\n<br />\n\n## Hardware Party\n\nThrough the summer, we’ve grown a substantial community of hardware hackers on the Slack and we want to keep the spirit alive. **To celebrate, we’ll be shipping custom, Orpheus-themed [Arduino Leonardos](https://www.arduino.cc/en/Main/Arduino_BoardLeonardo), which we’ve named the [Orpheus Leap](https://github.com/kevin200617/Orpheus-Leap-Micro).** These are fully-functional Arduino clones, packed into a dino shape, shipped for free.\n\n![Orpheus Leap PCB](http://cloud-jrox24mrn.vercel.app/orpheus_leap_micro_final.png)\n\nA few weeks ago, <StaticMention username=\"kevinyang\" avatar=\"https://ca.slack-edge.com/T0266FRGM-U015X5P6KAM-gc35567f1dbb-512\" link=\"http://bykevinyang.com/\"/>, a 9th grade Hack Clubber from Massachusetts, designed the board. Then <StaticMention username=\"roshan\" avatar=\"https://ca.slack-edge.com/T0266FRGM-UNGNM3H9A-d31a2d1b4dac-512\" link=\"https://scrapbook.hackclub.com/roshan\"/> found a factory in China, got a quote, and is now managing the pre-fab process to verify that the board works before we finalize the order and start final production. Since we’re manufacturing in China, it will be many months before the final boards are shipped to everyone who participated.\n\nLast hardware thing: we’re hosting a show & tell with Adafruit & the wonderful [John Park](https://en.wikipedia.org/wiki/John_Edgar_Park). More details will be shared in the next few weeks.\n\n## Slack - Some Clean-Up Items\n\nToday we’ve archived all the SoM channels (those prefixed with `#som-`), to shift conversation into the standard Slack channels like `#lounge`, `#code`, and `#welcome`. We’ve kept `#hardware-party` and its affiliated channels open for now, since we’re still shipping out the final grants & want to continue support as folks complete their projects. In the future, we’ll redirect folks to `#hardware`.\n\nA handful of folks are yet to be promoted. We’ll be finding many of you who are active on Scrapbook & promoting you, but message anyone on `@summer` if you need a promotion.\n\n**New users:** We’ve redesigned the flow for joining the Slack. New users now join as multi-channel guests, added only to `#welcome` and a private channel where they’re introduced to the Slack. Once they complete the tutorial, they’re automatically promoted to full users & unlock the rest of the community.\n\n**Stickers:** Everyone who filled out the form at [https://hack.af/som-stickers](https://hack.af/som-stickers) will receive stickers in the upcoming 4-8 weeks! Over 7,000 people from 122 countries requested stickers and we're still trying to figure out how to ship them all. Hang tight.\n\n## Scrapbook from Anywhere\n\nWhile originally Scrapbook was merely a summer project, shutting it down didn’t feel right. Thanks to <StaticMention username=\"caleb\" avatar=\"https://cloud-5v0kfmsva.vercel.app/image.png\" link=\"https://scrapbook.hackclub.com/caleb\" />, today we’re launching **“Scrapbook from Anywhere”**. When you post in a public channel with the Scrappy bot, add a `:scrappy:` emoji reaction & your message will be posted to your Scrapbook. We’ve added this to help Scrapbook mix with the rest of Slack more, and while the `#scrapbook` channel will remain as-is, it allows you to Scrapbook the projects you `#ship`, get feedback in `#design` or `#wip`, show off your photo in `#photography`, or share with your club without cross-posting.\n\n[![Amogh's Scrapbook on a MacBook Air](https://cloud-2iw372frd.vercel.app/2020-08-31_83wk7n4zpuzkfjwdmwqgm22ccccqz0r9.jpeg)](https://scrapbook.hackclub.com/amogh)\n\n---\n\nIn summary, thank you—to everyone who helped run parts of the Summer, who made a Scrapbook post, built something epic with a hardware grant, attended a live event or just dropped by the Slack. Back in April, I posted my original summer idea in `#hq`. It’s been an experience of a lifetime helping put it together.\n\nWith gratitude,\n\nSam Poder, the Summer of Making team, & Hack Club HQ\n\n</Letterhead>\n"
  },
  {
    "path": "pages/content/transparency/may-2020.mdx",
    "content": "import Letterhead from '../../../components/letterhead'\n\n<Letterhead\ntitle=\"May 2020 Transparency Update\"\ndesc=\"An update with the latest open finances from Hack Club HQ.\"\nimg=\"https://workshop-cards.hackclub.com/Transparency%20Update.png?theme=light&brand=HQ&fontSize=225px&caption=May%202020\"\nauthor={{\n  name: '@zrl',\n  avatar: 'https://hackclub.com/team/zach.jpg',\n  url: 'https://app.slack.com/team/U0266FRGP'\n}}\ndate=\"2020-06-03\"\npath=\"transparency-may.mdx\">\n\nIn 2014, after dropping out of high school at 16 to become a programmer, I started Hack Club. I had so many questions. How would finances work? How did other organizations get donations? How did they budget and spend their money? How much does it cost to run a program that reaches 1,000 people? What is an appropriate monthly salary for an employee? How much do lawyers and CPAs cost?\n\nFor me, learning to program was largely possible because of open source: the code of so much software written by both professionals and hobbyists is available publicly on GitHub. When you see under the hood at how software is made, you learn yourself. But nonprofits don't work that way. They are enigmas to outsiders. While top-level information is available to the public via [IRS Form 990](https://en.wikipedia.org/wiki/Form_990) ([example](https://990s.foundationcenter.org/990_pdf_archive/946/946069890/946069890_201712_990.pdf)), the actual budgets and details of spending are closely guarded secrets—often not even donors, staff members, or board members are privy to how nonprofits spend their money.\n\nThat lack of transparency creates an ivory tower of nonprofits that is near-impossible enter as an outsider. Since it's impossible to learn from what other organizations are doing, this results in a world where you have to be born into a high-priest class to successfully start a nonprofit and receive major gifts.\n\nWe’d like to do things differently at Hack Club.\n\nA totally transparent nonprofit not only shows others how to do it. It also increases accountability. This is a goal of the Liberman family, who have inspired and supported Hack Club's transparency goals over the last year. In 2019, Hack Club won the [Frank Prize](https://grant.frank.ly/) of $1M to support growing Hack Club's programs and to support Hack Club in increasing transparency. Two weeks ago, [we announced we were publicly opening Hack Club's bank account](https://hackclub.com/elon/).\n\nWhile a bunch of transactions in a bank account is great, I want to summarize Hack Club's spending in May 2020 publicly. This is something that I wish other nonprofits did when Hack Club was first getting started.\n\nThe below summary was calculated from HQ's export from [HCB](https://hackclub.com/fiscal-sponsorship/). You can see our full current account at https://hcb.hackclub.com/hq/ using HCB's new [Transparency Mode](https://twitter.com/hackclub/status/1262471150963130374).\n\n### Revenue (total $20,621.78)\n\n- **Donations ($15,621.78)**\n  - $15,000 - Ron Conway\n  - $244.20 - Samuel Escapa\n  - $200 - Tim and Kate Clem\n  - $97.50 - Jake Brownson\n  - $20 - Jeffrey Owens\n  - $19.30 - David C Farnan-Williams\n  - $19.30 - Reid Workman\n  - $10 - Chaleb Pommells\n  - $9.48 - Tyler Hilliard\n  - $2 - Hamza bnr Bellucci\n- **Consulting Income ($5,000)**\n\n  _This was a one-time project to advise Think Together on their September 2020 school re-opening plans._\n  - $5,000 - Think Together\n\nThank you to all the new donors to Hack Club this month. You make Hack Club possible. We rely on donations to keep Hack Club free for students. [Donate here.](https://hackclub.com/philanthropy/)\n\nPlease note that [Elon Musk also donated $500K this month](https://twitter.com/hackclub/status/1263153557945159680), but the gift didn't hit our account until June 3rd, so it will be included in the June finance update.\n\n### Expenses ($61,729.35 - nearly entirely salaries)\n\n- **People including taxes ($57,625.25)**\n\n  _For the first time, Hack Club staff is growing beyond 3 people. When we were still tiny, we all took essentially the same salary of $4K/month. Now that we're growing, we still need to figure out how we want to think about salaries as an organization._\n  - $13,333.33 - Christina Asquith - COO, leads donor side\n    - $9,962.34 - Net pay\n    - $3,370.99 - Employee taxes\n    - $1,020 - Employer taxes\n  - $6,666.67 - Chris Walker - Clubs\n    - $5,268.17 - Net pay\n    - $1,398.50 - Employee taxes\n    - $510 - Employer taxes\n  - $6,500 - Zach Latta - Executive Director\n    - No taxes pre-withdrawn due to 1099, net pay above\n  - $5,166.67 - Max Wofford - Clubs, working with Chris, recently owning HCB too\n    - No taxes pre-withdrawn due to 1099, net pay above\n  - $4,761.90 - Lachlan Campbell - Design, https://hackclub.com\n    - No taxes pre-withdrawn due to 1099, net pay above\n  - $4,425 - Hack Club India Team\n    - There are 117 Hack Clubs in India overseen by Athul and his team. We provide monthly funding to cover salaries for the team, an office, and operational expenses like travel and food.\n  - $4,166.67 - Matthew Stanciu - Clubs, working with Chris and Max\n    - No taxes pre-withdrawn due to 1099, net pay above\n  - $3,500 - Theo Bleier - Donor side, working with Christina\n    - No taxes pre-withdrawn due to 1099, net pay above\n  - $3,100 - Michael Destefanis - Runs operations on HCB\n    - $2,444.13 - Net pay\n    - $655.87 - Employee taxes\n    - $237.15 - Employer taxes\n  - $2,000 - Melody - Community and running [our Twitter](https://twitter.com/hackclub)\n    - Note: Melody is paid $4K/month. I've been paying them weekly out of my personal bank account and getting reimbursed by Hack Club. Not all the reimbursements for May have gone through yet, which is why this number is $2K instead of $4K.\n  - $1,642.86 - Sean Victory (filled in for Michael during medical leave, this was his final payment + $500 bonus)\n  - $495 - James Click (contractor on AMA video editing, ~$150/each)\n  - $100 - Sammi Brie (contractor on graphic design for Elon AMA)\n\n- **Hardware Chris Purchased for Simone and future AMAs ($1,201.11)**\n  - $938.08 - Bass Pro\n  - $256.51 - Lowe's\n  - $6.52 - Amazon\n- **Software ($1,121.31)**\n  - $260.25 - Rippling (payroll processor)\n  - $249.90 - Zoom\n  - $184.66 - Airtable\n  - $99 - Zapier\n  - $82.83 - Calendly\n  - $59.99 - LinkedIn Premium\n  - $45 - Figma\n  - $40 - QuickBooks\n  - $39 - Mountain Duck\n  - $26.99 - Dialpad\n  - $14.99 - Castr.io\n  - $9 - Unity\n  - $8.50 - DNSimple\n  - $1.20 - Mailgun\n- **HCB ($515.25)**\n  - $207 - Expensify\n  - $181.60 - Earth Class Mail (mail processing service)\n  - $120 - DocuSign\n  - $6.65 - Lob (check printer)\n- **Hosting ($464.81)**\n  - $425.12 - Heroku\n  - $18.50 - Compose.io\n  - $9.11 - Digital Ocean\n  - $6.54 - Linode\n  - $3.50 - Vultr\n  - $2.04 - Backblaze\n- **Food ($434.71)**\n  - $409.78 - Groceries\n  - $24.93 - Staff lunch in Philly\n- **Office ($287.46)**\n  - $207.79 - Standing whiteboard\n  - $42.39 - White noise machine\n  - $21.39 - Video call lighting supplies\n  - $15.89 - Kitchen supplies\n- **News ($67.94)**\n  - $38.99 - Wall Street Journal\n  - $12.95 - Business Insider\n  - $12 - Stratechery\n  - $4 - New York Times\n- **Minecraft Server ($59)**\n  - $59 - Wholesale Internet\n- **Mail Team ($117.49)**\n  - $59.49 - Supplies\n  - $49 - ShipStation\n  - $9 - Aftership\n- **Misc ($42.81)**\n  - $42.81 - Medicine\n\nThe above numbers are on a cash basis, meaning they only include transactions that hit our bank account or cards this month.\n\nIn some cases, there are expenses that we have committed to in May that have not yet hit our accounts, like rent for the space that the team is currently staying in. I've done my best to list all known missing transactions below:\n\n- $500,000 donation from Elon Musk\n- $5,000 in rent for May 17th - June 14th (4 weeks) for team in Vermont\n- $1,800 paid to Melody for work done in April and March 2020 (I paid them at the time from my personal account and have not been reimbursed yet)\n- $3,670 paid to Lewis Mudge for rent the 2nd 1/2 April and the first 1/2 of May (place Max and I stayed in). Similarly, I paid Lewis at the time from my personal account and have not yet been reimbursed.\n- ~$100 gas for staff trip to Vermont\n\nPlease note: there may be errors in this post. While I have pulled the numbers directly from HCB, I did mess around a bit in a spreadsheet and have not double checked my work. I believe that all numbers below are approximately correct.\n\nIf you’re interested in seeing the Google Sheet I used to calculate the above numbers, you can see it at https://docs.google.com/spreadsheets/d/1UDw7YewsS5wJIVm0Uh5wOGlM2Ddv-kZVrD3QqIypvRQ/edit.\n\nPlease note that while the above encompasses all of HQ's spending in our HCB account, it does not include GitHub grants to clubs, postage bought by Mail Team, or grants made from our internal \"Discretionary Fund\" to students in need that is funded by Ron Conway.\n\n_Thanks to Christina, Melody, and Lachlan for their help writing this post._\n\n</Letterhead>\n"
  },
  {
    "path": "pages/deprecated/[deprecated].tsx",
    "content": "import { Box, Button, Container, Heading, Text } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Icon from '@hackclub/icons'\nimport Head from 'next/head'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\n\ntype DeprecatedPageProps = {\n  page: {\n    name: string\n    desc: string\n    icon: string\n    link: string\n  }\n}\n\nconst DeprecatedPage = ({\n  page: { name, desc, icon, link }\n}: DeprecatedPageProps) => (\n  <>\n    <Nav dark />\n    <Meta\n      as={Head}\n      title={name}\n      desc={`Hack Club no longer offers ${name}. Learn more here.`}\n      image={`https://workshop-cards.hackclub.com/${encodeURIComponent(\n        name\n      )}.png?theme=dark&caption=deprecated&fontSize=250px&brand=HQ`}\n    />\n    <Box\n      as=\"main\"\n      sx={{\n        bg: 'dark',\n        color: 'muted',\n        pt: [5, 6],\n        pb: [4, 5],\n        textAlign: 'center'\n      }}\n    >\n      <Container variant=\"narrow\" as=\"article\">\n        <Icon size={128} glyph={icon as any} />\n        <Heading as=\"h1\" variant=\"title\" sx={{ color: 'snow', my: [2, 3] }}>\n          We no longer offer {name}.\n        </Heading>\n        <Heading as=\"h2\" variant=\"subtitle\" sx={{ mb: 4 }}>\n          {desc}\n        </Heading>\n        <a href={link} target=\"_blank\" rel=\"noopener noreferrer\">\n          <Button as=\"span\">Check it out »</Button>\n        </a>\n      </Container>\n    </Box>\n    <Footer dark />\n  </>\n)\n\nexport default DeprecatedPage\n\nconst pages = {\n  cloud9: {\n    name: 'Cloud9',\n    desc: 'Cloud9 has been replaced by repl.it, a newer online IDE.',\n    link: 'https://repl.it/?ref=hackclub',\n    icon: 'terminal'\n  },\n  challenge: {\n    name: 'Challenge',\n    desc: 'If you miss Hack Club Challenge, check out Scrapbook!',\n    link: 'https://scrapbook.hackclub.com/',\n    icon: 'sticker'\n  },\n  tech_domains: {\n    name: '.TECH domains',\n    desc: 'If you’re looking for a domain, you can get one via the Hack Pack.',\n    link: 'https://hack.af/pack',\n    icon: 'web'\n  },\n  pack: {\n    name: 'the Hack Pack',\n    desc: 'GitHub still offers the GitHub Student Developer Pack through the standard application flow.',\n    link: 'https://education.github.com/pack',\n    icon: 'github'\n  }\n}\n\nexport const getStaticPaths = () => {\n  const paths = Object.keys(pages).map(key => ({ params: { deprecated: key } }))\n  return { paths, fallback: false }\n}\n\nexport const getStaticProps = ({ params }) => {\n  const page = pages[params.deprecated]\n  return { props: { page } }\n}\n"
  },
  {
    "path": "pages/elon.tsx",
    "content": "import { Box, Container, Heading, Text } from 'theme-ui'\nimport {\n  PillHolder,\n  AuthorPill,\n  DatePill\n} from '../components/announcements/pills'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\nimport Elon from '../components/announcements/elon.mdx'\nimport SlackCTA from '../components/announcements/cta'\nimport AnnouncementHolder from '../components/announcements/holder'\n\nconst ElonPage = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Elon Musk is Giving $500K\"\n      description=\"We’re thrilled to announce Elon Musk has donated $500k to Hack Club, a global nonprofit network of high school hackers & coding clubs.\"\n      image=\"https://assets.hackclub.com/log/HC-500k@1080w.png\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"section\"\n      sx={{\n        pt: [5, 6],\n        pb: [4, 5],\n        bg: 'rgb(104, 41, 205)',\n        backgroundImage: (t: any) => t.util.gx('yellow', 'green')\n      }}\n    >\n      <Container sx={{ textAlign: 'center', color: 'white' }}>\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{\n            fontSize: [5, 6, null, 7],\n            span: {\n              WebkitTextStroke: 'currentColor',\n              WebkitTextStrokeWidth: ['2px', '3px'],\n              WebkitTextFillColor: 'transparent'\n            }\n          }}\n        >\n          Hack Club “makes me feel <span>much more optimistic</span>{' '}\n          about&nbsp;the future.”\n        </Heading>\n        <Text variant=\"headline\">—Elon Musk</Text>\n      </Container>\n    </Box>\n    <AnnouncementHolder>\n      <PillHolder>\n        <AuthorPill\n          firstName=\"Zach\"\n          tag=\"Zach Latta, founder\"\n          image=\"https://hackclub.com/team/zach.jpg\"\n        />\n        <DatePill tag=\"May 15, 2020\" />\n      </PillHolder>\n      <Elon />\n    </AnnouncementHolder>\n    <SlackCTA />\n    <Footer />\n  </>\n)\n\nexport default ElonPage\n"
  },
  {
    "path": "pages/events.tsx",
    "content": "import {\n  Box,\n  Button,\n  Container,\n  Heading,\n  Card,\n  Grid,\n  Flex,\n  Image as Img,\n  Link\n} from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport ForceTheme from '../components/force-theme'\nimport Nav from '../components/nav'\nimport Footer from '../components/footer'\nimport Image from 'next/image'\nimport OuternetPic from '../public/outernet/hack.jpg'\nimport theme from '@hackclub/theme'\n\nconst events = [\n  {\n    name: 'Haunted House',\n    description: `Where Fright Meets Byte: A Haunted House Hackathon Experience in Downtown Chicago.`,\n    logo: 'https://emoji.slack-edge.com/T0266FRGM/hauntedhouse/427353c4bd656767.png',\n    location: 'Chicago, Illinois',\n    season: 'Fall',\n    year: '2023',\n    // repo: 'outernet',\n    image: 'https://cloud-6vo1bh2dg-hack-club-bot.vercel.app/0image.png',\n    link: 'https://haunted.hackclub.com'\n  },\n  {\n    name: 'Outernet',\n    description: `An out-of-doors, make-it-yours programming and camping adventure in Vermont's Northeast Kingdom.`,\n    logo: 'https://emoji.slack-edge.com/T0266FRGM/outernet/522a19d904a627e6.png',\n    location: 'Cabot, Vermont',\n    season: 'Summer',\n    year: '2023',\n    video: 'https://www.youtube.com/embed/O1s5HqSqKi0',\n    repo: 'outernet'\n  },\n  {\n    name: 'Epoch',\n    logo: `https://emoji.slack-edge.com/T0266FRGM/epoch/1337c0f7f3c8341d.png`,\n    description: `A magical New Year's spent hacking in New Delhi, our first flagship event abroad and in India.`,\n    location: 'Delhi NCR, India',\n    season: 'Winter',\n    year: '2022/23',\n    video: 'https://www.youtube.com/embed/KLx4NZZPzMc',\n    repo: 'epoch'\n  },\n  {\n    name: 'Assemble',\n    logo: 'https://emoji.slack-edge.com/T0266FRGM/assemble/4f9465eb00175463.png',\n    description:\n      'The first high school hackathon since the pandemic! Hosted by a team of Hack Clubbers to kick off a hackathon renaissance.',\n    location: 'San Francisco, California',\n    season: 'Summer',\n    year: '2022',\n    video: 'https://youtube.com/embed/PnK4gzO6S3Q',\n    repo: 'assemble'\n  },\n  {\n    name: 'The Hacker Zephyr',\n    logo: 'https://hackclub.com/stickers/zephyr.svg',\n    description:\n      'A cross-country hacker adventure on a train and the longest hackathon (by miles) on land.',\n    location: 'Burlington (VT) to Los Angeles (CA)',\n    season: 'Summer',\n    year: '2021',\n    video: 'https://youtube.com/embed/2BID8_pGuqA',\n    repo: 'the-hacker-zephyr'\n  },\n  {\n    name: 'Summer of Making',\n    logo: 'https://hackclub.com/stickers/summer_of_making.svg',\n    description:\n      '$50k in hardware donations to teen hackers around the world and the creation of Scrapbook:',\n    location: 'Online (thanks COVID-19!)',\n    season: 'Summer',\n    year: '2020',\n    image:\n      'https://cdn.sanity.io/images/2ejqxsnu/production/ed144128afb78a7095d6c77945efdd2c38078ecf-1637x990.png?w=3840&q=75&fit=clip&auto=format',\n    link: 'https://scrapbook.hackclub.com/r/summer-of-making',\n    ghTag: 'summer-of-making'\n  },\n  {\n    name: 'Flagship',\n    logo: 'https://hackclub.com/stickers/ship.png',\n    description:\n      'An IRL meetup of high school hackathon organizers and coding club leaders. Our first \"flagship\" event.',\n    location: 'San Francisco, California',\n    season: 'Summer',\n    year: '2019',\n    image:\n      'https://github.com/hackclub/www-assemble/blob/main/public/hackers-assemble.jpg?raw=true',\n    link: 'https://hack.af/flagship-album'\n  }\n]\n\nconst Event = ({\n  name,\n  logo,\n  location,\n  season,\n  description,\n  year,\n  video,\n  repo,\n  ghTag,\n  image,\n  link\n}) => (\n  <Card variant=\"sunken\">\n    <Flex sx={{ alignItems: 'center', mb: 2 }}>\n      <Img src={logo} sx={{ height: '24px', mr: 2 }} />\n      <Heading as=\"h2\">{name}</Heading>\n    </Flex>\n    <Box>{description}</Box>\n    {video ? (\n      <iframe\n        src={video}\n        allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n        allowFullScreen\n        width=\"100%\"\n        height=\"250px\"\n        style={{ borderRadius: '8px', marginTop: 8, border: 'none' }}\n      />\n    ) : (\n      <a href={link}>\n        <Img\n          src={image}\n          sx={{\n            borderRadius: '8px',\n            mt: 2,\n            height: '250px',\n            objectFit: 'cover',\n            width: '100%',\n            objectPosition: 'top'\n          }}\n        />\n      </a>\n    )}\n    <Box sx={{ color: 'darkless' }}>\n      <b>\n        {season}, {year} - {location}\n      </b>{' '}\n    </Box>\n    <Box>\n      {' '}\n      {repo && (\n        <Link href={`https://github.com/hackclub/${repo}`}>\n          <>github.com/hackclub/{repo}</>\n        </Link>\n      )}\n      {ghTag && (\n        <Link href={`https://github.com/topics/${ghTag}`}>\n          <>github.com/topics/{ghTag}</>\n        </Link>\n      )}\n      {link && !repo && !ghTag && (\n        <Link href={link}>\n          <>{link.replace('https://', '')}</>\n        </Link>\n      )}\n    </Box>\n  </Card>\n)\n\nconst Page = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Events\"\n      description=\"Every summer (and now every winter!), Hack Club does something special to bring the community together. Let's take a trip down memory lane.\"\n      image=\"https://hackclub.com/outernet/hack.jpg\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"main\"\n      key=\"main\"\n      sx={{\n        color: 'black'\n      }}\n    >\n      <Box\n        sx={{\n          py: [5, 6],\n          background:\n            'linear-gradient(90deg, rgba(2,0,36,0.63) 0%, rgba(2,0,36,0.56) 100%)',\n          backgroundSize: 'cover',\n          backgroundPosition: 'center',\n          textAlign: 'center',\n          position: 'relative'\n        }}\n      >\n        <Box\n          sx={{\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            bottom: 0,\n            right: 0,\n            zIndex: -1\n          }}\n        >\n          <Image\n            src={OuternetPic}\n            alt=\"Hack Clubbers coming together at Outernet\"\n            fill\n            sizes=\"100vw\"\n            style={{\n              objectFit: 'cover'\n            }}\n          />\n        </Box>\n        <Container>\n          <Heading\n            as=\"h1\"\n            sx={{\n              fontSize: ['48px', '48px', '72px'],\n              color: 'white',\n              textShadow: 'elevated'\n            }}\n          >\n            Hack Club's Events\n          </Heading>\n          <Heading\n            sx={{\n              color: 'smoke',\n              mt: 3,\n              fontSize: ['18px', '24px'],\n              lineHeight: ['1.5', '1.325'],\n              maxWidth: '900px',\n              margin: 'auto',\n              fontWeight: 400,\n              textShadow: 'small'\n            }}\n          >\n            Every summer and now every winter, Hack Club does something special\n            to bring the community together. Let's take a trip down memory lane.\n          </Heading>\n          <Link\n            href=\"https://slack.hackclub.com\"\n            target=\"_blank\"\n            rel=\"noopener\"\n            sx={{ textDecoration: 'none' }}\n          >\n            <Button\n              variant=\"ctaLg\"\n              sx={{ mt: 3, background: theme.util.gx('purple', 'blue') }}\n            >\n              Get ready for the next one!\n            </Button>\n          </Link>\n        </Container>\n      </Box>\n      <Container sx={{ py: [3, 4], px: [2, 2, 0] }}>\n        <Grid\n          sx={{\n            maxWidth: '64rem',\n            mx: 'auto'\n          }}\n          columns={['1fr', '1fr 1fr']}\n        >\n          {events.map((event, i) => (\n            <Event\n              key={`event-${i}`}\n              name={event.name}\n              logo={event.logo}\n              location={event.location}\n              season={event.season}\n              description={event.description}\n              year={event.year}\n              video={event.video ?? null}\n              repo={event.repo ?? null}\n              ghTag={event.ghTag ?? null}\n              image={event.image ?? null}\n              link={event.link ?? null}\n            />\n          ))}\n        </Grid>\n        <Card\n          variant=\"sunken\"\n          sx={{\n            textAlign: 'center',\n            background: theme.util.gx('cyan', 'blue'),\n            color: 'white',\n            width: '100%',\n            maxWidth: '64rem',\n            mx: 'auto',\n            mt: 3,\n            fontSize: 2\n          }}\n        >\n          <Box sx={{ maxWidth: '600px', mx: 'auto' }}>\n            Looking for more? Hack Clubbers often organise their own hackathons!\n            Check them out at{' '}\n            <Link\n              href=\"https://hackathons.hackclub.com\"\n              sx={{ color: 'white' }}\n              target=\"_blank\"\n            >\n              hackathons.hackclub.com\n            </Link>\n            . Hack Club is also behind a series of{' '}\n            <Link\n              href=\"https://daysofservice.hackclub.com/\"\n              sx={{ color: 'white' }}\n              target=\"_blank\"\n            >\n              Day of Service\n            </Link>{' '}\n            events and{' '}\n            <Link\n              href=\"https://events.hackclub.com/\"\n              sx={{ color: 'white' }}\n              target=\"_blank\"\n            >\n              frequent virtual events\n            </Link>\n            .\n          </Box>\n        </Card>\n      </Container>\n    </Box>\n\n    <Footer key=\"footer\" />\n  </>\n)\n\nexport default Page\n"
  },
  {
    "path": "pages/fiscal-sponsorship/about.tsx",
    "content": "import { Box, Container, Flex, Link, Text } from 'theme-ui'\nimport { useEffect, useRef } from 'react'\nimport { keyframes } from '@emotion/react'\nimport FlexCol from '../../components/flex-col'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport ForceTheme from '../../components/force-theme'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport Icon from '../../components/icon'\nimport Tilt from '../../components/tilt'\n\ntype BulletProps = {\n  glow?: boolean\n  icon: string\n  href?: string\n  children: React.ReactNode\n}\n\nfunction Bullet({ glow = true, icon, href, children }: BulletProps) {\n  const effectColours = [\n    '#ec3750',\n    '#ff8c37',\n    '#f1c40f',\n    '#33d6a6',\n    '#5bc0de',\n    '#338eda',\n    '#a633d6'\n  ]\n\n  function keyframeGenerator(spread, blur, colours, opacity = 0.5) {\n    const hexOpacity = Math.max(Math.min(Math.round(opacity * 255), 255), 0)\n      .toString(16)\n      .padStart(2, '0')\n\n    const final = {}\n    for (let i = 0; i <= 100; i++) {\n      let baseX = Math.sin((i * Math.PI) / 50) // 50 keyframes for each pi radians\n      let baseY = -Math.cos((i * Math.PI) / 50)\n\n      // Ensure no scientific notation\n      const roundFactor = 1_000_000\n      baseX = Math.round(baseX * roundFactor) / roundFactor\n      baseY = Math.round(baseY * roundFactor) / roundFactor\n\n      let boxShadow = ''\n      for (let c = 0; c < colours.length; c++) {\n        // Rotate by 2pi / colours.length * c radians\n        const x =\n          baseX * Math.cos((2 * Math.PI * c) / colours.length) -\n          baseY * Math.sin((2 * Math.PI * c) / colours.length)\n        const y =\n          baseX * Math.sin((2 * Math.PI * c) / colours.length) +\n          baseY * Math.cos((2 * Math.PI * c) / colours.length)\n\n        boxShadow += `${x * spread}px ${y * spread}px ${blur}px ${\n          colours[c]\n        }${hexOpacity},`\n      }\n\n      // Remove trailing comma\n      boxShadow = boxShadow.slice(0, -1)\n\n      final[i + '%'] = { boxShadow }\n    }\n\n    return final\n  }\n\n  const shadowSpread = glow ? 5 : 0\n  const shadowBlur = glow ? 10 : 0\n  const animatedBoxShadow = keyframes(\n    keyframeGenerator(shadowSpread, shadowBlur, effectColours)\n  )\n\n  const borderWidth = '2px'\n\n  return (\n    <Tilt>\n      <Flex\n        as={href ? 'a' : 'div'}\n        {...(href && { href })}\n        {...({ target: '_blank' } as any)}\n        sx={{\n          display: 'flex',\n          alignItems: 'center',\n          gap: 2,\n\n          width: '20rem',\n\n          borderWidth,\n          borderRadius: '8px !important',\n          p: '8px !important',\n\n          textDecoration: 'none',\n          color: 'inherit',\n\n          backgroundColor: 'var(--theme-ui-colors-darkless)',\n\n          '&:hover::after': {\n            content: '\"\"',\n            position: 'absolute',\n            inset: 0,\n            boxShadow: `linear-gradient(60deg, ${effectColours[0]}, ${effectColours[1]}, ${effectColours[2]}, ${effectColours[3]}, ${effectColours[4]})`,\n            borderRadius: 'inherit',\n            zIndex: -1,\n            animation: `${animatedBoxShadow} 5s ease infinite`\n          }\n        }}\n      >\n        <Icon glyph={icon} size={42} sx={{ color: 'red', flexShrink: 0 }} />\n        <Box sx={{ textAlign: 'left' }}>{children}</Box>\n        {href && (\n          <Icon\n            glyph=\"external-fill\"\n            size={32}\n            sx={{\n              position: 'absolute',\n              top: 0,\n              right: 0,\n              translate: '50% -50%',\n              color: 'muted'\n            }}\n          />\n        )}\n      </Flex>\n    </Tilt>\n  )\n}\n\nfunction BulletBox({ padding = '2rem', children }) {\n  return (\n    <Box\n      as=\"ul\"\n      sx={{\n        width: '100%',\n        display: 'flex',\n        flexWrap: 'wrap',\n        justifyContent: 'center',\n        gridGap: '2rem',\n        padding\n      }}\n    >\n      {children}\n    </Box>\n  )\n}\n\nfunction Section({ id, children }) {\n  return (\n    <Flex as=\"section\" id={id} sx={{ flexDirection: 'column', pt: 5 }}>\n      {children}\n    </Flex>\n  )\n}\n\nexport default function FiscalSponsorship() {\n  const gridRef = useRef(null)\n  const glowRef = useRef(null)\n\n  const scrollPos = useRef(0)\n  const mousePos = useRef([0, 0])\n\n  const setGlowMaskPosition = () => {\n    const finalPos = [\n      -mousePos.current[0],\n      -mousePos.current[1] + scrollPos.current\n    ]\n    glowRef.current.style.maskPosition = `${finalPos[0]}px ${finalPos[1]}px`\n    glowRef.current.style.WebkitMaskPosition = `${finalPos[0]}px ${finalPos[1]}px`\n  }\n\n  useEffect(() => {\n    const handleScroll = e => {\n      scrollPos.current = -window.scrollY / 10\n\n      gridRef.current.style.transform = `translateY(${scrollPos.current}px)`\n\n      setGlowMaskPosition()\n    }\n\n    const handleMouseMove = e => {\n      const x = e.clientX\n      const y = e.clientY\n      glowRef.current.style.left = x + 'px'\n      glowRef.current.style.top = y + 'px'\n\n      mousePos.current = [x, y]\n      setGlowMaskPosition()\n    }\n\n    window.addEventListener('scroll', handleScroll)\n    window.addEventListener('mousemove', handleMouseMove)\n    return () => {\n      window.removeEventListener('scroll', handleScroll)\n      window.removeEventListener('mousemove', handleMouseMove)\n    }\n  }, [])\n\n  return (\n    <Box as=\"main\" key=\"main\" sx={{ position: 'relative' }}>\n      <style>\n        {`* {\n            scroll-behavior: smooth;\n          }\n          p {\n            text-wrap: balance;\n          }\n        `}\n      </style>\n      <Box\n        ref={gridRef}\n        sx={{\n          position: 'fixed',\n          inset: 0,\n          height: '1000%',\n          zIndex: -2,\n          backgroundSize: '20px 20px',\n          backgroundImage: `linear-gradient(to right,  #23262D 1px, transparent 1px),\n                                      linear-gradient(to bottom, #23262D 1px, transparent 1px) `,\n          backgroundPosition: 'top left',\n          maskImage: `linear-gradient(180deg, transparent 0%, white 3%)`,\n          opacity: 0.5\n        }}\n      />\n      <Box\n        ref={glowRef}\n        sx={{\n          pointerEvents: 'none',\n          zIndex: -2,\n          position: 'fixed',\n          top: '0',\n          left: '0',\n          width: '20rem',\n          height: '20rem',\n          background: 'red',\n          opacity: 0.2,\n          borderRadius: '50%',\n          filter: 'blur(2rem)',\n          translate: '-50% -50%',\n          // Mask it to the grid background\n          maskImage: `linear-gradient(to right, #23262D 1px, transparent 1px),\n                                linear-gradient(to bottom, #23262D 1px, transparent 1px) `,\n          maskSize: '20px 20px, 20px 20px, cover',\n          maskPosition: '0px 0px'\n        }}\n      />\n      <Nav dark />\n      <ForceTheme theme=\"dark\" />\n      <Meta\n        as={Head}\n        title=\"Fiscal Sponsorship\"\n        description=\"What is fiscal sponsorship?\"\n        image=\"/fiscal-sponsorship/og-image.png\"\n      >\n        <title>Fiscal Sponsorship | HCB</title>\n      </Meta>\n\n      <Container\n        variant=\"copy\"\n        sx={{ mt: 6, display: 'flex', flexDirection: 'column', gap: 3 }}\n      >\n        <FlexCol gap={4}>\n          <Text variant=\"title\" as=\"h1\">\n            Fiscal sponsorship:\n            <br />\n            <Text\n              sx={{\n                color: 'red',\n                textShadow: '0 0 50px var(--theme-ui-colors-red)'\n              }}\n            >\n              501(c)(3)&nbsp;nonprofit{' '}\n            </Text>\n            status in just 24 hours\n          </Text>\n        </FlexCol>\n        <Text variant=\"headline\" as=\"p\" sx={{ fontWeight: 'body' }}>\n          Organizing an event, project, or organization to serve the public good\n          or your community? Consider fiscal sponsorship before the pain of\n          paperwork distracts you from your goals.\n        </Text>\n\n        <FlexCol gap={1} alignItems=\"center\">\n          <Text variant=\"headline\">Jump to:</Text>\n          <BulletBox padding=\"0\">\n            <Link sx={{ fontSize: 2 }} href=\"#costs-and-perks\">\n              Costs and perks of 501(c)(3) status\n            </Link>\n            <Link sx={{ fontSize: 2 }} href=\"#what-is\">\n              How fiscal sponsorship works\n            </Link>\n            <Link sx={{ fontSize: 2 }} href=\"#requirements\">\n              Requirements for fiscal sponsorship\n            </Link>\n            <Link sx={{ fontSize: 2 }} href=\"#partner\">\n              HCB, the #1 fiscal sponsor\n            </Link>\n          </BulletBox>\n        </FlexCol>\n        <Section id=\"costs-and-perks\">\n          <Text variant=\"title\" as=\"h2\">\n            Why organizers go after 501(c)(3) status\n          </Text>\n          <Text variant=\"lead\">\n            Every year, 1.6 million nonprofits in the U.S. apply for and renew\n            501(c)(3) status through the IRS for charitable recognition and tax\n            exemption for their funding. It can take anywhere from 2-12 months\n            to hear a decision back from the IRS, and in general, nonprofit\n            organizers should be prepared for:\n          </Text>\n          <BulletBox>\n            <Bullet glow={false} icon=\"sad\">\n              $3,000 in <b>up-front costs</b>, from\n              <Link href=\"https://www.irs.gov/charities-non-profits/form-1023-and-1023-ez-amount-of-user-fee\">\n                {' '}\n                forms{' '}\n              </Link>\n              to state fees to support from legal counsel\n            </Bullet>\n            <Bullet glow={false} icon=\"sad\">\n              The potential for the IRS to <b>reject</b> an application\n            </Bullet>\n            <Bullet glow={false} icon=\"sad\">\n              <b>Hiring</b> bookkeepers and accountants to prepare taxes and\n              provide upkeep annually to stay in good standing\n            </Bullet>\n            <Bullet glow={false} icon=\"sad\">\n              <b>Closing costs</b> averaging around $5,000 if you lose or\n              terminate status\n            </Bullet>\n          </BulletBox>\n        </Section>\n        <Text variant=\"lead\">\n          Though it’s expensive and time consuming to apply, being a\n          legally-recognized 501(c)(3) nonprofit in the U.S., your organization\n          gains:\n        </Text>\n        <BulletBox>\n          <Bullet icon=\"payment\">\n            The ability to receive <b>tax deductible donations</b> from\n            sponsors.\n          </Bullet>\n          <Bullet icon=\"member-add\">\n            Reduced taxable income for your U.S. supporters, which\n            <b> incentivizes giving</b>.\n          </Bullet>\n          <Bullet icon=\"leader\">\n            <b>Exemption</b> from U.S. federal income tax and unemployment tax.\n          </Bullet>\n          <Bullet icon=\"bolt\">\n            Potential exemption from state income, sales, and employment taxes.\n          </Bullet>\n          <Bullet icon=\"email\">\n            Potential for reduced rates on postage, marketing, advertising,\n            legal counsel, and more.\n          </Bullet>\n        </BulletBox>\n        <Text variant=\"lead\">\n          Unfortunately between the costs and time needed to organize a\n          nonprofit, many charitable initiatives are prevented from exiting an\n          idea phase or progressing at a pace originally hoped. Imagine how much\n          more valuable impact could happen on the world if these barriers\n          didn’t exist.\n        </Text>\n        <Text variant=\"lead\">\n          As it turns out, there’s an alternative route for startups,\n          student-led initiatives, or anyone looking to avoid a headache with\n          the IRS to obtain all the benefits of 501(c)(3) status. That’s where\n          fiscal sponsorship comes in.\n        </Text>\n        <Section id=\"what-is\">\n          <Text variant=\"title\" as=\"h2\">\n            Fiscal sponsorship?\n          </Text>\n          <Text variant=\"lead\">\n            By legally working with an existing nonprofit offering fiscal\n            sponsorship, projects and events can claim most of the legal\n            benefits of individual 501(c)(3) status. Piggy-backing off this\n            existing status, organizations also gain access to resources from\n            their fiscal sponsor like:\n          </Text>\n          <BulletBox>\n            <Bullet icon=\"docs\">\n              Bookkeeping and administration to ensure that all paperwork and\n              taxes are filed\n            </Bullet>\n            <Bullet icon=\"bag\">\n              Fully established HR and benefits, which can vary by the fiscal\n              sponsor\n            </Bullet>\n            <Bullet icon=\"admin\">\n              Waived responsibility to organize a board of directors\n            </Bullet>\n            <Bullet icon=\"payment\">\n              Fully transparent operational fees, typically ranging from 7-12%\n              that prevent you from paying typical operating costs.\n            </Bullet>\n            <Bullet icon=\"door-leave\">\n              The ability to terminate your fiscal sponsorship agreement and\n              file for separate tax-exempt status at any point.\n            </Bullet>\n          </BulletBox>\n          <Text variant=\"lead\">\n            If you’re brand new to nonprofit organizing or unsure where your\n            project will take you, fiscal sponsorship is a great tool to help\n            manage your finances and gauge whether becoming an independent\n            nonprofit down the line is practical or financially feasible.\n          </Text>\n        </Section>\n        <Section id=\"requirements\">\n          <Text variant=\"title\" as=\"h2\">\n            Requirements for fiscal sponsorship\n          </Text>\n          <Text variant=\"lead\">\n            Depending on the fiscal sponsor you choose, requirements for working\n            together can vary. Fiscal sponsors generally ask that your\n            nonprofit’s goals be similar to theirs. They also usually ask that\n            your organization or event commits to remaining charitable in nature\n            and refrains from activities that may result in loss of 501(c)(3)\n            status.\n          </Text>\n        </Section>\n\n        <Section id=\"partner\">\n          <Text variant=\"title\" as=\"h2\">\n            HCB, the #1 fiscal sponsor\n          </Text>\n          <Text variant=\"lead\">\n            While many fiscal sponsors require that their partners relate to\n            their mission in similar ways, at HCB, we’ve built our\n            infrastructure to support hundreds of causes in all areas of\n            charitability.\n          </Text>\n          <Text variant=\"lead\">\n            Check out some of the resources we’ve built our fiscal sponsorship\n            foundation on:\n          </Text>\n          <BulletBox>\n            <Bullet icon=\"bank-account\">\n              A beautiful web interface to manage finances\n            </Bullet>\n            <Bullet icon=\"transactions\">\n              Fee-free invoicing, ACH or check transfers, and reimbursements\n            </Bullet>\n            <Bullet icon=\"link\">\n              A customizable and embeddable donations URL\n            </Bullet>\n            <Bullet icon=\"card-add\">\n              An account & routing number to connect to external platforms, like\n              Shopify and GoFundMe\n            </Bullet>\n            <Bullet icon=\"purse\">\n              Perks like PVSA certification, newsletter software, and 1Password\n              credits\n            </Bullet>\n          </BulletBox>\n          <Text variant=\"lead\">\n            Looking for nonprofit status and not a religious or political\n            organization? We’d love to meet you and chat about working together.\n            Feel free to apply\n            <Link href=\"https://hcb.hackclub.com/applications/new\"> here </Link>\n            or\n            <Link href=\"mailto:hcb@hackclub.com\"> email our team </Link>if you\n            have more questions about fiscal sponsorship!\n          </Text>\n        </Section>\n\n        <Text variant=\"lead\">\n          At its core, Hack Club is a nonprofit encouraging students to learn\n          how to code by building and making cool things. HCB was built out by\n          teenagers at Hack&nbsp;Club and continues to be a real-world space\n          that high schoolers can contribute to every day.\n        </Text>\n      </Container>\n      <Box\n        sx={{\n          height: '100px',\n          position: 'relative',\n          width: '100%',\n          overflow: 'hidden',\n\n          '&::after': {\n            content: '\"\"',\n            width: '500%',\n            height: '100%',\n\n            position: 'absolute',\n            translate: '-50% 100%',\n            boxShadow: '0 -64px 64px #17171d'\n          }\n        }}\n      />\n      <Footer dark />\n    </Box>\n  )\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/climate/[region].tsx",
    "content": "import ClimateDirectory, {\n  regions,\n  fetchRawClimateOrganizations\n} from './index'\nimport { map, find, kebabCase, startCase } from 'lodash'\n\nconst regionsWithIds = map(regions, region => ({\n  id: kebabCase(region.label),\n  ...region\n}))\n\nexport default function ClimateRegionalPage({ rawOrganizations, pageRegion }) {\n  return (\n    <ClimateDirectory\n      rawOrganizations={rawOrganizations}\n      pageRegion={pageRegion}\n    />\n  )\n}\n\nexport const getStaticPaths = () => {\n  const paths = map(map(regionsWithIds, 'id'), id => ({\n    params: { region: `organizations-in-${id}` }\n  }))\n\n  return { paths, fallback: false }\n}\n\nexport const getStaticProps = async ({ params }) => {\n  let { region } = params\n  region = find(regionsWithIds, ['id', region.replace('organizations-in-', '')])\n\n  const { fetchAllOrganizations } = await import('../../../lib/cached-hcb-orgs')\n  const total = await fetchAllOrganizations()\n\n  const orgs = total\n    .filter(org => org.climate)\n    .filter(org => org.location.continent === region.label)\n\n  return {\n    props: {\n      rawOrganizations: orgs,\n      pageRegion: region\n    },\n    revalidate: 60 // seconds\n  }\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/climate/index.tsx",
    "content": "import {\n  Badge as ThemeBadge,\n  Box,\n  Container,\n  Flex,\n  Grid,\n  Heading,\n  Input,\n  Image as ThemeImage\n} from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport ForceTheme from '../../../components/force-theme'\nimport Nav from '../../../components/nav'\nimport Footer from '../../../components/footer'\nimport MSparkles from '../../../components/sparkles/money'\nimport { Text, Button, Card } from 'theme-ui'\nimport Icon from '@hackclub/icons'\nimport OrganizationCard, {\n  Badge\n} from '../../../components/fiscal-sponsorship/directory/card'\nimport fuzzysort from 'fuzzysort'\nimport { useEffect, useState } from 'react'\n/** @jsxImportSource theme-ui */\nimport NextLink from 'next/link'\nimport { kebabCase, intersection } from 'lodash'\nimport theme from '@hackclub/theme'\nimport Tooltip from '../../../components/fiscal-sponsorship/tooltip'\nimport { Organization } from '../../../lib/organization'\nimport Image from 'next/image'\n\nconst styles = `\n  html {\n    scroll-behavior: smooth;\n  }\n`\n\nexport const badges = [\n  {\n    label: 'Transparent',\n    id: 'Transparent',\n    tooltip: 'Transparent',\n    color: 'purple',\n    icon: 'explore',\n    match: org => org.isTransparent\n  }\n]\n\nexport function getBadgesForOrg(org: Organization): typeof badges {\n  return badges.filter(badge => badge.match?.(org))\n}\n\nexport const tags = [\n  {\n    label: 'Climate',\n    id: 'Climate',\n    color: '#1eb36d',\n    match: (org: Organization) => true\n  },\n  {\n    label: 'Nonprofit',\n    id: 'Nonprofit',\n    color: 'blue',\n    match: (org: Organization) => true\n  }\n]\n\nexport function getTagsForOrg(org: Organization): typeof tags {\n  return tags.filter(tag => tag.match?.(org))\n}\n\nexport const regions = [\n  {\n    label: 'North America',\n    color: 'secondary',\n    iconColor: 'red',\n    icon: 'photo',\n    image:\n      'https://cloud-cberabu5z-hack-club-bot.vercel.app/3north_america.png',\n    ogImage: '/fiscal-sponsorship/climate/NorthAmerica.png'\n  },\n  {\n    label: 'South America',\n    color: 'secondary',\n    iconColor: 'orange',\n    icon: 'photo',\n    image:\n      'https://cloud-cberabu5z-hack-club-bot.vercel.app/4south_america.png',\n    ogImage: '/fiscal-sponsorship/climate/SouthAmerica.png'\n  },\n  {\n    label: 'Africa',\n    color: 'secondary',\n    iconColor: 'purple',\n    icon: 'explore',\n    image: 'https://cloud-cberabu5z-hack-club-bot.vercel.app/0africa.png',\n    ogImage: '/fiscal-sponsorship/climate/Africa.png'\n  },\n  {\n    label: 'Europe',\n    color: 'secondary',\n    iconColor: 'blue',\n    icon: 'explore',\n    image: 'https://cloud-oax3m4v0t-hack-club-bot.vercel.app/1europe.png',\n    ogImage: '/fiscal-sponsorship/climate/Europe.png'\n  },\n  {\n    label: 'Asia & Oceania',\n    color: 'secondary',\n    iconColor: 'green',\n    icon: 'explore',\n    image:\n      'https://cloud-oax3m4v0t-hack-club-bot.vercel.app/0asia___oceania.png',\n    ogImage: '/fiscal-sponsorship/climate/Asia+Oceania.png'\n  }\n]\n\nconst FilterPanel = ({ filter, mobile }) => {\n  const [hiddenOnMobile, setHiddenOnMobile] = useState(mobile)\n  const setStateVariable = filter[0]\n  const currentSelections = filter[1]\n  const title = filter[2]\n  const baseData = filter[3]\n  if (!baseData?.length) return <></>\n  return (\n    <>\n      <Heading\n        as=\"h3\"\n        sx={{\n          fontSize: 2,\n          textTransform: 'uppercase',\n          color: 'muted',\n          mb: hiddenOnMobile ? 1 : 3,\n          cursor: mobile ? 'pointer' : 'default',\n          ':hover': mobile\n            ? {\n                color: 'blue'\n              }\n            : {}\n        }}\n        onClick={() => setHiddenOnMobile(!hiddenOnMobile)}\n      >\n        {mobile && 'FILTER BY '} {title}{' '}\n        <small\n          style={{\n            transform: 'translateY(-1px)',\n            display: 'inline-block'\n          }}\n        >\n          {mobile && (hiddenOnMobile ? '▶︎' : '▼')}\n        </small>\n      </Heading>\n      <Flex\n        sx={{\n          flexDirection: mobile ? 'row' : 'column',\n          gap: '12px',\n          flexWrap: 'wrap',\n          mb: 3,\n          display: hiddenOnMobile ? 'none' : 'flex'\n        }}\n      >\n        <Flex\n          sx={{\n            alignItems: 'center',\n            cursor: 'pointer',\n            gap: 2,\n            py: mobile ? 1 : 0,\n            pl: mobile ? 1 : 0,\n            pr: mobile ? 3 : 0,\n            border: mobile ? '1px solid' : 'none',\n            borderColor: 'sunken',\n            borderRadius: '4px',\n            background: mobile ? 'snow' : 'none',\n            color: 'secondary',\n            textDecoration: 'none',\n            transition: 'color 0.2s',\n            ':hover': {\n              color: 'blue'\n            },\n            width: 'fit-content'\n          }}\n          onClick={() => setStateVariable([...baseData.map(x => x.id)])}\n        >\n          <Flex\n            sx={{\n              bg: 'smoke',\n              color: 'secondary',\n              p: 1,\n              borderRadius: 6\n            }}\n          >\n            <Icon glyph=\"list\" size={24} />\n          </Flex>\n          <Heading\n            as=\"h4\"\n            sx={{\n              fontSize: 3,\n              color:\n                currentSelections.length !== baseData.length\n                  ? 'black'\n                  : 'primary',\n              ':hover': {\n                color: 'blue'\n              }\n            }}\n          >\n            All\n          </Heading>\n        </Flex>\n        {baseData?.map((item, idx) => (\n          <Flex\n            key={idx}\n            sx={{\n              alignItems: 'center',\n              cursor: 'pointer',\n              gap: 2,\n              py: mobile ? 1 : 0,\n              pl: mobile ? 1 : 0,\n              pr: mobile ? 3 : 0,\n              border: mobile ? '1px solid' : 'none',\n              borderColor: 'sunken',\n              borderRadius: '4px',\n              background: mobile ? 'snow' : 'none',\n              textDecoration: 'none',\n              color:\n                currentSelections.length === baseData.length ||\n                !currentSelections.includes(item.id)\n                  ? 'black'\n                  : 'primary',\n              transition: 'color 0.2s',\n              ':hover': {\n                color: 'blue'\n              },\n              width: 'fit-content'\n            }}\n            onClick={() => {\n              if (currentSelections.length === baseData.length) {\n                setStateVariable([item.id])\n              } else if (currentSelections.includes(item.id)) {\n                let temp = currentSelections\n                temp = temp.filter(selection => selection !== item.id)\n                if (temp.length === 0) {\n                  setStateVariable([...baseData.map(x => x.id)])\n                } else {\n                  setStateVariable(temp)\n                }\n              } else {\n                setStateVariable([...currentSelections, item.id])\n              }\n            }}\n          >\n            {item.image ? (\n              <Flex\n                sx={{\n                  backgroundImage: `url(\"${item.image}\")`,\n                  backgroundSize: 'contain',\n                  backgroundPosition: 'center',\n                  backgroundRepeat: 'no-repeat',\n                  color: 'white',\n                  p: 1,\n                  borderRadius: 6\n                }}\n              >\n                <Flex\n                  sx={{\n                    width: 24,\n                    height: 24\n                  }}\n                />\n              </Flex>\n            ) : (\n              <Flex\n                sx={{\n                  bg: item.color,\n                  color: 'white',\n                  p: 1,\n                  borderRadius: 6\n                }}\n              >\n                <Icon glyph={item.icon} size={24} />\n              </Flex>\n            )}\n            <Heading as=\"h4\" sx={{ color: 'inherit', fontSize: 3 }}>\n              {item.label}\n            </Heading>\n          </Flex>\n        ))}\n      </Flex>\n    </>\n  )\n}\n\ntype RegionPanelProps = {\n  currentRegion: (typeof regions)[number] | null\n  mobile?: boolean\n}\n\nconst RegionPanel = ({ currentRegion, mobile }: RegionPanelProps) => {\n  const [hiddenOnMobile, setHiddenOnMobile] = useState(mobile)\n  return (\n    <>\n      <Heading\n        as=\"h3\"\n        sx={{\n          fontSize: 2,\n          textTransform: 'uppercase',\n          color: 'muted',\n          mb: hiddenOnMobile ? 1 : 3,\n          cursor: mobile ? 'pointer' : 'default',\n          ':hover': mobile\n            ? {\n                color: 'blue'\n              }\n            : {}\n        }}\n        onClick={() => setHiddenOnMobile(!hiddenOnMobile)}\n      >\n        {mobile && 'FILTER BY '} REGION{' '}\n        <small\n          style={{\n            transform: 'translateY(-1px)',\n            display: 'inline-block'\n          }}\n        >\n          {mobile && (hiddenOnMobile ? '▶︎' : '▼')}\n        </small>\n      </Heading>\n      <Flex\n        sx={{\n          flexDirection: mobile ? 'row' : 'column',\n          gap: '12px',\n          flexWrap: 'wrap',\n          mb: 3,\n          display: hiddenOnMobile ? 'none' : 'flex'\n        }}\n      >\n        <NextLink scroll={false} href={'/fiscal-sponsorship/climate'}>\n          <Flex\n            sx={{\n              alignItems: 'center',\n              cursor: 'pointer',\n              gap: 2,\n              py: mobile ? 1 : 0,\n              pl: mobile ? 1 : 0,\n              pr: mobile ? 3 : 0,\n              border: mobile ? '1px solid' : 'none',\n              borderColor: 'sunken',\n              borderRadius: '4px',\n              background: mobile ? 'snow' : 'none',\n              color: 'secondary',\n              textDecoration: 'none',\n              transition: 'color 0.2s',\n              ':hover': {\n                color: '#B72A3D'\n              },\n              width: 'fit-content'\n            }}\n          >\n            <Flex\n              sx={{\n                bg: 'smoke',\n                color: 'secondary',\n                p: 1,\n                borderRadius: 6\n              }}\n            >\n              <Icon glyph=\"list\" size={24} />\n            </Flex>\n            <Heading\n              as=\"h4\"\n              sx={{\n                fontSize: 3,\n                color: !currentRegion ? 'red' : 'black',\n                ':hover': {\n                  color: 'blue'\n                }\n              }}\n            >\n              All\n            </Heading>\n          </Flex>\n        </NextLink>\n        {regions?.map((item, idx) => (\n          <NextLink\n            key={idx}\n            scroll={false}\n            href={`/fiscal-sponsorship/climate/organizations-in-${kebabCase(\n              item.label\n            )}`}\n          >\n            <Flex\n              sx={{\n                alignItems: 'center',\n                cursor: 'pointer',\n                gap: 2,\n                py: mobile ? 1 : 0,\n                pl: mobile ? 1 : 0,\n                pr: mobile ? 3 : 0,\n                border: mobile ? '1px solid' : 'none',\n                borderColor: 'sunken',\n                borderRadius: '4px',\n                background: mobile ? 'snow' : 'none',\n                textDecoration: 'none',\n                color: currentRegion?.label === item.label ? 'red' : 'black',\n                transition: 'color 0.2s',\n                ':hover': {\n                  color: 'blue'\n                },\n                width: 'fit-content'\n              }}\n            >\n              {item.image ? (\n                <Flex\n                  sx={{\n                    backgroundImage: `url(\"${item.image}\")`,\n                    backgroundSize: 'contain',\n                    backgroundPosition: 'center',\n                    backgroundRepeat: 'no-repeat',\n                    color: 'white',\n                    p: 1,\n                    borderRadius: 6\n                  }}\n                >\n                  <Flex\n                    sx={{\n                      width: 24,\n                      height: 24\n                    }}\n                  />\n                </Flex>\n              ) : (\n                <Flex\n                  sx={{\n                    bg: item.color,\n                    color: 'white',\n                    p: 1,\n                    borderRadius: 6\n                  }}\n                >\n                  <Icon\n                    glyph={\n                      item.icon as keyof typeof import('@hackclub/icons').glyphs\n                    }\n                    size={24}\n                  />\n                </Flex>\n              )}\n              <Heading as=\"h4\" sx={{ color: 'inherit', fontSize: 3 }}>\n                {item.label}\n              </Heading>\n            </Flex>\n          </NextLink>\n        ))}\n      </Flex>\n    </>\n  )\n}\n\ntype FilteringProps = {\n  mobile?: boolean\n  region: (typeof regions)[number] | null\n  [key: string]: any\n}\n\nconst Filtering = ({ mobile, region, ...props }: FilteringProps) => {\n  return (\n    <>\n      {Object.values(props).map((filter, i) => (\n        <FilterPanel key={`filter-${i}`} filter={filter} mobile={mobile} />\n      ))}\n      <RegionPanel currentRegion={region} mobile={mobile} />\n    </>\n  )\n}\n\nexport default function ClimatePage({ rawOrganizations, pageRegion }) {\n  const [searchValue, setSearchValue] = useState('')\n  // const [region, setRegion] = useState(pageRegion);\n  const region = pageRegion\n\n  // useEffect(() => {\n  //   // history.pushState(null, null, `/fiscal-sponsorship/climate/organizations-in-${region.toLowerCase().split(' ').join('-')}`);\n  // }, [region]);\n  const [modalOrganization, setModalOrganization] = useState(null)\n\n  useEffect(() => {\n    const handle = e => {\n      if (e.key === 'Escape') {\n        closeModal()\n      }\n    }\n\n    window.addEventListener('keydown', handle)\n    return () => window.removeEventListener('keydown', handle)\n  })\n\n  let organizations = rawOrganizations\n\n  if (searchValue.length) {\n    const search = fuzzysort.go(searchValue, rawOrganizations, {\n      keys: ['name', 'description'],\n      threshold: -1000\n    })\n\n    organizations = search.map(({ obj }) => obj)\n  }\n\n  const [currentBadges, setBadges] = useState([...badges.map(x => x.id)])\n\n  const openModal = organization => {\n    setModalOrganization(organization)\n  }\n\n  const closeModal = () => {\n    setModalOrganization(null)\n  }\n\n  return (\n    <div style={modalOrganization ? {} : {}}>\n      <Meta\n        as={Head}\n        title={\n          'Climate-focused nonprofits' +\n          (region ? ` in ${region.label}` : ' on HCB')\n        }\n        description={\n          'Nonprofits are making real environmental impact' +\n          (region ? ` in ${region.label}` : '') +\n          \" with HCB's fiscal sponsorship and financial tools. Explore the climate efforts running on HCB.\"\n        }\n        image={\n          region?.ogImage ?? '/fiscal-sponsorship/climate/social-preview.png'\n        }\n      />\n      <style>{styles}</style>\n      {modalOrganization && (\n        <Box\n          sx={{\n            position: 'fixed',\n            top: '0px',\n            left: '0px',\n            right: '0px',\n            bottom: '0px',\n            zIndex: 1000,\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n            bg: '#00000044'\n          }}\n          onClick={closeModal}\n        >\n          <Card\n            sx={{\n              width: 'min(800px, 80%)',\n              bg: 'elevated',\n              borderRadius: '10px',\n              position: 'relative',\n              display: 'flex',\n              boxSizing: 'border-box',\n              flexDirection: 'column',\n              maxHeight: '90vh',\n              overflow: 'scroll'\n            }}\n            onClick={e => {\n              e.stopPropagation()\n            }}\n          >\n            <Flex\n              sx={{\n                position: 'absolute',\n                top: '10px',\n                right: '10px',\n                width: '40px',\n                height: '40px',\n                bg: 'smoke',\n                borderRadius: '50%',\n                justifyContent: 'center',\n                alignItems: 'center',\n                cursor: 'pointer'\n              }}\n            >\n              <Icon glyph=\"view-close\" size={32} onClick={closeModal} />\n            </Flex>\n            <Flex sx={{ flexDirection: 'column', alignItems: 'start', gap: 3 }}>\n              <Flex\n                sx={{\n                  flexDirection: 'column',\n                  justifyContent: 'end',\n                  width: '100%',\n                  minHeight: '200px',\n                  m: -4,\n                  p: 4,\n                  pb: '48px',\n                  boxSizing: 'content-box',\n                  backgroundPosition: 'center center',\n                  color: 'white',\n                  backgroundRepeat: 'no-repeat',\n                  backgroundSize: 'cover',\n                  backgroundImage: `linear-gradient(rgba(0,0,0,0.2) 0%, rgba(0,0,0,0.4) 80%, rgba(255,255,255,1) 100%), url('${modalOrganization.branding.backgroundImage}')`\n                }}\n              >\n                <Flex\n                  sx={{\n                    flexDirection: ['column', 'row', 'row'],\n                    alignItems: ['center', 'end', 'end'],\n                    justifyContent: 'start'\n                  }}\n                >\n                  {modalOrganization.branding.logo && (\n                    <ThemeImage\n                      alt={`${modalOrganization.name}'s logo`}\n                      src={modalOrganization.branding.logo}\n                      sx={{\n                        width: '100px',\n                        height: '100px',\n                        borderRadius: '8px',\n                        marginRight: [0, 4, 4],\n                        boxShadow: '0px 0px 45px 0px rgba(0, 0, 0, 0.72)'\n                      }}\n                    />\n                  )}\n                  <Text\n                    variant=\"title\"\n                    sx={{\n                      wordBreak: 'break-word',\n                      marginBottom: '16px',\n                      textAlign: ['center', 'left', 'left'],\n                      fontSize: ['48px', '48px', '64px'],\n                      color: 'white',\n                      textShadow: '0px 10px 10px rgba(0, 0, 0, 0.25)'\n                    }}\n                  >\n                    {modalOrganization.name}\n                  </Text>\n                </Flex>\n              </Flex>\n\n              {/* Badges */}\n              <Flex\n                sx={{\n                  flexDirection: 'row',\n                  justifyContent: ['center', 'start', 'start'],\n                  alignItems: 'center',\n                  gap: 2,\n                  width: '100%',\n                  mt: -1,\n                  mb: -2,\n                  flexWrap: 'wrap'\n                }}\n              >\n                {getTagsForOrg(modalOrganization).map((tag, i) => (\n                  <ThemeBadge\n                    key={i}\n                    as=\"span\"\n                    aria-label=\"Hello there\"\n                    sx={{\n                      bg: tag.color,\n                      color: 'snow',\n                      fontSize: '20px',\n                      textShadow: 'none',\n                      borderRadius: '15px',\n                      px: 2,\n                      display: 'block'\n                    }}\n                  >\n                    {tag.label}\n                  </ThemeBadge>\n                ))}\n\n                {getBadgesForOrg(modalOrganization).map((badge, i) => {\n                  return (\n                    <Tooltip.N key={i} text={badge.tooltip} id={badge.id}>\n                      <Box as=\"span\" className={`tooltipped-${badge.id}`}>\n                        <Badge badge={badge} />\n                      </Box>\n                    </Tooltip.N>\n                  )\n                })}\n              </Flex>\n\n              <Flex\n                sx={{\n                  flexDirection: 'row',\n                  alignItems: 'start',\n                  gap: 4,\n                  width: '100%'\n                }}\n              >\n                {/* info & buttons */}\n                <Flex\n                  sx={{\n                    flexDirection: 'column',\n                    alignItems: 'start',\n                    flex: '1'\n                  }}\n                >\n                  <Text variant=\"lead\" style={{ fontSize: '22px' }}>\n                    {modalOrganization.branding.description}\n                  </Text>\n\n                  {/* mobile stats */}\n                  <Flex\n                    sx={{\n                      my: 3,\n                      display: ['flex', 'flex', 'none'],\n                      width: '100%',\n                      gap: 2,\n                      flexWrap: 'wrap',\n                      flexDirection: 'row',\n                      alignItems: 'start',\n                      alignSelf: 'start'\n                    }}\n                  >\n                    <Text\n                      variant=\"subheadline\"\n                      sx={{\n                        mb: 0,\n                        color: '#3b4858',\n                        marginRight: 2\n                      }}\n                    >\n                      {modalOrganization.location.country}\n                    </Text>\n                    <Text\n                      variant=\"subheadline\"\n                      sx={{\n                        mb: 0,\n                        color: '#3b4858'\n                      }}\n                    >\n                      {modalOrganization.location.continent}\n                    </Text>\n                  </Flex>\n\n                  <Flex\n                    sx={{\n                      flexDirection: 'column',\n                      alignItems: 'start',\n                      my: 2,\n                      ml: -1,\n                      gap: 1\n                    }}\n                  >\n                    {modalOrganization.links.website && (\n                      <Flex\n                        as=\"a\"\n                        {...({ target: '_blank' } as any)}\n                        href={modalOrganization.links.website}\n                        sx={{\n                          flexDirection: 'row',\n                          justifyContent: 'start',\n                          alignItems: 'center',\n                          color: 'slate',\n                          textDecoration: 'none'\n                        }}\n                      >\n                        <Icon glyph=\"web\" size={38} />\n                        <Text style={{ fontSize: '20px', marginLeft: '6px' }}>\n                          Website\n                        </Text>\n                        <Icon\n                          glyph=\"external\"\n                          size={20}\n                          style={{ marginLeft: '2px', marginBottom: '6px' }}\n                        />\n                      </Flex>\n                    )}\n                    {modalOrganization.links.financials && (\n                      <Flex\n                        as=\"a\"\n                        {...({ target: '_blank' } as any)}\n                        href={modalOrganization.links.financials}\n                        sx={{\n                          flexDirection: 'row',\n                          justifyContent: 'start',\n                          alignItems: 'center',\n                          color: 'slate',\n                          textDecoration: 'none'\n                        }}\n                      >\n                        <Icon glyph=\"explore\" size={38} />\n                        <Text style={{ fontSize: '20px', marginLeft: '6px' }}>\n                          Transparent Finances\n                        </Text>\n                        <Icon\n                          glyph=\"external\"\n                          size={20}\n                          style={{ marginLeft: '2px', marginBottom: '6px' }}\n                        />\n                      </Flex>\n                    )}\n                  </Flex>\n                </Flex>\n                {/* desktop stats */}\n                <Flex\n                  sx={{\n                    display: ['none', 'none', 'flex'],\n                    maxWidth: '30%',\n                    flexDirection: 'column',\n                    alignItems: 'start',\n                    alignSelf: 'start'\n                  }}\n                >\n                  <Flex sx={{ flexDirection: 'column', alignItems: 'start' }}>\n                    <Text\n                      variant=\"headline\"\n                      sx={{\n                        mb: 0,\n                        color: '#3b4858'\n                      }}\n                    >\n                      {modalOrganization.location.country}\n                    </Text>\n                    <Text\n                      sx={{\n                        color: '#5b616a',\n                        fontSize: '20px'\n                      }}\n                    >\n                      Country\n                    </Text>\n                  </Flex>\n                  <Flex sx={{ flexDirection: 'column', alignItems: 'start' }}>\n                    <Text\n                      variant=\"headline\"\n                      sx={{\n                        mb: 0,\n                        color: '#3b4858'\n                      }}\n                    >\n                      {modalOrganization.location.continent}\n                    </Text>\n                    <Text\n                      sx={{\n                        color: '#5b616a',\n                        fontSize: '20px'\n                      }}\n                    >\n                      Continent\n                    </Text>\n                  </Flex>\n                </Flex>\n              </Flex>\n\n              <Flex\n                sx={{\n                  flexDirection: 'row',\n                  width: '100%',\n                  justifyContent: 'space-between',\n                  alignItems: 'center'\n                }}\n              >\n                <Button\n                  as=\"a\"\n                  variant=\"lg\"\n                  {...({ href: modalOrganization.links.donations } as any)}\n                  target=\"_blank\"\n                  sx={{\n                    backgroundImage: (t: any) => t.util.gx('green', 'blue'),\n                    width: ['100%', 'auto', 'auto']\n                  }}\n                >\n                  <Flex\n                    sx={{\n                      flexDirection: 'row',\n                      alignItems: 'center',\n                      justifyContent: 'center',\n                      width: '24px',\n                      height: '24px',\n                      marginLeft: -1,\n                      marginRight: 2\n                    }}\n                  >\n                    <Icon glyph=\"friend\" size={20} style={{ scale: '2.5' }} />\n                  </Flex>\n                  Make a Donation\n                </Button>\n                <Text sx={{ display: ['none', 'none', 'block'] }}>\n                  All donations are tax-deductible.\n                </Text>\n              </Flex>\n            </Flex>\n          </Card>\n        </Box>\n      )}\n      <Box as=\"main\" key=\"main\">\n        {!modalOrganization && <Nav />}\n        <ForceTheme theme=\"light\" />\n        <Box\n          sx={{\n            pt: [5, null, null, null, 6],\n            pb: [3, 4, 5, null, 6],\n            minHeight: ['70vh', 'none'],\n            textAlign: 'center',\n            backgroundImage:\n              \"linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.4)), url('https://cloud-ff8eau8q5-hack-club-bot.vercel.app/0jeremy-bishop-ewkxn5capa4-unsplash.jpg')\",\n            backgroundSize: 'cover',\n            backgroundPosition: 'center center',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center'\n          }}\n        >\n          <Box\n            sx={{\n              width: '100%',\n              maxWidth: 'calc(48rem + 512px)',\n              mx: 'auto',\n              px: '16px',\n              backdropFilter: 'blur(1.5px)',\n              color: 'white'\n            }}\n          >\n            <Heading\n              sx={{\n                textAlign: 'center',\n                mt: [2, 4],\n                textShadow: '0 0 16px rgba(0, 0, 0, 1)',\n                fontSize: [5, null, 6, 7]\n              }}\n              as=\"h1\"\n              variant=\"title\"\n            >\n              <Flex\n                sx={{ justifyContent: 'center', alignItems: 'center', mb: 2 }}\n              >\n                <MSparkles\n                  colors={['green', 'teal', 'blue']}\n                  path={`M491.9,156.3c-19.4-46-51.9-85-92.7-112.6C358.3,16.1,309,0,256,0c-35.3,0-69,7.2-99.7,20.1c-46,19.4-85,51.9-112.6,92.7\n\tC16.1,153.7,0,203,0,256c0,35.3,7.2,69,20.1,99.7c19.4,46,51.9,85,92.7,112.6C153.7,495.9,203,512,256,512c35.3,0,69-7.2,99.7-20.1\n\tc46-19.4,85-51.9,112.6-92.7C495.9,358.3,512,309,512,256C512,220.7,504.8,187,491.9,156.3z M123.2,81.3c-1,11.8,2.5,23.7,9.9,33.1\n\tc6.8,8.7,17.6,11.5,18.1,23.4c0.5,11.4-1.3,17.3-8.8,25.3c-3.2,3.4-5.5,8.3-8.8,11.5c-4,3.9-2.5,2.7-8.8,3.8\n\tc-11.8,2-21.9,5.1-33.4,8.2c-18,5-20.6-22.4-28.1-35.8C78.2,123.6,98.7,99.9,123.2,81.3z M74,378.8c-23.7-35-37.5-77.2-37.5-122.7\n\tc0-19.9,2.7-39.2,7.6-57.6c8.4,18.1,20.6,33.7,28.9,52.2c10.7,23.8,39.5,17.2,52.2,38.1c11.3,18.5-0.8,42,7.7,61.3\n\tc6.1,14.1,20.6,17.1,30.5,27.4c10.2,10.4,10,24.6,11.5,38.1c1.8,15.9,4.6,31.7,8.5,47.2c0,0.2,0.1,0.3,0.1,0.5\n\tc-4.4-1.5-8.7-3.2-12.9-5C131.2,441.7,97.7,413.8,74,378.8z M169.8,290.1c3.2-0.7,16.2,1.6,20.2,2.4c6.3,1.3,9.7,5.2,14.7,9.1\n\tc13,10.4,27.3,18.5,41.8,26.4c11.2,6.2,14.5,14.1,7.3,27c-6.9,12.2-22.1,20.4-31.9,30.2c-2.7,2.6-8.3,11.8-11.7,9.8\n\tc-2.4-1.4-3.2-13.3-4.1-16c-4.5-13.7-13.2-25.7-24.8-34.2c-3.6-2.7-12.4-6.2-14.5-9.9c-2.3-4-0.2-13.6-0.1-17.9\n\tc0.1-6.4-2.8-17-1.2-22.9C167.3,287.4,163.8,291.4,169.8,290.1z M378.7,438c-35,23.7-77.2,37.5-122.7,37.5\n\tc-12.5,0-24.7-1.1-36.7-3.1c0.1-3.1,0.2-6,0.5-8c2.8-18.2,11.9-35.9,24.1-49.5c12.1-13.4,28.7-22.5,39-37.7\n\tc10.2-14.9,13.2-34.9,9-52.3c-6.1-25.6-40.9-34.2-59.7-48.1c-10.8-8-20.4-20.4-34.6-21.4c-6.5-0.5-12,0.9-18.5-0.7\n\tc-5.9-1.5-10.6-4.7-16.9-3.9c-11.8,1.6-19.3,14.2-32,12.5c-12.1-1.6-24.5-15.7-27.2-27.2c-3.5-14.8,8.2-19.6,20.7-20.9\n\tc5.2-0.5,11.1-1.1,16.1,0.8c6.6,2.5,9.7,8.9,15.7,12.2c11.1,6.1,13.4-3.6,11.7-13.5c-2.5-14.8-5.5-20.8,7.7-31\n\tc9.1-7,17-12.1,15.5-24.7c-0.9-7.4-4.9-10.8-1.1-18.1c2.9-5.6,10.7-10.7,15.9-14c13.2-8.6,56.7-8,39-32.2\n\tc-5.2-7.1-14.9-19.8-24-21.5c-11.4-2.2-16.5,10.6-24.5,16.2c-8.2,5.8-24.3,12.4-32.5,3.4c-11.1-12.1,7.3-16.1,11.4-24.5\n\tc1.9-3.9,0-9.5-3.4-14.8c4.1-1.7,8.2-3.3,12.4-4.8c2.7,1.9,5.6,3.2,9.2,3.4c7.6,0.5,14.9-3.6,21.5,1.6c7.4,5.7,12.7,12.9,22.6,14.7\n\tc9.5,1.7,19.6-3.8,21.9-13.6c1.5-5.9,0-12.1-1.3-18.3c29.7,0.2,58.1,6.3,83.8,17.2c12.9,5.4,25.1,12.1,36.6,19.7\n\tc-2.3-1-5.2-1-8.8,0.7c-6.9,3.2-16.8,11.4-17.6,19.6c-0.8,9.2,12.8,10.5,19.2,10.5c9.7,0,19.6-4.3,16.4-15.6\n\tc-1.4-5-3.3-10.3-6.5-13.3c7.3,5,14.2,10.5,20.8,16.3c-0.1,0.1-0.2,0.2-0.3,0.2c-6.6,6.9-14.2,12.3-18.7,20.6\n\tc-3.2,5.9-6.8,8.7-13.2,10.2c-3.5,0.8-7.6,1.1-10.6,3.5c-8.3,6.8-3.5,22.4,4.3,27.1c9.9,5.9,24.6,3.1,32.1-5.3\n\tc5.8-6.6,9.3-18.1,19.8-18.1c4.6,0,9.1,1.8,12.4,5c4.3,4.5,3.5,8.7,4.4,14.3c1.7,10,10.4,4.6,15.8-0.5c3.9,7,7.4,14.1,10.6,21.5\n\tc-5.9,8.5-10.5,17.8-24.8,7.9c-8.5-5.9-13.7-14.5-24.4-17.1c-9.3-2.3-18.9,0.1-28.1,1.7c-10.5,1.8-22.9,2.6-30.8,10.5\n\tc-7.7,7.6-11.7,17.9-19.9,25.5c-15.8,14.9-22.4,31.1-12.2,52.1c9.8,20.2,30.4,31.2,52.6,29.7c21.8-1.5,44.4-14.1,43.8,17.6\n\tc-0.2,11.2,2.1,19,5.6,29.4c3.2,9.6,3,18.9,3.7,28.8c0.8,11.2,2.4,23.1,5.5,34.5C414.9,409.1,397.9,425,378.7,438z M459.4,338.5\n\tc-0.1-2.2-0.4-4.3-0.7-6.5c-1.5-9.8-7.3-19-8.1-28.7c-1.5-18.1,1.8-32.5-12.1-47.6c-13.4-14.6-33.1-18.1-52-15.1\n\tc-9.5,1.5-47.7,7.6-32.3-14.1c3-4.3,8.3-7.8,11.7-11.8c3-3.5,5.5-10,9-12.8c3.5-2.8,19.4-5.9,24-4.5c4.6,1.4,9.3,8,13.3,10.9\n\tc7.3,5.5,15.9,9.2,24.9,10.7c8.8,1.3,23.2-1.1,33.9-7c2.9,14.2,4.4,28.9,4.4,44C475.4,285.2,469.7,313.1,459.4,338.5z`}\n                  viewBox=\"0 0 512 512\"\n                >\n                  <Image\n                    src=\"/fiscal-sponsorship/climate/earth-on-hcb.png\"\n                    alt=\"\"\n                    width={512}\n                    height={512}\n                    style={{ height: '82px', width: 'auto' }}\n                  />\n                </MSparkles>\n              </Flex>\n              Climate-focused nonprofits on{' '}\n              <Box as=\"span\" sx={{ whiteSpace: 'nowrap' }}>\n                HCB\n              </Box>\n              {region ? (\n                <>\n                  {' '}\n                  in\n                  <Box\n                    as=\"span\"\n                    sx={{\n                      display: ['none', 'inline'],\n                      whiteSpace: 'nowrap',\n                      bg: region.iconColor,\n                      pl: 3,\n                      pr: 18,\n                      mx: -1,\n                      borderRadius: 8,\n                      textShadow: 'none',\n                      ml: 2\n                    }}\n                  >\n                    <ThemeImage\n                      src={region.image}\n                      alt=\"\"\n                      sx={{ mr: 3, height: [30, 42, 42, 64] }}\n                    />\n                    {region.label}\n                  </Box>\n                  <Box\n                    as=\"span\"\n                    sx={{ display: ['inline', 'none'], whiteSpace: 'nowrap' }}\n                  >\n                    {' ' + region.label}\n                  </Box>\n                </>\n              ) : (\n                ''\n              )}\n            </Heading>\n            <Box\n              sx={{\n                fontSize: [2, 3, 3],\n                textAlign: 'center',\n                my: 4,\n                maxWidth: '956px',\n                mx: 'auto'\n              }}\n            >\n              Nonprofits are making real environmental impact with HCB's fiscal\n              sponsorship and financial tools. Explore the climate efforts\n              running on HCB.\n            </Box>\n            <Button\n              variant=\"ctaLg\"\n              as=\"a\"\n              {...({ href: '#listings' } as any)}\n              sx={{\n                mt: [0, 2],\n                backgroundImage: (t: any) => t.util.gx('green', 'blue'),\n                height: '56px'\n              }}\n            >\n              EXPLORE IMPACT\n            </Button>\n          </Box>\n        </Box>\n\n        <Grid\n          columns=\"auto 3fr\"\n          sx={{\n            '@media screen and (max-width: 991.98px)': {\n              display: 'block'\n            },\n            position: 'relative'\n          }}\n          id=\"listings\"\n        >\n          <Container>\n            <Box\n              sx={{\n                py: [0, 4],\n                mb: [4, 0],\n                marginLeft: 'max(calc(50vw - 900px), 0px)',\n                '@media screen and (max-width: 991.98px)': {\n                  display: 'none'\n                },\n                '@media screen and (min-width: 992px)': {\n                  position: 'sticky',\n                  top: 80,\n                  alignSelf: 'start'\n                }\n              }}\n            >\n              <Filtering\n                badges={[setBadges, currentBadges, 'Badges', badges, false]}\n                region={region}\n              />\n            </Box>\n          </Container>\n          <Container py={4}>\n            <Flex>\n              <Box sx={{ flexGrow: 1, pr: [0, 3], mb: 3 }}>\n                <Input\n                  placeholder=\"Search Organizations\"\n                  onChange={e => setSearchValue(e.target.value)}\n                  value={searchValue}\n                  sx={{\n                    border: '2px solid ' + theme.colors.muted,\n                    textAlign: ['left', 'left', 'left'],\n                    width: '100%',\n                    height: '100%',\n                    bg: 'sheet',\n                    fontSize: '18px',\n                    padding: '12px'\n                  }}\n                />\n              </Box>\n            </Flex>\n            <Box\n              sx={{\n                '@media screen and (max-width: 991.99px)': {\n                  display: 'block'\n                },\n                '@media screen and (min-width: 992px)': {\n                  display: 'none'\n                },\n                my: 2\n              }}\n            >\n              <Filtering\n                badges={[setBadges, currentBadges, 'Badges', badges]}\n                region={region}\n                mobile\n              />\n            </Box>\n            {organizations.length === 0 && (\n              <Box\n                sx={{\n                  textAlign: 'center',\n                  p: 5\n                }}\n              >\n                <Box>\n                  <Text\n                    variant=\"headline\"\n                    sx={{\n                      textTransform: 'unset',\n                      display: 'block',\n                      mb: 0\n                    }}\n                  >\n                    No results\n                  </Text>\n                </Box>\n              </Box>\n            )}\n            <Grid columns={[1, 2, 3]} gap={[3, 4]} sx={{ my: 3 }}>\n              {organizations\n                .map(org => new Organization(org))\n                .filter(organization => {\n                  const organizationBadgeIds = getBadgesForOrg(\n                    organization\n                  ).map(badge => badge.id)\n\n                  return (\n                    currentBadges.length === badges.length ||\n                    intersection(organizationBadgeIds, currentBadges).length ===\n                      currentBadges.length\n                  )\n                })\n                .map(organization => (\n                  <OrganizationCard\n                    organization={organization}\n                    key={organization.id}\n                    openModal={openModal}\n                    badges={getBadgesForOrg(organization)}\n                  />\n                ))}\n            </Grid>\n          </Container>\n        </Grid>\n      </Box>\n      <Footer />\n    </div>\n  )\n}\n\nexport async function fetchRawClimateOrganizations() {\n  let lastLength = 100\n  let total = []\n  let page = 1\n  while (lastLength >= 100) {\n    const json = await fetch(\n      'https://hcb.hackclub.com/api/v3/directory/organizations?per_page=100&page=' +\n        page\n    ).then(res => res.json())\n    lastLength = json.length\n    page++\n    total = [...total, ...json]\n  }\n  return total.filter(org => org.climate)\n}\n\nexport const getStaticProps = async () => {\n  const { fetchAllOrganizations } = await import('../../../lib/cached-hcb-orgs')\n  const total = await fetchAllOrganizations()\n  return {\n    props: {\n      rawOrganizations: total.filter(org => org.climate)\n    },\n    revalidate: 60 // seconds\n  }\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/directory/[category]/[region].tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport DirectoryPage, {\n  regions,\n  categories,\n  fetchRawOrganizations\n} from '../index'\nimport { map, find, kebabCase } from 'lodash'\n\nconst regionsWithIds = map(regions, region => ({\n  id: kebabCase(region.label),\n  ...region\n}))\n\nexport default function DirectoryRegionalPage({\n  rawOrganizations,\n  pageRegion,\n  category\n}) {\n  return (\n    <DirectoryPage\n      rawOrganizations={rawOrganizations}\n      pageRegion={pageRegion}\n      category={category}\n    />\n  )\n}\n\nexport const getStaticPaths = () => {\n  const paths = categories.flatMap(category =>\n    map(map(regionsWithIds, 'id'), id => ({\n      params: { region: `${id}`, category: category.id }\n    }))\n  )\n\n  return { paths, fallback: false }\n}\n\nexport const getStaticProps = async ({ params }) => {\n  let { region } = params\n  const { category } = params\n  region = find(regionsWithIds, ['id', region.replace('organizations-in-', '')])\n\n  const { fetchAllOrganizations } =\n    await import('../../../../lib/cached-hcb-orgs')\n  const total = await fetchAllOrganizations()\n  const allOrgs = [\n    ...total.filter(a => a.logo !== null),\n    ...total.filter(a => a.logo === null)\n  ]\n\n  const orgs = allOrgs.filter(\n    org =>\n      (region.continents\n        ? region.continents.includes(org.location.continent)\n        : org.location.continent === region.label) &&\n      find(categories, ['id', category]).match(org)\n  )\n\n  return {\n    props: {\n      rawOrganizations: orgs,\n      pageRegion: region,\n      category\n    },\n    revalidate: 60 // seconds\n  }\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/directory/[category]/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport DirectoryPage, {\n  regions,\n  categories,\n  fetchRawOrganizations\n} from '../index'\nimport { find } from 'lodash'\n\nexport default function DirectoryRegionalPage({\n  rawOrganizations,\n  pageRegion,\n  category\n}) {\n  return (\n    <DirectoryPage\n      rawOrganizations={rawOrganizations}\n      pageRegion={pageRegion}\n      category={category}\n    />\n  )\n}\n\nexport const getStaticPaths = () => {\n  const paths = categories.flatMap(category => ({\n    params: { category: category.id }\n  }))\n\n  return { paths, fallback: false }\n}\n\nexport const getStaticProps = async ({ params }) => {\n  const { category } = params\n  const { fetchAllOrganizations } =\n    await import('../../../../lib/cached-hcb-orgs')\n  const total = await fetchAllOrganizations()\n  const allOrgs = [\n    ...total.filter(a => a.logo !== null),\n    ...total.filter(a => a.logo === null)\n  ]\n\n  const orgs = allOrgs.filter(org =>\n    find(categories, ['id', category]).match(org)\n  )\n\n  return {\n    props: {\n      rawOrganizations: orgs,\n      category\n    },\n    revalidate: 60 // seconds\n  }\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/directory/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Container, Flex, Grid, Heading, Input } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport ForceTheme from '../../../components/force-theme'\nimport Nav from '../../../components/nav'\nimport Footer from '../../../components/footer'\nimport MSparkles from '../../../components/sparkles/money'\nimport { Text, Button } from 'theme-ui'\nimport Icon from '@hackclub/icons'\nimport fuzzysort from 'fuzzysort'\nimport { useEffect, useState } from 'react'\nimport { kebabCase, intersection, find } from 'lodash'\nimport theme from '@hackclub/theme'\nimport { useRouter } from 'next/router'\nimport {\n  OrganizationModal,\n  badges,\n  getBadgesForOrg\n} from '../../../components/directoryModal'\nimport OrganizationCard from '../../../components/fiscal-sponsorship/directory/card'\nimport { Organization } from '../../../lib/organization'\nimport Image from 'next/image'\n\nconst styles = `\n  html {\n    scroll-behavior: smooth;\n  }\n`\n\ntype Region = {\n  label: string\n  color: string\n  iconColor: string\n  icon: string\n  image: string\n  ogImage: string\n  continents?: string[]\n  miniLabel?: string\n}\n\nexport const regions: Region[] = [\n  {\n    label: 'North America',\n    color: 'secondary',\n    iconColor: 'red',\n    icon: 'photo',\n    image:\n      'https://cloud-cberabu5z-hack-club-bot.vercel.app/3north_america.png',\n    ogImage: '/fiscal-sponsorship/climate/NorthAmerica.png'\n  },\n  {\n    label: 'South America',\n    color: 'secondary',\n    iconColor: 'orange',\n    icon: 'photo',\n    image:\n      'https://cloud-cberabu5z-hack-club-bot.vercel.app/4south_america.png',\n    ogImage: '/fiscal-sponsorship/climate/SouthAmerica.png'\n  },\n  {\n    label: 'Africa',\n    color: 'secondary',\n    iconColor: 'purple',\n    icon: 'explore',\n    image: 'https://cloud-cberabu5z-hack-club-bot.vercel.app/0africa.png',\n    ogImage: '/fiscal-sponsorship/climate/Africa.png'\n  },\n  {\n    label: 'Europe',\n    color: 'secondary',\n    iconColor: 'blue',\n    icon: 'explore',\n    image: 'https://cloud-oax3m4v0t-hack-club-bot.vercel.app/1europe.png',\n    ogImage: '/fiscal-sponsorship/climate/Europe.png'\n  },\n  {\n    label: 'Asia & Oceania',\n    continents: ['Asia', 'Oceania', 'Australia'],\n    color: 'secondary',\n    iconColor: 'green',\n    icon: 'explore',\n    image:\n      'https://cloud-oax3m4v0t-hack-club-bot.vercel.app/0asia___oceania.png',\n    ogImage: '/fiscal-sponsorship/climate/Asia+Oceania.png'\n  }\n]\n\nexport const categories = [\n  {\n    label: 'Nonprofits',\n    miniLabel: 'All',\n    id: 'organizations',\n    color: 'purple',\n    description: null,\n    match: org => true,\n    icon: 'list' as const,\n    index: true\n  },\n  {\n    label: 'FIRST Teams',\n    id: 'first',\n    color: 'blue',\n    description:\n      'Everywhere from San Jose to Boston to New York, HCB powers teams of all sizes.',\n    match: org => org.category === 'robotics_team',\n    icon: 'sam' as const\n  },\n  {\n    label: 'Hackathons',\n    id: 'hackathons',\n    color: 'purple',\n    description: `Hackers are using HCB to run hackathons that'll blow your mind away.`,\n    match: org => org.category === 'hackathon',\n    icon: 'event-code' as const\n  }\n]\n\nconst FilterPanel = ({ filter, mobile, clearOffset }) => {\n  const [regionsHiddenOnMobile, setRegionsHiddenOnMobile] = useState(mobile)\n  const [categoriesHiddenOnMobile, setCategoriesHiddenOnMobile] =\n    useState(mobile)\n  const router = useRouter()\n  const { category, region } = router.query\n  return (\n    <>\n      <Heading\n        as=\"h3\"\n        sx={{\n          fontSize: 2,\n          textTransform: 'uppercase',\n          color: 'muted',\n          mb: categoriesHiddenOnMobile ? 1 : 3,\n          cursor: mobile ? 'pointer' : 'default',\n          ':hover': mobile\n            ? {\n                color: 'blue'\n              }\n            : {}\n        }}\n        onClick={() => setCategoriesHiddenOnMobile(!categoriesHiddenOnMobile)}\n      >\n        FILTER {mobile && 'BY CATEGORY'}\n        <small\n          style={{\n            transform: 'translateY(-1px)',\n            display: 'inline-block',\n            marginLeft: '6px'\n          }}\n        >\n          {mobile && (categoriesHiddenOnMobile ? '▶︎' : '▼')}\n        </small>\n      </Heading>\n      <Flex\n        sx={{\n          flexDirection: mobile ? 'row' : 'column',\n          gap: '12px',\n          flexWrap: 'wrap',\n          mb: 3,\n          display: categoriesHiddenOnMobile ? 'none' : 'flex'\n        }}\n      >\n        {categories.map(availableCategory => (\n          <Flex\n            key={kebabCase(availableCategory.label)}\n            sx={{\n              alignItems: 'center',\n              cursor: 'pointer',\n              gap: 2,\n              py: mobile ? 1 : 0,\n              pl: mobile ? 1 : 0,\n              pr: mobile ? 3 : 0,\n              border: mobile ? '1px solid' : 'none',\n              borderColor: 'sunken',\n              borderRadius: '4px',\n              background: mobile ? 'snow' : 'none',\n              color: 'secondary',\n              textDecoration: 'none',\n              transition: 'color 0.2s',\n              ':hover': {\n                color: 'blue'\n              },\n              width: 'fit-content'\n            }}\n            onClick={() => {\n              router.push(\n                availableCategory.index\n                  ? `/fiscal-sponsorship/directory/`\n                  : `/fiscal-sponsorship/directory/${availableCategory.id}/${region || ''}`\n              )\n              clearOffset()\n            }}\n          >\n            <Flex\n              sx={{\n                bg: 'smoke',\n                color: 'secondary',\n                p: 1,\n                borderRadius: 6\n              }}\n            >\n              <Icon glyph={availableCategory.icon || 'list'} size={24} />\n            </Flex>\n            <Heading\n              as=\"h4\"\n              sx={{\n                fontSize: 3,\n                color:\n                  category === availableCategory.id ||\n                  (availableCategory.index &&\n                    category === null &&\n                    region === null)\n                    ? 'primary'\n                    : 'null',\n                ':hover': {\n                  color: 'blue'\n                }\n              }}\n            >\n              {availableCategory.miniLabel || availableCategory.label}\n            </Heading>\n          </Flex>\n        ))}\n      </Flex>\n      <Heading\n        as=\"h3\"\n        sx={{\n          fontSize: 2,\n          textTransform: 'uppercase',\n          color: 'muted',\n          mb: regionsHiddenOnMobile ? 1 : 3,\n          mt: 3,\n          cursor: mobile ? 'pointer' : 'default',\n          ':hover': mobile\n            ? {\n                color: 'blue'\n              }\n            : {}\n        }}\n        onClick={() => setRegionsHiddenOnMobile(!regionsHiddenOnMobile)}\n      >\n        {mobile ? 'FILTER BY REGION' : 'REGIONS'}\n        <small\n          style={{\n            transform: 'translateY(-1px)',\n            display: 'inline-block',\n            marginLeft: '6px'\n          }}\n        >\n          {mobile && (regionsHiddenOnMobile ? '▶︎' : '▼')}\n        </small>\n      </Heading>\n      <Flex\n        sx={{\n          flexDirection: mobile ? 'row' : 'column',\n          gap: '12px',\n          flexWrap: 'wrap',\n          mb: 3,\n          display: regionsHiddenOnMobile ? 'none' : 'flex'\n        }}\n      >\n        {regions.map(availableRegion => (\n          <Flex\n            key={kebabCase(availableRegion.label)}\n            sx={{\n              alignItems: 'center',\n              cursor: 'pointer',\n              gap: 2,\n              py: mobile ? 1 : 0,\n              pl: mobile ? 1 : 0,\n              pr: mobile ? 3 : 0,\n              border: mobile ? '1px solid' : 'none',\n              borderColor: 'sunken',\n              borderRadius: '4px',\n              background: mobile ? 'snow' : 'none',\n              color: 'secondary',\n              textDecoration: 'none',\n              transition: 'color 0.2s',\n              ':hover': {\n                color: 'blue'\n              },\n              width: 'fit-content'\n            }}\n            onClick={() => {\n              router.push(\n                `/fiscal-sponsorship/directory/${category || 'organizations'}/${kebabCase(availableRegion.label)}`\n              )\n              clearOffset()\n            }}\n          >\n            <Flex\n              sx={{\n                backgroundImage: `url(\"${availableRegion.image}\")`,\n                backgroundSize: 'contain',\n                backgroundPosition: 'center',\n                backgroundRepeat: 'no-repeat',\n                color: 'white',\n                p: 1,\n                borderRadius: 6\n              }}\n            >\n              <Flex\n                sx={{\n                  width: 24,\n                  height: 24\n                }}\n              />\n            </Flex>\n            <Heading\n              as=\"h4\"\n              sx={{\n                fontSize: 3,\n                color:\n                  region === kebabCase(availableRegion.label)\n                    ? 'primary'\n                    : 'null',\n                ':hover': {\n                  color: 'blue'\n                }\n              }}\n            >\n              {availableRegion.miniLabel || availableRegion.label}\n            </Heading>\n          </Flex>\n        ))}\n      </Flex>\n    </>\n  )\n}\n\ntype FilteringProps = {\n  mobile?: boolean\n  region?: string\n  clearOffset?: () => void\n  badges: [\n    React.Dispatch<React.SetStateAction<string[]>>,\n    string[],\n    string,\n    any[],\n    boolean?\n  ]\n}\n\nconst Filtering = ({\n  mobile,\n  region,\n  clearOffset,\n  ...props\n}: FilteringProps) => {\n  return (\n    <>\n      {Object.values(props).map((filter, i) => (\n        <FilterPanel\n          key={`filter-${i}`}\n          filter={filter}\n          mobile={mobile}\n          clearOffset={clearOffset}\n        />\n      ))}\n    </>\n  )\n}\n\nexport default function Directory({ rawOrganizations, pageRegion, category }) {\n  const [searchValue, setSearchValue] = useState('')\n  const [offset, setOffset] = useState(0)\n  const region = pageRegion\n  category = find(categories, ['id', category])\n  const [modalOrganization, setModalOrganization] = useState(null)\n\n  useEffect(() => {\n    const handle = e => {\n      if (e.key === 'Escape') {\n        closeModal()\n      }\n    }\n\n    window.addEventListener('keydown', handle)\n    return () => window.removeEventListener('keydown', handle)\n  })\n\n  let organizations = rawOrganizations\n\n  if (searchValue.length) {\n    const search = fuzzysort.go(searchValue, rawOrganizations, {\n      keys: ['name', 'description'],\n      threshold: -1000\n    })\n\n    organizations = search.map(({ obj }) => obj)\n  }\n\n  const [currentBadges, setBadges] = useState([...badges.map(x => x.id)])\n\n  const openModal = organization => {\n    setModalOrganization(organization)\n  }\n\n  const closeModal = () => {\n    setModalOrganization(null)\n  }\n\n  return (\n    <div style={modalOrganization ? {} : {}}>\n      <Meta\n        as={Head}\n        title={`${category ? category.label : 'Nonprofits'} ${pageRegion ? `in ${pageRegion.label}` : ''} on HCB`}\n        description={\n          \"Teenagers are making an impact with HCB's fiscal sponsorship and financial tools. Explore the nonprofits running on HCB.\"\n        }\n        image={`https://workshop-cards.hackclub.com/${encodeURIComponent(`${category ? category.label : 'Nonprofits running'} ${pageRegion ? `in ${pageRegion.label}` : ''} on HCB`)}.png?theme=light&md=1&fontSize=250px`}\n      />\n      <style>{styles}</style>\n      {modalOrganization && (\n        <OrganizationModal\n          organization={modalOrganization}\n          onClose={closeModal}\n        />\n      )}\n      <Box as=\"main\" key=\"main\">\n        {!modalOrganization && <Nav />}\n        <ForceTheme theme=\"light\" />\n        <Box\n          sx={{\n            pt: [5, null, null, null, 6],\n            pb: [3, 4, 5, null, 6],\n            minHeight: ['70vh', 'none'],\n            textAlign: 'center',\n            backgroundImage:\n              \"linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.4)), url('/home/hackathons-bg.webp')\",\n            backgroundSize: 'cover',\n            backgroundPosition: 'center center',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center'\n          }}\n        >\n          <Box\n            sx={{\n              width: '100%',\n              maxWidth: 'calc(48rem + 512px)',\n              mx: 'auto',\n              px: '16px',\n              backdropFilter: 'blur(1.5px)',\n              color: 'white'\n            }}\n          >\n            <Heading\n              sx={{\n                textAlign: 'center',\n                mt: [2, 4],\n                textShadow: '0 0 16px rgba(0, 0, 0, 1)',\n                fontSize: [5, null, 6, 7],\n                textWrap: 'balance'\n              }}\n              as=\"h1\"\n              variant=\"title\"\n            >\n              <Flex\n                sx={{ justifyContent: 'center', alignItems: 'center', mb: 2 }}\n              >\n                <MSparkles colors={['green', 'teal', 'blue']}>\n                  <Image\n                    src=\"/fiscal-sponsorship/hcb-icon-small.png\"\n                    alt=\"\"\n                    width={512}\n                    height={512}\n                    style={{ height: 'auto', width: '82px' }}\n                  />\n                </MSparkles>\n              </Flex>\n              {category ? category.label : 'Nonprofits'}{' '}\n              {pageRegion && <>in {pageRegion.label}</>} on HCB\n            </Heading>\n            <Box\n              sx={{\n                fontSize: [2, 3, 3],\n                textAlign: 'center',\n                my: 2,\n                maxWidth: '956px',\n                mx: 'auto'\n              }}\n            >\n              {\n                <>\n                  Teenagers are making an impact with HCB's fiscal sponsorship\n                  and financial tools. <br /> Explore the nonprofits running on\n                  HCB.\n                </>\n              }\n            </Box>\n            <Button\n              variant=\"ctaLg\"\n              as=\"a\"\n              {...({ href: '/fiscal-sponsorship' } as any)}\n              target=\"_blank\"\n              sx={{\n                mt: [0, 2],\n                height: '56px'\n              }}\n            >\n              WHAT'S HCB?\n            </Button>\n          </Box>\n        </Box>\n\n        <Grid\n          columns=\"auto 3fr\"\n          sx={{\n            '@media screen and (max-width: 991.98px)': {\n              display: 'block'\n            },\n            position: 'relative'\n          }}\n          id=\"listings\"\n        >\n          <Container>\n            <Box\n              sx={{\n                py: [0, 4],\n                mb: [4, 0],\n                display: 'block', // temporary - @sampoder\n                marginLeft: 'max(calc(50vw - 900px), 0px)',\n                '@media screen and (max-width: 991.98px)': {\n                  display: 'none'\n                },\n                '@media screen and (min-width: 992px)': {\n                  position: 'sticky',\n                  top: 80,\n                  alignSelf: 'start'\n                }\n              }}\n            >\n              <Filtering\n                badges={[setBadges, currentBadges, 'Badges', badges, false]}\n                region={region}\n                clearOffset={() => setOffset(0)}\n              />\n            </Box>\n          </Container>\n          <Container py={4}>\n            <Flex>\n              <Box sx={{ flexGrow: 1, pr: [0, 3], mb: 3 }}>\n                <Input\n                  placeholder=\"Search Organizations\"\n                  onChange={e => setSearchValue(e.target.value)}\n                  value={searchValue}\n                  sx={{\n                    border: '2px solid ' + theme.colors.muted,\n                    textAlign: ['left', 'left', 'left'],\n                    width: '100%',\n                    height: '100%',\n                    bg: 'sheet',\n                    fontSize: '18px',\n                    padding: '12px'\n                  }}\n                />\n              </Box>\n            </Flex>\n            <Box\n              sx={{\n                '@media screen and (max-width: 991.99px)': {\n                  display: 'block'\n                },\n                '@media screen and (min-width: 992px)': {\n                  display: 'none'\n                },\n                my: 2\n              }}\n            >\n              <Filtering\n                badges={[setBadges, currentBadges, 'Badges', badges]}\n                region={region}\n                mobile\n              />\n            </Box>\n            {organizations.length === 0 && (\n              <Box\n                sx={{\n                  textAlign: 'center',\n                  p: 5\n                }}\n              >\n                <Box>\n                  <Text\n                    variant=\"headline\"\n                    sx={{\n                      textTransform: 'unset',\n                      display: 'block',\n                      mb: 0\n                    }}\n                  >\n                    No results\n                  </Text>\n                </Box>\n              </Box>\n            )}\n            <Grid columns={[1, 2, 3]} gap={[3, 4]} sx={{ my: 3 }}>\n              {organizations\n                .map(org => new Organization(org))\n                .filter(organization => {\n                  const organizationBadgeIds = getBadgesForOrg(\n                    organization\n                  ).map(badge => badge.id)\n\n                  return (\n                    currentBadges.length === badges.length ||\n                    intersection(organizationBadgeIds, currentBadges).length ===\n                      currentBadges.length\n                  )\n                })\n                .slice(offset, offset + 51)\n                .map(organization => (\n                  <OrganizationCard\n                    organization={organization}\n                    key={organization.id}\n                    openModal={openModal}\n                    badges={getBadgesForOrg(organization)}\n                    showTags={true}\n                  />\n                ))}\n            </Grid>\n          </Container>\n        </Grid>\n      </Box>\n      <Box\n        sx={{\n          textAlign: 'center',\n          mb: 4,\n          display: searchValue === '' ? 'flex' : 'none',\n          alignItems: 'center',\n          justifyContent: 'center',\n          gap: '16px'\n        }}\n      >\n        {offset > 0 && (\n          <Button onClick={() => setOffset(offset - 51)}>\n            <Icon\n              glyph=\"view-back\"\n              size={24}\n              style={{ marginRight: 0, marginLeft: '-8px' }}\n            />{' '}\n            Previous\n          </Button>\n        )}\n        <Heading variant=\"eyebrow\" as=\"p\" sx={{ fontSize: [2, 3], mb: 0 }}>\n          Page {Math.ceil((offset + 1) / 51)}/\n          {Math.ceil(organizations.length / 51)}\n        </Heading>\n        {offset + 51 < organizations.length && (\n          <Button onClick={() => setOffset(offset + 51)}>\n            Next\n            <Icon\n              glyph=\"view-forward\"\n              size={24}\n              style={{ marginRight: '-8px', marginLeft: 0 }}\n            />\n          </Button>\n        )}\n      </Box>\n      <Footer />\n    </div>\n  )\n}\n\nexport async function fetchRawOrganizations() {\n  let lastLength = 100\n  let total = []\n  let page = 1\n  while (lastLength >= 100) {\n    const json = await fetch(\n      'https://hcb.hackclub.com/api/v3/directory/organizations?per_page=100&page=' +\n        page\n    ).then(res => res.json())\n    lastLength = json.length\n    page++\n    total = [...total, ...json]\n  }\n  return [\n    ...total.filter(a => a.logo !== null),\n    ...total.filter(a => a.logo === null)\n  ]\n}\n\nexport const getStaticProps = async () => {\n  const { fetchAllOrganizations } = await import('../../../lib/cached-hcb-orgs')\n  const total = await fetchAllOrganizations()\n  const rawOrganizations = [\n    ...total.filter(a => a.logo !== null),\n    ...total.filter(a => a.logo === null)\n  ]\n  return {\n    props: { rawOrganizations },\n    revalidate: 60 // seconds\n  }\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/first.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Heading, Container, Text, Button, Badge } from 'theme-ui'\n\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport ForceTheme from '../../components/force-theme'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport Icon from '../../components/icon'\nimport Features from '../../components/fiscal-sponsorship/first/features'\n\nimport Testimonials from '../../components/fiscal-sponsorship/first/testimonials'\nimport Start from '../../components/fiscal-sponsorship/first/start'\nimport theme from '@hackclub/theme'\nimport { Balancer } from 'react-wrap-balancer'\nimport { setCookie } from 'cookies-next'\nimport { useEffect } from 'react'\n\nexport default function First({ stats }) {\n  useEffect(() => {\n    const params = new URLSearchParams(window.location.search)\n\n    const tubProgram = params.get('tub_program')\n    const referral = params.get('referral')\n\n    if (referral) {\n      setCookie('referral', referral)\n      setCookie('tub_program', 'GFGS')\n    } else if (tubProgram) {\n      setCookie('tub_program', tubProgram)\n      setCookie('referral', '')\n    }\n  }, [])\n\n  return (\n    <>\n      <style>\n        {`*{\n          scroll-behavior: smooth;\n        }`}\n      </style>\n      <Meta\n        as={Head}\n        title=\"Financial Toolkit for FIRST Teams\"\n        description=\"HCB is the ultimate booster club for FRC, FTC, and FLL teams to receive grants, fundraise, make purchases, and so much more.\"\n        image=\"/fiscal-sponsorship/first/og-image.png\"\n      >\n        <title>Financial Toolkit for FIRST Teams | HCB</title>\n      </Meta>\n\n      <Box as=\"main\" key=\"main\" sx={{ mb: 6 }}>\n        <Nav dark />\n        <ForceTheme theme=\"dark\" />\n        <Box\n          sx={{\n            pt: [5, null, null, null, 6],\n            pb: [3, 4, 5, null, 6],\n            minHeight: ['70vh', 'none'],\n            textAlign: 'center',\n            backgroundImage:\n              \"linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.4)), url('https://cloud-7chjcfuyw-hack-club-bot.vercel.app/0image.png')\",\n            backgroundSize: 'cover',\n            backgroundPosition: 'center center',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center'\n          }}\n        >\n          <Container\n            sx={{\n              width: '100%',\n              mx: 'auto',\n              px: 3,\n              backdropFilter: 'blur(1.5px)'\n            }}\n          >\n            <Heading\n              as=\"h1\"\n              variant=\"ultratitle\"\n              sx={{\n                textAlign: 'center',\n                mt: [5, null, 6],\n                textShadow: '0 0 16px rgba(0, 0, 0, 1)',\n                maxWidth: 'container'\n              }}\n            >\n              <Balancer>\n                The ultimate booster club for{' '}\n                <Text\n                  as=\"span\"\n                  sx={{\n                    WebkitTextStroke: theme => theme.colors.blue,\n                    WebkitTextStrokeWidth: '1px',\n                    WebkitTextFillColor: theme => theme.colors.white,\n                    textShadow: theme => `0 0 12px ${theme.colors.blue}`\n                  }}\n                >\n                  FRC, FTC, and FLL teams\n                </Text>\n                .\n              </Balancer>\n            </Heading>\n            <Badge\n              variant=\"pill\"\n              sx={{\n                bg: 'rgba(132,146,166, 0.5)',\n                color: 'white',\n                fontWeight: 'normal',\n                fontSize: 2,\n                mt: 3,\n                mx: 'auto',\n                borderRadius: ['default', null, 'extra']\n              }}\n            >\n              <Box\n                as=\"div\"\n                sx={{\n                  display: ['grid', 'grid', 'flex'],\n                  flexDirection: [null, 'row', 'row'],\n                  gridTemplateColumns: ['1fr', '1fr 1fr']\n                }}\n              >\n                <Box\n                  as=\"span\"\n                  sx={{ display: 'flex', flexDirection: 'row', mr: 4 }}\n                >\n                  <Icon glyph=\"checkmark\" size={28} color=\"#33d6A6\" />\n                  <Text sx={{ ml: 1 }}>Nonprofit status</Text>\n                </Box>\n                <Box\n                  as=\"span\"\n                  sx={{ display: 'flex', flexDirection: 'row', mr: 4 }}\n                >\n                  <Icon glyph=\"checkmark\" size={28} color=\"#33d6A6\" />\n                  <Text sx={{ ml: 1 }}>Receive grants</Text>\n                </Box>\n                <Box as=\"span\" sx={{ display: 'flex', flexDirection: 'row' }}>\n                  <Icon glyph=\"checkmark\" size={28} color=\"#33d6A6\" />\n                  <Text sx={{ ml: 1 }}>Debit cards</Text>\n                </Box>\n              </Box>\n            </Badge>\n            <Container\n              as=\"p\"\n              sx={{\n                fontSize: [2, 3, 3],\n                textAlign: 'center',\n                my: 4\n              }}\n              variant=\"copy\"\n            >\n              Built by <i>FIRST</i> alumni for <i>FIRST</i> teams, HCB is a\n              comprehensive financial platform used by hundreds of clubs, teams\n              and hackathons.\n            </Container>\n\n            <Box\n              sx={{\n                display: 'flex',\n                flexDirection: ['column', null, 'row'],\n                justifyContent: 'center',\n                alignItems: 'center'\n              }}\n            >\n              <a href=\"#demo\">\n                <Button variant=\"ctaLg\">Open an account</Button>\n              </a>\n\n              <a\n                href=\"/fiscal-sponsorship/first/Hack_Club_Bank_for_FIRST_Teams.pdf\"\n                target=\"_blank\"\n              >\n                <Button\n                  sx={{\n                    backgroundImage: theme.util.gx('cyan', 'blue'),\n                    ml: 2,\n                    display: ['none', null, 'inline-block'] // hide on mobile because viewing pdfs on mobile is a pain anyways\n                  }}\n                  variant=\"ctaLg\"\n                  // @exu3: to edit this PDF, use this Figma file https://www.figma.com/file/LgadOH1lHUBOejA3vaNGgm/Hack-Club-Bank-for-FIRST-Teams-One-Pager?node-id=0%3A1&t=ZtkN2a3aw2IojFvi-1\n                  // message me on Slack if you need edit access\n                >\n                  Download this page\n                </Button>\n              </a>\n            </Box>\n          </Container>\n        </Box>\n\n        <Features />\n\n        <Box id=\"testimonials\">\n          <Testimonials />\n        </Box>\n\n        <Box id=\"demo\">\n          <Start stats={stats} />\n        </Box>\n      </Box>\n      <Footer dark />\n    </>\n  )\n}\n\nexport async function getStaticProps(context) {\n  const res = await fetch(`https://hcb.hackclub.com/stats`)\n  try {\n    const stats = await res.json()\n    return {\n      props: {\n        stats\n      },\n      revalidate: 60 * 60 // once an hour\n    }\n  } catch (e) {\n    return {\n      props: {\n        stats: {}\n      },\n      revalidate: 60 * 60 // once an hour\n    }\n  }\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport Link from 'next/link'\nimport { Balancer } from 'react-wrap-balancer'\nimport {\n  Box,\n  Button,\n  Card,\n  Container,\n  Flex,\n  Grid,\n  Heading,\n  Link as UILink,\n  Text\n} from 'theme-ui'\nimport ForceTheme from '../../components/force-theme'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport Photo from '../../components/photo'\nimport Stat from '../../components/stat'\nimport ContactBanner from '../../components/fiscal-sponsorship/contact'\nimport Features from '../../components/fiscal-sponsorship/features'\nimport OuternetImgFile from '../../public/home/outernet-110.jpg'\nimport SignIn from '../../components/fiscal-sponsorship/sign-in'\nimport OrganizationSpotlight from '../../components/fiscal-sponsorship/organization-spotlight'\nimport { setCookie, getCookie } from 'cookies-next'\nimport { useEffect, useState } from 'react'\nimport { unfold } from '../../components/announcement'\nimport OpenSource from '../../components/fiscal-sponsorship/open-source'\nimport 'react-responsive-carousel/lib/styles/carousel.min.css'\nimport Sparkles from '../../components/sparkles'\nimport Icon from '../../components/icon'\nimport Image from 'next/image'\n\nconst organizations = [\n  {\n    id: 'org_MpJurQ',\n    name: 'Reboot',\n    description:\n      'Publishing techno-optimism, through newsletters, magazines, and events.',\n    slug: 'reboot',\n    location: { readable: 'Bay Area, CA, USA' },\n    logo: '/fiscal-sponsorship/reboot.png',\n    background_image: '/fiscal-sponsorship/reboot-bg.jpg'\n  },\n  {\n    id: 'org_AluOql',\n    name: 'Apocalypse',\n    description: \"Canada's largest in-person high school hackathon.\",\n    slug: 'apocalypse',\n    location: { readable: 'Toronto, Canada' },\n    logo: '/fiscal-sponsorship/apocalypse.png',\n    background_image: '/fiscal-sponsorship/apocalypse-bg.png'\n  },\n  {\n    id: 'org_BbVuWN',\n    name: 'Green Mountain Robotics',\n    description: 'Spreading STEM interest, one robot at a time.',\n    slug: 'green-mountain-robotics',\n    location: { readable: 'Chittenden County, VT, USA' },\n    logo: '/fiscal-sponsorship/green-mountain-robotics.png',\n    background_image: 'green-mountain-robotics-bg.png'\n  },\n  {\n    id: 'org_a29uVj',\n    name: 'Hack Club HQ',\n    description: 'This is us! We run our operations on HCB.',\n    slug: 'hq',\n    location: { readable: 'Vermont, USA' },\n    logo: '/fiscal-sponsorship/hq.png',\n    background_image: '/fiscal-sponsorship/hq-bg.jpg'\n  }\n]\n\nfunction MobileAppAlert() {\n  return (\n    <Container sx={{ position: 'relative' }}>\n      <Box\n        sx={{\n          position: 'relative',\n          overflow: 'hidden',\n          py: ['25px', 3],\n          px: 4,\n          background: [\n            'rgba(200, 200, 200, 0.3)',\n            'linear-gradient(rgba(255,255,255,0.4), rgba(200,200,200,.3))'\n          ],\n          backdropFilter: 'blur(20px)',\n          borderRadius: 20,\n          boxShadow:\n            '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n          display: 'flex',\n          alignItems: 'center',\n          gap: 10,\n          mt: [20, -50],\n          '@media (prefers-reduced-motion: no-preference)': {\n            transform: 'scaleY(0)',\n            animation: `${unfold} 0.5s ease-out forwards`,\n            animationDelay: '0.5s'\n          },\n          '@media (prefers-reduced-motion: reduce)': {\n            transform: 'scaleY(100%)'\n          },\n          flexDirection: ['column', 'row']\n        }}\n      >\n        <Box\n          sx={{\n            position: 'absolute',\n            top: 15,\n            right: -30,\n            bg: 'red',\n            color: 'white',\n            transform: 'rotate(45deg)',\n            width: 120,\n            textAlign: 'center',\n            py: 1,\n            fontSize: 1,\n            zIndex: 40,\n            fontWeight: 'bold',\n            boxShadow: '0 2px 4px rgba(0,0,0,0.2)'\n          }}\n        >\n          New!\n        </Box>\n        <span style={{ fontSize: 20 }}>\n          <strong style={{ fontSize: 23 }}>HCB Mobile is here!</strong>\n          <br />\n          Manage your HCB organizations on the go. Issue cards, view\n          transactions, and more!\n        </span>\n\n        <Box\n          sx={{\n            gap: 2,\n            display: 'flex',\n            width: ['100%', 'auto'],\n            flexShrink: 0,\n            ml: [undefined, 'auto'],\n            flexDirection: ['column', 'row'],\n            flexWrap: 'wrap',\n            alignItems: 'center'\n          }}\n        >\n          <a\n            href=\"https://apps.apple.com/us/app/hcb-by-hack-club/id6465424810\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            style={{ padding: 0, margin: 0, height: 40 }}\n          >\n            <Image\n              src=\"apple-web-badge.svg\"\n              alt=\"Download on the App Store\"\n              width={120}\n              height={40}\n            />\n          </a>\n          <a\n            href=\"https://play.google.com/store/apps/details?id=com.hackclub.hcb\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            style={{ padding: 0, margin: 0, height: 40 }}\n          >\n            <Image\n              src=\"/fiscal-sponsorship/google-play-web-badge.png\"\n              alt=\"Get it on Google Play\"\n              width={135}\n              height={40}\n            />\n          </a>\n        </Box>\n      </Box>\n    </Container>\n  )\n}\n\nexport default function Page() {\n  const [hasReferral, setHasReferral] = useState(false)\n  const [mobileInstalls, setMobileInstalls] = useState(0)\n  useEffect(() => {\n    fetch('https://hcb.hackclub.com/stats')\n      .then(res => res.json())\n      .then(data => {\n        setMobileInstalls(data.mobile_installs)\n      })\n  }, [])\n\n  useEffect(() => {\n    const params = new URLSearchParams(window.location.search)\n\n    const tubProgram = params.get('tub_program')\n    const referral = params.get('referral')\n    const referralCookie = getCookie('referral')\n\n    if (referral) {\n      setCookie('referral', referral)\n      setCookie('tub_program', 'GFGS')\n    } else if (tubProgram) {\n      setCookie('tub_program', tubProgram)\n      setCookie('referral', '')\n    }\n\n    setHasReferral(!!referral || !!referralCookie)\n  }, [])\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Fiscal Sponsorship\"\n        description=\"Start your nonprofit with our fiscal sponsorship program, HCB: a 501(c)(3) legal entity, bank account, automatic taxes & accounting, and best-in-class app.\"\n        image=\"/fiscal-sponsorship/og-image.png\"\n      />\n      <ForceTheme theme=\"light\" />\n      <Nav />\n      <Box\n        as=\"header\"\n        sx={{\n          position: 'relative',\n          pt: 6,\n          pb: [4, '90px'],\n          bg: 'rgb(104, 41, 205)',\n          backgroundImage:\n            'radial-gradient(ellipse at 5% 5%, #ec555c 0%, rgba(236,85,92,0) 75%),radial-gradient(ellipse at 95% 5%, #dc71a1 0%, rgba(220,113,161,0) 75%),radial-gradient(ellipse at 95% 95%, #fcc8bf 0%, rgba(252,200,191,0) 75%),radial-gradient(ellipse at 5% 95%, #ffce33 0%, rgba(255,206,51,0) 75%)'\n        }}\n      >\n        <Box\n          sx={{\n            position: 'absolute',\n            inset: 0,\n            height: '100%',\n            zIndex: 0,\n            backgroundSize: '48px 48px',\n            backgroundImage: `linear-gradient(to right,  #fcc8bf 1px, transparent 1px),\n                              linear-gradient(to bottom, #fcc8bf 1px, transparent 1px)`,\n            backgroundPosition: 'top center',\n            maskImage:\n              'linear-gradient(to bottom, transparent 0%, hsl(0deg 0% 100% / 50%) 10%, white 100%)',\n            opacity: 0.18\n          }}\n        />\n        <Container\n          sx={{\n            color: 'white',\n            position: 'relative',\n            zIndex: 1,\n            svg: {\n              position: 'absolute',\n              right: [3, 0],\n              bottom: 0,\n              width: [114, 200, 300],\n              height: [114, 200, 300],\n              opacity: 0.5\n            }\n          }}\n        >\n          <svg\n            width=\"32\"\n            height=\"32\"\n            viewBox=\"0 0 32 32\"\n            fill=\"none\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n            aria-hidden\n          >\n            <path\n              fillRule=\"evenodd\"\n              clipRule=\"evenodd\"\n              d=\"M16 31C28 31 31 28 31 16C31 4 28 1 16 1C4 1 1 4 1 16C1 28 4 31 16 31Z\"\n              stroke=\"currentColor\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeDasharray=\"6 4\"\n            />\n            <path\n              fillRule=\"evenodd\"\n              clipRule=\"evenodd\"\n              d=\"M16.0003 8.018C15.9593 8.032 15.8963 8.056 15.8063 8.096C15.5673 8.199 15.2832 8.347 14.9183 8.556C14.1762 8.98 13.2473 9.579 12.2023 10.317C10.9954 11.1683 10.4485 11.5969 9.76695 12.1311L9.76693 12.1311L9.76692 12.1311C9.26201 12.5269 8.68316 12.9806 7.70725 13.707C7.31725 14.098 6.68325 14.098 6.29325 13.707C5.90225 13.317 5.90225 12.683 6.29325 12.293C8.5005 10.5 8.89925 10.201 11.0483 8.683C12.1283 7.921 13.1373 7.27 13.9263 6.819C14.3273 6.59 14.7063 6.394 15.0033 6.264C15.2653 6.149 15.6423 6 16.0003 6C16.3583 6 16.7353 6.149 16.9973 6.264C17.2943 6.394 17.6733 6.59 18.0743 6.819C18.8632 7.27 19.8723 7.921 20.9523 8.683C23.1012 10.201 23.5 10.5 25.7073 12.293C26.0983 12.683 26.0983 13.317 25.7073 13.707C25.3173 14.098 24.6833 14.098 24.2932 13.707C23.3173 12.9806 22.7385 12.5269 22.2336 12.1311C21.552 11.5969 21.0051 11.1683 19.7983 10.317C18.7533 9.579 17.8243 8.98 17.0823 8.556C16.7173 8.347 16.4333 8.199 16.1943 8.096C16.1043 8.056 16.0413 8.032 16.0003 8.018ZM7 24C7 23.448 7.448 23 8 23H24C24.552 23 25 23.448 25 24C25 24.552 24.552 25 24 25H8C7.448 25 7 24.552 7 24ZM15 21C15 21.552 15.448 22 16 22C16.552 22 17 21.552 17 21V14C17 13.448 16.552 13 16 13C15.448 13 15 13.448 15 14V21ZM21 22C20.448 22 20 21.552 20 21V14C20 13.448 20.448 13 21 13C21.552 13 22 13.448 22 14V21C22 21.552 21.552 22 21 22ZM10 21C10 21.552 10.448 22 11 22C11.552 22 12 21.552 12 21V14C12 13.448 11.552 13 11 13C10.448 13 10 13.448 10 14V21Z\"\n              fill=\"currentColor\"\n            />\n          </svg>\n          <Heading\n            as=\"h1\"\n            variant=\"title\"\n            sx={{\n              fontSize: [5, 6, null, 7],\n              // magic number to align with the grid\n              mt: -3,\n              lineHeight: [null, null, 1.03],\n              span: {\n                WebkitTextStroke: 'currentColor',\n                WebkitTextStrokeWidth: ['2px', '3px'],\n                WebkitTextFillColor: 'transparent',\n                display: 'block'\n              }\n            }}\n          >\n            <span>The foundation</span> of your nonprofit.\n          </Heading>\n          <Text as=\"p\" variant=\"lead\" sx={{ my: [3, 4] }}>\n            <Balancer>\n              Start your nonprofit with{' '}\n              <strong>our fiscal sponsorship program, HCB</strong>: a 501(c)(3)\n              legal entity, bank account, automatic taxes & accounting, and\n              best-in-class software.\n            </Balancer>\n          </Text>\n\n          {hasReferral && (\n            <Text variant=\"lead\" sx={{ my: [3, 4] }}>\n              <Box\n                sx={{\n                  bg: 'rgba(255, 255, 255, 0.2)',\n                  p: 3,\n                  borderRadius: 'default',\n                  border: '1px solid rgba(255, 255, 255, 0.3)',\n                  backdropFilter: 'blur(8px)',\n                  boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n                  mt: 3\n                }}\n              >\n                Apply by <strong>April 16th</strong> using referral code (\n                {getCookie('referral')}) and get stickers + fiscal sponsorship\n                fees waived for the month of May.\n                <Link\n                  href=\"https://docs.google.com/document/d/e/2PACX-1vTPygv_qfd2FnU3Dslt4o69nBlOoKhvWDuexk67ApjuIH96ghjpLjw9wJhsRUtTZYX3XO4EVdxXVx7Q/pub\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  title=\"Terms apply\"\n                  style={{ marginLeft: '4px' }}\n                >\n                  *\n                </Link>\n              </Box>\n            </Text>\n          )}\n\n          <Flex\n            sx={{\n              flexDirection: ['column', 'row'],\n              mt: [3, 4],\n              gap: [3, 4],\n              alignItems: ['start', 'center']\n            }}\n          >\n            <Link href=\"https://hcb.hackclub.com/applications/new\">\n              <Button\n                variant=\"lg\"\n                sx={{\n                  bg: 'blue',\n                  backgroundImage: (t: any) => t.util.gx('cyan', 'blue'),\n                  lineHeight: 0.9\n                }}\n              >\n                Apply now\n              </Button>\n            </Link>\n            <SignIn />\n          </Flex>\n        </Container>\n      </Box>\n      <MobileAppAlert />\n      <Box as=\"section\" sx={{ py: [4, 5], alignItems: 'center' }}>\n        <Container sx={{ alignItems: 'center' }}>\n          <Grid\n            gap={[4, 5]}\n            columns={[null, null, 2]}\n            sx={{ alignItems: 'center' }}\n          >\n            <Box>\n              <Heading\n                as=\"h2\"\n                variant=\"title\"\n                sx={{ mb: 3, maxWidth: 'copyUltra' }}\n              >\n                HCB in your <Sparkles sx={{ color: 'red' }}>pocket</Sparkles>\n              </Heading>\n              <Text as=\"p\" variant=\"lead\" sx={{ mb: 3 }}>\n                The official mobile app lets you manage your organization&apos;s\n                finances, issue cards, and more!\n              </Text>\n              <Grid columns={[1, 2]} gap={3}>\n                <Card\n                  variant=\"sunken\"\n                  sx={{\n                    p: '1.5rem !important',\n                    bg: 'snow',\n                    borderRadius: 'default'\n                  }}\n                >\n                  <Text\n                    as=\"strong\"\n                    color=\"slate\"\n                    sx={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      gap: 2,\n                      mb: 1,\n                      justifyContent: 'space-between'\n                    }}\n                  >\n                    <span style={{ maxWidth: 'calc(100% - 36px)' }}>\n                      See your organization's spending\n                    </span>\n                    <Icon\n                      glyph=\"view\"\n                      size={36}\n                      sx={{ color: 'red', flexShrink: 0 }}\n                    />\n                  </Text>\n                  <Text>\n                    Stay up to date on your organization's balance and\n                    transactions.\n                  </Text>\n                </Card>\n                <Card\n                  variant=\"sunken\"\n                  sx={{\n                    p: '1.5rem !important',\n                    bg: 'snow',\n                    borderRadius: 'default'\n                  }}\n                >\n                  <Text\n                    as=\"strong\"\n                    color=\"slate\"\n                    sx={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      justifyContent: 'space-between',\n                      gap: 2,\n                      mb: 1\n                    }}\n                  >\n                    <span style={{ maxWidth: 'calc(100% - 32px)' }}>\n                      Accept Tap to Pay donations\n                    </span>\n                    <Icon\n                      glyph=\"bolt-circle\"\n                      size={32}\n                      sx={{ color: 'red', flexShrink: 0 }}\n                    />\n                  </Text>\n                  <Text>\n                    No extra hardware required! Tap any card against your phone.\n                    Great for in-person fundraisers.\n                  </Text>\n                </Card>\n                <Card\n                  variant=\"sunken\"\n                  sx={{\n                    p: '1.5rem !important',\n                    bg: 'snow',\n                    borderRadius: 'default'\n                  }}\n                >\n                  <Text\n                    as=\"strong\"\n                    color=\"slate\"\n                    sx={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      justifyContent: 'space-between',\n                      gap: 2,\n                      mb: 1\n                    }}\n                  >\n                    <span style={{ maxWidth: 'calc(100% - 32px)' }}>\n                      Issue, manage, and\n                      <br />\n                      add cards\n                    </span>\n                    <Icon\n                      glyph=\"card\"\n                      size={32}\n                      sx={{ color: 'red', flexShrink: 0 }}\n                    />\n                  </Text>\n                  <Text>\n                    You can directly add cards to Apple&nbsp;Wallet and\n                    Google&nbsp;Wallet. No more forgetting your card!\n                  </Text>\n                </Card>\n                <Card\n                  variant=\"sunken\"\n                  sx={{\n                    p: '1.5rem !important',\n                    bg: 'snow',\n                    borderRadius: 'default'\n                  }}\n                >\n                  <Text\n                    as=\"strong\"\n                    color=\"slate\"\n                    sx={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      justifyContent: 'space-between',\n                      gap: 2,\n                      mb: 1\n                    }}\n                  >\n                    <span style={{ maxWidth: 'calc(100% - 32px)' }}>\n                      Upload receipts the easy way\n                    </span>\n                    <Icon\n                      glyph=\"docs\"\n                      size={32}\n                      sx={{ color: 'red', flexShrink: 0 }}\n                    />\n                  </Text>\n                  <Text>Quickly snap a photo or upload a file!</Text>\n                </Card>\n              </Grid>\n              <a href=\"/hcb/mobile\" target=\"_blank\">\n                <Button\n                  sx={{\n                    flexShrink: 0,\n                    gap: 1,\n                    paddingLeft: 25,\n                    paddingRight: '5px',\n                    marginTop: '20px'\n                  }}\n                >\n                  Read our story\n                  <Icon glyph=\"view-forward\" />\n                </Button>\n              </a>\n            </Box>\n            <Card\n              sx={{\n                backgroundImage: 'linear-gradient(to right, #fcc8bf, #ffce33)',\n                px: [5, 5],\n                py: '0 !important',\n                height: 'fit-content',\n                display: 'flex',\n                flexDirection: 'column',\n                justifyContent: 'flex-end',\n                position: 'relative'\n              }}\n            >\n              <Text\n                as=\"span\"\n                sx={{\n                  position: 'absolute',\n                  bottom: 12,\n                  left: 12,\n                  bg: 'white',\n                  color: 'slate',\n                  fontSize: 14,\n                  fontWeight: 'bold',\n                  px: 3,\n                  py: 2,\n                  borderRadius: 30,\n                  boxShadow: 'small'\n                }}\n              >\n                {mobileInstalls.toLocaleString()} installs\n              </Text>\n              <Image\n                src=\"/fiscal-sponsorship/mobile-mockup.png\"\n                alt=\"Mobile app mockup\"\n                width={400}\n                height={800}\n                style={{\n                  display: 'block',\n                  width: '100%',\n                  height: 'auto',\n                  borderRadius: 'inherit'\n                }}\n              />\n            </Card>\n          </Grid>\n        </Container>\n      </Box>\n      <Box id=\"organizations\" as=\"section\" sx={{ py: [4, 5], bg: 'snow' }}>\n        <Container sx={{}}>\n          <Heading\n            as=\"h2\"\n            variant=\"title\"\n            sx={{ mt: 0, mb: 3, maxWidth: 'copyUltra' }}\n          >\n            <Balancer>Powering nonprofits at every scale</Balancer>\n          </Heading>\n          <Flex sx={{ flexWrap: 'wrap', rowGap: 3, columnGap: [4, 5], mb: 4 }}>\n            <Stat value=\"$100M+\" label=\"processed transactions\" reversed />\n            <Stat value=\"6500+\" label=\"projects\" reversed />\n            <Stat value=\"2018\" label=\"serving nonprofits since\" reversed />\n          </Flex>\n          <Grid columns={[1, 2]} gap={[3, 4]} sx={{ mt: 4 }}>\n            {organizations.map(org => (\n              <OrganizationSpotlight organization={org} key={org.id} />\n            ))}\n          </Grid>\n          <Box\n            sx={{\n              mt: 4,\n              width: '100%',\n              display: 'flex',\n              flexDirection: 'row',\n              justifyContent: 'center',\n              alignItems: 'center'\n            }}\n          >\n            <Link href=\"/fiscal-sponsorship/directory\">\n              <Button\n                variant=\"lg\"\n                sx={{\n                  bg: 'blue',\n                  backgroundImage: (t: any) => t.util.gx('muted', 'slate'),\n                  lineHeight: 0.9,\n                  whiteSpace: 'nowrap'\n                }}\n              >\n                See more organizations →\n              </Button>\n            </Link>\n\n            <Box sx={{ flexGrow: '1' }}></Box>\n          </Box>\n        </Container>\n      </Box>\n      <Features />\n      <Box\n        id=\"fees\"\n        as=\"section\"\n        sx={{ position: 'relative', py: 5, bg: 'snow' }}\n      >\n        <Container>\n          <Grid columns={[null, null, 2]} gap={[4, 5]}>\n            <div>\n              <Text\n                variant=\"title\"\n                sx={{ color: 'blue', mb: 2, lineHeight: 0.96 }}\n              >\n                One simple, transparent fee:\n                <br />\n                7% of revenue.\n              </Text>\n              <Text\n                as=\"p\"\n                variant=\"caption\"\n                color=\"slate\"\n                sx={{ maxWidth: '52ch' }}\n              >\n                This fee goes directly to Hack Club's operations staff,\n                including teen interns working under mentors. This allows us to\n                deliver best-in-class software and support, grow sustainably,\n                while also providing paid career training for young people from\n                diverse backgrounds.\n              </Text>\n            </div>\n            <Text\n              as=\"p\"\n              variant=\"headline\"\n              sx={{\n                width: 'fit-content',\n                gridRow: ['1', 'auto'],\n                '@supports (-webkit-background-clip: text)': {\n                  backgroundRepeat: 'no-repeat',\n                  WebkitBackgroundClip: 'text',\n                  WebkitTextFillColor: 'transparent',\n                  backgroundImage:\n                    'linear-gradient(to right, #f06844 0%, #ee4c54 25%, #d45e95 50%, #9c6ca6 75%, #6583c1 100%) !important'\n                },\n                '@supports (-webkit-background-clip: text) and (background: linear-gradient(to right in oklch, white, black)':\n                  {\n                    backgroundImage:\n                      'linear-gradient(to right in oklch, #f06844 0%, #ee4c54 25%, #d45e95 50%, #9c6ca6 75%, #6583c1 100%) !important'\n                  }\n              }}\n              style={{ margin: 0 }}\n            >\n              No legal fees.\n              <br />\n              No startup fees.\n              <br />\n              No transaction fees.\n              <br />\n              No card issuing fees.\n              <br />\n              No subscription fees.\n              <br />\n              No check deposit fees.\n              <br />\n              No credit card processing fees.\n            </Text>\n          </Grid>\n        </Container>\n      </Box>\n      {/** removed for now\n      <Box as=\"section\" bg=\"snow\" sx={{ py: 5 }}>\n        <Container>\n          <Grid columns={[null, null, 2]} gap={[4, 5]}>\n            <div>\n              <Heading\n                variant=\"headline\"\n                as=\"h2\"\n                sx={{ marginBlockStart: [null, 4] }}\n              >\n                <Balancer>\n                  The fiscal sponsor of&nbsp;choice for the best funders.\n                </Balancer>\n              </Heading>\n              <Flex\n                sx={{\n                  alignItems: 'center',\n                  gap: [3, 4],\n                  mt: 4,\n                  img: {\n                    width: [72, 128],\n                    height: [72, 128],\n                    objectFit: 'contain'\n                  }\n                }}\n              >\n                {['ycjf.png', 'first.png'].map(file => (\n                  <img\n                    key={file}\n                    src={`/fiscal-sponsorship/${file}`}\n                    width={128}\n                    height={128}\n                    loading=\"lazy\"\n                    alt={file.split('.')[0].toUpperCase()}\n                  />\n                ))}\n              </Flex>\n            </div>\n            <Card sx={{ maxWidth: 'copy', ml: [null, -4], textAlign: 'left' }}>\n              <Text\n                as=\"blockquote\"\n                variant=\"lead\"\n                sx={{\n                  mt: '0 !important',\n                  color: 'slate',\n                  textIndent: '-0.33em'\n                }}\n              >\n                “Quote goes here”\n              </Text>\n              <Text\n                as=\"p\"\n                variant=\"caption\"\n                sx={{ color: 'muted', mt: 3, textIndent: '-1.5ch' }}\n              >\n                —\n                <Text as=\"strong\" color=\"slate\">\n                  FirstName LastName\n                </Text>\n                , Title,{' '}\n                <UILink href=\"https://example.com\">\n                  Organization\n                </UILink>\n              </Text>\n            </Card>\n          </Grid>\n        </Container>\n      </Box>\n      */}\n      <Container>\n        <Grid\n          columns={[null, null, 2]}\n          gap={[4, 5]}\n          sx={{ py: 5, p: { fontSize: 2, '&:last-child': { mb: 0 } } }}\n        >\n          <Link href=\"https://outernet.hackclub.com/\">\n            <Photo\n              src={OuternetImgFile}\n              alt=\"Each year, thousands of teenagers attend Hack Club events like this\"\n              showAlt\n              sx={{ height: '100%' }}\n            />\n          </Link>\n          <div>\n            <Heading as=\"h2\" variant=\"headline\" sx={{ mt: [0, 0] }}>\n              Built by Hack Club\n            </Heading>\n            <p>\n              As{' '}\n              <UILink as={Link} href=\"/\">\n                Hack Club\n              </UILink>{' '}\n              grew, we needed a way to empower our members. We currently have\n              over 60,000 high schoolers involved in Hack Club with over 400\n              clubs around the world.\n            </p>\n            <p>\n              We started HCB in 2018 to support teen-led clubs and hackathons.\n              After showing it to our educational partners, we knew we had\n              tapped into something much larger. Today, HCB removes financial\n              and legal barriers for thousands doing good in their community.\n            </p>\n            <Flex\n              as=\"footer\"\n              sx={{\n                alignItems: 'center',\n                gap: 3,\n                color: 'slate',\n                borderRadius: 'default',\n                lineHeight: 'caption',\n                textWrap: 'balance',\n                svg: { flexShrink: 0, fill: 'blue' }\n              }}\n            >\n              <svg\n                xmlns=\"http://www.w3.org/2000/svg\"\n                width={32}\n                height={32}\n                viewBox=\"0 0 16 16\"\n                aria-hidden\n              >\n                <path d=\"M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0M2.04 4.326c.325 1.329 2.532 2.54 3.717 3.19.48.263.793.434.743.484q-.121.12-.242.234c-.416.396-.787.749-.758 1.266.035.634.618.824 1.214 1.017.577.188 1.168.38 1.286.983.082.417-.075.988-.22 1.52-.215.782-.406 1.48.22 1.48 1.5-.5 3.798-3.186 4-5 .138-1.243-2-2-3.5-2.5-.478-.16-.755.081-.99.284-.172.15-.322.279-.51.216-.445-.148-2.5-2-1.5-2.5.78-.39.952-.171 1.227.182.078.099.163.208.273.318.609.304.662-.132.723-.633.039-.322.081-.671.277-.867.434-.434 1.265-.791 2.028-1.12.712-.306 1.365-.587 1.579-.88A7 7 0 1 1 2.04 4.327Z\" />\n              </svg>\n              <span>\n                As part of our commitment to the environment, funding for\n                HCB&apos;s operations&nbsp;and staff will never come from the{' '}\n                <UILink\n                  href=\"https://www.ffisolutions.com/the-carbon-underground-200-500/\"\n                  color=\"blue\"\n                >\n                  fossil fuel industry\n                </UILink>\n                .\n              </span>\n            </Flex>\n          </div>\n        </Grid>\n      </Container>\n      <OpenSource />\n      <Box\n        as=\"section\"\n        id=\"apply\"\n        sx={{\n          py: 6,\n          px: 3,\n          backgroundImage:\n            'radial-gradient(ellipse at 5% 5%, #e86494 0%, rgba(232,100,148,0) 75%),radial-gradient(ellipse at 95% 5%, #e86494 0%, rgba(232,100,148,0) 75%),radial-gradient(ellipse at 95% 95%, #baa8d3 0%, rgba(186,168,211,0) 75%),radial-gradient(ellipse at 5% 95%, #fa9f69 0%, rgba(250,159,105,0) 75%)',\n          position: 'relative'\n        }}\n      >\n        <Box\n          sx={{\n            position: 'absolute',\n            inset: 0,\n            height: '100%',\n            zIndex: 0,\n            backgroundSize: '48px 48px',\n            backgroundImage: `linear-gradient(to right,  #fcc8bf 1px, transparent 1px),\n                              linear-gradient(to bottom, #fcc8bf 1px, transparent 1px)`,\n            backgroundPosition: 'top left',\n            maskImage: `linear-gradient(180deg, transparent 0%, white 3%)`,\n            opacity: 0.1\n          }}\n        />\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'center',\n            justifyContent: 'center',\n            textAlign: 'center',\n            gap: 3\n          }}\n        >\n          <Link href=\"https://hcb.hackclub.com/applications/new\">\n            <Button\n              variant=\"lg\"\n              sx={{\n                bg: 'white',\n                mixBlendMode: 'screen',\n                color: 'black !important',\n                fontSize: [58, 96],\n                width: ['100%', 'auto'],\n                py: 4,\n                px: [4, null, 6],\n                lineHeight: 0.9,\n                textTransform: 'none'\n              }}\n            >\n              Apply now\n            </Button>\n          </Link>\n        </Flex>\n      </Box>\n      <ContactBanner sx={{ justifyContent: 'center' }} />\n      <Footer />\n    </>\n  )\n}\n"
  },
  {
    "path": "pages/fiscal-sponsorship/mobile/index.tsx",
    "content": "import { Box, Container, Heading } from 'theme-ui'\nimport {\n  PillHolder,\n  AuthorPill,\n  DatePill\n} from '../../../components/announcements/pills'\nimport Head from 'next/head'\nimport NextLink from 'next/link'\nimport styled from '@emotion/styled'\nimport theme from '../../../lib/theme'\nimport Meta from '@hackclub/meta'\nimport Nav from '../../../components/nav'\nimport ForceTheme from '../../../components/force-theme'\nimport Footer from '../../../components/footer'\nimport Copy from '../../../components/announcements/hcb-mobile.mdx'\nimport HCBCTA from '../../../components/announcements/hcb_cta'\nimport AnnouncementHolder from '../../../components/announcements/holder'\nimport Balancer from 'react-wrap-balancer'\n\nconst StyledLink = styled(NextLink)`\n  text-decoration: underline;\n  color: ${theme.colors.white};\n`\n\nconst Link = props => {\n  const { href } = props\n  return <StyledLink href={href}>{props.children}</StyledLink>\n}\n\nconst MobilePage = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"HCB Mobile is here!\"\n      description=\"Manage your HCB organizations on the go. Issue cards, view transactions, and more!\"\n      image=\"https://cdn.hackclub.com/019c76ba-15be-7e16-b6a7-adca9ccae9c0/Ueb-LA.png\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"section\"\n      sx={{\n        pt: [5, 6],\n        pb: [4, 5],\n        bg: 'rgb(104, 41, 205)',\n        backgroundImage: (t: any) => t.util.gx('purple', 'orange')\n      }}\n    >\n      <Container sx={{ textAlign: 'center', color: 'white' }}>\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{\n            fontSize: [5, 6, null, 7],\n            span: {\n              WebkitTextStroke: 'currentColor',\n              WebkitTextStrokeWidth: ['2px', '3px'],\n              WebkitTextFillColor: 'transparent'\n            }\n          }}\n        >\n          <Link href=\"/fiscal-sponsorship\">HCB</Link> Mobile is here!\n        </Heading>\n        <Balancer>\n          <Heading\n            as=\"h2\"\n            variant=\"title\"\n            sx={{\n              fontSize: [3, 4, 4, 4],\n              fontWeight: 400,\n              marginTop: '24px',\n              maxWidth: '900px',\n              mx: 'auto'\n            }}\n          >\n            Manage your HCB organizations on the go. Issue cards, view\n            transactions, and more!\n          </Heading>\n        </Balancer>\n      </Container>\n    </Box>\n    <AnnouncementHolder>\n      <PillHolder>\n        <AuthorPill\n          firstName=\"Mohamad\"\n          tag=\"Mohamad Mortada\"\n          // this image is 404\n          image=\"https://github.com/thedev132.png\"\n        />\n        <DatePill tag=\"Dec 2, 2025\" />\n      </PillHolder>\n      <Copy />\n    </AnnouncementHolder>\n    <HCBCTA />\n    <Footer />\n  </>\n)\n\nexport default MobilePage\n"
  },
  {
    "path": "pages/fiscal-sponsorship/open-source.tsx",
    "content": "import { Box, Container, Heading } from 'theme-ui'\nimport {\n  PillHolder,\n  AuthorPill,\n  DatePill\n} from '../../components/announcements/pills'\nimport Head from 'next/head'\nimport NextLink from 'next/link'\nimport styled from '@emotion/styled'\nimport theme from '../../lib/theme'\nimport Meta from '@hackclub/meta'\nimport Nav from '../../components/nav'\nimport ForceTheme from '../../components/force-theme'\nimport Footer from '../../components/footer'\nimport Copy from '../../components/announcements/hcb-open-source.mdx'\nimport SlackCTA from '../../components/announcements/cta'\nimport AnnouncementHolder from '../../components/announcements/holder'\nimport Balancer from 'react-wrap-balancer'\n\nconst StyledLink = styled(NextLink)`\n  text-decoration: underline;\n  color: ${theme.colors.white};\n`\n\nconst Link = props => {\n  const { href } = props\n  return <StyledLink href={href}>{props.children}</StyledLink>\n}\n\nconst RelonPage = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"HCB is now open source!\"\n      description=\"Our fiscal sponsorship platform’s codebase is now publicly available under the AGPL license and we’re continuing to encourage transparency amongst nonprofits.\"\n      image=\"https://cdn.hackclub.com/019c76b8-802d-74e1-9980-f509a8d9bfd6/I2o1xg.png\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"section\"\n      sx={{\n        pt: [5, 6],\n        pb: [4, 5],\n        bg: 'rgb(104, 41, 205)',\n        backgroundImage: (t: any) => t.util.gx('purple', 'orange')\n      }}\n    >\n      <Container sx={{ textAlign: 'center', color: 'white' }}>\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{\n            fontSize: [5, 6, null, 7],\n            span: {\n              WebkitTextStroke: 'currentColor',\n              WebkitTextStrokeWidth: ['2px', '3px'],\n              WebkitTextFillColor: 'transparent'\n            }\n          }}\n        >\n          <Link href=\"/fiscal-sponsorship\">HCB</Link> is now open source!\n        </Heading>\n        <Balancer>\n          <Heading\n            as=\"h2\"\n            variant=\"title\"\n            sx={{\n              fontSize: [3, 4, 4, 4],\n              fontWeight: 400,\n              marginTop: '24px',\n              maxWidth: '900px',\n              mx: 'auto'\n            }}\n          >\n            Our fiscal sponsorship platform’s{' '}\n            <Link href=\"https://github.com/hackclub/hcb\">codebase</Link> is now\n            publicly available under the AGPL license and we’re continuing to\n            encourage transparency amongst nonprofits.\n          </Heading>\n        </Balancer>\n      </Container>\n    </Box>\n    <AnnouncementHolder>\n      <PillHolder>\n        <AuthorPill\n          firstName=\"Sam\"\n          tag=\"Sam Poder\"\n          image=\"https://github.com/sampoder.png\"\n        />\n        <AuthorPill\n          firstName=\"Ian\"\n          tag=\"Ian Madden\"\n          image=\"https://cdn.hackclub.com/019c76b7-3337-718e-b630-818f2a4340bd/m11HEg.png\"\n        />\n        <AuthorPill\n          firstName=\"Gary\"\n          tag=\"Gary Tou\"\n          image=\"https://github.com/garyhtou.png\"\n        />\n        <AuthorPill\n          firstName=\"Manu\"\n          tag=\"Manu Gurudath\"\n          image=\"https://github.com/manuthecoder.png\"\n        />\n        <AuthorPill\n          firstName=\"Ruien\"\n          tag=\"Ruien Luo\"\n          image=\"https://github.com/rluodev.png\"\n        />\n        <DatePill tag=\"Mar 29, 2025\" />\n      </PillHolder>\n      <Copy />\n    </AnnouncementHolder>\n    <SlackCTA />\n    <Footer />\n  </>\n)\n\nexport default RelonPage\n"
  },
  {
    "path": "pages/hackathons/grant.tsx",
    "content": "import { Box, Container, Flex, Grid, Heading } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport ForceTheme from '../../components/force-theme'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport MSparkles from '../../components/sparkles/money'\nimport NextLink from 'next/link'\nimport { Link, Text, Button, Card } from 'theme-ui'\nimport Icon from '@hackclub/icons'\n\nimport { Zoom } from '../../components/react-reveal-compat'\n/** @jsxImportSource theme-ui */\n\nconst styles = `\n  html {\n    scroll-behavior: smooth;\n  }\n`\n\nimport type { glyphs } from '@hackclub/icons'\n\ntype RequirementProps = {\n  title: React.ReactNode\n  checkmark: keyof typeof glyphs\n  background: string\n  size: number\n  children: React.ReactNode\n}\n\nconst Requirement = ({ title, children, checkmark, background, size }) => {\n  return (\n    <Zoom>\n      <Card\n        variant=\"interactive\"\n        sx={{\n          backgroundColor: 'elevated',\n          backgroundImage: `url('${background}')`,\n          backgroundSize: '40px 40px',\n          backgroundRepeat: 'repeat',\n          backgroundPosition: '10% 10%',\n          color: 'snow',\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'start',\n          height: '100%'\n        }}\n      >\n        <Flex sx={{ alignItems: 'center' }}>\n          <Box mr={3} sx={{ lineHeight: 0, flexShrink: 0 }}>\n            <Icon glyph={checkmark} color=\"#ec3750\" size={size} />\n          </Box>\n          <Text variant=\"heading\" sx={{ fontSize: [2, 3, 3], lineHeight: 1.5 }}>\n            {title}\n          </Text>\n        </Flex>\n\n        <Text pl={48} mt={2} sx={{ fontSize: [1, 2, 2] }}>\n          {children}\n        </Text>\n      </Card>\n    </Zoom>\n  )\n}\n\nconst HackathonGrant = () => {\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Hackathon Grant\"\n        description=\"Hack Club provided $500 grants to in-person high school hackathons. This program ended December 31st, 2024.\"\n        image=\"https://cloud-7yw9f6xnv-hack-club-bot.vercel.app/0grant.png\"\n      />\n      <style>{styles}</style>\n      <Box as=\"main\" key=\"main\">\n        <Nav dark />\n        <ForceTheme theme=\"dark\" />\n        <Meta as={Head} title=\"Hackathon Grant\" />\n        <Box\n          sx={{\n            pt: [5, null, null, null, 6],\n            pb: [3, 4, 5, null, 6],\n            minHeight: ['70vh', 'none'],\n            textAlign: 'center',\n            backgroundImage:\n              \"linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.4)), url('https://cloud-gxxp8xcyl-hack-club-bot.vercel.app/0fzfm1e-ueaef1qw.jpeg')\",\n            backgroundSize: 'cover',\n            backgroundPosition: 'center center',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center'\n          }}\n        >\n          <Box\n            sx={{\n              width: '100%',\n              maxWidth: 'calc(56rem + 32px)',\n              mx: 'auto',\n              px: '16px',\n              backdropFilter: 'blur(1.5px)'\n            }}\n          >\n            <Heading\n              sx={{\n                textAlign: 'center',\n                mt: [2, 4],\n                textShadow: '0 0 16px rgba(0, 0, 0, 1)',\n                fontSize: [5, null, 6, 7]\n              }}\n              as=\"h1\"\n              variant=\"title\"\n            >\n              <Flex\n                sx={{ justifyContent: 'center', alignItems: 'center', mb: 2 }}\n              >\n                <NextLink href=\"https://hackclub.com\" target=\"_blank\">\n                  <Box\n                    sx={{\n                      width: 72,\n                      height: 72,\n                      backgroundImage:\n                        \"url('https://assets.hackclub.com/icon-square.svg')\",\n                      backgroundSize: 'contain',\n                      backgroundPosition: 'center center',\n                      backgroundRepeat: 'no-repeat',\n                      mr: 3,\n                      borderRadius: 8\n                    }}\n                  ></Box>\n                </NextLink>\n              </Flex>\n              A{' '}\n              <MSparkles sx={{}} path=\"\" viewBox=\"\" props={{}}>\n                $500\n              </MSparkles>{' '}\n              grant for your in-person hackathon.\n              <br />\n              <Text style={{ fontSize: '2.5rem', fontWeight: 'normal' }}>\n                This program ended December 31st, 2024.\n              </Text>\n              <br />\n            </Heading>\n            <Box\n              sx={{\n                fontSize: [2, 3, 3],\n                textAlign: 'center',\n                my: 4\n              }}\n            >\n              Hack Club provided $500 grants (and waived{' '}\n              <Link href=\"/fiscal-sponsorship\" target=\"_blank\">\n                HCB\n              </Link>{' '}\n              fees) to in-person high school hackathons.\n            </Box>\n            <Box\n              sx={{\n                fontSize: [2, 4, 4],\n                textAlign: 'center',\n                my: 4\n              }}\n            >\n              Want to attend a hackathon?\n              <Link href=\"https://hackathons.hackclub.com\" target=\"_blank\">\n                <Button\n                  variant=\"ctaLg\"\n                  sx={{\n                    ml: [0, 3],\n                    mt: 2,\n                    backgroundImage: (t: any) => t.util.gx('green', 'blue')\n                  }}\n                >\n                  <Text>\n                    Find hackathons{' '}\n                    <Text sx={{ display: ['none', 'inline'] }}>near you</Text>\n                  </Text>\n                </Button>\n              </Link>\n            </Box>\n          </Box>\n        </Box>\n        <Container sx={{ py: 5 }}>\n          <Text\n            as=\"h1\"\n            variant=\"heading\"\n            mt={4}\n            mb={3}\n            sx={{ fontSize: [28, 30, 40], textAlign: 'center' }}\n          >\n            Check if your hackathon qualifies\n          </Text>\n          <Text\n            as=\"p\"\n            sx={{\n              textAlign: 'center',\n              my: 3,\n              color: 'white',\n              fontSize: [1, 2, 2]\n            }}\n          >\n            Your hackathon should be <Text as=\"b\">free</Text> for all attendees\n            and meet the following requirements:\n          </Text>\n\n          <Grid columns={[1, 1, 2, 2]} gap={4}>\n            <Requirement\n              title=\"Running August 2022 to December 2024\"\n              checkmark=\"clock-fill\"\n              background=\"https://icons.hackclub.com/api/icons/0x212025/glyph:clock.svg\"\n              size={36}\n            >\n              We want to bring back high schooler-led events around the world,\n              so we're only offering this grant for high school hackathons that\n              take place throughout 2024 (until December 31st).\n              <br />\n              <br />\n              <Text\n                sx={{\n                  fontSize: ['14px', 1, 1],\n                  color: 'muted'\n                }}\n              >\n                This is not an annual program and has only been renewed until\n                the end of 2024.\n              </Text>\n            </Requirement>\n            <Requirement\n              title={<>By high schoolers, for high schoolers</>}\n              checkmark=\"profile-fill\"\n              background=\"https://icons.hackclub.com/api/icons/0x212025/glyph:profile.svg\"\n              size={36}\n            >\n              To create a uniquely tailored high school hackathon, your\n              hackathon should be organized by high school students*. All\n              attendees should be 18 & under <strong>AND</strong> not full-time\n              college students.\n              <br />\n              <br />\n              <Text\n                sx={{\n                  fontSize: ['14px', 1, 1],\n                  color: 'muted'\n                }}\n              >\n                Maximum of 1 college student is allowed on your organizing team.\n              </Text>\n            </Requirement>\n            <Requirement\n              title=\"Fully in-person\"\n              checkmark=\"flag-fill\"\n              background=\"https://icons.hackclub.com/api/icons/0x212025/glyph:flag.svg\"\n              size={36}\n            >\n              Hacking is a social activity, and we're supporting hackathons that\n              bring hackers together IRL. We believe that fully IRL (not hybrid)\n              events allow organisers to maximize the unique hackathon\n              experience for attendees.\n              <br />\n              <br />\n              <Text\n                sx={{\n                  color: 'muted',\n                  fontSize: ['14px', 1, 1]\n                }}\n              >\n                Your event must be at least 8 consecutive hours long to qualify\n                for the grant.\n              </Text>\n            </Requirement>\n            <Requirement\n              title=\"Venue secured\"\n              checkmark=\"pin-fill\"\n              background=\"https://icons.hackclub.com/api/icons/0x212025/glyph:pin.svg\"\n              size={36}\n            >\n              You will need to provide a scan of an email, contract, or an{' '}\n              <Link\n                href=\"https://www.investopedia.com/terms/m/mou.asp\"\n                target=\"_blank\"\n              >\n                MOU\n              </Link>{' '}\n              with your venue. Your scan should have the date of your hackathon\n              and address, contact details, and the specific commitment of your\n              venue.\n              <br />\n              <br />\n              <Text\n                sx={{\n                  color: 'muted',\n                  fontSize: ['14px', 1, 1]\n                }}\n              >\n                If your venue is a school, attendance must not be limited to a\n                specific school or club.\n              </Text>\n            </Requirement>\n            <Requirement\n              title=\"Handmade website\"\n              checkmark=\"web\"\n              background=\"https://icons.hackclub.com/api/icons/0x212025/glyph:web.svg\"\n              size={36}\n            >\n              We believe the best hackathons embody the hacker spirit by\n              building their own website. Complex or simple, beautiful or janky–\n              build your own instead of using nontechnical tools like Wix or\n              Devpost.\n              <br />\n              <br />\n              <Text\n                sx={{\n                  fontSize: ['14px', 1, 1],\n                  color: 'muted'\n                }}\n              >\n                You will need to share a link to your website. Don't have a\n                domain? HCB provides a free domain. Check out this{' '}\n                <Link\n                  href=\"https://notebook.lachlanjc.com/2019-09-06_making_a_hackathon_site\"\n                  target=\"_blank\"\n                  sx={{\n                    color: 'muted'\n                  }}\n                >\n                  guide on building hackathon websites\n                </Link>{' '}\n                or ask in{' '}\n                <Link\n                  href=\"https://slack.hackclub.com\"\n                  target=\"_blank\"\n                  sx={{\n                    color: 'muted'\n                  }}\n                >\n                  Slack\n                </Link>{' '}\n                if you need help.\n              </Text>\n            </Requirement>\n            <Requirement\n              title=\"Open sourced finances\"\n              checkmark=\"bank-circle\"\n              background=\"https://icons.hackclub.com/api/icons/0x212025/glyph:bank-account.svg\"\n              size={28}\n            >\n              You'll receive your grant through HCB, our financial platform for\n              hackathons, and spend it in the open with{' '}\n              <Link\n                href=\"https://changelog.hcb.hackclub.com/transparent-finances-(optional-feature)-151427\"\n                target=\"_blank\"\n              >\n                Transparency Mode\n              </Link>\n              . Sign up for{' '}\n              <Link href=\"/fiscal-sponsorship\" target=\"_blank\">\n                HCB\n              </Link>{' '}\n              before applying.\n              <br />\n              <br />\n              <Text\n                sx={{\n                  fontSize: ['14px', 1, 1],\n                  color: 'muted'\n                }}\n              >\n                If you're unable to use HCB, we're unfortunately unable to\n                support you through this grant program.\n              </Text>\n            </Requirement>\n          </Grid>\n          <Text\n            as=\"p\"\n            sx={{\n              textAlign: 'center',\n              mt: 3,\n              color: 'muted'\n            }}\n          >\n            If you'd like to list us on your site (optional), you can use the\n            logos found on the respective brand guides for{' '}\n            <Link href=\"/brand\" target=\"_blank\">\n              Hack Club\n            </Link>\n            {'.'}\n          </Text>\n          <Box as=\"div\" sx={{ mt: 3 }}></Box>\n          <Heading sx={{ textAlign: 'center', mb: 3, fontSize: 5 }} id=\"apply\">\n            This program ended on December 31st, 2024.\n          </Heading>\n        </Container>\n      </Box>\n      <Zoom>\n        <Card\n          as=\"a\"\n          {...({\n            href: 'mailto:hcb@hackclub.com',\n            style: { textDecoration: 'none' }\n          } as any)}\n          variant=\"interactive\"\n          sx={{\n            mx: 'auto',\n            maxWidth: '52rem',\n            width: '90%',\n            textAlign: 'left',\n            textDecoration: 'none',\n            lineHeight: 'caption',\n            display: 'flex',\n            alignItems: 'center',\n            fontSize: [1, 2, 2],\n            mb: [3, 4],\n            p: '16px !important',\n            svg: { flexShrink: 'none' }\n          }}\n        >\n          <Icon\n            glyph=\"emoji\"\n            color=\"#ec3750\"\n            // @ts-expect-error: allow sx prop because anything else messes up the size\n            sx={\n              {\n                mr: [2, 3],\n                ml: 2,\n                display: ['none', 'block'],\n                width: 56,\n                height: 'auto'\n              } as any\n            }\n          />\n          <Text\n            as=\"p\"\n            sx={{\n              flex: '1 1 auto',\n              strong: { display: ['inline', 'block'], pl: 3 }\n            }}\n          >\n            <strong>Questions?</strong>\n            <Text as=\"span\" variant=\"caption\" color=\"secondary\" sx={{ pl: 3 }}>\n              Reach out to hcb@hackclub.com\n            </Text>\n          </Text>\n        </Card>\n      </Zoom>\n      <Footer dark key=\"footer\" />\n    </>\n  )\n}\n\nexport default HackathonGrant\n"
  },
  {
    "path": "pages/hackathons/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Container } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport ForceTheme from '../../components/force-theme'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport Recap from '../../components/hackathons/recap'\nimport Slack from '../../components/hackathons/features/slack'\nimport Landing from '../../components/hackathons/landing'\nimport Marketing from '../../components/hackathons/features/marketing'\nimport Overview from '../../components/hackathons/overview'\nimport ScrollingHackathons from '../../components/hackathons/scrolling-hackathons'\nimport KeepExploring from '../../components/hackathons/keep-exploring'\n\nexport default function Hackathons({ data }) {\n  return (\n    <>\n      <Box as=\"main\" key=\"main\">\n        <Nav />\n        <ForceTheme theme=\"light\" />\n        <Meta\n          as={Head}\n          title=\"Hackathons\"\n          description=\"Welcome to the high school hackathon. It's not an extracurricular or a club. It's not a class or a lecture. Hackathons are a playground to build things for fun and meet others doing the same.\"\n          image=\"https://cloud-hkscyg8sg-hack-club-bot.vercel.app/0og-image.png\"\n        />\n        <Box as=\"main\">\n          <Landing />\n\n          <Overview />\n\n          <ScrollingHackathons eventData={data} title={true} mode=\"default\" />\n\n          <KeepExploring />\n          <Slack />\n          <Marketing />\n          <Container>\n            <Recap />\n          </Container>\n        </Box>\n      </Box>\n      <Footer key=\"footer\" />\n    </>\n  )\n}\nexport async function getStaticProps() {\n  let data: any\n  try {\n    const res = await fetch(\n      'https://hackathons.hackclub.com/api/events/upcoming'\n    )\n    if (res.ok) {\n      data = await res.json()\n    } else {\n      data = []\n    }\n  } catch (error) {\n    data = []\n  }\n\n  return {\n    props: {\n      data\n    },\n    revalidate: 10\n  }\n}\n"
  },
  {
    "path": "pages/imprint.tsx",
    "content": "import { BaseStyles, Box, Container, Heading, Link, Text } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport Nav from '../components/nav'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\n\nconst Imprint = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Imprint\"\n      description=\"Legal notice and operator information for Hack Club.\"\n      image=\"https://workshop-cards.hackclub.com/Imprint.png?brand=HQ&theme=light&fontSize=350px\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav color=\"text\" />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'sheet',\n        color: 'text',\n        pt: [5, null, null, null, 6],\n        pb: [3, 4, 5, null, 6],\n        textAlign: 'center'\n      }}\n    >\n      <Container variant=\"copy\">\n        <Heading as=\"h1\" variant=\"title\" sx={{ color: 'primary', mt: [2, 4] }}>\n          Imprint (Legal Notice)\n        </Heading>\n        <Heading as=\"h2\" variant=\"subtitle\" sx={{ mt: 3, color: 'text' }}>\n          Legal notice and contact details for Hack Club (The Hack Foundation).\n        </Heading>\n      </Container>\n    </Box>\n    <Container\n      variant=\"main\"\n      sx={{\n        py: [3, 4],\n        px: 3,\n        maxWidth: [null, 'copyUltra'],\n        h2: { variant: 'text.headline' }\n      }}\n    >\n      <Heading variant=\"headline\">Operator</Heading>\n      <Box\n        as={BaseStyles}\n        sx={{\n          mx: 0,\n          fontSize: 2,\n          '> p': { maxWidth: 'copy' },\n          h2: { variant: 'text.headline', mt: 4 }\n        }}\n      >\n        <Text as=\"p\" sx={{ mt: 2 }}>\n          The Hack Foundation (\"Hack Club\")\n          <br />\n          Non-profit corporation (501(c)(3)), incorporated in the United States\n        </Text>\n      </Box>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        Registered Address\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        8605 Santa Monica Blvd #86294\n        <br />\n        West Hollywood, CA 90069\n        <br />\n        United States\n      </Text>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        Authorized Representative\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        Zach Latta, Founder\n      </Text>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        Contact\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        Email: <Link href=\"mailto:team@hackclub.com\">team@hackclub.com</Link>\n        <br />\n        Phone: <Link href=\"tel:+18556254225\">+1-855-625-HACK</Link>\n      </Text>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        VAT ID\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        Not applicable (U.S. nonprofit organization)\n      </Text>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        Legal Status\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        Hack Club is a California nonprofit public benefit corporation,\n        recognized as a 501(c)(3) organization under U.S. law.\n        <br />\n        EIN: 81-2908499\n      </Text>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        Responsible for Content (§ 18 MStV)\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        Zach Latta, Founder\n        <br />\n        8605 Santa Monica Blvd #86294\n        <br />\n        West Hollywood, CA 90069\n        <br />\n        United States\n      </Text>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        Dispute Resolution\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        Information on consumer dispute resolution entities in EU Member States\n        is available at{' '}\n        <Link href=\"https://consumer-redress.ec.europa.eu/dispute-resolution-bodies\">\n          consumer-redress.ec.europa.eu\n        </Link>\n        . As a U.S. nonprofit organization, Hack Club is not obligated or\n        willing to participate in dispute resolution proceedings before a\n        consumer arbitration board.\n      </Text>\n\n      <Heading variant=\"headline\" sx={{ mt: 4 }}>\n        Notes\n      </Heading>\n      <Text as=\"p\" sx={{ mt: 2, fontSize: 2 }}>\n        This imprint is provided to satisfy common EU/German transparency\n        expectations (e.g., §5 DDG) and US best practices.\n      </Text>\n    </Container>\n    <Footer />\n  </>\n)\n\nexport default Imprint\n"
  },
  {
    "path": "pages/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport {\n  Badge,\n  Box,\n  Button,\n  Card,\n  Flex,\n  Grid,\n  Heading,\n  Link,\n  Text\n} from 'theme-ui'\nimport { useEffect, useRef, useState } from 'react'\nimport Head from 'next/head'\nimport { useRouter } from 'next/router'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport BGImg from '../components/background-image'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\nimport Stage from '../components/stage'\nimport Carousel from '../components/index/carousel'\nimport Sprig from '../components/index/cards/sprig'\nimport Sinerider from '../components/index/cards/sinerider'\nimport SprigConsole from '../components/index/cards/sprig-console'\nimport Clubs from '../components/index/cards/clubs'\nimport Workshops from '../components/index/cards/workshops'\nimport HCB from '../components/index/cards/hcb'\nimport Hackathons from '../components/index/cards/hackathons'\nimport OuternetImgFile from '../public/home/outernet-110.jpg'\nimport JSConfetti from 'js-confetti'\nimport Secret from '../components/secret'\nimport MailingList from '../components/index/cards/mailing-list'\nimport Slack from '../components/index/cards/slack'\nimport Icon from '../components/icon'\nimport GitHub from '../components/index/github'\nimport Photo from '../components/photo'\nimport Comma from '../components/comma'\nimport Haxidraw from '../components/index/cards/haxidraw'\nimport Flavortown from '../components/index/cards/flavortown'\nimport HackClubTheGame from '../components/index/cards/hctg'\nimport Sleepover from '../components/index/cards/sleepover'\nimport Stasis from '../components/index/cards/stasis'\nimport Jackpot from '../components/index/cards/jackpot'\nimport Fallout from '../components/index/cards/fallout'\nimport Macondo from '../components/index/cards/macondo'\nimport Beest from '../components/index/cards/beest'\nimport CTAS from '../components/index/ctas'\nimport { slackData as SlackDataLib } from '../lib/slackData'\nimport Horizons from '../components/index/cards/horizons'\ndeclare global {\n  interface Window {\n    kc: string\n    paper: string\n  }\n}\n\nconst redBadgeSx = {\n  px: 2,\n  backgroundColor: 'red',\n  borderRadius: 10,\n  color: 'white',\n  whiteSpace: 'nowrap'\n}\nfunction Page({\n  hackathonsData,\n  bankData,\n  slackData,\n  gitHubData,\n  consoleCount,\n  stars,\n  game,\n  events,\n  carouselCards,\n  ctaCards\n}) {\n  const [reveal, setReveal] = useState(false)\n\n  const { asPath } = useRouter()\n\n  const jsConfetti = useRef(null)\n\n  useEffect(() => {\n    jsConfetti.current = new JSConfetti()\n\n    window.kc = `In the days of old, when gaming was young \\nA mysterious code was found among \\nA sequence of buttons, pressed in a row \\nIt unlocked something special, we all know \\n\\nUp, up, down, down, left, right, left, right \\nB, A, Start, we all have heard it's plight \\nIn the 8-bit days, it was all the rage \\nAnd it still lives on, with time, it will never age \\n\\nKonami Code, it's a legend of days gone by \\nIt's a reminder of the classics we still try \\nNo matter the game, no matter the system \\nThe code will live on, and still be with them \\n\\nSo the next time you play, take a moment to pause \\nAnd remember the code, and the Konami cause \\nIt's a part of gaming's history, and a part of our lives \\nLet's keep it alive, and let the Konami Code thrive!\\n`\n    window.paper = `Welcome, intrepid hacker! We'd love to have you in our community. Get your invite at hack.af/slack. Under \"Why do you want to join the Hack Club Slack?\" add a 🦄 and we'll ship you some exclusive stickers! `\n  }, [])\n\n  // easter egg detector, one-shot\n  const [konamiActivated, setKonamiActivated] = useState(false)\n  useEffect(() => {\n    const konamiSequence = [\n      'ArrowUp',\n      'ArrowUp',\n      'ArrowDown',\n      'ArrowDown',\n      'ArrowLeft',\n      'ArrowRight',\n      'ArrowLeft',\n      'ArrowRight',\n      'b',\n      'a'\n    ]\n    let konamiPosition = 0\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (!konamiActivated && e.key === konamiSequence[konamiPosition]) {\n        konamiPosition++\n        if (konamiPosition === konamiSequence.length) {\n          easterEgg()\n          setKonamiActivated(true)\n          konamiPosition = 0\n        }\n      } else if (!konamiActivated) {\n        konamiPosition = 0\n      }\n    }\n    window.addEventListener('keydown', handleKeyDown)\n    return () => window.removeEventListener('keydown', handleKeyDown)\n  }, [konamiActivated])\n\n  const easterEgg = () => {\n    alert('Hey, you typed the Konami Code!')\n\n    jsConfetti.current.addConfetti({\n      confettiColors: [\n        // Hack Club colours!\n        '#ec3750',\n        '#ff8c37',\n        '#f1c40f',\n        '#33d6a6',\n        '#5bc0de',\n        '#338eda',\n        '#a633d6'\n      ]\n    })\n  }\n\n  const [count, setCount] = useState(0)\n\n  const images = [\n    { alt: 'Map of Hack Clubs around the world', src: '/home/map.png' },\n    {\n      alt: 'Hack Clubbers at SpaceX HQ in LA',\n      src: '/home/zephyr-spacex.jpeg'\n    },\n    {\n      alt: 'MA Hacks, Hack Clubber organized hackathon',\n      src: '/hackathons/mahacks.jpeg'\n    },\n    { alt: 'AMA with Sal Khan', src: '/home/ama.png' },\n    { alt: 'Hack Clubbers at Flagship, 2019', src: '/home/flagship_4.jpg' }\n  ]\n\n  // Spotlight effect\n  const spotlightRef = useRef<HTMLDivElement | null>(null)\n  useEffect(() => {\n    const handler = event => {\n      const rect = document.getElementById('spotlight').getBoundingClientRect()\n      const x = event.clientX - rect.left //x position within the element.\n      const y = event.clientY - rect.top //y position within the element.\n\n      spotlightRef.current.style.background = `radial-gradient(\n\t\t\t\tcircle at ${x}px ${y}px,\n\t\t\t\trgba(132, 146, 166, 0) 10px,\n\t\t\t\trgba(249, 250, 252, 0.9) 80px\n\t\t\t)`\n    }\n    window.addEventListener('mousemove', handler)\n    return () => window.removeEventListener('mousemove', handler)\n  }, [])\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"A Home for High School Hackers\"\n        description=\"Hack Club is a global nonprofit network of high school makers & student-led coding clubs where young people build the agency, the network, & the technical talent to think big & do big things in the world.\"\n        image=\"https://cloud-lgl7kg862-hack-club-bot.vercel.app/0start__1_.png\"\n      />\n      <Head>\n        <meta\n          property=\"og:image\"\n          content=\"https://assets.hackclub.com/icon-rounded.png\"\n        />\n      </Head>\n      <ForceTheme theme=\"light\" />\n      <Nav />\n      <Box\n        as=\"main\"\n        sx={{\n          overflowX: 'hidden',\n          position: 'relative'\n        }}\n      >\n        <Secret\n          reveal={reveal}\n          onMouseEnter={() => {\n            setReveal(true)\n          }}\n          onMouseOut={() => {\n            setReveal(false)\n          }}\n        />\n        {konamiActivated && (\n          <Text as=\"p\">Hey, I'm an Easter Egg! Look at me!</Text>\n        )}\n        <Box\n          as=\"header\"\n          sx={{\n            bg: 'dark',\n            pt: [4, 5],\n            pb: [2, 1],\n            textAlign: 'left',\n            position: 'relative',\n            overflowX: 'hidden'\n          }}\n        >\n          <BGImg\n            src={OuternetImgFile}\n            alt=\"Hack Clubbers gather in the great outdoors of Cabot, VT, for an experience unlike any other: Outernet. 📸 Photo by Matt Gleich, Hack Clubber in NH!\"\n            gradient=\"linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.51))\"\n          />\n          <Box\n            sx={{\n              width: '100%',\n              maxWidth: ['100%', '100%', '1200px'],\n              px: [3, 4, 4],\n              position: 'relative',\n              mx: 'auto',\n              py: [4, 4, 4],\n              pb: 1,\n              textShadow: 'text'\n            }}\n          >\n            <Text\n              variant=\"eyebrow\"\n              sx={{\n                color: 'sunken',\n                pb: 2,\n                position: 'relative',\n                display: 'block'\n              }}\n              as=\"h4\"\n            >\n              Welcome to Hack&nbsp;Club\n            </Text>\n            <Heading>\n              <Box\n                sx={{\n                  display: 'flex',\n                  flexDirection: ['column', 'column', 'column', 'row'],\n                  flexWrap: ['nowrap', 'nowrap', 'nowrap', 'wrap'],\n                  gap: 2,\n                  alignItems: [null, null, null, 'end']\n                }}\n              >\n                <Box\n                  sx={{\n                    flex: 1,\n                    minWidth: [null, null, null, 'min(100%, 1000px)']\n                  }}\n                >\n                  <Text\n                    as=\"p\"\n                    variant=\"title\"\n                    sx={{\n                      color: 'white',\n                      mb: [3, 4],\n                      zIndex: 1,\n                      textAlign: 'left',\n                      fontSize: ['42px', '52px', '58px'],\n                      lineHeight: 1.2,\n                      width: '100%'\n                    }}\n                  >\n                    We are{' '}\n                    <Text\n                      sx={{\n                        color: 'transparent',\n                        ml: 2,\n                        mr: 3,\n                        whiteSpace: 'nowrap',\n                        display: ['none', 'inline', 'inline']\n                      }}\n                    >\n                      <Text\n                        onClick={() => {\n                          !reveal ? setReveal(true) : setReveal(false)\n                        }}\n                        sx={{\n                          ...redBadgeSx,\n                          position: 'absolute',\n                          transform: 'rotate(-2deg) translateY(-5px)',\n                          textDecoration: 'none',\n                          '&:hover': {\n                            cursor: 'pointer'\n                          }\n                        }}\n                        aria-hidden=\"true\"\n                      >\n                        <Comma>{slackData.total_members_count}</Comma> teen\n                        hackers\n                      </Text>\n                      <Comma>{slackData.total_members_count}</Comma> teen\n                      hackers\n                    </Text>\n                    <Text\n                      sx={{\n                        ...redBadgeSx,\n                        display: ['inline-block', 'none', 'none'],\n                        transform: 'rotate(-2deg)',\n                        mx: 2\n                      }}\n                    >\n                      teen hackers\n                    </Text>\n                    <Box as=\"br\" sx={{ display: ['inline', 'none', 'none'] }} />{' '}\n                    from around the world who code together\n                  </Text>\n                  <Box\n                    sx={{\n                      display: 'flex',\n                      flexDirection: 'row',\n                      rowGap: 3,\n                      marginBottom: 3\n                    }}\n                  >\n                    <Box\n                      sx={{\n                        display: 'flex',\n                        pb: [1, 2, 3],\n                        flexWrap: ['wrap', 'wrap', 'wrap', 'nowrap']\n                      }}\n                    >\n                      <Button\n                        variant=\"ctaLg\"\n                        as=\"a\"\n                        {...({ href: 'https://slack.hackclub.com' } as any)}\n                        my={[3, 3, 0]}\n                        mr={3}\n                        sx={{\n                          transformOrigin: 'center left',\n                          whiteSpace: 'nowrap'\n                        }}\n                      >\n                        Join Hack Club\n                      </Button>\n                      <Text\n                        variant=\"eyebrow\"\n                        as=\"h4\"\n                        sx={{\n                          fontSize: [2, 2, 3],\n                          maxWidth: 'layout',\n                          my: 'auto',\n                          color: 'white',\n                          textShadow:\n                            'rgba(0, 0, 0, 1) 0 0 10px, rgba(0, 0, 0, 1) 0 0 10px, rgba(0, 0, 0, 0.5) 0 0 10px'\n                        }}\n                      >\n                        Or, check out our programs:\n                      </Text>\n                    </Box>\n                  </Box>\n                  <CTAS cards={ctaCards} />\n                </Box>\n              </Box>\n              <Button\n                sx={{\n                  background: 'rgb(255, 255, 255, 0.3)',\n                  color: 'white',\n\n                  borderRadius: '100px',\n                  border: 'none',\n                  display: 'flex',\n                  alignItems: 'center',\n                  my: '3',\n                  px: '3',\n                  py: 2,\n\n                  width: 'fit-content',\n                  textTransform: 'none',\n                  fontSize: [1, '16px', '18px'],\n                  backdropFilter: 'blur(2px)',\n                  fontWeight: 'normal',\n                  zIndex: 999\n                }}\n                onClick={() =>\n                  document\n                    .getElementById('spotlight')\n                    ?.scrollIntoView({ behavior: 'smooth' })\n                }\n              >\n                <Icon\n                  glyph={'rep'}\n                  sx={{ color: 'inherit', marginRight: 2 }}\n                  size={24}\n                  mr={2}\n                />\n                View more programs\n              </Button>\n            </Heading>\n          </Box>\n\n          <Box\n            sx={{\n              display: 'flex',\n              position: ['relative', 'relative', 'absolute'],\n              bottom: ['0px', '0px', '24px'],\n              right: ['0px', '0px', '4px'],\n              justifyContent: ['flex-end', 'flex-end', 'flex-end'],\n              marginRight: 2,\n              mt: [3, 2, 0],\n              mr: [2, 3, null]\n            }}\n          >\n            <Badge\n              as=\"a\"\n              {...({ href: 'https://outernet.hackclub.com/' } as any)}\n              target=\"_blank\"\n              rel=\"noopener\"\n              variant=\"pill\"\n              sx={{\n                zIndex: '1',\n                bg: 'black',\n                color: 'white',\n                opacity: 1,\n                textDecoration: 'none',\n                fontWeight: 'normal',\n                ':hover': { opacity: 1 },\n                transition: '0.3s ease'\n                // mixBlendMode: 'multiply'\n              }}\n              title=\"📸 Photo by Matt Gleich, Hack Clubber in NH!\"\n            >\n              Hackers at Outernet in Vermont\n            </Badge>\n          </Box>\n        </Box>\n        <Box as=\"section\" sx={{ py: [4, 5, '82px'], color: 'black' }}>\n          <Box\n            sx={{\n              position: 'relative',\n              width: '90vw',\n              maxWidth: 'layout',\n              margin: 'auto'\n            }}\n          >\n            <Text\n              variant=\"title\"\n              as=\"h1\"\n              sx={{ fontSize: ['36px', '48px', '56px'] }}\n            >\n              Discover the{' '}\n              <Text\n                as=\"span\"\n                sx={{\n                  borderRadius: 'default',\n                  px: 1,\n                  mx: 0,\n                  whiteSpace: ['wrap', 'nowrap', 'nowrap'],\n                  color: 'white',\n                  background: (t: any) => t.util.gx('red', 'orange'),\n                  WebkitBackgroundClip: 'text',\n                  WebkitTextFillColor: 'transparent'\n                }}\n              >\n                joy of code\n              </Text>\n              , together.\n            </Text>\n            <Text\n              variant=\"subtitle\"\n              as=\"p\"\n              sx={{\n                fontSize: ['18px', '20px', '22px'],\n                pb: [3, 3, 4],\n                maxWidth: '62ch'\n              }}\n            >\n              Every day, thousands of Hack&nbsp;Clubbers gather online and\n              in-person to make things with code. Whether you're a beginner\n              programmer or have years of experience, there's a place for you at\n              Hack&nbsp;Club. Read about our{' '}\n              <Link href=\"/philosophy\" target=\"_blank\" rel=\"noopener\">\n                hacker ethic\n              </Link>\n              .\n            </Text>\n            <Grid columns={[1, 1, 1, '2.5fr 3fr']} gap={[0, 3, 4]} pt={[3, 4]}>\n              <Box\n                sx={{\n                  position: 'relative',\n                  height: ['300px', '300px', '300px', '100%'],\n                  py: [3, 3, 3, 0]\n                }}\n                onClick={() => {\n                  setCount(prevCount => (prevCount + 1) % images.length)\n                }}\n              >\n                <Box\n                  sx={{ position: 'absolute', width: '100%', height: '100%' }}\n                >\n                  <Box\n                    sx={{\n                      position: 'relative',\n                      height: ['300px', '300px', '100%'],\n                      figure: {\n                        position: 'absolute',\n                        transform:\n                          count % 2 === 0 ? 'rotate(3deg)' : 'rotate(-3deg)',\n                        height: '85%',\n                        width: ['80%', '80%', '70%', '100%'],\n                        marginLeft: ['10%', '10%', '15%', '0']\n                      },\n                      zIndex: 3,\n                      '&:hover': {\n                        cursor: 'pointer'\n                      }\n                    }}\n                  >\n                    <Photo\n                      src={\n                        count === images.length - 2\n                          ? images[0].src\n                          : images.length - 1\n                            ? images[1].src\n                            : images[count + 2].src\n                      }\n                      alt={\n                        count === images.length - 2\n                          ? images[0].alt\n                          : images.length - 1\n                            ? images[1].alt\n                            : images[count + 2].alt\n                      }\n                      width={3000}\n                      height={2550}\n                      showAlt\n                    />\n                  </Box>\n                </Box>\n                <Box\n                  sx={{ position: 'absolute', width: '100%', height: '100%' }}\n                >\n                  <Box\n                    sx={{\n                      position: 'relative',\n                      height: ['300px', '300px', '100%'],\n                      figure: {\n                        position: 'absolute',\n                        transform:\n                          count % 2 === 0 ? 'rotate(-3deg)' : 'rotate(3deg)',\n                        height: '85%',\n                        width: ['80%', '80%', '70%', '100%'],\n                        marginLeft: ['10%', '10%', '15%', '0']\n                      },\n                      zIndex: 3,\n                      '&:hover': {\n                        cursor: 'pointer'\n                      }\n                    }}\n                  >\n                    <Photo\n                      src={\n                        count === images.length - 1\n                          ? images[0].src\n                          : images[count + 1].src\n                      }\n                      alt={\n                        count === images.length - 1\n                          ? images[0].alt\n                          : images[count + 1].alt\n                      }\n                      width={3000}\n                      height={2550}\n                      showAlt\n                    />\n                  </Box>\n                </Box>\n                <Box\n                  sx={{ position: 'absolute', width: '100%', height: '100%' }}\n                >\n                  <Box\n                    sx={{\n                      position: 'relative',\n                      height: ['300px', '300px', '100%'],\n                      figure: {\n                        position: 'absolute',\n                        transform:\n                          count % 2 === 0 ? 'rotate(3deg)' : 'rotate(-3deg)',\n                        height: '85%',\n                        width: ['80%', '80%', '70%', '100%'],\n                        marginLeft: ['10%', '10%', '15%', '0']\n                      },\n                      zIndex: 3,\n                      '&:hover': {\n                        cursor: 'pointer'\n                      }\n                    }}\n                  >\n                    <Photo\n                      src={images[count].src}\n                      alt={images[count].alt}\n                      width={3000}\n                      height={2550}\n                      showAlt\n                    />\n                  </Box>\n                </Box>\n              </Box>\n              <Grid\n                columns=\"1fr\"\n                sx={{\n                  gridColumnGap: 3,\n                  span: {\n                    width: 36,\n                    height: 36,\n                    borderRadius: 24,\n                    display: 'inline-block',\n                    fontSize: 2,\n                    lineHeight: '30px',\n                    textAlign: 'center',\n                    fontWeight: 'bold',\n                    border: '3px solid currentColor'\n                  },\n                  p: { my: 0, fontSize: ['18px', '20px', '22px'] },\n                  strong: { display: 'block', fontSize: ['22px', 2, 3] }\n                }}\n                as=\"ul\"\n              >\n                <Grid\n                  columns=\"auto 1fr\"\n                  sx={{\n                    transitionDuration: '0.52s',\n                    py: 2,\n                    px: 2,\n                    color: 'inherit',\n                    position: 'relative',\n                    textDecoration: 'none',\n                    borderRadius: 'extra'\n                  }}\n                  as=\"li\"\n                >\n                  <Text as=\"span\" color=\"red\" aria-hidden=\"true\">\n                    1\n                  </Text>\n                  <Text as=\"p\" variant=\"subtitle\">\n                    <Text as=\"strong\" sx={{ mb: 1 }}>\n                      Connect with other teenage coders\n                    </Text>\n                    Have a coding question? Looking for project feedback? You'll\n                    find hundreds of fabulous people to talk to in our global{' '}\n                    <Link\n                      href=\"https://slack.hackclub.com\"\n                      target=\"_blank\"\n                      rel=\"noopener\"\n                    >\n                      Slack{' '}\n                    </Link>\n                    (like Discord), active at all hours.\n                  </Text>\n                </Grid>\n                <Grid\n                  columns=\"auto 1fr\"\n                  sx={{\n                    transitionDuration: '0.52s',\n                    py: 2,\n                    px: 2,\n                    color: 'inherit',\n                    position: 'relative',\n                    textDecoration: 'none',\n                    borderRadius: 'extra'\n                  }}\n                  as=\"li\"\n                >\n                  <Text as=\"span\" color=\"orange\" aria-hidden=\"true\">\n                    2\n                  </Text>\n                  <Text\n                    as=\"p\"\n                    variant=\"subtitle\"\n                    sx={{\n                      mt: 0\n                    }}\n                  >\n                    <Text as=\"strong\" sx={{ mb: 1 }}>\n                      Build open source learning tools\n                    </Text>\n                    We build large open source projects together (\n                    <Link href=\"https://github.com/hackclub\" target=\"_blank\">\n                      16k+&nbsp;PRs a year\n                    </Link>\n                    ) like this website, a game engine, daily streak system, and\n                    more!\n                  </Text>\n                </Grid>\n                <Grid\n                  columns=\"auto 1fr\"\n                  sx={{\n                    transitionDuration: '0.52s',\n                    py: 2,\n                    px: 2,\n                    color: 'inherit',\n                    position: 'relative',\n                    textDecoration: 'none',\n                    borderRadius: 'extra'\n                  }}\n                  as=\"li\"\n                >\n                  <Text as=\"span\" color=\"yellow\" aria-hidden=\"true\">\n                    3\n                  </Text>\n                  <Text as=\"p\" variant=\"subtitle\">\n                    <Text as=\"strong\" sx={{ mb: 1 }}>\n                      Gather IRL with other makers\n                    </Text>\n                    Meet other Hack&nbsp;Clubbers in your community to build\n                    together at one of the 1000+{' '}\n                    <Link href=\"/clubs\" target=\"_blank\" rel=\"noopener\">\n                      Hack&nbsp;Clubs\n                    </Link>{' '}\n                    and{' '}\n                    <Link href=\"/hackathons\" target=\"_blank\" rel=\"noopener\">\n                      high school hackathons\n                    </Link>\n                    .\n                  </Text>\n                </Grid>\n              </Grid>\n            </Grid>\n          </Box>\n        </Box>\n        <Carousel cards={carouselCards} />\n        <Box\n          id=\"spotlight\"\n          as=\"section\"\n          sx={{\n            backgroundImage: `\n              linear-gradient(rgba(249, 250, 252, 0.7), rgba(249, 250, 252, 0.7)),\n              url('https://icons.hackclub.com/api/icons/0x8492a6/glyph:rep.svg')\n            `,\n            backgroundSize: '40px 40px',\n            backgroundRepeat: 'repeat',\n            position: 'relative'\n          }}\n        >\n          <Box\n            ref={spotlightRef}\n            sx={{\n              position: 'absolute',\n              zIndex: 2,\n              top: 0,\n              left: 0,\n              right: 0,\n              bottom: 0,\n              bg: 'snow',\n              pointerEvents: 'none'\n            }}\n          />\n          <Box\n            sx={{\n              position: 'relative',\n              width: '90vw',\n              maxWidth: 'layout',\n              margin: 'auto',\n              zIndex: 5\n            }}\n            py={[4, 4, 5]}\n          >\n            <Box>\n              <Text variant=\"title\" sx={{ fontSize: ['36px', 4, 5] }}>\n                Connect with{' '}\n                <Text\n                  as=\"span\"\n                  sx={{\n                    borderRadius: 'default',\n                    px: 2,\n                    mx: 0,\n                    whiteSpace: 'nowrap',\n                    color: 'white',\n                    bg: 'red'\n                  }}\n                >\n                  builders\n                </Text>{' '}\n                from around the world\n              </Text>\n              <Text\n                variant=\"subtitle\"\n                as=\"p\"\n                sx={{ fontSize: ['18px', '20px', '22px'], pb: [3, 0, 0] }}\n              >\n                We gather both online and in-person to share our love of code\n                and make things together!\n              </Text>\n            </Box>\n            <Flavortown />\n            <Fallout />\n            <Macondo />\n            <Sleepover />\n            <Stasis />\n            <Jackpot />\n            <HackClubTheGame />\n            <Beest />\n            <Horizons />\n            <Slack data={slackData} events={events} />\n          </Box>\n        </Box>\n        <Box>\n          <Box py={[4, 5, '82px']}>\n            <Box\n              sx={{\n                width: '90vw',\n                maxWidth: 'layout',\n                margin: 'auto',\n                position: 'relative'\n              }}\n            >\n              <Flex\n                sx={{\n                  flexDirection: ['column', 'column', 'column', 'row'],\n                  justifyContent: gitHubData ? 'center' : 'flex-start',\n                  alignItems: [\n                    'flex-start',\n                    'flex-start',\n                    'flex-start',\n                    'center'\n                  ],\n                  gap: '10px'\n                }}\n              >\n                <Box sx={{ mb: [3, 0, 0] }}>\n                  <Text\n                    variant=\"title\"\n                    as=\"h2\"\n                    sx={{\n                      fontSize: ['36px', '48px', '56px'],\n                      maxWidth: '20ch'\n                    }}\n                  >\n                    We build{' '}\n                    <Text\n                      as=\"span\"\n                      sx={{\n                        borderRadius: 'default',\n                        mx: 0,\n                        whiteSpace: 'nowrap',\n                        color: 'orange'\n                      }}\n                    >\n                      open source\n                    </Text>{' '}\n                    games and tools together\n                  </Text>\n                  <Text\n                    variant=\"subtitle\"\n                    as=\"p\"\n                    sx={{\n                      fontSize: ['18px', '20px', '22px'],\n                      pb: [3, 0, 0],\n                      maxWidth: '60ch'\n                    }}\n                  >\n                    In collaboration with engineers on the Hack&nbsp;Club team,\n                    Hack Clubbers build learning tools for each other. Get\n                    involved with these projects by building something with our\n                    tools or contribute to the tools themselves.\n                  </Text>\n                </Box>\n                {gitHubData && (\n                  <Flex\n                    sx={{\n                      flexDirection: ['row', null, null, 'column'],\n                      gap: [1, 2, 2],\n                      alignItems: ['center', 'center', 'center', 'flex-start'],\n                      flexWrap: 'wrap',\n                      width: ['100%', null, null, 'fit-content'],\n\n                      '& > a:nth-child(n+4)': {\n                        display: ['none', null, null, 'flex']\n                      }\n                    }}\n                  >\n                    <Text\n                      sx={{\n                        fontSize: ['11px', '11px', '14px'],\n                        textAlign: 'left',\n                        lineHeight: '90%',\n                        fontStyle: 'italic',\n                        width: 'fit-content'\n                      }}\n                    >\n                      Live from GitHub\n                    </Text>\n                    {gitHubData\n                      .filter(data => !data.user.endsWith('[bot]'))\n                      .slice(0, 4)\n                      .map((data, key) => {\n                        return (\n                          <GitHub\n                            type={data.type}\n                            img={data.userImage}\n                            user={data.user}\n                            time={data.time}\n                            url={data.url}\n                            message={data.message}\n                            key={key}\n                            opacity={1 / (key / 2 + 1)}\n                          />\n                        )\n                      })}\n                  </Flex>\n                )}\n              </Flex>\n              <Sprig\n                stars={stars.sprig.stargazerCount}\n                game={game}\n                gameImage=\"\"\n                gameImage1=\"\"\n              />\n              <Haxidraw stars={stars.blot.stargazerCount} />\n              <Sinerider stars={stars.sinerider.stargazerCount} />\n              <Box as=\"section\" id=\"sprig\">\n                <SprigConsole\n                  stars={stars.sprig.stargazerCount}\n                  consoleCount={consoleCount}\n                />\n              </Box>\n              <Workshops stars={stars.hackclub.stargazerCount} />\n            </Box>\n          </Box>\n          <Box\n            sx={{\n              position: 'relative',\n              background: 'snow',\n              backgroundImage: `url('https://icons.hackclub.com/api/icons/0xF4F7FB/glyph:rep.svg')`,\n              backgroundSize: '40px 40px',\n              backgroundRepeat: 'repeat',\n              backgroundPosition: '10% 10%'\n            }}\n          >\n            <Box\n              py={[4, 5, '82px']}\n              sx={{\n                width: '90vw',\n                maxWidth: 'layout',\n                margin: 'auto',\n                position: 'relative'\n              }}\n            >\n              <Box>\n                <Text\n                  variant=\"title\"\n                  as=\"h2\"\n                  sx={{\n                    fontSize: ['36px', '48px', '72px'],\n                    width: '18ch',\n                    textAlign: 'center',\n                    margin: 'auto'\n                  }}\n                >\n                  Find your{' '}\n                  <Text\n                    as=\"span\"\n                    sx={{\n                      borderRadius: 'default',\n                      mx: 0,\n                      whiteSpace: 'nowrap',\n                      color: 'orange'\n                    }}\n                  >\n                    IRL community.\n                  </Text>\n                </Text>\n                <Text\n                  variant=\"subtitle\"\n                  as=\"p\"\n                  sx={{\n                    fontSize: ['18px', '24px', '32px'],\n                    margin: 'auto',\n                    pt: 2,\n                    textAlign: 'center'\n                  }}\n                >\n                  Thousands of Hack Clubbers organize and participate in\n                  hackathons and after school coding clubs.\n                </Text>\n              </Box>\n              <Clubs />\n              <Hackathons\n                data={hackathonsData}\n                stars={stars.hackathons.stargazerCount}\n              />\n\n              {/* <Events events={events} /> */}\n              <HCB data={bankData} />\n            </Box>\n          </Box>\n        </Box>\n        <Box py={[4, 5, '82px']}>\n          <Box\n            sx={{\n              width: '90vw',\n              maxWidth: 'layout',\n              margin: 'auto'\n            }}\n          >\n            <Box>\n              <Text\n                as=\"p\"\n                variant=\"eyebrow\"\n                sx={{ fontSize: ['22px', 2, 3], textAlign: 'center' }}\n              >\n                We've got a lot going on - Let's recap\n              </Text>\n              <Text\n                variant=\"title\"\n                as=\"h2\"\n                sx={{\n                  fontSize: ['36px', '48px', '72px'],\n                  width: '16ch',\n                  textAlign: 'center',\n                  margin: 'auto'\n                }}\n              >\n                Find your second home at{' '}\n                <Text\n                  as=\"span\"\n                  sx={{\n                    borderRadius: 'default',\n                    ml: 0,\n                    whiteSpace: ['wrap', 'nowrap'],\n                    background: (t: any) => t.util.gx('red', 'orange'),\n                    WebkitBackgroundClip: 'text',\n                    WebkitTextFillColor: 'transparent'\n                  }}\n                >\n                  Hack&nbsp;Club\n                </Text>\n              </Text>\n            </Box>\n            <Grid\n              pt={[3, 4]}\n              pb={[4, 5]}\n              gap={3}\n              columns={[1, 2, 3]}\n              sx={{\n                textAlign: 'left',\n                '> a, > div': {\n                  borderRadius: 'extra',\n                  boxShadow: 'elevated',\n                  p: [3, null, 4]\n                },\n                span: {\n                  boxShadow:\n                    '-2px -2px 6px rgba(255,255,255,0.125), inset 2px 2px 6px rgba(0,0,0,0.1), 2px 2px 8px rgba(0,0,0,0.0625)'\n                },\n                svg: { fill: 'currentColor' }\n              }}\n            >\n              <Card\n                as=\"a\"\n                {...({ href: 'https://slack.hackclub.com' } as any)}\n                target=\"_blank\"\n                rel=\"noopener\"\n                variant=\"interactive\"\n                sx={{\n                  background:\n                    'linear-gradient(32deg, rgba(51, 142, 218, 0.9) 0%, rgba(51, 214, 166, 0.9) 100%)',\n                  color: 'white',\n                  svg: { color: 'rgb(51, 142, 218)' },\n                  position: 'relative',\n                  '.icon': {\n                    transition:\n                      'transform 0.25s ease-in-out, opacity 0.25s ease-in-out'\n                  },\n                  ':hover,:focus': {\n                    '.icon': {\n                      transform: 'translateX(28px) translateY(-28px)',\n                      opacity: 0\n                    }\n                  }\n                }}\n              >\n                <Icon\n                  glyph=\"external\"\n                  size={32}\n                  className=\"icon\"\n                  sx={{\n                    position: 'absolute',\n                    top: 2,\n                    right: 2,\n                    opacity: 0.3,\n                    fontSize: ['18px', '20px', '22px'],\n                    zIndex: 3,\n                    color: 'white !important'\n                  }}\n                />\n                <Stage\n                  icon=\"slack\"\n                  color=\"white\"\n                  name=\"Join Our Slack\"\n                  desc=\"Connect with other technical teenagers on Slack and hack on things together.\"\n                  sx={{\n                    p: {\n                      fontSize: ['18px', '20px', '22px']\n                    },\n                    h3: {\n                      fontSize: ['22px', 2, 3]\n                    }\n                  }}\n                />\n              </Card>\n              <Card\n                sx={{\n                  background:\n                    'linear-gradient(-32deg, #6f31b7 14%, #fb558e 82%)',\n                  color: 'white',\n                  svg: { color: '#fb558e' },\n                  textDecoration: 'none',\n                  position: 'relative',\n                  '.icon': {\n                    transition:\n                      'transform 0.25s ease-in-out, opacity 0.25s ease-in-out'\n                  },\n                  ':hover,:focus': {\n                    '.icon': {\n                      transform: 'translateX(28px) translateY(-28px)',\n                      opacity: 0\n                    }\n                  }\n                }}\n                as=\"a\"\n                {...({ href: 'https://github.com/hackclub' } as any)}\n                variant=\"interactive\"\n                target=\"_blank\"\n                rel=\"noopener\"\n              >\n                <Icon\n                  glyph=\"external\"\n                  size={32}\n                  className=\"icon\"\n                  sx={{\n                    position: 'absolute',\n                    top: 2,\n                    right: 2,\n                    opacity: 0.3,\n                    fontSize: [1, '16px', '20px'],\n                    zIndex: 3,\n                    color: 'white !important'\n                  }}\n                />\n                <Stage\n                  icon=\"github\"\n                  color=\"white\"\n                  name=\"Explore Our Open Source Tools\"\n                  desc=\"We're currently building a game engine, daily streak system, graphing game, and more!\"\n                  sx={{\n                    p: {\n                      fontSize: [1, '16px', '20px']\n                    },\n                    h3: {\n                      fontSize: ['22px', 2, 3]\n                    }\n                  }}\n                />\n              </Card>\n              <Card\n                sx={{\n                  background:\n                    'linear-gradient(to bottom, rgba(255, 140, 55, 0.9) 0%, rgba(236, 55, 80, 0.9) 100%)',\n                  color: 'white',\n                  svg: { color: 'rgb(236, 55, 80)' },\n                  textDecoration: 'none',\n                  position: 'relative',\n                  '.icon': {\n                    transition:\n                      'transform 0.25s ease-in-out, opacity 0.43s ease-in-out'\n                  },\n                  ':hover,:focus': {\n                    '.icon': {\n                      transform: 'translateX(28px) translateY(-28px)',\n                      opacity: 0\n                    }\n                  }\n                }}\n                as=\"a\"\n                {...({ href: '/clubs' } as any)}\n                variant=\"interactive\"\n                target=\"_blank\"\n                rel=\"noopener\"\n              >\n                <Icon\n                  glyph=\"external\"\n                  size={32}\n                  className=\"icon\"\n                  sx={{\n                    position: 'absolute',\n                    top: 2,\n                    right: 2,\n                    opacity: 0.3,\n                    fontSize: ['18px', '20px', '22px'],\n                    zIndex: 3,\n                    color: 'white !important'\n                  }}\n                />\n                <Stage\n                  icon=\"clubs\"\n                  color=\"white\"\n                  name=\"Start A Club\"\n                  desc=\"Build an in-person community of high school hackers, and we're here to help.\"\n                  sx={{\n                    p: {\n                      fontSize: ['18px', '20px', '22px']\n                    },\n                    h3: {\n                      fontSize: ['22px', 2, 3]\n                    }\n                  }}\n                />\n              </Card>\n            </Grid>\n          </Box>\n        </Box>\n\n        {new URL(asPath, 'http://example.com').searchParams.get('gen') ===\n          'z' && (\n          <>\n            <Box\n              sx={{\n                position: 'fixed',\n                top: 0,\n                width: '100%',\n                zIndex: 1000\n              }}\n            >\n              <Box\n                sx={{\n                  position: 'relative',\n                  margin: 'auto',\n                  width: 'fit-content',\n                  lineHeight: 0\n                }}\n              >\n                <iframe\n                  width=\"560\"\n                  height=\"315\"\n                  src=\"https://www.youtube-nocookie.com/embed/sJNK4VKeoBM?si=zvhDKhb9C5G2b4TJ&controls=1&autoplay=1&mute=1\"\n                  title=\"YouTube video player\"\n                  frameBorder=\"0\"\n                  allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                  allowFullScreen\n                ></iframe>\n              </Box>\n            </Box>\n            <Box\n              sx={{\n                position: 'fixed',\n                bottom: 0,\n                right: 0,\n                zIndex: 1000,\n                lineHeight: 0\n              }}\n            >\n              <iframe\n                width=\"560\"\n                height=\"315\"\n                src=\"https://www.youtube-nocookie.com/embed/ChBg4aowzX8?si=X2J_T95yiaKXB2q4&controls=1&autoplay=1&mute=1\"\n                title=\"YouTube video player\"\n                frameBorder=\"0\"\n                allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                allowFullScreen\n              ></iframe>\n            </Box>\n            <Box\n              sx={{\n                position: 'fixed',\n                bottom: 0,\n                left: 0,\n                zIndex: 1000,\n                lineHeight: 0\n              }}\n            >\n              <iframe\n                width=\"560\"\n                height=\"315\"\n                src=\"https://www.youtube-nocookie.com/embed/JDQr1vICu54?si=U6-9AFtk7EdTabfp&autoplay=1&mute=1\"\n                title=\"YouTube video player\"\n                frameBorder=\"0\"\n                allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                allowFullScreen\n              ></iframe>\n            </Box>\n          </>\n        )}\n        <MailingList />\n      </Box>\n      <Footer\n        dark\n        sx={{\n          backgroundColor: 'dark',\n          position: 'relative',\n          overflow: 'hidden',\n          textShadow: '0 1px 2px rgba(0,0,0,0.375)',\n          'h2,span,p,a': { color: 'white !important' },\n          '> div img': { objectPosition: ['left', 'center'] },\n          svg: {\n            fill: 'white',\n            filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.25))'\n          }\n        }}\n      >\n        <style>\n          {`a{\n          color: #338eda\n        }`}\n        </style>\n      </Footer>\n    </>\n  )\n}\n\nexport async function getStaticProps() {\n  const carouselCards = require('../public/carousel.json')\n  const allCtaCards = require('../lib/cta.json')\n  const ctaCards =\n    allCtaCards.length > 3\n      ? allCtaCards.sort(() => Math.random() - 0.5).slice(0, 3)\n      : allCtaCards\n\n  // HCB: get total raised\n  const bankData = []\n  const initialBankData = await fetch('https://hcb.hackclub.com/stats')\n  try {\n    const bd = await initialBankData.json()\n    const raised = bd.raised / 100\n\n    bankData.push(\n      `💰 ${raised.toLocaleString('en-US', {\n        style: 'currency',\n        currency: 'USD'\n      })} raised`\n    )\n  } catch {\n    bankData.push('error')\n  }\n\n  const slackData = await SlackDataLib()\n\n  // GitHub: get latest github activity (currently this is erroring and\n  // preventing the site from deploying)\n  const gitHubData = null\n\n  // GitHub: get latest GitHub stars\n  const { fetchStars } = require('./api/stars')\n  const stars = await fetchStars()\n\n  // Sprig: get newest games\n  const { getGames } = require('./api/games')\n  const game = await getGames()\n\n  // Sprig: get console count\n  const { getConsoles } = require('./api/sprig-console')\n  const consoleCount = await getConsoles()\n\n  // Hackathons: get latest hackathons\n  let hackathonsData\n  try {\n    const response = await fetch(\n      'https://hackathons.hackclub.com/api/events/upcoming'\n    )\n    if (response.ok) {\n      hackathonsData = await response.json()\n    } else {\n      hackathonsData = [] // or some default value if the fetch fails\n    }\n  } catch (error) {\n    hackathonsData = [] // or some default value if an error occurs\n  }\n  hackathonsData.sort(\n    (a: { start: string }, b: { start: string }) =>\n      new Date(a.start).getTime() - new Date(b.start).getTime()\n  )\n\n  const events = []\n\n  return {\n    props: {\n      game,\n      gitHubData,\n      consoleCount,\n      hackathonsData,\n      bankData,\n      slackData,\n      stars,\n      events,\n      carouselCards,\n      ctaCards\n    },\n    revalidate: 60\n  }\n}\n\nexport default Page\n"
  },
  {
    "path": "pages/jobs/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Container, Heading, Card, Text, Grid } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport ForceTheme from '../../components/force-theme'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport Icon from '../../components/icon'\nimport Image from 'next/image'\nimport zephyrPic from '../../public/jobs/zephyr-group-pic.jpg'\nimport { compact } from 'lodash'\nimport { decodeHtmlEntities } from '../../lib/helpers'\n\nconst JobListing = ({\n  positionName,\n  positionDesc,\n  positionLink,\n  positionLocation,\n  positionType\n}) => (\n  <Card\n    variant=\"sunken\"\n    as=\"a\"\n    href={positionLink}\n    target=\"_blank\"\n    rel=\"noopener noreferrer\"\n    sx={{\n      width: '100%',\n      textDecoration: 'none',\n      'span > svg': {\n        opacity: '0',\n        transition: '0.3s ease-in-out'\n      },\n      '&:hover span > svg': {\n        opacity: '1'\n      }\n    }}\n  >\n    <Box\n      as=\"span\"\n      sx={{ display: 'flex', justifyContent: 'space-between', width: '100%' }}\n    >\n      <Heading\n        variant=\"headline\"\n        sx={{\n          color: 'black',\n          m: 0\n        }}\n      >\n        {positionName}\n      </Heading>\n      <Icon glyph=\"external\" size={24} color=\"black\" />\n    </Box>\n\n    <Text\n      variant=\"caption\"\n      sx={{\n        mt: 1,\n        display: 'block',\n        textAlign: 'left'\n      }}\n    >\n      {compact([positionDesc, positionLocation, positionType]).join(' • ')}\n    </Text>\n  </Card>\n)\n\nconst Page = ({ jobs }) => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Jobs\"\n      description=\"Hack Club is hiring! Check out the open positions.\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"main\"\n      key=\"main\"\n      sx={{\n        color: 'black'\n      }}\n    >\n      <Box\n        sx={{\n          py: [5, 6],\n          background:\n            'linear-gradient(90deg, rgba(2,0,36,0.53) 0%, rgba(2,0,36,0.46) 100%)',\n          backgroundSize: 'cover',\n          backgroundPosition: 'center',\n          textAlign: 'center',\n          position: 'relative'\n        }}\n      >\n        <Box\n          sx={{\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            bottom: 0,\n            right: 0,\n            zIndex: -1\n          }}\n        >\n          <Image\n            src={zephyrPic}\n            alt=\"Hack Clubbers hacking during the Hacker Zephyr trip\"\n            fill\n            sizes=\"100vw\"\n            style={{\n              objectFit: 'cover'\n            }}\n          />\n        </Box>\n        <Container>\n          <Heading\n            as=\"h1\"\n            sx={{\n              fontSize: ['48px', '48px', '72px'],\n              color: 'white'\n            }}\n          >\n            Join the Hack Club Team\n          </Heading>\n          <Heading\n            sx={{\n              color: 'smoke',\n              mt: 3,\n              fontSize: ['18px', '24px'],\n              lineHeight: ['1.5', '1.125']\n            }}\n          >\n            <Text\n              sx={{\n                bg: 'dark',\n                color: 'green',\n                width: 'fit-content',\n                px: 3,\n                py: [1, 2],\n                borderRadius: 6,\n                mr: 1\n              }}\n            >\n              $ ssh jobs.hackclub.com -p 1337\n            </Text>{' '}\n            or scroll down to learn more...\n          </Heading>\n        </Container>\n      </Box>\n      <Container sx={{ py: [3, 4], px: [2, 2, 0] }}>\n        <Grid\n          sx={{\n            maxWidth: '64rem',\n            mx: 'auto',\n            textAlign: 'left'\n          }}\n          columns={['1fr', '1fr 1fr']}\n        >\n          {jobs.items.length > 0 ? (\n            jobs.items.map(job => (\n              <JobListing\n                key={job.id}\n                positionName={decodeHtmlEntities(job.title)}\n                positionDesc={job.job_category_name}\n                positionLink={job.job_post_url}\n                positionLocation={job.display_location}\n                positionType={job.kind_pretty}\n              />\n            ))\n          ) : (\n            <Text\n              variant=\"headline\"\n              sx={{\n                color: 'muted',\n                textAlign: 'center',\n                mx: 'auto',\n                gridColumn: '1 / -1'\n              }}\n            >\n              No open roles at this time. Check back later!\n            </Text>\n          )}\n        </Grid>\n      </Container>\n    </Box>\n\n    <Footer key=\"footer\" />\n  </>\n)\n\nexport default Page\n\nexport async function getStaticProps() {\n  const data = await fetch(\n    'https://api.polymer.co/v1/hire/organizations/hackclub/jobs'\n  )\n  const jobs = await data.json()\n  return {\n    props: {\n      jobs\n    },\n    revalidate: 60\n  }\n}\n"
  },
  {
    "path": "pages/minecraft.tsx",
    "content": "import {\n  Box,\n  Button,\n  Card,\n  Container,\n  Grid,\n  Heading,\n  Image,\n  Link,\n  Text\n} from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport NextLink from 'next/link'\nimport Nav from '../components/nav'\nimport SlideDown from '../components/slide-down'\nimport FadeIn from '../components/fade-in'\nimport Icon from '../components/icon'\nimport Footer from '../components/footer'\n\nconst Page = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Minecraft\"\n      description=\"Join the Minecrafters of Hack Club on our official server and build plugins with our technical community.\"\n      image=\"https://cdn.hackclub.com/019c2689-21c1-7060-ad57-8353dd7d51c0/image.png\"\n    />\n    <Nav color=\"#759B40\" dark />\n    <Box\n      as=\"main\"\n      sx={{\n        bg: 'dark',\n        color: 'white',\n        backgroundImage:\n          'url(https://cdn.hackclub.com/019c268a-e8e7-7dc4-9969-2d7336740fd5/image.png)',\n        backgroundPosition: 'top center',\n        backgroundSize: 'cover',\n        position: 'relative'\n      }}\n    >\n      <SlideDown duration={768} sx={{ pt: 6, textAlign: 'center' }}>\n        <Image\n          src=\"https://cdn.hackclub.com/019c268c-8137-7683-a7b1-d07482f86e17/2020-07-16_minecraft-banner.svg\"\n          alt=\"Hack Club stylized as Minecraft logo\"\n          width={256}\n          sx={{\n            width: ['100%', 384, 512],\n            transition: 'transform .125s ease-in-out',\n            ':hover': { transform: 'scale(1.0625)' }\n          }}\n        />\n      </SlideDown>\n      <FadeIn duration={768}>\n        <Grid\n          variant=\"layout.copy\"\n          columns={[null, 2]}\n          gap={3}\n          sx={{\n            pt: 5,\n            pb: [6, 7],\n            div: {\n              variant: 'cards.translucentDark',\n              color: 'white',\n              p: [null, 3]\n            },\n            h3: { mb: 2 },\n            p: { lineHeight: 'caption' }\n          }}\n        >\n          <Card\n            sx={{\n              gridColumnStart: 1,\n              gridColumnEnd: 3\n            }}\n          >\n            <Heading as=\"h3\" variant=\"subheadline\">\n              Vanilla Server\n            </Heading>\n            <Text as=\"p\">\n              Hang out with the tree-punchers of Hack&nbsp;Club playing on the\n              official server, mc.hackclub.com.{' '}\n              <Link href=\"http://mc.hackclub.com\" color=\"#759B40\">\n                Check out the map »\n              </Link>\n            </Text>\n          </Card>\n          <Card sx={{ display: 'none' }}>\n            <Heading as=\"h3\" variant=\"subheadline\">\n              Modded Server\n            </Heading>\n            <Text as=\"p\">\n              Want a unique Minecraft experience? Come explore the limits of\n              Minecraft with us on the official modded server!\n            </Text>\n          </Card>\n          <Card sx={{ display: 'none' }}>\n            <Heading as=\"h3\" variant=\"subheadline\">\n              Compete weekly\n            </Heading>\n            <Text as=\"p\">\n              Join weekly Minecraft Monday calls & compete in the monthly\n              Minecraft Showdown to win prizes.\n            </Text>\n          </Card>\n          <Card>\n            <Heading as=\"h3\" variant=\"subheadline\">\n              Build plugins\n            </Heading>\n            <Text as=\"p\">\n              Many Hack Clubbers first found coding via Minecraft plugins, and\n              we have an active community scripting plugins on our server.\n            </Text>\n          </Card>\n          <Card>\n            <Heading as=\"h3\" variant=\"subheadline\">\n              Chat in #minecraft on Slack\n            </Heading>\n            <Text as=\"p\">Hundreds of players around the world.</Text>\n            <NextLink href=\"https://slack.hackclub.com\" passHref>\n              <Button\n                sx={{\n                  mt: 2,\n                  backgroundImage: (t: any) => t.util.gx('#759B40', '#4F6728')\n                }}\n              >\n                <Icon glyph=\"slack-fill\" size={24} />\n                Join our Slack\n              </Button>\n            </NextLink>\n          </Card>\n        </Grid>\n      </FadeIn>\n    </Box>\n    <Footer dark />\n  </>\n)\n\nexport default Page\n"
  },
  {
    "path": "pages/night.tsx",
    "content": "import { Box, Container, Heading, Image, Link, Text } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport NextLink from 'next/link'\nimport Nav from '../components/nav'\nimport SlideDown from '../components/slide-down'\nimport Footer from '../components/footer'\nimport { keyframes } from '@emotion/react'\n\nconst floating = keyframes`\n  from {\n    transform: translateY(20px);\n  }\n  to {\n    transform: translateY(-20px);\n  }\n`\n\n// (msw) Credit for this totally goes to https://codepen.io/WebSonick/pen/vjmgu\nconst twinkling = keyframes`\n  from { background-position: 0 0; }\n  to { background-position: -10000px 5000px; }\n`\n\nconst color = '#50E3C2'\n\nconst Page = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Hack Night\"\n      description=\"The Hack Club community regularly gathers on Slack Huddles and Zoom calls to show off what we’re working on & hang out.\"\n      image=\"https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/52020-07-25_52g0nw40p2b00dh39mt93xq5ubku6yaj.jpeg\"\n    />\n    <Nav color={color} dark />\n    <Box\n      as=\"main\"\n      sx={{\n        pt: [5, 6],\n        pb: 5,\n        bg: 'dark',\n        color: 'muted',\n        textAlign: 'center',\n        backgroundImage:\n          'url(https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/62020-07-24_stars.svg)',\n        backgroundSize: '512px auto'\n      }}\n    >\n      <Box\n        sx={{\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          width: '100%',\n          height: '100%',\n          display: 'block',\n          background:\n            'transparent url(https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/72020-07-24_afnkcwju2hfkbrkc1ee0h5a5y72a2r5f.png) repeat top center',\n          animation: `${twinkling} 200s linear infinite`\n        }}\n      ></Box>\n      <SlideDown\n        variant=\"layout.narrow\"\n        duration={768}\n        sx={{ position: 'relative' }}\n      >\n        <Heading\n          as=\"h1\"\n          variant=\"ultratitle\"\n          mt={3}\n          sx={{\n            color,\n            textTransform: 'uppercase',\n            WebkitTextStroke: 'white',\n            WebkitTextStrokeWidth: '2px',\n            WebkitTextFillColor: 'transparent',\n            filter: `drop-shadow(0 0 1px ${color}) drop-shadow(0 0 2px ${color}) drop-shadow(0 0 6px ${color})`\n          }}\n        >\n          Hack Night\n        </Heading>\n        <Text as=\"p\" variant=\"subtitle\">\n          The Hack Club community regularly gathers on Zoom or Huddles. It’s a\n          chance to meet new friends, livestream what you’re hacking on, or just\n          hang out on a chill call.\n        </Text>\n        <Text as=\"p\" variant=\"subtitle\">\n          Hack nights are hosted regularly by Hack Clubbers. Come join or start\n          an impromptu Hack session on{' '}\n          <Link\n            as={NextLink}\n            href=\"https://slack.hackclub.com\"\n            sx={{ color, opacity: 0.75 }}\n          >\n            #hack-night\n          </Link>\n          !\n        </Text>\n      </SlideDown>\n      <Container\n        variant=\"narrow\"\n        sx={{\n          position: 'relative',\n          width: '100%',\n          maxWidth: 512,\n          minHeight: 512,\n          mx: 'auto',\n          mt: [4, 5],\n          img: {\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            right: 0,\n            maxWidth: '100%'\n          }\n        }}\n      >\n        <Image\n          src=\"https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/82020-07-24_gbetd0kafcxjp2e5hkv4w9u3m40pmmmt.png\"\n          alt=\"Moon background\"\n          width={512}\n        />\n        <Image\n          src=\"https://cloud-r4rrjh2z8-hack-club-bot.vercel.app/92020-07-24_zdd8ycnkp9q0bbf1fj8a1amjv3zndufz.png\"\n          alt=\"Illustration of Orpheus with a moon\"\n          width={512}\n          sx={{\n            zIndex: 1,\n            animation: `${floating} cubic-bezier(.55,.03,.43,.98) 8s infinite alternate`\n          }}\n        />\n      </Container>\n    </Box>\n    <Footer dark />\n  </>\n)\n\nexport default Page\n"
  },
  {
    "path": "pages/onboard/board/[slug].tsx",
    "content": "import { Box, Button, Flex, Heading, Image, Link, Text } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../../../components/nav'\nimport { useEffect, useRef } from 'react'\nimport { remark } from 'remark'\nimport html from 'remark-html'\nimport { getOnboardProject } from '../../api/onboard/p/[project]'\nimport { getAllOnboardProjects } from '../../api/onboard/p'\nimport Icon from '@hackclub/icons'\nimport Tilt from '../../../components/tilt'\n\ntype ProjectType = {\n  name: string\n  imageTop: string\n  readmeData: {\n    frontmatter: {\n      github_handle: string\n    }\n    description: string\n  }\n}\n\ntype BoardPageProps = {\n  project: ProjectType\n}\n\nconst BoardPage = ({ project }: BoardPageProps) => {\n  const spotlightRef = useRef(null)\n  useEffect(() => {\n    const handler = event => {\n      spotlightRef.current.style.background = `radial-gradient(\n\t\t\t\tcircle at ${event.pageX}px ${event.pageY}px,\n\t\t\t\trgba(0, 0, 0, 0) 10px,\n\t\t\t\trgba(0, 0, 0, 0.8) 80px\n\t\t\t)`\n    }\n    window.addEventListener('mousemove', handler)\n    return () => window.removeEventListener('mousemove', handler)\n  }, [])\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Gallery\"\n        description=\"Check out the latest and greatest from the Onboard project.\"\n      ></Meta>\n      <style>{`\n\n\t\t\t\t@font-face {\n\t\t\t\t\tfont-family: 'Phantom Sans';\n\t\t\t\t\tsrc: url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff')\n\t\t\t\t\t\t\tformat('woff'),\n\t\t\t\t\t\turl('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff2')\n\t\t\t\t\t\t\tformat('woff2');\n\t\t\t\t\tfont-weight: 500;\n\t\t\t\t\tfont-style: normal;\n\t\t\t\t\tfont-display: swap;\n\t\t\t\t}\n\n\t\t\t\thtml {\n\t\t\t\t\tscroll-behavior: smooth;\n\t\t\t\t}\n\t\t\t`}</style>\n      <Nav />\n      <Box\n        as=\"header\"\n        sx={{\n          bg: '#000000',\n          backgroundImage: `\n\t\t\t\t\t\tlinear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)),\n\t\t\t\t\t\turl('https://cloud-dst3a9oz5-hack-club-bot.vercel.app/0image.png')\n\t\t\t\t\t`,\n          color: '#ffffff',\n          position: 'relative'\n        }}\n      >\n        <Box\n          ref={spotlightRef}\n          sx={{\n            position: 'absolute',\n            zIndex: 2,\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            bg: '#000000',\n            pointerEvents: 'none'\n          }}\n        />\n        <Flex\n          sx={{\n            p: 4,\n            flexDirection: 'column',\n            alignItems: 'center',\n            zIndex: 5,\n            position: 'relative'\n          }}\n        >\n          <Flex\n            sx={{\n              p: 4,\n              flexDirection: 'column',\n              alignItems: 'center',\n              zIndex: 5,\n              margin: '3vh auto',\n              position: 'relative'\n            }}\n          >\n            <Heading as=\"h1\" variant=\"title\" sx={{ textAlign: 'center' }}>\n              {project.name}\n            </Heading>\n            <Text as=\"p\" variant=\"subtitle\" sx={{ textAlign: 'center' }}>\n              by {project?.readmeData?.frontmatter?.github_handle}\n            </Text>\n            <Flex sx={{ mt: 16, gap: 10, flexDirection: ['column', 'row'] }}>\n              <Link href=\"/onboard/gallery\">\n                <Button\n                  sx={{\n                    background: (t: any) => t.util.gx('#60cc38', '#113b11')\n                  }}\n                >\n                  See more in the gallery\n                </Button>\n              </Link>\n            </Flex>\n          </Flex>\n        </Flex>\n      </Box>\n      <Box\n        sx={{\n          bg: 'white',\n          py: [4, 5],\n          textAlign: 'center'\n        }}\n      >\n        <Box\n          sx={{\n            maxWidth: 'copyUltra',\n            mx: 'auto',\n            px: 3\n          }}\n        >\n          {\n            // two-column layout - image on left, title + desc on right\n          }\n          <Box\n            sx={{\n              display: 'grid',\n              gap: 4,\n              gridTemplateColumns: ['1fr', 'repeat(2, 1fr)'],\n              color: 'black'\n            }}\n          >\n            <Tilt>\n              <Image\n                src={project.imageTop}\n                alt={project.name}\n                sx={{\n                  borderRadius: 8,\n                  boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)'\n                }}\n              />\n            </Tilt>\n            <Box\n              sx={{\n                display: 'flex',\n                flexDirection: 'column',\n                justifyContent: 'center'\n              }}\n            >\n              <Heading as=\"h2\" variant=\"title\" sx={{ textAlign: 'left' }}>\n                {project.name}\n              </Heading>\n              <Text as=\"p\" variant=\"subtitle\" sx={{ textAlign: 'left' }}>\n                {project?.readmeData?.frontmatter?.github_handle\n                  ? `by ${project?.readmeData?.frontmatter?.github_handle}`\n                  : ''}\n              </Text>\n              <Link\n                target=\"_blank\"\n                href={`https://github.com/hackclub/OnBoard/blob/main/projects/${project.name}/`}\n                sx={{\n                  textDecoration: 'none',\n                  color: 'black',\n                  ':hover': {\n                    color: 'primary'\n                  },\n                  textAlign: 'left'\n                }}\n              >\n                <Icon glyph=\"github\" size={18} />\n                View on GitHub\n              </Link>\n              <Box\n                sx={{\n                  textAlign: 'left'\n                }}\n                dangerouslySetInnerHTML={{\n                  __html:\n                    // render with remark to parse markdown\n                    remark()\n                      .use(html)\n                      .processSync(project?.readmeData?.description)\n                      .toString()\n                      .replaceAll('h4', 'p')\n                }}\n              />\n            </Box>\n          </Box>\n        </Box>\n      </Box>\n      {process.env.NODE_ENV !== 'production' && (\n        <>\n          <pre>{JSON.stringify(project, null, 2)}</pre>\n        </>\n      )}\n    </>\n  )\n}\n\nexport async function getStaticPaths(_context) {\n  const projects = (await getAllOnboardProjects()).slice(0, 5)\n  const paths = projects.map(project => {\n    return {\n      params: {\n        slug: project.name\n      }\n    }\n  })\n  return {\n    paths,\n    fallback: 'blocking'\n  }\n}\n\nexport async function getStaticProps(context: any) {\n  const name = context.params.slug\n  const project = await getOnboardProject(name)\n  if (!project) {\n    return {\n      notFound: true\n    }\n  }\n  return {\n    props: {\n      project\n    },\n    revalidate: 120\n  }\n}\n\nexport default BoardPage\n"
  },
  {
    "path": "pages/onboard/first.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Button, Flex, Grid, Heading, Image, Link, Text } from 'theme-ui'\nimport Balancer from 'react-wrap-balancer'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport FadeIn from '../../components/fade-in'\nimport Sparkles from '../../components/sparkles'\nimport Tilt from '../../components/tilt'\nimport usePrefersReducedMotion from '../../lib/use-prefers-reduced-motion'\nimport { useEffect, useRef, useState } from 'react'\n\n/**\n * @type {import('theme-ui').ThemeUIStyleObject}\n */\nconst traceSx = {\n  width: 6,\n  bg: '#e2b747',\n  alignSelf: 'stretch',\n  mr: 100,\n  position: 'relative'\n}\n\nconst dimBg = '#151515'\n\n// Beloved classic utility function :3\nconst sleep = ms => new Promise(resolve => setTimeout(resolve, ms))\n\n// \"LET'S RECAP\" pixel art (exported from Piskel)\n// Original: https://doggo.ninja/fiK0nk.piskel\nconst recapWidth = 71\nconst recapHeight = 10\nconst recapPixels = [\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,\n  0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,\n  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,\n  0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,\n  0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n  0xffffffff, 0xffffffff\n]\n\nconst slackLink = 'https://slack.hackclub.com'\n\nconst stickerButtonText = 'Click 4 Stickers'\nconst stickerButtonFont = 'Oleo Script'\nconst stickerButtonFontStylesheet = `https://fonts.googleapis.com/css2?family=${encodeURIComponent(\n  stickerButtonFont\n)}&display=swap&text=${encodeURIComponent(stickerButtonText)}`\n\nconst wandImgTraced =\n  'https://cloud-mmhtcl463-hack-club-bot.vercel.app/1trace.png'\nconst wandImgRendered =\n  'https://cloud-mmhtcl463-hack-club-bot.vercel.app/0transparent_pcb.png'\n\nconst ShipPage = () => {\n  const prefersReducedMotion = usePrefersReducedMotion()\n\n  // Wand flicker animation\n  const [wandImg, setWandImg] = useState(wandImgTraced)\n  const wandAnimated = useRef(false)\n  useEffect(() => {\n    let canceled = false\n\n    const flicker = async () => {\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(Math.random() * 80 + 10)\n      if (canceled) return\n      setWandImg(wandImgRendered)\n      setTimeout(flicker, Math.random() * 4000 + 500)\n    }\n\n    const animate = async () => {\n      if (wandAnimated.current) return\n      wandAnimated.current = true\n\n      await sleep(1500)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      await sleep(60)\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(340)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      await sleep(14)\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(55)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      await sleep(10)\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(150)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      setTimeout(flicker, 1200)\n    }\n\n    if (prefersReducedMotion) {\n      setWandImg(wandImgRendered)\n    } else {\n      animate()\n    }\n\n    return () => {\n      canceled = true\n    }\n  }, [prefersReducedMotion])\n\n  // Spotlight effect\n  const spotlightRef = useRef(null)\n  useEffect(() => {\n    const handler = event => {\n      const rect = spotlightRef.current.getBoundingClientRect()\n      const x = event.clientX - rect.left\n      const y = event.clientY - rect.top\n      spotlightRef.current.style.background = `radial-gradient(\n\t\t\t\tcircle at ${x}px ${y}px,\n\t\t\t\trgba(0, 0, 0, 0) 10px,\n\t\t\t\trgba(0, 0, 0, 0.8) 80px\n\t\t\t)`\n    }\n    window.addEventListener('mousemove', handler)\n    return () => window.removeEventListener('mousemove', handler)\n  }, [])\n\n  // Calculating the bus height to match the bottom left of the first connector.\n  const [busHeight, setBusHeight] = useState(null)\n  const containerRef = useRef(null) // For ResizeObserver\n  const connectorRef = useRef(null) // To get bottom left position\n  const busRef = useRef(null) // To calculate height differential\n\n  useEffect(() => {\n    const observer = new ResizeObserver(() => {\n      const connectorRect = connectorRef.current.getBoundingClientRect()\n      const busRect = busRef.current.getBoundingClientRect()\n      setBusHeight(busRect.bottom - connectorRect.bottom + 4.5)\n    })\n\n    observer.observe(containerRef.current)\n    return () => observer.disconnect()\n  }, [])\n\n  // Fancy lights animation\n  const lightsScrollTrigger = useRef(null)\n  const lightsAnimated = useRef(false)\n  useEffect(() => {\n    let canceled = false\n\n    const setAtIndex = (i, color) => {\n      if (canceled) return\n\n      // Going outside of React for performance\n      const el = document.getElementById(`pixel-${i}`)\n      if (!el) return\n\n      if (recapPixels[i]) {\n        el.style.background = color\n        el.style.boxShadow = `0 0 10px ${color}`\n      } else {\n        el.style.background = dimBg\n        el.style.boxShadow = 'none'\n      }\n    }\n    const setAll = color => {\n      for (let i = 0; i < recapPixels.length; i++) setAtIndex(i, color)\n    }\n\n    const animate = async () => {\n      if (lightsAnimated.current) return\n      lightsAnimated.current = true\n\n      // Illuminate lights in diagonal lines starting with only top left.\n      for (\n        let curColumn = 0;\n        curColumn < recapWidth + recapHeight;\n        curColumn++\n      ) {\n        for (\n          let offset = curColumn;\n          offset >= Math.max(0, curColumn - recapHeight);\n          offset--\n        ) {\n          const i = curColumn * recapWidth + offset - offset * recapWidth\n          setAtIndex(i, '#ffffff')\n          if (!recapPixels[i]) await sleep(4)\n          if (canceled) return\n        }\n        // await sleep(2); if (canceled) return\n      }\n\n      // Flash the lights twice\n      await sleep(600)\n      if (canceled) return\n\n      setAll(dimBg)\n      await sleep(80)\n      if (canceled) return\n\n      setAll('#aaaaaa')\n      await sleep(20)\n      if (canceled) return\n\n      setAll(dimBg)\n      await sleep(30)\n      if (canceled) return\n\n      setAll('#aaaaaa')\n      await sleep(100)\n      if (canceled) return\n\n      setAll(dimBg)\n      await sleep(200)\n      if (canceled) return\n\n      // Animate rainbow 2-column increments\n      for (let x = 0; x < recapWidth; x++) {\n        const color = `hsl(${(x * 360) / recapWidth}, 100%, 65%)`\n        for (let y = 0; y < recapHeight; y++) {\n          const i = y * recapWidth + x\n          setAtIndex(i, color)\n        }\n        if (x % 2 === 1) await sleep(35)\n      }\n    }\n\n    if (prefersReducedMotion) {\n      if (!lightsAnimated.current) setAll('#ffffff')\n      return () => {\n        canceled = true\n      }\n    } else {\n      const observer = new IntersectionObserver(\n        ([entry]) => {\n          if (entry.isIntersecting) animate()\n        },\n        { threshold: 0.5 }\n      )\n      observer.observe(lightsScrollTrigger.current)\n      return () => {\n        canceled = true\n        observer.disconnect()\n      }\n    }\n  }, [prefersReducedMotion])\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        name=\"OnBoard\"\n        description={`We'll pay manufacturing costs for any high schooler who designs a circuit board.`}\n        image=\"https://cloud-ji9c1qxfx-hack-club-bot.vercel.app/03_card.png\"\n      />\n\n      <style>{`\n\t\t\t\t@import url('${stickerButtonFontStylesheet}');\n\n\t\t\t\t@font-face {\n\t\t\t\t\tfont-family: 'Phantom Sans';\n\t\t\t\t\tsrc: url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff')\n\t\t\t\t\t\t\tformat('woff'),\n\t\t\t\t\t\turl('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff2')\n\t\t\t\t\t\t\tformat('woff2');\n\t\t\t\t\tfont-weight: 500;\n\t\t\t\t\tfont-style: normal;\n\t\t\t\t\tfont-display: swap;\n\t\t\t\t}\n\n\t\t\t\thtml {\n\t\t\t\t\tscroll-behavior: smooth;\n\t\t\t\t}\n\t\t\t`}</style>\n\n      <Head>\n        <link rel=\"preload\" href={wandImgRendered} as=\"image\" />\n      </Head>\n\n      <Nav />\n\n      <Box\n        as=\"header\"\n        sx={{\n          bg: '#000000',\n          backgroundImage: `\n\t\t\t\t\t\tlinear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)),\n\t\t\t\t\t\turl('https://cloud-dst3a9oz5-hack-club-bot.vercel.app/0image.png')\n\t\t\t\t\t`,\n          color: '#ffffff',\n          position: 'relative'\n        }}\n      >\n        <Box\n          ref={spotlightRef}\n          sx={{\n            position: 'absolute',\n            zIndex: 2,\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            bg: '#000000',\n            pointerEvents: 'none'\n          }}\n        />\n\n        <Flex\n          sx={{\n            p: 4,\n            flexDirection: 'column',\n            alignItems: 'center',\n            zIndex: 5,\n            position: 'relative'\n          }}\n        >\n          <Flex\n            sx={{\n              pt: 80,\n              width: '100%',\n              maxWidth: 'layout',\n              alignItems: 'center'\n            }}\n          >\n            <Flex sx={{ flex: 1, flexDirection: 'column', gap: 25 }}>\n              <Heading\n                as=\"h1\"\n                sx={{\n                  fontSize: 80,\n                  maxWidth: 'copyPlus',\n                  textShadow: '0 0 30px rgba(42, 252, 88, 0.6)',\n                  color: '#87ffa1'\n                }}\n              >\n                <Balancer ratio={0.3}>\n                  OnBoard with <i>FIRST&reg;</i>\n                </Balancer>\n              </Heading>\n\n              <Heading\n                as=\"div\"\n                sx={{ fontSize: 4, fontWeight: 400, maxWidth: 'copyPlus' }}\n              >\n                <Balancer ratio={0.3}>\n                  Circuit boards are{' '}\n                  <Sparkles>\n                    <Text sx={{ fontWeight: 400 }}>magical</Text>\n                  </Sparkles>\n                  . You design one, we'll print it!\n                  <br />\n                  <br />\n                  Plus! FIRST team members get a limited edition PCB badge\n                  designed with Dean Kamen.\n                </Balancer>\n              </Heading>\n\n              <Flex sx={{ mt: 16, gap: 10, flexDirection: ['column', 'row'] }}>\n                <Button\n                  variant=\"ctaLg\"\n                  as=\"a\"\n                  href=\"https://hackclub.com/onboard/first_and_hack_club.pdf\"\n                  target=\"_blank\"\n                  sx={{\n                    background: t => t.util.gx('#60cc38', '#113b11')\n                  }}\n                >\n                  Download the PDF\n                </Button>\n\n                <Button\n                  variant=\"outlineLg\"\n                  as=\"a\"\n                  href=\"https://jams.hackclub.com/tag/pcb\"\n                  target=\"_blank\"\n                  sx={{\n                    borderColor: '#113b11',\n                    color: '#60cc38'\n                  }}\n                >\n                  Learn PCB Design!\n                </Button>\n              </Flex>\n            </Flex>\n\n            <Box sx={{ flex: 1, maxWidth: 330, ml: [0, null, -100] }}>\n              <FadeIn duration={800} delay={100}>\n                <Image\n                  src={wandImg}\n                  alt=\"A circuit board of a dino wizard with a light up wand.\"\n                />\n              </FadeIn>\n            </Box>\n          </Flex>\n\n          <Heading\n            as=\"h2\"\n            sx={{\n              pt: 60,\n              pb: 35,\n              fontSize: 36,\n              fontWeight: 500,\n              maxWidth: 'copy',\n              textAlign: 'center'\n            }}\n          >\n            <Balancer ratio={0.8}>\n              Join 1,000 others to create your own circuit board.\n            </Balancer>\n          </Heading>\n\n          <Grid\n            width={300}\n            gap={4}\n            sx={{\n              fontSize: 2,\n              h3: { fontSize: 2 },\n              width: '100%',\n              maxWidth: 'layout',\n              pb: 40\n            }}\n          >\n            <Flex as=\"article\" sx={{ flexDirection: 'column', gap: 2 }}>\n              <Text as=\"h3\">Community & Friends</Text>\n              <Text as=\"p\">\n                Share your progress and ask for help with Hack Club teens who\n                are designing their own circuit boards.\n              </Text>\n            </Flex>\n\n            <Flex as=\"article\" sx={{ flexDirection: 'column', gap: 2 }}>\n              <Text as=\"h3\">Free Manufacturing</Text>\n              <Text as=\"p\">\n                We’ll pay $100 to cover manufacturing costs, enough for 2-3\n                iterations of your design.\n              </Text>\n            </Flex>\n          </Grid>\n        </Flex>\n      </Box>\n\n      <Flex\n        as=\"section\"\n        sx={{\n          px: 4,\n          pt: 6,\n          pb: 150,\n          bg: dimBg,\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            gap: 4,\n            width: '100%',\n            maxWidth: 'copyPlus'\n          }}\n        >\n          <Heading\n            as=\"h2\"\n            sx={{\n              fontSize: 42,\n              fontWeight: 500,\n              borderTop: '4px solid',\n              borderTopColor: 'red',\n              pt: 4\n            }}\n          >\n            <Balancer ratio={0.3}>\n              Never made a circuit board before? No problem.\n            </Balancer>\n          </Heading>\n          <Text sx={{ fontSize: 3 }}>\n            Learn how to design your own circuit boards from scratch with our{' '}\n            <strong>official tutorials</strong> and jams, like Maggie’s{' '}\n            <Link href=\"https://hack.af/pcb-jam\" target=\"_blank\">\n              intro to PCB design jam\n            </Link>\n            . Ask in the{' '}\n            <Link href={slackLink} target=\"_blank\">\n              Hack Club Slack\n            </Link>{' '}\n            if you have any questions!\n          </Text>\n        </Flex>\n      </Flex>\n\n      <Flex\n        as=\"section\"\n        sx={{\n          position: 'relative',\n          top: -100,\n          px: 4,\n          mb: -100,\n          bg: 'transparent',\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Text\n          as=\"a\"\n          href=\"https://github.com/hackclub/OnBoard/pull/248/files\"\n          target=\"_blank\"\n          sx={{\n            display: 'flex',\n            bg: '#ffffff',\n            width: '100%',\n            border: `4px solid ${dimBg}`,\n            borderRadius: 'default',\n            fontSize: 22,\n            color: 'inherit',\n            textDecoration: 'inherit',\n            flexDirection: ['column', null, 'row', null],\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            maxWidth: 'copyPlus'\n          }}\n        >\n          <Text\n            as=\"p\"\n            sx={{ color: '#000000', flex: '1', maxWidth: 400, p: 4 }}\n          >\n            FRC team #4272 \"Maverick Robotics\" made this{' '}\n            <strong>swerve-drive encoder</strong> for their robot drive train\n            that's cheaper than stock sensors and saves ports on their CAN.\n          </Text>\n          <Image\n            src=\"https://cloud-of94ar9fg-hack-club-bot.vercel.app/0purple.png\"\n            alt=\"A purple arrow-shaped circuit board with the words 'maverick robotics' on it.\"\n            sx={{\n              pr: [0, null, 4, null],\n              width: '100%',\n              maxWidth: 300\n            }}\n          />\n        </Text>\n      </Flex>\n\n      {/* <Flex\n        as=\"section\"\n        sx={{\n          overflowX: 'hidden',\n          px: 4,\n          py: 5,\n          pb: 6,\n          bg: dimBg,\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'center',\n            gap: 4,\n            width: '100%',\n            maxWidth: 'copyPlus'\n          }}\n        >\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: 36, fontWeight: 500, textAlign: 'center' }}\n          >\n            <Balancer>What have people made already?</Balancer>\n          </Heading>\n\n          <Grid\n            width={350}\n            gap={3}\n            sx={{\n              width: '100%',\n              fontSize: 2,\n              a: {\n                display: 'block',\n                position: 'relative',\n                bg: '#000000',\n                borderRadius: 'default',\n                px: 3,\n                py: 4,\n                color: 'inherit',\n                textDecoration: 'inherit',\n                '.arrow': {\n                  position: 'relative',\n                  left: '0px',\n                  top: '1px', // Looks more aligned with text.\n                  display: 'inline-block',\n                  transition: 'left 80ms ease-in'\n                },\n                '&:hover .arrow': {\n                  left: '4px'\n                }\n              },\n              article: {\n                flexDirection: 'column',\n                gap: 3,\n                justifyContent: 'center',\n                height: '100%',\n                zIndex: 1\n              },\n              img: {\n                pointerEvents: 'none',\n                zIndex: 2\n              }\n            }}\n          >\n            <a\n              href=\"https://github.com/hackclub/OnBoard/tree/main/projects/E-Fidget%20Lite\"\n              target=\"_blank\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: 115 }}>\n                  A <strong>fidget spinner</strong> without any moving parts.\n                </Text>\n                <Text as=\"p\" sx={{ pr: 100, color: 'gray' }}>\n                  See Micha's work&nbsp;\n                  <span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-r2xrlpq9q-hack-club-bot.vercel.app/0spinner.png\"\n                  alt=\"A red circular circuit board with a graphic of white fidget spinner on it.\"\n                  sx={{\n                    maxWidth: 120,\n                    position: 'absolute',\n                    top: 40,\n                    right: 10\n                  }}\n                />\n              </Flex>\n            </a>\n\n            <a\n              href=\"https://github.com/hackclub/sprig-hardware\"\n              target=\"_blank\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: 100 }}>\n                  A <strong>movement sensor</strong> add-on to an open source{' '}\n                  <strong>game console</strong>.\n                </Text>\n                <Text as=\"p\" sx={{ pr: 140, color: 'gray' }}>\n                  Read the source&nbsp;<span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-6exi6bz1i-hack-club-bot.vercel.app/0rotatesprig.png\"\n                  alt=\"A black circuit board for a game console with copper wiring.\"\n                  sx={{\n                    maxWidth: 280,\n                    position: 'absolute',\n                    bottom: -40,\n                    right: -75\n                  }}\n                />\n              </Flex>\n            </a>\n\n            <a\n              href=\"https://github.com/Hugoyhu/Hack-Club-Zephyr-USB-Hub\"\n              target=\"_blank\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: [100, 100, 100, 0] }}>\n                  Hugo's <strong>USB-C hub</strong> for the best{' '}\n                  <strong>hackathon swag</strong> ever.\n                </Text>\n                <Text as=\"p\" sx={{ color: 'gray', pr: 150 }}>\n                  Build one for your event&nbsp;\n                  <span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-c953eezuq-hack-club-bot.vercel.app/0hub.png\"\n                  alt=\"A rectangular circuit board in the shape of a train car that acts as a USB type C hub.\"\n                  sx={{\n                    flex: 1,\n                    right: -15,\n                    bottom: -10,\n                    maxWidth: 260,\n                    position: 'absolute',\n                    zIndex: 6\n                  }}\n                />\n              </Flex>\n            </a>\n\n            <a\n              href=\"https://jams.hackclub.com/batch/sparkletilt-pcb\"\n              target=\"_blank\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: 140 }}>\n                  Karmanyaah's <strong>digital level</strong>, SparkleTilt.\n                </Text>\n                <Text as=\"p\" sx={{ pr: 140, color: 'gray' }}>\n                  Learn how to make your own&nbsp;<span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-myjum5y6g-hack-club-bot.vercel.app/0longhorn2.png\"\n                  alt=\"A longhorn-shaped PCB with glowing horns.\"\n                  sx={{\n                    position: 'absolute',\n                    top: 40,\n                    right: -30,\n                    maxWidth: 230,\n                    transform: 'rotate(20deg)'\n                  }}\n                />\n              </Flex>\n            </a>\n          </Grid>\n\n          <Button\n            variant=\"lg\"\n            as=\"a\"\n            href=\"https://jams.hackclub.com/tag/pcb\"\n            target=\"_blank\"\n          >\n            Learn PCB Design Now!\n          </Button>\n        </Flex>\n      </Flex> */}\n\n      <Flex\n        as=\"section\"\n        id=\"apply\"\n        sx={{\n          px: 4,\n          pt: 5,\n          bg: '#ffffff',\n          color: '#000000',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          as=\"section\"\n          sx={{\n            flexDirection: 'column',\n            gap: 4,\n            width: '100%',\n            maxWidth: 'layout'\n          }}\n          ref={containerRef}\n        >\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: 5, fontWeight: 500, textAlign: 'center' }}\n          >\n            How to Get a Grant\n          </Heading>\n\n          <Flex>\n            <Box\n              sx={{\n                ...traceSx,\n                alignSelf: 'flex-end',\n                height: busHeight\n              }}\n              ref={busRef}\n            />\n\n            <Flex\n              sx={{\n                flexDirection: ['column', 'column', 'row'],\n                flex: 1,\n                gap: 5,\n                pb: 5\n              }}\n            >\n              <Flex\n                as=\"ul\"\n                sx={{\n                  flexDirection: 'column',\n                  fontSize: 24,\n                  listStyleType: 'none',\n                  gap: 4,\n                  flex: 1,\n                  p: 0\n                }}\n              >\n                {[\n                  <>\n                    <strong>Design a PCB</strong> using any tool that can export\n                    Gerber files.\n                  </>,\n                  <>\n                    <strong>Upload your design</strong> to JLCPCB and take a\n                    screenshot.\n                  </>,\n                  <>\n                    <strong>Open source your design</strong> on GitHub and{' '}\n                    <Link\n                      href=\"https://github.com/hackclub/OnBoard/blob/main/README.md\"\n                      target=\"_blank\"\n                    >\n                      apply for the grant\n                    </Link>\n                    ! You must be a teenager in high school to apply.\n                  </>\n                ].map((text, i) => (\n                  <Text\n                    as=\"li\"\n                    key={i}\n                    sx={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      position: 'relative'\n                    }}\n                  >\n                    <Box\n                      sx={{\n                        width: 30,\n                        height: 30,\n                        borderWidth: traceSx.width,\n                        borderStyle: 'solid',\n                        borderColor: traceSx.bg,\n                        borderRadius: '50%',\n                        left: t => -60,\n                        position: 'absolute'\n                      }}\n                    >\n                      <Box\n                        ref={i === 0 ? connectorRef : null}\n                        sx={{\n                          // Yeah, yeah, it's a 45-45-90 triangle...\n                          // I'm too lazy to do math though, so I'm hardcoding\n                          // coords until there's actually a problem.\n                          width: traceSx.width,\n                          height: 69,\n                          bg: traceSx.bg,\n                          position: 'absolute',\n                          transform: 'rotate(45deg)',\n                          transformOrigin: 'top right',\n                          top: '20.5px',\n                          left: '-5px'\n                        }}\n                      />\n                    </Box>\n\n                    <span>{text}</span>\n                  </Text>\n                ))}\n              </Flex>\n\n              <Tilt options={{ scale: 1 }}>\n                <Image\n                  src=\"https://cloud-hy108iezt-hack-club-bot.vercel.app/0dinopcb.png\"\n                  alt=\"A complex white circuit board in the shape of a cute leaping dinosaur.\"\n                  loading=\"lazy\"\n                  sx={{\n                    flex: 1,\n                    maxWidth: 350,\n                    objectFit: 'contain',\n                    mt: ['-40px', '-40px', 0]\n                  }}\n                />\n              </Tilt>\n            </Flex>\n          </Flex>\n        </Flex>\n      </Flex>\n\n      <Flex\n        sx={{\n          px: 4,\n          bg: '#000000',\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex as=\"section\" sx={{ width: '100%', maxWidth: 'layout' }}>\n          <Box sx={traceSx}>\n            <Box\n              sx={{\n                height: traceSx.width,\n                width: 40,\n                bg: traceSx.bg,\n                position: 'absolute',\n                bottom: 0,\n                left: -20 + traceSx.width / 2\n              }}\n            />\n          </Box>\n\n          <Flex sx={{ flex: 1, flexDirection: 'column', gap: 4, py: 5 }}>\n            <Heading as=\"h2\" sx={{ fontSize: 36, fontWeight: 500 }}>\n              <Balancer>Join the Hack Club Slack</Balancer>\n            </Heading>\n            <Text as=\"p\" sx={{ fontSize: 24 }}>\n              Meet others learning how to make their own circuit boards.\n              Collaborate, get help, and support others as you take the leap.\n            </Text>\n            <Box sx={{ mt: 1 }}>\n              <Button\n                variant=\"outlineLg\"\n                as=\"a\"\n                href={slackLink}\n                target=\"_blank\"\n              >\n                Join Slack\n              </Button>\n            </Box>\n          </Flex>\n        </Flex>\n      </Flex>\n\n      <Flex\n        as=\"section\"\n        sx={{\n          overflowX: 'hidden',\n          px: 4,\n          py: 6,\n          bg: '#000000',\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'center',\n            gap: 5,\n            width: '100%',\n            maxWidth: 'layout'\n          }}\n        >\n          {/* For accessibility and screen readers: */}\n          <Heading\n            as=\"h2\"\n            sx={{\n              position: 'absolute',\n              width: '1px',\n              height: '1px',\n              margin: '-1px',\n              overflow: 'hidden',\n              clip: 'rect(0, 0, 0, 0)',\n              whiteSpace: 'nowrap',\n              borderWidth: 0\n            }}\n          >\n            Let's Recap\n          </Heading>\n\n          <Grid\n            ref={lightsScrollTrigger}\n            gap={['2px', '3px', '4px']}\n            columns={recapWidth}\n            sx={{ width: '100%', maxWidth: 800 }}\n          >\n            {recapPixels.map((_, i) => (\n              <Box\n                id={`pixel-${i}`}\n                key={i}\n                sx={{ bg: dimBg, paddingTop: '100%' }}\n              />\n            ))}\n          </Grid>\n\n          <Grid\n            width={300}\n            gap={4}\n            sx={{\n              width: '100%',\n              article: {\n                bg: dimBg,\n                borderRadius: 'default',\n                p: 4,\n                flexDirection: 'column',\n                boxShadow: 'inset 0px 0px 14px rgba(255, 255, 255, 0.15);'\n              },\n              h3: {\n                fontSize: 3,\n                mb: 3\n              },\n              p: {\n                fontSize: 18,\n                pb: 3,\n                mb: '6px'\n              }\n            }}\n          >\n            <Flex as=\"article\">\n              <Text as=\"h3\">$100 Grants</Text>\n              <Text as=\"p\">\n                We’ll pay $100 to manufacture your boards, all components\n                included.\n              </Text>\n              <Button\n                variant=\"outline\"\n                as=\"a\"\n                href=\"https://hackclub.com/onboard/first_and_hack_club.pdf\"\n                target=\"_blank\"\n              >\n                Download the PDF\n              </Button>\n            </Flex>\n\n            <Flex\n              as=\"article\"\n              sx={{\n                transform: 'scale(1.1)'\n              }}\n            >\n              <Text as=\"h3\">Learn to PCB</Text>\n              <Text as=\"p\">\n                Read our tutorials to learn how to make a simple circuit boards\n                from start to end.\n              </Text>\n              <Button\n                as=\"a\"\n                href=\"https://jams.hackclub.com/tag/pcb\"\n                target=\"_blank\"\n              >\n                Start the Tutorial\n              </Button>\n            </Flex>\n\n            <Flex as=\"article\">\n              <Text as=\"h3\">Community</Text>\n              <Text as=\"p\">\n                Share progress with fellow participants and ask for help in the\n                Hack Club Slack.\n              </Text>\n              <Button variant=\"outline\" as=\"a\" href={slackLink} target=\"_blank\">\n                Join Slack\n              </Button>\n            </Flex>\n          </Grid>\n        </Flex>\n      </Flex>\n\n      <Box sx={{ position: 'relative' }}>\n        <Image\n          src=\"https://cloud-f4lij7sq1-hack-club-bot.vercel.app/0flowerpcb.png\"\n          alt=\"A big image of several pink flower-shaped PCBs.\"\n          loading=\"lazy\"\n          sx={{\n            display: 'block',\n            width: '100%',\n            height: 500,\n            objectFit: 'cover'\n          }}\n        />\n\n        <Flex\n          as=\"a\"\n          href=\"https://airtable.com/shrOOU2ZZFYtffUVz\"\n          target=\"_blank\"\n          sx={{\n            bg: '#ff0000',\n            color: 'rgba(255, 255, 255, 0.7)',\n            textDecoration: 'none',\n            size: 160,\n            flexDirection: 'column',\n            textAlign: 'center',\n            justifyContent: 'center',\n            alignItems: 'center',\n            position: 'absolute',\n            top: -80,\n            right: '14vw',\n            fontSize: '24px',\n            lineHeight: 1.2,\n            fontWeight: 'bold',\n            fontFamily: `'${stickerButtonFont}', cursive`,\n            transform: 'rotate(-25deg)',\n            borderRadius: '50%',\n            // Terrible buttons styles, doesn't even look good, but didn't want to waste more time:\n            backgroundImage:\n              'radial-gradient(75.96% 56.13% at 50.00% 50.00%, #FF6464 0%, #EF2222 32.29%, #B00 100%)',\n            boxShadow:\n              '0px -14px 14px 0px #670000 inset, 14px 0px 14px 0px rgba(255, 255, 255, 0.25) inset, 0px 14px 14px 0px rgba(255, 255, 255, 0.25) inset, -14px 0px 14px 0px #670000 inset',\n            filter: 'drop-shadow(3px 3px 8px rgba(0, 0, 0, 0.50))',\n            textShadow: '0px 0px 2px rgba(255, 255, 255, 0.45)',\n            WebkitTapHighlightColor: 'transparent',\n            transition:\n              'box-shadow 80ms linear, filter 80ms linear, font-size 80ms linear',\n            ':active': {\n              backgroundImage:\n                'radial-gradient(75.96% 56.13% at 50.00% 50.00%, #FF4747 0%, #E52121 32.29%, #B00 100%, #A30101 100%)',\n              boxShadow:\n                '0px -14px 14px 0px #440303 inset, 14px 0px 14px 0px #860000 inset, 0px 14px 14px 0px #860000 inset, -14px 0px 14px 0px #440303 inset',\n              filter: 'drop-shadow(0px 0px 8px rgba(0, 0, 0, 0.50))',\n              fontSize: '22px'\n            }\n          }}\n        >\n          {stickerButtonText.split(' ').map((line, i) => (\n            <div key={i}>{line}</div>\n          ))}\n        </Flex>\n      </Box>\n\n      <Footer dark />\n    </>\n  )\n}\n\nexport default ShipPage\n"
  },
  {
    "path": "pages/onboard/gallery/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { GalleryPage } from '../../../components/onboard/gallery-paginated'\nimport { getAllOnboardProjects } from '../../api/onboard/p'\nimport { getOnboardProject } from '../../api/onboard/p/[project]'\n\nexport default function Index({ projects, itemCount }) {\n  return (\n    <GalleryPage\n      currentPage={1}\n      itemCount={itemCount}\n      currentProjects={projects}\n    />\n  )\n}\n\nexport async function getStaticProps() {\n  const allProjects = await getAllOnboardProjects()\n  const data = allProjects.slice(0, 10)\n  const projects = []\n  for (const project of data) {\n    projects.push(await getOnboardProject(project.name))\n  }\n  return {\n    props: {\n      projects,\n      itemCount: allProjects.length\n    },\n    revalidate: 120 // 2 minutes\n  }\n}\n"
  },
  {
    "path": "pages/onboard/index.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Button, Flex, Grid, Heading, Image, Link, Text } from 'theme-ui'\nimport Balancer from 'react-wrap-balancer'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../../components/nav'\nimport Footer from '../../components/footer'\nimport FadeIn from '../../components/fade-in'\nimport Sparkles from '../../components/sparkles'\nimport Tilt from '../../components/tilt'\nimport Recap from '../../components/onboard/recap'\nimport usePrefersReducedMotion from '../../lib/use-prefers-reduced-motion'\nimport { useEffect, useRef, useState } from 'react'\nimport sleep from '../../lib/sleep'\nimport Announcement from '../../components/announcement'\nimport YoutubeVideo from '../../components/onboard/youtube-video'\nimport Icon from '@hackclub/icons'\n\n/**\n * @type {import('theme-ui').ThemeUIStyleObject}\n */\nconst traceSx = {\n  width: 6,\n  bg: '#e2b747',\n  alignSelf: 'stretch',\n  mr: 100,\n  position: 'relative'\n}\n\nconst dimBg = '#151515'\n\nconst slackLink = 'https://slack.hackclub.com'\n\nconst stickerButtonText = 'Click 4 Stickers'\nconst stickerButtonFont = 'Oleo Script'\nconst stickerButtonFontStylesheet = `https://fonts.googleapis.com/css2?family=${encodeURIComponent(\n  stickerButtonFont\n)}&display=swap&text=${encodeURIComponent(stickerButtonText)}`\n\nconst wandImgTraced =\n  'https://cloud-8lszi55ph-hack-club-bot.vercel.app/10frame_2.png'\nconst wandImgRendered =\n  'https://cloud-8lszi55ph-hack-club-bot.vercel.app/00frame_1.png'\n\nconst ShipPage = () => {\n  const prefersReducedMotion = usePrefersReducedMotion()\n\n  // Wand flicker animation\n  const [wandImg, setWandImg] = useState(wandImgTraced)\n  const wandAnimated = useRef(false)\n  useEffect(() => {\n    let canceled = false\n\n    const flicker = async () => {\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(Math.random() * 80 + 10)\n      if (canceled) return\n      setWandImg(wandImgRendered)\n      setTimeout(flicker, Math.random() * 4000 + 500)\n    }\n\n    const animate = async () => {\n      if (wandAnimated.current) return\n      wandAnimated.current = true\n\n      await sleep(1500)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      await sleep(60)\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(340)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      await sleep(14)\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(55)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      await sleep(10)\n      if (canceled) return\n      setWandImg(wandImgTraced)\n      await sleep(150)\n      if (canceled) return\n\n      setWandImg(wandImgRendered)\n      setTimeout(flicker, 1200)\n    }\n\n    if (prefersReducedMotion) {\n      setWandImg(wandImgRendered)\n    } else {\n      animate()\n    }\n\n    return () => {\n      canceled = true\n    }\n  }, [prefersReducedMotion])\n\n  // Spotlight effect\n  const spotlightRef = useRef(null)\n  useEffect(() => {\n    const handler = event => {\n      const rect = spotlightRef.current.getBoundingClientRect()\n      const x = event.clientX - rect.left\n      const y = event.clientY - rect.top\n      spotlightRef.current.style.background = `radial-gradient(\n\t\t\t\tcircle at ${x}px ${y}px,\n\t\t\t\trgba(0, 0, 0, 0) 10px,\n\t\t\t\trgba(0, 0, 0, 0.8) 80px\n\t\t\t)`\n    }\n    window.addEventListener('mousemove', handler)\n    return () => window.removeEventListener('mousemove', handler)\n  }, [])\n\n  // Calculating the bus height to match the bottom left of the first connector.\n  const [busHeight, setBusHeight] = useState(null)\n  const containerRef = useRef(null) // For ResizeObserver\n  const connectorRef = useRef(null) // To get bottom left position\n  const busRef = useRef(null) // To calculate height differential\n\n  useEffect(() => {\n    const observer = new ResizeObserver(() => {\n      const connectorRect = connectorRef.current.getBoundingClientRect()\n      const busRect = busRef.current.getBoundingClientRect()\n      setBusHeight(busRect.bottom - connectorRect.bottom + 4.5)\n    })\n\n    observer.observe(containerRef.current)\n    return () => observer.disconnect()\n  }, [])\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        name=\"OnBoard\"\n        description={`We'll pay manufacturing costs for any high schooler (or younger!) who designs a circuit board.`}\n        image=\"https://cloud-n2wfd6ra6-hack-club-bot.vercel.app/0onboard-twitter.png\"\n      />\n\n      <style>{`\n\t\t\t\t@import url('${stickerButtonFontStylesheet}');\n\n\t\t\t\t@font-face {\n\t\t\t\t\tfont-family: 'Phantom Sans';\n\t\t\t\t\tsrc: url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff')\n\t\t\t\t\t\t\tformat('woff'),\n\t\t\t\t\t\turl('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Med.woff2')\n\t\t\t\t\t\t\tformat('woff2');\n\t\t\t\t\tfont-weight: 500;\n\t\t\t\t\tfont-style: normal;\n\t\t\t\t\tfont-display: swap;\n\t\t\t\t}\n\n\t\t\t\thtml {\n\t\t\t\t\tscroll-behavior: smooth;\n\t\t\t\t}\n\t\t\t`}</style>\n\n      <Head>\n        <link rel=\"preload\" href={wandImgRendered} as=\"image\" />\n      </Head>\n\n      <Box sx={{ bg: '#000000', height: '64px' }} />\n      <Nav />\n\n      <Box\n        sx={{\n          backgroundColor: '#0e305b',\n          backgroundImage:\n            'linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px)',\n          backgroundSize: '50px 50px',\n          backgroundPosition: '0 0, 0 0',\n          color: 'white',\n          p: 3,\n          textAlign: 'center',\n          fontSize: 3,\n          fontWeight: 'bold',\n          position: 'relative',\n          border: '4px solid white'\n        }}\n      >\n        OnBoard has ended!{' '}\n        <Link\n          href=\"https://fallout.hackclub.com/?utm_source=onboard-site\"\n          target=\"_blank\"\n          sx={{ color: 'white', textDecoration: 'underline' }}\n        >\n          Click here\n        </Link>{' '}\n        to sign up for Fallout - the next hardware program\n      </Box>\n\n      <Box\n        as=\"header\"\n        sx={{\n          bg: '#000000',\n          backgroundImage: `\n\t\t\t\t\t\tlinear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)),\n\t\t\t\t\t\turl('https://cloud-dst3a9oz5-hack-club-bot.vercel.app/0image.png')\n\t\t\t\t\t`,\n          color: '#ffffff',\n          position: 'relative'\n        }}\n      >\n        <Box\n          ref={spotlightRef}\n          sx={{\n            position: 'absolute',\n            zIndex: 2,\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            bg: '#000000',\n            pointerEvents: 'none'\n          }}\n        />\n\n        <Flex\n          sx={{\n            p: 4,\n            flexDirection: 'column',\n            alignItems: 'center',\n            zIndex: 5,\n            position: 'relative'\n          }}\n        >\n          <Box sx={{ pt: [3, 5] }}>\n            <Announcement\n              copy=\"Steve Wozniak, Apple co-founder, about OnBoard\"\n              caption=\"I’m so glad young people can create PCBs online. May your creativity change the world! Mine did.\"\n              imgSrc=\"https://cloud-iddh16j0r-hack-club-bot.vercel.app/0stevew.png\"\n              imgAlt=\"A picture of Steve Wozniak who is a co-founder of Apple.\"\n              color=\"primary\"\n            />\n          </Box>\n          <Flex\n            sx={{\n              pt: [3, 1],\n              width: '100%',\n              maxWidth: 'layout',\n              alignItems: 'center'\n            }}\n          >\n            <Flex sx={{ flex: 1, flexDirection: 'column', gap: 25 }}>\n              <Heading\n                as=\"h1\"\n                sx={{\n                  fontSize: 80,\n                  maxWidth: 'copyPlus',\n                  textShadow: '0 0 30px rgba(42, 252, 88, 0.6)',\n                  color: '#87ffa1'\n                }}\n              >\n                <Balancer ratio={0.3}>OnBoard</Balancer>\n              </Heading>\n\n              <Heading\n                as=\"div\"\n                sx={{ fontSize: 4, fontWeight: 400, maxWidth: 'copyPlus' }}\n              >\n                <Balancer ratio={0.3}>\n                  Circuit boards are{' '}\n                  <Sparkles>\n                    <Text sx={{ fontWeight: 400 }}>magical{'.'}</Text>\n                  </Sparkles>{' '}\n                  You design one, we'll print it!\n                </Balancer>\n              </Heading>\n\n              <Flex sx={{ mt: 16, gap: 10, flexDirection: ['column', 'row'] }}>\n                <Button\n                  variant=\"ctaLg\"\n                  as=\"a\"\n                  href=\"https://jams.hackclub.com/tag/pcb\"\n                  target=\"_blank\"\n                  sx={{\n                    background: t => t.util.gx('#60cc38', '#113b11')\n                  }}\n                >\n                  Learn PCB Design Now!\n                </Button>\n\n                <Button\n                  variant=\"outlineLg\"\n                  as=\"a\"\n                  href=\"https://github.com/hackclub/OnBoard/blob/main/README.md\"\n                  target=\"_blank\"\n                  sx={{\n                    borderColor: '#113b11',\n                    color: '#60cc38'\n                  }}\n                >\n                  Get a Grant\n                </Button>\n              </Flex>\n            </Flex>\n\n            <Box sx={{ flex: 1, maxWidth: 230 }}>\n              <FadeIn duration={800} delay={100}>\n                <Image\n                  src={wandImg}\n                  alt=\"A circuit board of a dino wizard with a light up wand.\"\n                />\n              </FadeIn>\n            </Box>\n          </Flex>\n\n          <Heading\n            as=\"h2\"\n            sx={{\n              pt: 60,\n              pb: 35,\n              fontSize: 36,\n              fontWeight: 500,\n              maxWidth: 'copy',\n              textAlign: 'center'\n            }}\n          >\n            <Balancer ratio={0.8}>\n              Join 1,000 others to create your own circuit board.\n            </Balancer>\n          </Heading>\n\n          <Grid\n            width={300}\n            gap={4}\n            sx={{\n              fontSize: 2,\n              h3: { fontSize: 2 },\n              width: '100%',\n              maxWidth: 'layout',\n              pb: 40\n            }}\n          >\n            <Flex as=\"article\" sx={{ flexDirection: 'column', gap: 2 }}>\n              <Text as=\"h3\">Community & Friends</Text>\n              <Text as=\"p\">\n                Share your progress and ask for help with Hack Club teens who\n                are designing their own circuit boards.\n              </Text>\n            </Flex>\n\n            <Flex as=\"article\" sx={{ flexDirection: 'column', gap: 2 }}>\n              <Text as=\"h3\">Free Manufacturing</Text>\n              <Text as=\"p\">\n                We’ll pay $100 to cover manufacturing costs, enough for 2-3\n                iterations of your design.\n              </Text>\n            </Flex>\n          </Grid>\n        </Flex>\n      </Box>\n\n      <Flex\n        as=\"section\"\n        sx={{\n          px: 4,\n          pt: 6,\n          pb: 4,\n          bg: dimBg,\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            gap: 4,\n            width: '100%',\n            maxWidth: 'copyPlus'\n          }}\n        >\n          <Heading\n            as=\"h2\"\n            sx={{\n              fontSize: 42,\n              fontWeight: 500,\n              borderTop: '4px solid',\n              borderTopColor: 'red',\n              pt: 4\n            }}\n          >\n            <Balancer ratio={0.3}>\n              Never made a circuit board before? No problem.\n            </Balancer>\n          </Heading>\n          <Flex sx={{ flexDirection: 'column' }}>\n            <YoutubeVideo\n              youtube-id=\"LrSKs35nR8k\"\n              list=\"PLbNbddgD-XxECO7C2z-FAlSoJ57VqcJA3\"\n              height=\"300px\"\n            />\n            <Text sx={{ fontSize: 2, color: 'muted' }}>\n              See the{' '}\n              <Link\n                href=\"https://www.youtube.com/watch?v=LrSKs35nR8k&list=PLbNbddgD-XxECO7C2z-FAlSoJ57VqcJA3\"\n                target=\"_blank\"\n              >\n                full playlist\n                <Icon glyph=\"external\" size={18} />\n              </Link>\n            </Text>\n          </Flex>\n          <Text sx={{ fontSize: 3 }}>\n            Learn how to design your own circuit boards from scratch with our{' '}\n            <strong>official tutorials</strong> and jams, like Maggie’s{' '}\n            <Link href=\"https://hack.af/pcb-jam\" target=\"_blank\">\n              intro to PCB design jam\n            </Link>\n            . Ask in the{' '}\n            <Link href={slackLink} target=\"_blank\">\n              Hack Club Slack\n            </Link>{' '}\n            if you have any questions!\n          </Text>\n        </Flex>\n      </Flex>\n\n      <Flex\n        as=\"section\"\n        sx={{\n          overflowX: 'hidden',\n          px: 4,\n          py: 5,\n          pb: 6,\n          bg: dimBg,\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'center',\n            gap: 4,\n            width: '100%',\n            maxWidth: 'copyPlus'\n          }}\n        >\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: 36, fontWeight: 500, textAlign: 'center' }}\n          >\n            <Balancer>What have people made already?</Balancer>\n          </Heading>\n\n          <Grid\n            width={350}\n            gap={3}\n            sx={{\n              width: '100%',\n              fontSize: 2,\n              a: {\n                display: 'block',\n                position: 'relative',\n                bg: '#000000',\n                borderRadius: 'default',\n                px: 3,\n                py: 4,\n                color: 'inherit',\n                textDecoration: 'inherit',\n                '.arrow': {\n                  position: 'relative',\n                  left: '0px',\n                  top: '1px', // Looks more aligned with text.\n                  display: 'inline-block',\n                  transition: 'left 80ms ease-in'\n                },\n                '&:hover .arrow': {\n                  left: '4px'\n                }\n              },\n              article: {\n                flexDirection: 'column',\n                gap: 3,\n                justifyContent: 'center',\n                height: '100%',\n                zIndex: 1\n              },\n              img: {\n                pointerEvents: 'none',\n                zIndex: 2\n              }\n            }}\n          >\n            <a\n              href=\"https://github.com/hackclub/OnBoard/tree/main/projects/E-Fidget%20Lite\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: 115 }}>\n                  A <strong>fidget spinner</strong> without any moving parts.\n                </Text>\n                <Text as=\"p\" sx={{ pr: 100, color: 'gray' }}>\n                  See Micha's work&nbsp;\n                  <span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-r2xrlpq9q-hack-club-bot.vercel.app/0spinner.png\"\n                  alt=\"A red circular circuit board with a graphic of white fidget spinner on it.\"\n                  sx={{\n                    maxWidth: 120,\n                    position: 'absolute',\n                    top: 40,\n                    right: 10\n                  }}\n                />\n              </Flex>\n            </a>\n\n            {/* <a\n              href=\"https://github.com/hackclub/OnBoard/tree/main/projects/proto2040\"\n              target=\"_blank\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: 100 }}>\n                  The cutest, tiniest raspberry pi-base developer board.\n                </Text>\n                <Text as=\"p\" sx={{ pr: 140, color: 'gray' }}>\n                  Read Paolo's work&nbsp;<span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-6a1wip38p-hack-club-bot.vercel.app/02023-07-21t14_56_26.548z-img_20230720_175244.png\"\n                  alt=\"A black circuit board for a game console with copper wiring.\"\n                  sx={{\n                    maxWidth: 180,\n                    position: 'absolute',\n                    bottom: -40,\n                    right: -75\n                  }}\n                />\n              </Flex>\n            </a> */}\n\n            <a\n              href=\"https://jams.hackclub.com/batch/usb-hub\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: [100, 100, 100, 0] }}>\n                  Hugo's <strong>USB-C hub</strong> for the best{' '}\n                  <strong>hackathon swag</strong> ever.\n                </Text>\n                <Text as=\"p\" sx={{ color: 'gray', pr: 150 }}>\n                  Build one for your event&nbsp;\n                  <span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-c953eezuq-hack-club-bot.vercel.app/0hub.png\"\n                  alt=\"A rectangular circuit board in the shape of a train car that acts as a USB type C hub.\"\n                  sx={{\n                    flex: 1,\n                    right: -15,\n                    bottom: -10,\n                    maxWidth: 260,\n                    position: 'absolute',\n                    zIndex: 6\n                  }}\n                />\n              </Flex>\n            </a>\n\n            <a\n              href=\"https://jams.hackclub.com/batch/sparkletilt-pcb\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: 140 }}>\n                  Karmanyaah's <strong>digital level</strong>, SparkleTilt.\n                </Text>\n                <Text as=\"p\" sx={{ pr: 140, color: 'gray' }}>\n                  Learn how to make your own&nbsp;\n                  <span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-myjum5y6g-hack-club-bot.vercel.app/0longhorn2.png\"\n                  alt=\"A longhorn-shaped PCB with glowing horns.\"\n                  sx={{\n                    position: 'absolute',\n                    top: 40,\n                    right: -30,\n                    maxWidth: 230,\n                    transform: 'rotate(20deg)'\n                  }}\n                />\n              </Flex>\n            </a>\n\n            <a\n              href=\"https://github.com/hackclub/OnBoard/tree/main/projects/TOTKey\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n            >\n              <Flex as=\"article\">\n                <Text as=\"p\" sx={{ pr: 140 }}>\n                  Build your own <strong>hardware key</strong>.\n                </Text>\n                <Text as=\"p\" sx={{ pr: 140, color: 'gray' }}>\n                  Learn how to make your own&nbsp;\n                  <span className=\"arrow\">&rarr;</span>\n                </Text>\n                <Image\n                  src=\"https://cloud-6a1wip38p-hack-club-bot.vercel.app/1totk_key.png\"\n                  alt=\"A long PCB with a pixelated screen.\"\n                  sx={{\n                    position: 'absolute',\n                    top: 40,\n                    right: -30,\n                    maxWidth: 230,\n                    transform: 'rotate(20deg)'\n                  }}\n                />\n              </Flex>\n            </a>\n          </Grid>\n\n          <Button\n            variant=\"lg\"\n            as=\"a\"\n            href=\"https://jams.hackclub.com/tag/pcb\"\n            target=\"_blank\"\n          >\n            Learn PCB Design Now!\n          </Button>\n        </Flex>\n      </Flex>\n\n      <Flex\n        as=\"section\"\n        id=\"apply\"\n        sx={{\n          px: 4,\n          pt: 5,\n          bg: '#ffffff',\n          color: '#000000',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          as=\"section\"\n          sx={{\n            flexDirection: 'column',\n            gap: 4,\n            width: '100%',\n            maxWidth: 'layout'\n          }}\n          ref={containerRef}\n        >\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: 5, fontWeight: 500, textAlign: 'center' }}\n          >\n            How to Get a Free Circuit Board\n          </Heading>\n\n          <Flex>\n            <Box\n              sx={{\n                ...traceSx,\n                alignSelf: 'flex-end',\n                height: busHeight\n              }}\n              ref={busRef}\n            />\n\n            <Flex\n              sx={{\n                flexDirection: ['column', 'column', 'row'],\n                flex: 1,\n                gap: 5,\n                pb: 5\n              }}\n            >\n              <Flex\n                as=\"ul\"\n                sx={{\n                  flexDirection: 'column',\n                  fontSize: 24,\n                  listStyleType: 'none',\n                  gap: 4,\n                  flex: 1,\n                  p: 0\n                }}\n              >\n                {[\n                  <>\n                    <strong>Design a PCB</strong> using any tool that can export\n                    Gerber files.\n                  </>,\n                  <>\n                    <strong>Upload your design</strong> to JLCPCB and take a\n                    screenshot.\n                  </>,\n                  <>\n                    <strong>Open source your design</strong> on GitHub and{' '}\n                    <Link\n                      href=\"https://github.com/hackclub/OnBoard/blob/main/README.md\"\n                      target=\"_blank\"\n                    >\n                      apply for the grant\n                    </Link>\n                    ! You must be a teenager in high school or younger to apply.\n                  </>\n                ].map((text, i) => (\n                  <Text\n                    as=\"li\"\n                    key={i}\n                    sx={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      position: 'relative'\n                    }}\n                  >\n                    <Box\n                      sx={{\n                        width: 30,\n                        height: 30,\n                        borderWidth: traceSx.width,\n                        borderStyle: 'solid',\n                        borderColor: traceSx.bg,\n                        borderRadius: '50%',\n                        left: t => -60,\n                        position: 'absolute'\n                      }}\n                    >\n                      <Box\n                        ref={i === 0 ? connectorRef : null}\n                        sx={{\n                          // Yeah, yeah, it's a 45-45-90 triangle...\n                          // I'm too lazy to do math though, so I'm hardcoding\n                          // coords until there's actually a problem.\n                          width: traceSx.width,\n                          height: 69,\n                          bg: traceSx.bg,\n                          position: 'absolute',\n                          transform: 'rotate(45deg)',\n                          transformOrigin: 'top right',\n                          top: '20.5px',\n                          left: '-5px'\n                        }}\n                      />\n                    </Box>\n\n                    <span>{text}</span>\n                  </Text>\n                ))}\n              </Flex>\n\n              <Tilt options={{ scale: 1 }}>\n                <Image\n                  src=\"https://cloud-hy108iezt-hack-club-bot.vercel.app/0dinopcb.png\"\n                  alt=\"A complex white circuit board in the shape of a cute leaping dinosaur.\"\n                  loading=\"lazy\"\n                  sx={{\n                    flex: 1,\n                    maxWidth: 350,\n                    objectFit: 'contain',\n                    mt: ['-40px', '-40px', 0]\n                  }}\n                />\n              </Tilt>\n            </Flex>\n          </Flex>\n        </Flex>\n      </Flex>\n\n      <Flex\n        sx={{\n          px: 4,\n          bg: '#000000',\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex as=\"section\" sx={{ width: '100%', maxWidth: 'layout' }}>\n          <Box sx={traceSx}>\n            <Box\n              sx={{\n                height: traceSx.width,\n                width: 40,\n                bg: traceSx.bg,\n                position: 'absolute',\n                bottom: 0,\n                left: -20 + traceSx.width / 2\n              }}\n            />\n          </Box>\n\n          <Flex sx={{ flex: 1, flexDirection: 'column', gap: 4, py: 5 }}>\n            <Heading as=\"h2\" sx={{ fontSize: 36, fontWeight: 500 }}>\n              <Balancer>Join the Hack Club Slack</Balancer>\n            </Heading>\n            <Text as=\"p\" sx={{ fontSize: 24 }}>\n              Meet others learning how to make their own circuit boards.\n              Collaborate, get help, and support others as you take the leap.\n            </Text>\n            <Box sx={{ mt: 1 }}>\n              <Button\n                variant=\"outlineLg\"\n                as=\"a\"\n                href={slackLink}\n                target=\"_blank\"\n              >\n                Join Slack\n              </Button>\n            </Box>\n          </Flex>\n        </Flex>\n      </Flex>\n\n      <Flex\n        as=\"section\"\n        sx={{\n          overflowX: 'hidden',\n          px: 4,\n          py: 6,\n          bg: '#000000',\n          color: '#ffffff',\n          justifyContent: 'center'\n        }}\n      >\n        <Flex\n          sx={{\n            flexDirection: 'column',\n            alignItems: 'center',\n            gap: 5,\n            width: '100%',\n            maxWidth: 'layout'\n          }}\n        >\n          {/* For accessibility and screen readers: */}\n          <Heading\n            as=\"h2\"\n            sx={{\n              position: 'absolute',\n              width: '1px',\n              height: '1px',\n              margin: '-1px',\n              overflow: 'hidden',\n              clip: 'rect(0, 0, 0, 0)',\n              whiteSpace: 'nowrap',\n              borderWidth: 0\n            }}\n          >\n            Let's Recap\n          </Heading>\n\n          <Recap />\n          <Grid\n            width={300}\n            gap={4}\n            sx={{\n              width: '100%',\n              article: {\n                bg: dimBg,\n                borderRadius: 'default',\n                p: 4,\n                flexDirection: 'column',\n                boxShadow: 'inset 0px 0px 14px rgba(255, 255, 255, 0.15);'\n              },\n              h3: {\n                fontSize: 3,\n                mb: 3\n              },\n              p: {\n                fontSize: 18,\n                pb: 3,\n                mb: '6px'\n              }\n            }}\n          >\n            <Flex as=\"article\">\n              <Text as=\"h3\">$100 Grants</Text>\n              <Text as=\"p\">\n                We’ll pay $100 to manufacture your boards, all components\n                included.\n              </Text>\n              <Button\n                variant=\"outline\"\n                as=\"a\"\n                href=\"https://github.com/hackclub/OnBoard#requirements\"\n                target=\"_blank\"\n              >\n                Get a Grant\n              </Button>\n            </Flex>\n\n            <Flex\n              as=\"article\"\n              sx={{\n                transform: 'scale(1.1)'\n              }}\n            >\n              <Text as=\"h3\">Learn to PCB</Text>\n              <Text as=\"p\">\n                Read our tutorials to learn how to make a simple circuit boards\n                from start to end.\n              </Text>\n              <Button\n                as=\"a\"\n                href=\"https://jams.hackclub.com/tag/pcb\"\n                target=\"_blank\"\n              >\n                Start the Tutorial\n              </Button>\n            </Flex>\n\n            <Flex as=\"article\">\n              <Text as=\"h3\">Community</Text>\n              <Text as=\"p\">\n                Share progress with fellow participants and ask for help in the\n                Hack Club Slack.\n              </Text>\n              <Button variant=\"outline\" as=\"a\" href={slackLink} target=\"_blank\">\n                Join Slack\n              </Button>\n            </Flex>\n          </Grid>\n        </Flex>\n      </Flex>\n\n      <Box sx={{ position: 'relative' }}>\n        <Image\n          src=\"https://cloud-f4lij7sq1-hack-club-bot.vercel.app/0flowerpcb.png\"\n          alt=\"A big image of several pink flower-shaped PCBs.\"\n          loading=\"lazy\"\n          sx={{\n            display: 'block',\n            width: '100%',\n            height: 500,\n            objectFit: 'cover'\n          }}\n        />\n\n        <Flex\n          as=\"a\"\n          href=\"https://airtable.com/shrOOU2ZZFYtffUVz\"\n          target=\"_blank\"\n          sx={{\n            bg: '#ff0000',\n            color: 'rgba(255, 255, 255, 0.7)',\n            textDecoration: 'none',\n            size: 160,\n            flexDirection: 'column',\n            textAlign: 'center',\n            justifyContent: 'center',\n            alignItems: 'center',\n            position: 'absolute',\n            top: -80,\n            right: '14vw',\n            fontSize: '24px',\n            lineHeight: 1.2,\n            fontWeight: 'bold',\n            fontFamily: `'${stickerButtonFont}', cursive`,\n            transform: 'rotate(-25deg)',\n            borderRadius: '50%',\n            // Terrible buttons styles, doesn't even look good, but didn't want to waste more time:\n            backgroundImage:\n              'radial-gradient(75.96% 56.13% at 50.00% 50.00%, #FF6464 0%, #EF2222 32.29%, #B00 100%)',\n            boxShadow:\n              '0px -14px 14px 0px #670000 inset, 14px 0px 14px 0px rgba(255, 255, 255, 0.25) inset, 0px 14px 14px 0px rgba(255, 255, 255, 0.25) inset, -14px 0px 14px 0px #670000 inset',\n            filter: 'drop-shadow(3px 3px 8px rgba(0, 0, 0, 0.50))',\n            textShadow: '0px 0px 2px rgba(255, 255, 255, 0.45)',\n            WebkitTapHighlightColor: 'transparent',\n            transition:\n              'box-shadow 80ms linear, filter 80ms linear, font-size 80ms linear',\n            ':active': {\n              backgroundImage:\n                'radial-gradient(75.96% 56.13% at 50.00% 50.00%, #FF4747 0%, #E52121 32.29%, #B00 100%, #A30101 100%)',\n              boxShadow:\n                '0px -14px 14px 0px #440303 inset, 14px 0px 14px 0px #860000 inset, 0px 14px 14px 0px #860000 inset, -14px 0px 14px 0px #440303 inset',\n              filter: 'drop-shadow(0px 0px 8px rgba(0, 0, 0, 0.50))',\n              fontSize: '22px'\n            }\n          }}\n        >\n          {stickerButtonText.split(' ').map((line, i) => (\n            <div key={i}>{line}</div>\n          ))}\n        </Flex>\n      </Box>\n\n      <Footer dark />\n    </>\n  )\n}\n\nexport default ShipPage\n"
  },
  {
    "path": "pages/opensource.tsx",
    "content": "import {\n  Box,\n  Button,\n  Card,\n  Container,\n  Flex,\n  Grid,\n  Heading,\n  Text,\n  Link\n} from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Icon from '@hackclub/icons'\nimport Head from 'next/head'\nimport Nav from '../components/nav'\nimport Footer from '../components/footer'\nimport { Octokit } from '@octokit/rest'\nimport ForceTheme from '../components/force-theme'\n\nexport const BankProject = ({ name, url }) => (\n  <Card\n    variant=\"sunken\"\n    as=\"a\"\n    {...({ target: '_blank', href: url } as any)}\n    sx={{\n      p: [2, 2],\n      display: 'flex',\n      alignItems: 'center',\n      color: 'black',\n      textDecoration: 'none',\n      pr: [3, 3],\n      '> svg': {\n        opacity: '0',\n        transition: '0.3s ease-in-out'\n      },\n      '&:hover > svg': {\n        opacity: '1'\n      }\n    }}\n  >\n    <Text\n      variant=\"subheadline\"\n      sx={{ fontSize: [2, 3], mt: 2, mb: 2, mx: 2, flexGrow: 1 }}\n    >\n      {name}\n    </Text>\n\n    <Icon glyph={'external'} size={24} color=\"placeholder\" />\n  </Card>\n)\n\nconst Page = ({ repos, transparentAccounts }) => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Open Source\"\n      description=\"Explore our finances, code, planning documents and more.\"\n      image=\"https://workshop-cards.hackclub.com/Open%20Source.png?theme=dark&fontSize=350px&brand=HQ\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav color=\"text\" />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'sheet',\n        color: 'text',\n        pt: [5, null, null, null, 6],\n        pb: [3, 4, 5, null, 6],\n        textAlign: 'center'\n      }}\n    >\n      <Container variant=\"copy\">\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{ color: 'primary', mt: [2.5, 4] }}\n        >\n          Open Source at Hack Club\n        </Heading>\n        <Heading as=\"h2\" variant=\"subtitle\" sx={{ mt: 3, color: 'text' }}>\n          Explore our finances, code, planning documents and more.\n        </Heading>\n        <Button\n          variant=\"outline\"\n          as=\"a\"\n          {...({\n            target: '_blank',\n            mt: 3,\n            href: 'https://contribute.hackclub.com'\n          } as any)}\n        >\n          Contribute to Our Projects\n        </Button>\n      </Container>\n    </Box>\n    <Container\n      sx={{\n        py: [3, 4],\n        maxWidth: [null, 'copyUltra'],\n        h2: { variant: 'text.headline' }\n      }}\n    >\n      <Heading\n        variant=\"headline\"\n        sx={{ marginBlockEnd: '0em', mb: '4px!important' }}\n      >\n        Finances\n      </Heading>\n      <Text sx={{ fontSize: 2, color: 'placeholder' }}>\n        All open sourced through HCB Transparency Mode.\n      </Text>\n      <Grid columns={2} gap={3} mt={2} mb={[4]}>\n        {transparentAccounts.map(account => (\n          <BankProject\n            key={account.id}\n            name={account.name}\n            url={`https://hcb.hackclub.com/${account.slug}`}\n          />\n        ))}\n      </Grid>\n      <Heading\n        variant=\"headline\"\n        sx={{ marginBlockEnd: '0em', mb: '4px!important' }}\n      >\n        Events\n      </Heading>\n      <Text sx={{ fontSize: 2, color: 'placeholder' }}>\n        Includes planning documents, partnership emails, meeting notes etc.\n      </Text>\n      <Grid columns={2} gap={3} mt={2} mb={[4]}>\n        <BankProject\n          name=\"Outernet\"\n          url={`https://github.com/hackclub/outernet`}\n        />\n        <BankProject name=\"Epoch\" url={`https://github.com/hackclub/epoch`} />\n        <BankProject\n          name=\"Assemble\"\n          url={`https://github.com/hackclub/assemble`}\n        />\n        <BankProject\n          name=\"The Hacker Zephyr\"\n          url={`https://github.com/hackclub/the-hacker-zephyr`}\n        />\n        <BankProject\n          name=\"Hack Camp\"\n          url={`https://github.com/hackclub/camp`}\n        />\n      </Grid>\n      <Heading\n        variant=\"headline\"\n        sx={{ marginBlockEnd: '0em', mb: '12px!important' }}\n      >\n        Content\n      </Heading>\n      <Grid columns={3} gap={3} mt={2} mb={[4]}>\n        <BankProject name=\"Jams\" url={`https://github.com/hackclub/jams`} />\n        <BankProject\n          name=\"Workshops\"\n          url={`https://github.com/hackclub/hackclub/tree/main/workshops`}\n        />\n        <BankProject\n          name=\"VIP Newsletter\"\n          url={`https://github.com/hackclub/vip-newsletters`}\n        />\n        <BankProject\n          name=\"Community Newsletter\"\n          url={`https://github.com/hackclub/newsletter`}\n        />\n        <BankProject name=\"Meetings\" url={`https://meetings.hackclub.com`} />\n      </Grid>\n      <Heading\n        variant=\"headline\"\n        sx={{ marginBlockEnd: '0em', mb: '12px!important' }}\n      >\n        GitHub Repositories\n      </Heading>\n\n      <Link\n        href=\"https://contribute.hackclub.com/\"\n        sx={{ fontSize: 2, display: 'block', mb: 3 }}\n      >\n        Want to contribute?\n      </Link>\n\n      {repos\n        .sort(function (a, b) {\n          const keyA = a.stargazers_count,\n            keyB = b.stargazers_count\n          if (keyA < keyB) return 1\n          if (keyA > keyB) return -1\n          return 0\n        })\n        .map(repo => (\n          <Flex\n            key={repo.id}\n            sx={{\n              alignItems: 'center',\n              color: 'black',\n              textDecoration: 'none'\n            }}\n            as=\"a\"\n            {...({\n              href: `https://github.com/hackclub/${repo.name}`,\n              target: '_blank'\n            } as any)}\n          >\n            <Text\n              sx={{\n                mr: 2,\n                fontSize: 2,\n                whiteSpace: 'nowrap',\n                minWidth: 'fit-content'\n              }}\n            >\n              <b>{repo.name}</b>\n            </Text>\n            <Text\n              sx={{\n                mr: 3,\n                flexGrow: 1,\n                color: 'muted',\n                whiteSpace: ' nowrap',\n                overflow: 'hidden',\n                textOverflow: 'ellipsis'\n              }}\n            >\n              {repo.description?.replace(\n                /([\\u2700-\\u27BF]|[\\uE000-\\uF8FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDFFF]|[\\u2011-\\u26FF]|\\uD83E[\\uDD10-\\uDDFF])/g,\n                ''\n              )}\n            </Text>\n            <Text sx={{ whiteSpace: 'nowrap', minWidth: 'fit-content' }}>\n              {repo.stargazers_count} ★\n            </Text>\n          </Flex>\n        ))}\n    </Container>\n    <Footer />\n  </>\n)\n\nexport default Page\n\nexport async function getStaticProps() {\n  const octokit = new Octokit({\n    auth: process.env.GITHUB || process.env.GITHUB_TOKEN\n  })\n  let repos\n  try {\n    const x = await octokit.paginate('GET /orgs/{org}/repos', {\n      org: 'hackclub'\n    })\n    repos = x.map(repo => ({\n      id: repo.id,\n      name: repo.name,\n      description: repo.description,\n      stargazers_count: repo.stargazers_count\n    }))\n  } catch (e) {\n    console.error(e)\n    return { props: { repos: [], transparentAccounts: [] }, revalidate: 30 }\n  }\n\n  const transparentAccounts = (\n    await fetch('https://hcb.hackclub.com/api/v3/organizations').then(res =>\n      res.json()\n    )\n  ).filter(account => account.category?.replaceAll(' ', '_') === 'hack_club_hq')\n\n  return { props: { repos, transparentAccounts }, revalidate: 30 }\n}\n"
  },
  {
    "path": "pages/philanthropy/index.tsx",
    "content": "import {\n  Avatar,\n  Box,\n  Button,\n  Card,\n  Container,\n  Flex,\n  Grid,\n  Heading,\n  Link,\n  Text\n} from 'theme-ui'\nimport styled from '@emotion/styled'\nimport Image from 'next/image'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport Nav from '../../components/nav'\nimport ForceTheme from '../../components/force-theme'\nimport Footer from '../../components/footer'\nimport ReactBeforeSliderComponent from 'react-before-after-slider-component'\nimport 'react-before-after-slider-component/dist/build.css'\nimport { Fade, Slide } from '../../components/react-reveal-compat'\nimport Marquee from '../../components/marquee'\nimport ExecuteBig from '../../public/donate/codedaydc_hack.jpg'\nimport HackCamp from '../../public/donate/sf.jpg'\nimport HackerGames from '../../public/donate/0img_20210830_161125.jpg'\nimport LaptopDonations from '../../public/donate/0screenshot_2021-10-03_at_4.20.30_pm.png'\nimport Kerala from '../../public/donate/0img-20210918-wa0091.jpg'\nimport HackPenn from '../../public/donate/0color_pop.jpg'\nimport ElonAMA from '../../public/donate/elon.jpg'\nimport SpaceX from '../../public/donate/0spacex_and_hack_club.jpg'\nimport Flagship from '../../public/donate/flagship.png'\nimport MAHacks from '../../public/donate/0screenshot_2021-10-03_at_4.07.51_pm.png'\nimport HackCamp2020 from '../../public/donate/0img_6447.jpg'\nimport InnovationCircuit from '../../public/donate/0screenshot_2021-10-03_at_3.45.54_pm.png'\nimport WindyCity from '../../public/donate/6screenshot_2021-10-03_at_3.29.29_pm.png'\nimport ZephyrFun from '../../public/donate/0screenshot_2021-10-03_at_3.59.34_pm.png'\nimport GoldenTrain from '../../public/home/golden-train.png'\nimport usePrefersMotion from '../../lib/use-prefers-motion'\n\nimport { BarChart, Bar, XAxis, YAxis, ResponsiveContainer } from 'recharts'\n\nconst Header = styled(Box)`\n  background: url('/pattern.svg');\n`\n\nconst AMarquee = Marquee as any\n\nconst PhotoRow = ({ photos }) => (\n  <Box sx={{ height: '160px', overflow: 'hidden' }}>\n    <Box sx={{ display: ['block', 'block', 'block', 'block', 'none'] }}>\n      <AMarquee\n        velocity={usePrefersMotion() ? 12 : 0}\n        onInit={() => {}}\n        onFinish={() => {}}\n      >\n        {photos.map((photo, index) => (\n          <Image\n            placeholder=\"blur\"\n            src={photo}\n            className=\"next-image\"\n            height={200}\n            width={300}\n            alt=\"Hack Club students\"\n            key={'image-' + index}\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'cover'\n            }}\n          />\n        ))}\n      </AMarquee>\n    </Box>\n    <Box sx={{ display: ['none', 'none', 'none', 'none', 'block'] }}>\n      <AMarquee\n        velocity={usePrefersMotion() ? 12 : 0}\n        onInit={() => {}}\n        onFinish={() => {}}\n      >\n        {photos.map((photo, index) => (\n          <Image\n            placeholder=\"blur\"\n            src={photo}\n            className=\"next-image\"\n            height={200}\n            width={600}\n            key={'image-' + index}\n            alt=\"Hack Club students\"\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'cover'\n            }}\n          />\n        ))}\n      </AMarquee>\n    </Box>\n  </Box>\n)\n\nconst data = [\n  { name: '3452 Teenagers', Teenagers: 3452, year: '2018' },\n  { name: '6932 Teenagers', Teenagers: 6932, year: '2019' },\n  { name: '13530 Teenagers', Teenagers: 13530, year: '2020' },\n  { name: '18347 Teenagers', Teenagers: 18347, year: '2021' },\n  { name: '21790 Teenagers', Teenagers: 21790, year: '2022' },\n  { name: '28720 Teenagers', Teenagers: 28720, year: '2023' }\n]\n\nconst Sheet = styled(Card)`\n  position: relative;\n  overflow: hidden;\n  border-radius: 8px;\n  width: 100%;\n  color: white;\n  height: 100%;\n`\n\nconst Q = styled(Sheet)`\n  position: relative;\n  &:after {\n    content: '';\n    background-color: #ec3750;\n    height: 100%;\n    width: 10px;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n  }\n  color: #3c4858;\n`\n\nconst Stat = ({ num, words, background }) => {\n  return (\n    <Card\n      sx={{\n        padding: '20px !important',\n        my: 2,\n        backgroundColor: 'elevated',\n        backgroundImage: `url('${background}')`,\n        backgroundSize: '25px 25px',\n        backgroundRepeat: 'repeat',\n        backgroundPosition: '10% -20%',\n        display: 'flex',\n        gap: 2,\n        textAlign: 'left',\n        fontSize: ['14px', '16px', '18px']\n      }}\n    >\n      <Text as=\"h2\" sx={{ color: '#ec3750' }}>\n        {num}\n      </Text>\n      <Text as=\"h2\">{words}</Text>\n    </Card>\n  )\n}\n\nconst Graph = () => {\n  return (\n    <>\n      <Box sx={{ mx: 'auto', my: '5%', overflow: 'visible' }}>\n        <Heading as=\"h2\" sx={{ textAlign: 'center' }}>\n          Teenagers in Slack per year\n        </Heading>\n        <ResponsiveContainer width=\"90%\" height=\"100%\" minHeight=\"350px\">\n          <BarChart data={data}>\n            <Bar type=\"monotone\" dataKey=\"Teenagers\" fill=\"#1f2d3d\" />\n            <YAxis />\n            <XAxis dataKey=\"year\"></XAxis>\n          </BarChart>\n        </ResponsiveContainer>\n      </Box>\n    </>\n  )\n}\n\nconst Highlight = ({ children }) => {\n  return <Text sx={{ fontWeight: 'bold' }}>{children}</Text>\n}\nconst Line = () => {\n  return (\n    <Fade>\n      <Box\n        sx={{\n          borderBottom: '1px solid #e0e6ed',\n          width: '100%',\n          my: [4, 5]\n        }}\n      ></Box>\n    </Fade>\n  )\n}\n\nconst Quote = ({ children }) => {\n  return (\n    <Text\n      sx={{\n        fontSize: '1.5em',\n        color: '#ec3750',\n        lineHeight: '1em'\n      }}\n    >\n      {children}\n    </Text>\n  )\n}\n\ntype PropPilled = {\n  logo?: string\n  name: string\n}\n\nconst Pill = ({ logo, name }: PropPilled) => {\n  return (\n    <Slide>\n      <Box\n        sx={{\n          backgroundColor: 'snow',\n          padding: '5px 10px',\n          borderRadius: '50px',\n          display: 'flex',\n          alignItems: 'center'\n        }}\n      >\n        {logo ? (\n          <Box\n            sx={{\n              borderRadius: '100%',\n              width: '20px',\n              height: '20px',\n              backgroundImage: `url(${logo})`,\n              backgroundSize: 'cover',\n              marginRight: 1\n            }}\n          ></Box>\n        ) : (\n          <></>\n        )}\n        <Text>{name}</Text>\n      </Box>\n    </Slide>\n  )\n}\n\nconst HackClubber = ({ photo, quote, info }) => {\n  return (\n    <Box\n      sx={{\n        borderRadius: '10px',\n        width: '100%',\n        height: '300px',\n        backgroundImage: `linear-gradient(to bottom, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.3)), url(/philanthropy/${photo})`,\n        backgroundSize: 'cover',\n        backgroundPosition: 'top center',\n        position: 'relative'\n      }}\n    >\n      <Box\n        sx={{\n          position: 'absolute',\n          bottom: '20px',\n          left: '20px',\n          width: 'calc(100% - 40px)',\n          color: 'white'\n        }}\n      >\n        <Text as=\"h3\">\"{quote}\"</Text>\n        <Text>{info}</Text>\n      </Box>\n    </Box>\n  )\n}\n\nconst FIRST_IMAGE = {\n  imageUrl: '/philanthropy/after1.png'\n}\nconst SECOND_IMAGE = {\n  imageUrl: '/philanthropy/before.png'\n}\n\nconst delimiterIconStyles = {\n  width: '50px',\n  height: '50px',\n  backgroundSize: '110%',\n  backgroundPosition: 'center',\n  borderRadius: 'none',\n  backgroundImage:\n    'url(https://cloud-1rqn9rwxm-hack-club-bot.vercel.app/0frame_43.svg)'\n}\nconst Map = () => {\n  return (\n    <Fade>\n      <Box\n        sx={{\n          position: 'relative',\n          width: '100%',\n          mx: 'auto',\n          height: 'auto'\n        }}\n      >\n        <ReactBeforeSliderComponent\n          firstImage={FIRST_IMAGE}\n          secondImage={SECOND_IMAGE}\n          delimiterIconStyles={delimiterIconStyles}\n          currentPercentPosition={30}\n        />\n        <Text variant=\"caption\">\n          What Hack Club could look like with your support\n        </Text>\n      </Box>\n    </Fade>\n  )\n}\n\nconst Philanthropy = ({ posts = [] }) => {\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Philanthropy\"\n        description=\"Support Hack Club\"\n        image=\"https://workshop-cards.hackclub.com/Philanthropy.png?theme=light&md=1&fontSize=250px&caption=&images=\"\n      />\n      <ForceTheme theme=\"light\" />\n      <Nav color=\"white\" />\n      <Box sx={{ overflowX: 'hidden' }}>\n        {/* <Box\n          sx={{\n            width: '100vw',\n            height: '50vh',\n            maxHeight: '1400px',\n            minHeight: '500px',\n            display: 'flex',\n            justifyContent: 'center',\n            textAlign: 'center',\n            alignItems: 'center',\n            backgroundImage:\n              'linear-gradient(to bottom,rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(https://cloud-51qsxafpt-hack-club-bot.vercel.app/0hackpenn_1__1___1_-min.jpg)',\n            backgroundSize: 'cover',\n            backgroundPosition: 'top center'\n          }}\n        >\n          <Box>\n            <Text\n              as=\"h1\"\n              sx={{\n                fontSize: [6, 6, 7, 7],\n                color: 'white',\n                lineHeight: '1.2em'\n              }}\n            >\n              Investing in the future\n            </Text>\n            <Fade delay={90}>\n              <Button\n                variant=\"ctaLg\"\n                my={3}\n                sx={{ width: ['100%', 'auto'] }}\n                as=\"a\"\n                href=\"https://hcb.hackclub.com/donations/start/hq\"\n              >\n                Donate\n                <Text sx={{ display: ['none', 'inline-block'], ml: 2 }}>\n                  to Hack Club\n                </Text>\n              </Button>\n              <Text\n                sx={{ mt: 1, display: 'block', opacity: 0.8 }}\n                fontSize={2}\n                color=\"white\"\n              >\n                Your contribution is tax-deductible.\n                <br />\n                Hack Club is a 501(c)(3) nonprofit with the EIN 81-2908499.\n              </Text>\n            </Fade>\n          </Box>\n        </Box> */}\n        <Header sx={{ position: 'relative' }}>\n          <Box\n            sx={{\n              background: 'rgba(0,0,0, 0.7)',\n              zIndex: 1,\n              position: 'relative',\n              color: 'white!important',\n              height: '480px'\n            }}\n            pt={[5, 5, '110px']}\n          >\n            <Box\n              sx={{\n                maxWidth: '64rem',\n                mx: 'auto',\n                zIndex: 1,\n                position: 'relative',\n                textAlign: 'center'\n              }}\n              py={2}\n              px={[1, 3]}\n            >\n              <Container sx={{ maxWidth: '48rem' }}>\n                <Heading\n                  sx={{\n                    fontSize: ['42px', '54px', '72px'],\n                    my: 2,\n                    color: 'white'\n                  }}\n                >\n                  Invest in the future.\n                </Heading>\n                <Box\n                  sx={{\n                    fontSize: ['22px', '23px', '28px'],\n                    maxWidth: '40rem',\n                    color: 'white'\n                  }}\n                >\n                  Contribute today to empower the next generation.\n                </Box>\n                <Button\n                  variant=\"ctaLg\"\n                  my={3}\n                  sx={{ width: ['100%', 'auto'] }}\n                  as=\"a\"\n                  {...({\n                    href: 'https://hcb.hackclub.com/donations/start/hq?utm_source=site&utm_medium=internal&utm_campaign=philanthropy_page&utm_content=hero_button'\n                  } as any)}\n                >\n                  Donate\n                  <Text sx={{ display: ['none', 'inline-block'], ml: 2 }}>\n                    to Hack Club\n                  </Text>\n                </Button>\n                <Text\n                  sx={{ mt: 1, display: 'block', opacity: 0.8 }}\n                  color=\"white\"\n                >\n                  Your contribution is tax-deductible.\n                  <br />\n                  Hack Club is a 501(c)(3) nonprofit with the EIN 81-2908499.\n                </Text>\n              </Container>\n            </Box>\n          </Box>\n          <Box\n            sx={{\n              position: 'absolute',\n              top: 0,\n              zIndex: 0,\n              width: '100%',\n              display: 'block'\n            }}\n          >\n            <PhotoRow\n              photos={[\n                ExecuteBig,\n                HackCamp,\n                HackerGames,\n                LaptopDonations,\n                Kerala\n              ]}\n            />\n            <PhotoRow\n              photos={[HackPenn, ElonAMA, SpaceX, GoldenTrain, Flagship]}\n            />\n            <PhotoRow\n              photos={[\n                HackCamp2020,\n                InnovationCircuit,\n                WindyCity,\n                MAHacks,\n                ZephyrFun\n              ]}\n            />\n          </Box>\n        </Header>\n        <Container\n          sx={{\n            width: 'container',\n            margin: 'auto',\n            'p, li, a': {\n              fontSize: '1.3em'\n            }\n          }}\n        >\n          <Fade delay={60}>\n            <Box\n              sx={{\n                mt: 4,\n                textAlign: 'center'\n              }}\n            >\n              <Text as=\"h1\">\n                <Quote>“</Quote>With major support, I am confident Hack Club\n                will change the world.<Quote>”</Quote>\n              </Text>\n              <Text as=\"p\">—Tom Preston-Werner, GitHub Co-founder</Text>\n            </Box>\n          </Fade>\n          <Line />\n          <Fade>\n            <Text as=\"h1\" mb={2} mt={4}>\n              In the next ten years, Hack Club will discover, foster and inspire\n              thousands more teenagers to use technical skills to solve\n              problems.\n            </Text>\n          </Fade>\n          <br />\n          <Fade>\n            <Text as=\"p\">\n              Led by young engineers, with early backing from the 21st century’s\n              most iconic creators, Hack Club already reaches tens of thousands\n              of teenagers, and represents the largest network of technical\n              teens in the world. Each day, new projects are shipped, new lines\n              of code are written, and new friendships are forged through\n              collaborative, problem-solving technical projects happening at\n              Hack Club.\n            </Text>\n          </Fade>\n          <br />\n          <Fade>\n            <Text as=\"p\">\n              Hack Club is always free for teenagers and with your support, Hack\n              Club can grow to hundreds of thousands of teen hackers, bringing\n              free computer science education, a hacker mindset, and an equal\n              shot at success to every teenager, regardless of where they’re\n              from, how they identify, or what their parents do.\n            </Text>\n          </Fade>\n          <Fade>\n            <br />\n            <Text as=\"p\">\n              Over time, Hack Clubbers will reshape societies as entrepreneurs,\n              environmentalists, political leaders, activists and policy makers.\n              We help shape the values of these future leaders, modeling and\n              incentivizing them to be curious, humble, kind, optimistic problem\n              solvers.{' '}\n              <Highlight>\n                We need your support to make this vision a reality.\n              </Highlight>\n            </Text>\n          </Fade>\n          <Grid gap={2} columns={[1, 2, 3, 5]} mt={4}>\n            <Fade delay={30}>\n              <HackClubber\n                photo=\"arianna.png\"\n                quote=\"Always inspiring interesting new projects\"\n                info=\"Arianna, 16, Kentucky\"\n              />\n            </Fade>\n            <Fade delay={60}>\n              <HackClubber\n                photo=\"jason.png\"\n                quote=\"I’ve met some of the best people\"\n                info=\"Jason, 16, Texas\"\n              />\n            </Fade>\n            <Fade delay={90}>\n              <HackClubber\n                photo=\"sam.png\"\n                quote=\"In Hack Club I’ve found a home\"\n                info=\"Sam, 17, Singapore\"\n              />\n            </Fade>\n            <Fade delay={120}>\n              <HackClubber\n                photo=\"abby.png\"\n                quote=\"Helped build me a strong coding foundation\"\n                info=\"Abby, 15, Los Angeles\"\n              />\n            </Fade>\n            <Fade delay={150}>\n              <HackClubber\n                photo=\"adriano.png\"\n                quote=\"Totally different from the coding classes at school\"\n                info=\"Adriano, 19, Brazil\"\n              />\n            </Fade>\n          </Grid>\n          <Fade>\n            <Text as=\"h2\" mt={5}>\n              To discuss a gift:\n            </Text>\n          </Fade>\n          <Fade>\n            <Grid gap={[4, 2, 2]} columns={[1, '1r 1fr', '1fr 1fr']} mt={2}>\n              <Box>\n                <Text as=\"h3\">Reach out to</Text>\n                <Text as=\"p\">Christina Asquith</Text>\n                <Text as=\"p\">Co-founder, COO, and Board Member</Text>\n                <Text\n                  as=\"a\"\n                  {...({ href: 'mailto:christina@hackclub.com' } as any)}\n                  sx={{\n                    ':link': {\n                      color: 'inherit',\n                      textDecoration: 'none'\n                    }\n                  }}\n                >\n                  christina@hackclub.com\n                </Text>\n              </Box>\n              <Box>\n                <Text as=\"h3\">Send physical checks</Text>\n                <Text as=\"p\">The Hack Foundation</Text>\n                <Text as=\"p\">\n                  8605 Santa Monica Blvd #86294, West Hollywood, CA, 90069\n                </Text>\n                <Text as=\"p\">EIN: 81-2908499</Text>\n                <Box mt={[2, 3]}>\n                  <Text\n                    as=\"a\"\n                    {...({\n                      href: 'https://hcb.hackclub.com/donations/start/hq?utm_source=site&utm_medium=internal&utm_campaign=philanthropy_page&utm_content=body_link'\n                    } as any)}\n                    target=\"_blank\"\n                    sx={{\n                      color: '#ec3750',\n                      textDecoration: 'none',\n                      fontWeight: '700',\n                      fontSize: '1.2em'\n                    }}\n                  >\n                    Donate online to Hack Club &#9654;\n                  </Text>\n                </Box>\n                <Text>\n                  We also accept crypto, stocks, and other forms of support.\n                </Text>\n              </Box>\n            </Grid>\n          </Fade>\n          <Line />\n          <Fade delay={100}>\n            <Flex sx={{ justifyContent: 'space-between' }} mt={[3, 4]}>\n              <Box>\n                <Text as=\"h2\">View Hack Club's IRS Form 990s</Text>\n                <Text as=\"p\">2025 Form will be shared when ready.</Text>\n              </Box>\n              <Box>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c4366-66a7-7b57-8103-5d7731c114d3/812908499_2024_202533219349309698_990.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2\n                  }}\n                >\n                  2024\n                </Button>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c4366-d33c-7b59-a778-f1a932036d43/812908499_2023_202423209349312247_990.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2\n                  }}\n                >\n                  2023\n                </Button>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c4367-399e-76b5-8198-66ab98fb6ea9/812908499_2022_202333199349306488_990.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2,\n                    mr: 2\n                  }}\n                >\n                  2022\n                </Button>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c4367-84af-7e6c-a8bc-cb7dabd69f9f/812908499_2021_202243189349308489_990.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2,\n                    mr: 2\n                  }}\n                >\n                  2021\n                </Button>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c4367-d7be-73b2-bf65-933c982b3d07/812908499_2020_202103239349300740_990.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2,\n                    mr: 2\n                  }}\n                >\n                  2020\n                </Button>\n              </Box>\n            </Flex>\n            <span>\n              Starting in 2021, Hack Club has engaged with an external auditing\n              firm and has audited financials through the current fiscal year.\n            </span>\n          </Fade>\n          <Line />\n          <Fade delay={100}>\n            <Flex sx={{ justifyContent: 'space-between' }} mt={[3, 4]}>\n              <Box>\n                <Text as=\"h2\">View Hack Club's Annual Reports</Text>\n                <Text as=\"p\">Reports from 2022-2024</Text>\n              </Box>\n              <Box>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c4369-c21c-7436-9669-4ab80d4774a4/2024%20Annual%20Report.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2\n                  }}\n                >\n                  2024\n                </Button>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c4368-9ea2-76fb-96fc-d7859dffa59e/2023%20Annual%20Report.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2,\n                    mr: 2\n                  }}\n                >\n                  2023\n                </Button>\n                <Button\n                  as=\"a\"\n                  variant=\"outline\"\n                  {...({\n                    href: 'https://cdn.hackclub.com/019c436a-61fa-7c33-bd8d-d65b89446bff/2022%20Annual%20Report.pdf'\n                  } as any)}\n                  target=\"_blank\"\n                  mb={4}\n                  sx={{\n                    fontSize: '1em !important',\n                    width: 'fit-content',\n                    float: 'right',\n                    mt: 2,\n                    mr: 2\n                  }}\n                >\n                  2022\n                </Button>\n              </Box>\n            </Flex>\n            <span>\n              Explore Hack Club's annual reports from 2022 onward, showcasing\n              each year's impact and key milestones.\n            </span>\n          </Fade>\n          {/* <Fade delay={300}>\n            <Text\n              as=\"a\"\n              mt={2}\n              href=\"https://hcb.hackclub.com/donations/start/hq\"\n              target=\"_blank\"\n              sx={{\n                color: '#ec3750',\n                textDecoration: 'none',\n                fontSize: '1.2em'\n              }}\n            >\n              Donate &#9654;\n            </Text>\n          </Fade> */}\n        </Container>\n        <Box\n          sx={{\n            width: '100vw',\n            backgroundColor: 'snow',\n            py: 4,\n            my: 5,\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Container sx={{ textAlign: 'center' }}>\n            <Fade>\n              <Text as=\"h1\" sx={{ fontSize: ['28px', '28px', '36px'] }}>\n                Hack Club is already making a difference!\n              </Text>\n            </Fade>\n            <Grid\n              my=\"4\"\n              gap={2}\n              columns={[1, 1, 1, 2]}\n              sx={{ alignItems: 'center' }}\n            >\n              <Fade delay={30}>\n                <Graph />\n              </Fade>\n              <Box\n                sx={{\n                  width: '90%',\n                  margin: 'auto'\n                }}\n              >\n                <Fade delay={90}>\n                  <Stat\n                    num=\"11 million\"\n                    words=\"messages sent\"\n                    background=\"https://icons.hackclub.com/api/icons/0xFAFAFA/glyph:slack.svg\"\n                  />\n                </Fade>\n                <Fade delay={120}>\n                  <Stat\n                    num=\"450+\"\n                    words=\"coding clubs\"\n                    background=\"https://icons.hackclub.com/api/icons/0xFAFAFA/glyph:event-code.svg\"\n                  />\n                </Fade>\n                <Fade delay={180}>\n                  <Stat\n                    num=\"180+\"\n                    words=\"global events supported\"\n                    background=\"https://icons.hackclub.com/api/icons/0xFAFAFA/glyph:profile.svg\"\n                  />\n                </Fade>\n                <Fade delay={150}>\n                  <Stat\n                    num=\"1800+\"\n                    words=\"nonprofits & clubs sponsored\"\n                    background=\"https://icons.hackclub.com/api/icons/0xFAFAFA/glyph:member-add.svg\"\n                  />\n                </Fade>\n                <Fade delay={180}>\n                  <Stat\n                    num=\"$14 million\"\n                    words=\"transacted on HCB\"\n                    background=\"https://icons.hackclub.com/api/icons/0xFAFAFA/glyph:photo.svg\"\n                  />\n                </Fade>\n              </Box>\n            </Grid>\n            <Fade delay={210} bottom>\n              <Text as=\"h2\">\n                “Hack Club helped me fall in love with creating and made me feel\n                like I belong.”\n              </Text>\n              <Text\n                sx={{ display: 'inline-flex', alignItems: 'center', gap: 2 }}\n              >\n                <Image\n                  src=\"/philanthropy/belle.png\"\n                  width=\"20\"\n                  height=\"20\"\n                  alt=\"belle\"\n                  style={{\n                    borderRadius: '100%',\n                    maxWidth: '100%',\n                    height: 'auto',\n                    objectFit: 'cover'\n                  }}\n                />\n                Belle, 17, Malaysia\n              </Text>\n            </Fade>\n          </Container>\n        </Box>\n        <Container\n          sx={{\n            width: 'container',\n            margin: 'auto',\n            px: [2, 3, 4],\n            'p, li, a': {\n              fontSize: '1.3em'\n            },\n            h1: {\n              fontSize: ['28px', '28px', '36px']\n            }\n          }}\n        >\n          <Fade>\n            <Text as=\"h1\" my={4}>\n              As the largest network of technical teenagers, we are featured in\n              the news:\n            </Text>\n            <Grid gap={[0, 0, 4]} columns={['1fr 1fr', '1fr 0.5fr 1fr 1fr']}>\n              <Link\n                href=\"https://www.businessinsider.com/zach-lattas-hacker-club-got-him-on-forbes-30-under-30-2016-1\"\n                target=\"_blank\"\n                sx={{ display: 'flex', alignItems: 'center' }}\n              >\n                <Image\n                  src=\"/philanthropy/insider-logo.svg\"\n                  width={530}\n                  height={150}\n                  alt=\"insider logo\"\n                  style={{\n                    maxWidth: '100%',\n                    height: 'auto',\n                    objectFit: 'cover'\n                  }}\n                />\n              </Link>\n              <Link\n                href=\"https://www.wsj.com/articles/teen-hackers-try-to-convince-parents-they-are-up-to-good-11569922200\"\n                target=\"_blank\"\n                sx={{ display: 'flex', alignItems: 'center' }}\n              >\n                <Image\n                  src=\"/philanthropy/wsj-logo.svg\"\n                  width={270}\n                  height={100}\n                  alt=\"wsj logo\"\n                  style={{\n                    maxWidth: '100%',\n                    height: 'auto',\n                    objectFit: 'cover'\n                  }}\n                />\n              </Link>\n              <Link\n                href=\"https://www.forbes.com/sites/fastforward/2021/06/29/from-journalism-to-a-tech-nonprofit-this-coos-big-pivot-to-empower-the-next-generation-of-coders/\"\n                target=\"_blank\"\n                sx={{ display: 'flex', alignItems: 'center' }}\n              >\n                <Image\n                  src=\"/philanthropy/forbes-logo.svg\"\n                  width={500}\n                  height={100}\n                  alt=\"forbes logo\"\n                  style={{\n                    maxWidth: '100%',\n                    height: 'auto',\n                    objectFit: 'cover'\n                  }}\n                />\n              </Link>\n              <Link\n                href=\"https://www.philanthropy.com/article/nonprofits-need-to-embrace-transparency-even-if-the-supreme-court-rules-to-protect-donor-privacy\"\n                target=\"_blank\"\n                sx={{ display: 'flex', alignItems: 'center' }}\n              >\n                <Image\n                  src=\"/philanthropy/cop.png\"\n                  width={750}\n                  height={250}\n                  alt=\"cop logo\"\n                  style={{\n                    maxWidth: '100%',\n                    height: 'auto',\n                    objectFit: 'cover'\n                  }}\n                />\n              </Link>\n            </Grid>\n          </Fade>\n          <Line />\n          <Fade>\n            <Text as=\"h1\" sx={{ marginBottom: '20px' }}>\n              Board of Directors\n            </Text>\n          </Fade>\n          <Grid gap={4} columns={[1, '1fr 2fr', '1fr 2fr']} mt={2}>\n            <Box>\n              <Fade>\n                <Box>\n                  <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                    <Box\n                      sx={{\n                        borderRadius: '100%',\n                        width: '40px',\n                        height: '40px',\n                        backgroundImage: `url(https://cloud-80nhjzldl-hack-club-bot.vercel.app/0.jpeg)`,\n                        backgroundSize: 'cover',\n                        marginRight: 2\n                      }}\n                    ></Box>\n                    <Box>\n                      <Text as=\"p\">\n                        <b>Tom Preston-Werner</b>\n                      </Text>\n                      <Text\n                        as=\"p\"\n                        sx={{\n                          lineHeight: '1em',\n                          fontSize: '1.1em !important'\n                        }}\n                      >\n                        Co-founder, GitHub\n                      </Text>\n                    </Box>\n                  </Box>\n                </Box>\n              </Fade>\n              <Fade delay={200}>\n                <br />\n                <Box>\n                  <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                    <Box\n                      sx={{\n                        borderRadius: '100%',\n                        width: '40px',\n                        height: '40px',\n                        backgroundImage: `url(https://philanthropy.hackclub.com/_next/image?url=/quinn.png&w=1200&q=75)`,\n                        backgroundSize: 'cover',\n                        marginRight: 2\n                      }}\n                    ></Box>\n                    <Box>\n                      <Text as=\"p\">\n                        <b>Quinn Slack</b>\n                      </Text>\n                      <Text\n                        as=\"p\"\n                        sx={{ lineHeight: '1em', fontSize: '1.1em !important' }}\n                      >\n                        Co-founder and CEO, Sourcegraph\n                      </Text>\n                    </Box>\n                  </Box>\n                </Box>\n              </Fade>\n              <Fade delay={400}>\n                <br />\n                <Box>\n                  <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                    <Box\n                      sx={{\n                        borderRadius: '100%',\n                        width: '40px',\n                        height: '40px',\n                        backgroundImage: `url(/team/zach.jpg)`,\n                        backgroundSize: 'cover',\n                        marginRight: 2\n                      }}\n                    ></Box>\n                    <Box>\n                      <Text as=\"p\">\n                        <b>Zach Latta</b>\n                      </Text>\n                      <Text\n                        as=\"p\"\n                        sx={{ lineHeight: '1em', fontSize: '1.1em !important' }}\n                      >\n                        Founder and Executive Director, Hack Club\n                      </Text>\n                    </Box>\n                  </Box>\n                </Box>\n              </Fade>\n              <Fade delay={600}>\n                <br />\n                <Box>\n                  <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                    <Box\n                      sx={{\n                        borderRadius: '100%',\n                        width: '40px',\n                        height: '40px',\n                        backgroundImage: `url(/team/christina.jpg)`,\n                        backgroundSize: 'cover',\n                        marginRight: 2\n                      }}\n                    ></Box>\n                    <Box>\n                      <Text as=\"p\">\n                        <b>Christina Asquith</b>\n                      </Text>\n                      <Text\n                        as=\"p\"\n                        sx={{ lineHeight: '1em', fontSize: '1.1em !important' }}\n                      >\n                        Co-founder and COO, Hack Club\n                      </Text>\n                    </Box>\n                  </Box>\n                </Box>\n              </Fade>\n              <Fade delay={800}>\n                <br />\n                <Text sx={{ color: 'muted', fontSize: '90%' }}>\n                  Board advisor: John Abele (Founder, Boston Scientific)\n                </Text>\n              </Fade>\n            </Box>\n            <Fade delay={900}>\n              <Box sx={{ color: 'slate' }}>\n                <Text as=\"p\">\n                  <Quote>“</Quote>Hack Club is the organization I wish I had\n                  when I was a teenager.\n                </Text>\n                <br />\n                <Text as=\"p\">\n                  In 2017, I joined as a founding board member, and I’ve seen\n                  firsthand the leadership team act with integrity and\n                  transparency since Day 1. Founder Zach Latta and COO Christina\n                  Asquith are efficient, responsible and disciplined stewards of\n                  every dollar, and I've proudly grown my donations over the\n                  years.\n                </Text>\n                <br />\n                <Text as=\"p\">\n                  I believe in Hack Club, and I'm looking forward to staying\n                  involved for the long term. I also personally intend to\n                  continue and grow my financial support of their mission.\n                  <Quote>”</Quote>\n                </Text>\n                <br />\n                <Text as=\"p\">\n                  — Tom Preston-Werner, Co-founder, Preston-Werner Ventures /\n                  Co-founder and former CEO, GitHub\n                </Text>\n              </Box>\n            </Fade>\n          </Grid>\n          <Line />\n          <Box>\n            <Fade>\n              <Text as=\"h1\" sx={{ marginBottom: '20px' }}>\n                Join our community of generous donors\n              </Text>\n            </Fade>\n            <Grid\n              gap={[2, 2, 3]}\n              mt={2}\n              sx={{\n                gridTemplateColumns: [\n                  'repeat(2, minmax(0, 1fr))',\n                  'repeat(4, minmax(0, 1fr))',\n                  '1.15fr repeat(3, minmax(0, 1fr))'\n                ]\n              }}\n            >\n              <Box>\n                <Fade delay={50}>\n                  <Text as=\"h3\" sx={{ marginBottom: '8px' }}>\n                    $5M - $10M{' '}\n                  </Text>\n                </Fade>\n                <Fade delay={70}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Tom Preston-Werner (9x)\n                  </Text>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Musk Foundation (6x)\n                  </Text>\n                </Fade>\n                <br></br>\n                <Fade delay={90}>\n                  <Text as=\"h3\" sx={{ marginBottom: '8px' }}>\n                    {' '}\n                    $1M - $5M{' '}\n                  </Text>\n                  <Fade delay={110}>\n                    <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                      Dr. Lisa Su\n                    </Text>\n                  </Fade>\n                  <Fade delay={130}>\n                    <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                      Michael Dell (3x)\n                    </Text>\n                  </Fade>\n                </Fade>\n                <Fade delay={150}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Craig Newmark (4x)\n                  </Text>\n                </Fade>\n                <Fade delay={170}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Tobi Lutke\n                  </Text>\n                </Fade>\n                <Fade delay={190}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Advanced Micro Devices\n                  </Text>\n                </Fade>\n                <Fade delay={210}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    The Libermans\n                  </Text>\n                </Fade>\n                <Fade delay={230}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Lizzy Danhakl & Andrew Reed (4x)\n                  </Text>\n                </Fade>\n                <Fade delay={250}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Patrick J. McGovern (3x)\n                  </Text>\n                </Fade>\n              </Box>\n              <Box>\n                <Fade delay={280}>\n                  <Text as=\"h3\" sx={{ marginBottom: '8px' }}>\n                    $500k - $1M\n                  </Text>\n                </Fade>\n                <Fade delay={310}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    GitHub Education (6x)\n                  </Text>\n                </Fade>\n                <Fade delay={330}>\n                  <Fade delay={410}>\n                    <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                      Argosy Foundation (5x)\n                    </Text>\n                  </Fade>\n                </Fade>\n                <Fade delay={350}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Endless Network (4x)\n                  </Text>\n                </Fade>\n                <Fade delay={370}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    FUTO (3x)\n                  </Text>\n                </Fade>\n                <Fade delay={390}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Joe Liemandt\n                  </Text>\n                </Fade>\n              </Box>\n              <Box>\n                <Fade>\n                  <Text as=\"h3\" sx={{ lineHeight: '1.8em' }}>\n                    $200k - $500k\n                  </Text>\n                </Fade>\n                <Fade delay={410}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Ron Conway (6x)\n                  </Text>\n                </Fade>\n                <Fade delay={430}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Adam Ross (3x)\n                  </Text>\n                </Fade>\n                <Fade delay={450}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Gwynne Shotwell\n                  </Text>\n                </Fade>\n                <Fade delay={470}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Ron Baron\n                  </Text>\n                </Fade>\n                <Fade delay={490}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Jack Dorsey\n                  </Text>\n                </Fade>\n                <Fade delay={510}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Vitalik Buterin\n                  </Text>\n                </Fade>\n              </Box>\n              <Box>\n                <Fade delay={530}>\n                  <Text as=\"h3\" sx={{ marginBottom: '8px' }}>\n                    $100k- $200k\n                  </Text>\n                </Fade>\n                <Fade delay={550}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Quinn Slack (3x)\n                  </Text>\n                </Fade>\n                <Fade delay={570}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Peter Levine\n                  </Text>\n                </Fade>\n                <Fade delay={590}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Mitchell Hashimoto\n                  </Text>\n                </Fade>\n                <Fade delay={610}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Proton Foundation\n                  </Text>\n                </Fade>\n                <Fade delay={630}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Chuck & Marna Davis\n                  </Text>\n                </Fade>\n                <Fade delay={650}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Kellogg Foundation\n                  </Text>\n                </Fade>\n                <Fade delay={670}>\n                  <Text as=\"p\" sx={{ lineHeight: '1.8em' }}>\n                    Pinkerton Foundation\n                  </Text>\n                </Fade>\n              </Box>\n            </Grid>\n            <Fade delay={800}>\n              <br />\n              <Text sx={{ color: 'muted', fontSize: '90%' }}>\n                * The numbers in bracket indicates # of gifts since 2018\n              </Text>\n            </Fade>\n          </Box>\n          <Fade>\n            <Text as=\"h2\" mt={4} mb={2}>\n              A few others who support Hack Club\n            </Text>\n          </Fade>\n          <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 2 }} mb={5}>\n            <Fade delay={30}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/0figma.png\"\n                name=\"Dylan Field, Founder, Figma\"\n              />\n            </Fade>\n            <Fade delay={60}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/1vercel.png\"\n                name=\"Guillermo Rauch, Founder, Vercel\"\n              />\n            </Fade>\n            <Fade delay={90}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/7laravel.png\"\n                name=\"Taylor Otwell, Creator of Laravel\"\n              />\n            </Fade>\n            <Fade delay={120}>\n              <Pill\n                logo=\"https://user-cdn.hackclub-assets.com/019d60ed-1665-758f-8eee-ef3c3a1a4223/simile_ai_inc_logo.jfif\"\n                name=\"Theo Bleier, Technical Staff, Simile\"\n              />\n            </Fade>\n            <Fade delay={120}>\n              <Pill\n                logo=\"https://cdn.hackclub.com/019d60e7-9c9e-7eec-af86-27c0b712d246/Microsoft_Logo_512px.png\"\n                name=\"Kevin Yang, Principal Researcher, Microsoft\"\n              />\n            </Fade>\n            <Fade delay={150}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/6replit.png\"\n                name=\"Amjad Masad, Co-founder, Replit\"\n              />\n            </Fade>\n            <Fade delay={180}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/2workflow.png\"\n                name=\"Conrad Kramer, Co-founder, Workflow\"\n              />\n            </Fade>\n            <Fade delay={210}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/3github.png\"\n                name=\"Tim Clem, Senior Engineer, GitHub\"\n              />\n            </Fade>\n            <Fade delay={240}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/4sentry.png\"\n                name=\"David Cramer, Co-founder, Sentry\"\n              />\n            </Fade>\n            <Fade delay={270}>\n              <Pill\n                logo=\"https://cloud-kwnsazl2x-hack-club-bot.vercel.app/8vgs.png\"\n                name=\"Mahmoud Abdelkader, CEO, Very Good Security\"\n              />\n            </Fade>\n            <Fade delay={270}>\n              <Pill name=\"Blake Lieberman, Partner, Rief Ventures\" />\n            </Fade>\n            <Fade delay={300}>\n              <Text\n                as=\"a\"\n                {...({ href: '/philanthropy/supporters' } as any)}\n                target=\"_blank\"\n                sx={{\n                  color: 'slate',\n                  textDecoration: 'none',\n                  fontSize: '1em !important',\n                  backgroundColor: 'snow',\n                  padding: '5px 10px',\n                  borderRadius: '50px',\n                  display: 'flex',\n                  alignItems: 'center',\n                  transition: '0.5s ease',\n                  border: '1px solid #1f2d3d',\n                  ':hover': {\n                    backgroundColor: '#e0e6ed'\n                  }\n                }}\n              >\n                and many more...\n              </Text>\n            </Fade>\n          </Box>\n          <Fade>\n            <Text as=\"h2\" my={3}>\n              Only through their support are we able to empower students like\n              Obrey and Maggie\n            </Text>\n          </Fade>\n          <Grid gap={3} columns={[1, 1, 1, 2]} mt={2} mb={4}>\n            <Fade delay={100}>\n              <Q>\n                <Heading mb={3} sx={{ fontWeight: 'normal', fontSize: '18px' }}>\n                  Obrey Muchena started a Hack Club in his senior year of high\n                  school at Kabulonga Boys' Secondary School, and now more than\n                  a dozen students are coding.\n                </Heading>\n                <Heading\n                  sx={{ fontWeight: '700', fontSize: ['18px', '20px', '22px'] }}\n                >\n                  Thanks to our donor-funded laptop program, Hack Club sent him\n                  a MacBook Air. In his Hack Club, Obrey and his best friend\n                  Edward built robots that won Canada’s Humanitarian Activist\n                  Award.\n                </Heading>\n                <Flex sx={{ alignItems: 'center' }} mt={[3, 4]}>\n                  <Avatar\n                    src=\"/philanthropy/obrey.png\"\n                    sx={{ height: '48px', width: '48px' }}\n                    mr={3}\n                  />\n                  <Box sx={{ textAlign: 'left' }}>\n                    <Heading>Obrey Muchena</Heading>\n                    <Text color=\"green.1\">19, Zambia</Text>\n                  </Box>\n                </Flex>\n              </Q>\n            </Fade>\n            <Fade delay={200}>\n              <Q>\n                <Heading mb={3} sx={{ fontWeight: 'normal', fontSize: '18px' }}>\n                  In 2021, Maggie joined the Hack Club community; she has since\n                  shipped 10+ coding projects from widgets to raycast\n                  extensions.\n                </Heading>\n                <Heading\n                  sx={{ fontWeight: '700', fontSize: ['18px', '20px', '22px'] }}\n                >\n                  The Hack Club community \"inspired me to step outside my\n                  comfort zone and take on challenges I never previously would\n                  have — starting a CS Club at my school, (co-)hosting AMAs, and\n                  even organizing Leland Hacks, the first in-person hackathon in\n                  my city after the pandemic.”\n                </Heading>\n                <Flex sx={{ alignItems: 'center' }} mt={[3, 4]}>\n                  <Avatar\n                    src=\"/philanthropy/maggie.png\"\n                    sx={{ height: '48px', width: '48px' }}\n                    mr={3}\n                  />\n                  <Box sx={{ textAlign: 'left' }}>\n                    <Heading>Maggie Liu</Heading>\n                    <Text color=\"green.1\">17, California</Text>\n                  </Box>\n                </Flex>\n              </Q>\n            </Fade>\n          </Grid>\n          <Line />\n          <Fade>\n            <Text as=\"h1\" sx={{ textAlign: 'center' }} mb={[4, 5]}>\n              Hack Club invites the 21st century’s leading thinkers, builders\n              and disrupters to join our small, core network of donors with a\n              gift.\n            </Text>\n          </Fade>\n          <Grid columns={['1fr', '1fr', '1fr', '0.8fr 1.2fr']}>\n            <Fade>\n              <Box>\n                <Text as=\"p\">\n                  We envision thousands of diverse Hack Club leaders in towns\n                  and cities across America and the world, connected online, and\n                  self-organizing events and hackathons–driven by a can-do\n                  culture and a rigorous dedication to building real things in\n                  the real world.\n                </Text>\n                <br />\n                <Text as=\"p\">\n                  Founded in 2014, Hack Club grew 700 percent during the\n                  COVID-19 pandemic, and Hack Club’s team of engineers can’t\n                  keep up with demand.\n                </Text>\n              </Box>\n            </Fade>\n            <Map />\n          </Grid>\n          <Fade>\n            <Text as=\"p\" mt={4}>\n              Your gift will:\n            </Text>\n          </Fade>\n          <ul>\n            <Fade>\n              <li>\n                Increase support to serve thousands more teenagers, with a\n                strong focus on serving those who face additional barriers to\n                contributing their talents to the world\n              </li>\n            </Fade>\n            <Fade delay={30}>\n              <li>\n                Create hundreds more Hack Clubs in high schools and communities\n                across the country and world\n              </li>\n            </Fade>\n            <Fade delay={60}>\n              <li>\n                Inspire a problem-solving mindset and a hacker identity, where\n                teenagers are empowered to build what they want to see in the\n                world\n              </li>\n            </Fade>\n            <Fade delay={90}>\n              <li>\n                Make Hack Club the best place to be a teenager on the internet,\n                incentivizing a shift among teenagers from consumers to creators\n                of technology\n              </li>\n            </Fade>\n            <Fade delay={120}>\n              <li>\n                Launch special projects, in which Hack Clubbers collaborate with\n                SpaceX, Vercel, Cloudflare, Replit, Dogecoin and others\n              </li>\n            </Fade>\n            <Fade delay={150}>\n              <li>\n                Popularize transparent accounting, open source building, and\n                high-integrity leadership\n              </li>\n            </Fade>\n            <Fade delay={180}>\n              <li>Grow the team, mostly engineers</li>\n            </Fade>\n            <Fade delay={210}>\n              <li>\n                Host dozens of in-person events, including our summer adventure\n              </li>\n            </Fade>\n            <Fade delay={240}>\n              <li>\n                Extend mini-grants of hardware and internet access to hundreds\n                of teenagers\n              </li>\n            </Fade>\n            <Fade delay={270}>\n              <li>\n                Bring computer science and engineering skills to thousands more\n                teenagers\n              </li>\n            </Fade>\n          </ul>\n          <Box my={4}>\n            <Fade delay={350}>\n              <Text as=\"h2\" sx={{ mb: 0, pb: 0, mt: 2 }}>\n                Thank you for your consideration!\n              </Text>\n            </Fade>\n            <Fade delay={380}>\n              <Text as=\"h2\" sx={{ mt: 0 }}>\n                Sincerely,\n              </Text>\n            </Fade>\n            <Flex mb={4}>\n              <Fade delay={410}>\n                <Box sx={{ marginRight: 3 }}>\n                  <Image\n                    src=\"/philanthropy/christina-s.png\"\n                    width={250}\n                    height={100}\n                    alt=\"christina\"\n                    style={{\n                      maxWidth: '100%',\n                      height: 'auto',\n                      objectFit: 'cover'\n                    }}\n                  />\n                  <Text as=\"p\">Christina Asquith, Co-founder and COO</Text>\n                </Box>\n              </Fade>\n              <Fade delay={440}>\n                <Box>\n                  <Image\n                    src=\"/philanthropy/zach-s.png\"\n                    width={150}\n                    height={100}\n                    alt=\"zach\"\n                    style={{\n                      maxWidth: '100%',\n                      height: 'auto',\n                      objectFit: 'cover'\n                    }}\n                  />\n                  <Text as=\"p\">Zach Latta, Founder and Executive Director</Text>\n                </Box>\n              </Fade>\n            </Flex>\n          </Box>\n          <Fade delay={200}>\n            <Grid\n              gap={4}\n              columns={[1, '2fr 1fr', '2fr 1fr']}\n              my={4}\n              sx={{ color: 'muted' }}\n            >\n              <Box>\n                <Text as=\"h3\">The Hack Foundation</Text>\n                <Text as=\"p\" sx={{ width: '70%' }}>\n                  Address: The Hack Foundation at 8605 Santa Monica Blvd #86294,\n                  West Hollywood, CA, 90069\n                </Text>\n                <Text as=\"p\">EIN: 81-2908499</Text>\n              </Box>\n              <Box>\n                <Text as=\"h3\">Reach out to</Text>\n                <Text as=\"p\">Christina Asquith</Text>\n                <Text as=\"p\">Co-founder, COO, and Board Member</Text>\n                <Text\n                  as=\"a\"\n                  {...({ href: 'mailto:christina@hackclub.com' } as any)}\n                  sx={{\n                    ':link': {\n                      color: 'inherit',\n                      textDecoration: 'none'\n                    }\n                  }}\n                >\n                  christina@hackclub.com\n                </Text>\n              </Box>\n            </Grid>\n          </Fade>\n          <Fade>\n            <Button\n              as=\"a\"\n              {...({ href: '/philanthropy/hackclub_philanthropy.pdf' } as any)}\n              download=\"HackClub\"\n              mb={4}\n              sx={{ fontSize: '1em !important' }}\n            >\n              Download as PDF\n            </Button>\n          </Fade>\n          <Fade>\n            <Text\n              as=\"p\"\n              sx={{ fontSize: '90% !important', color: 'muted', pb: 2 }}\n            >\n              Site by Belle, 17, Hack Clubber\n            </Text>\n          </Fade>\n        </Container>\n        <Footer />\n      </Box>\n    </>\n  )\n}\n\nexport default Philanthropy\n"
  },
  {
    "path": "pages/philanthropy/supporters.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport styled from '@emotion/styled'\nimport {\n  Box,\n  Button,\n  Container,\n  Flex,\n  Heading,\n  Card,\n  Link as A,\n  Text\n} from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport ForceTheme from '../../components/force-theme'\nimport Nav from '../../components/nav'\nimport Sponsors from '../../components/donate/sponsors'\nimport donors from '../../components/donate/donors.json'\nimport Footer from '../../components/footer'\n\nconst Header = styled(Box)`\n  background: url('/pattern.svg');\n`\n\nconst Sheet = styled(Card)`\n  position: relative;\n  overflow: hidden;\n  border-radius: 8px;\n  width: 100%;\n  color: white;\n`\n\nconst Row = styled(Box)`\n  text-align: left;\n  @media screen and (min-width: 48em) {\n    display: grid;\n    grid-gap: 18px;\n    grid-template-columns: 2fr 3fr;\n  }\n`\n\nconst subhline = { fontSize: [3, 4], style: { lineHeight: '1.375' } }\n\nconst contentContainer = {\n  maxWidth: 72,\n  width: 1,\n  p: 3,\n  color: 'black',\n  style: { position: 'relative' }\n}\nconst content = { maxWidth: 48, mx: 0, color: 'black' }\n\nconst title = 'Donate'\nconst desc =\n  'Contribute today to empower the next generation and help start a coding club at every high school.'\n\nconst DonorGrid = styled(Box)`\n  display: grid;\n  grid-gap: 6px;\n  grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));\n  align-items: center;\n  p,\n  a {\n    width: 100%;\n  }\n  @media screen and (min-width: 48em) {\n    grid-gap: 18px;\n    grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));\n  }\n`\n\nconst DonorCardBase = styled(Sheet)`\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  @media screen and (max-width: 32em) {\n    border-radius: 0;\n    box-shadow: none;\n  }\n`\nconst DonorCard = ({ name, link = false }) => (\n  <DonorCardBase bg=\"white\" p=\"18px!important\" mb={0}>\n    <Text color=\"black\" sx={{ textAlign: 'center', fontSize: '16px' }}>\n      {name}\n    </Text>\n  </DonorCardBase>\n)\nconst DonorListing = ({ name, url }) => {\n  if (url) {\n    return (\n      <A target=\"_blank\" href={url} color=\"black\">\n        <DonorCard name={name} link />\n      </A>\n    )\n  } else {\n    return <DonorCard name={name} />\n  }\n}\n\nexport default function Donate() {\n  return (\n    <Box>\n      <Meta\n        as={Head}\n        title={title}\n        description={desc}\n        image=\"https://cloud-cz9a6kt0a-hack-club-bot.vercel.app/0social-photo_2.jpg\"\n      />\n      <Nav color=\"muted\" />\n      <ForceTheme theme=\"light\" />\n      <Header sx={{ position: 'relative' }}>\n        <Box\n          sx={{\n            background: 'rgba(0,0,0, 0.8)',\n            zIndex: 1,\n            position: 'relative',\n            color: 'white!important',\n            height: '600px'\n          }}\n          pt={[5, 5, '110px']}\n        >\n          <Box\n            sx={{\n              maxWidth: '64rem',\n              mx: 'auto',\n              zIndex: 1,\n              position: 'relative',\n              textAlign: 'center'\n            }}\n            py={2}\n            px={[1, 3]}\n          >\n            <Container\n              sx={{\n                maxWidth: '48rem',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'center'\n              }}\n            >\n              <Heading\n                sx={{\n                  fontSize: ['42px', '54px', '72px'],\n                  my: 2,\n                  color: 'white'\n                }}\n              >\n                We rely on people like you to bring coding to the world.\n              </Heading>\n              <Box\n                sx={{\n                  fontSize: ['22px', '23px', '28px'],\n                  maxWidth: '40rem',\n                  color: 'white',\n                  textAlign: 'center'\n                }}\n              >\n                Contribute today to empower the next generation. Help start a\n                Hack Club at every high school.\n              </Box>\n              <Button\n                variant=\"ctaLg\"\n                my={3}\n                sx={{ width: ['100%', 'auto'] }}\n                as=\"a\"\n                {...({\n                  href: 'https://hcb.hackclub.com/donations/start/hq'\n                } as any)}\n              >\n                Donate\n                <Text sx={{ display: ['none', 'inline-block'], ml: 2 }}>\n                  to Hack Club\n                </Text>\n              </Button>\n              <Text\n                sx={{ mt: 1, display: 'block', opacity: 0.8 }}\n                color=\"white\"\n              >\n                Your contribution is tax-deductible.\n                <br />\n                Hack Club is a 501(c)(3) nonprofit with the EIN 81-2908499.\n              </Text>\n            </Container>\n          </Box>\n        </Box>\n      </Header>\n      <Flex bg=\"snow\" color=\"black\">\n        <Container py={[4, 5]} sx={{ textAlign: ['left', 'center'] }}>\n          <Heading\n            px={3}\n            mt={[3, 4]}\n            mb={[3, 4]}\n            mx=\"auto\"\n            as=\"h1\"\n            sx={{ fontSize: [5, 6] }}\n          >\n            A few of our amazing donors.\n          </Heading>\n          <DonorGrid mt={4} mb={4}>\n            {Object.keys(donors).map(name => (\n              <DonorListing key={name} name={name} url={donors[name]} />\n            ))}\n          </DonorGrid>\n          <Heading px={3} sx={{ fontWeight: 'normal', mt: 2 }}>\n            and many more…\n          </Heading>\n        </Container>\n      </Flex>\n      <Container {...({ ...contentContainer } as any)}>\n        <Row my={5} {...content}>\n          <Heading {...subhline} mb={4} sx={{ fontSize: [4, 5] }}>\n            These fabulous companies donate their products to us.\n          </Heading>\n          <Sponsors />\n        </Row>\n        <Button\n          as=\"a\"\n          {...({ href: '/philanthropy', target: '_blank' } as any)}\n          mb={4}\n          sx={{\n            fontSize: '1em !important',\n            background: 'slate',\n            textAlign: 'center'\n          }}\n        >\n          Learn more about Hack Club\n        </Button>\n      </Container>\n      <Footer />\n    </Box>\n  )\n}\n"
  },
  {
    "path": "pages/philosophy.tsx",
    "content": "import Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport { Box, Heading, Container, Text, Button, Link } from 'theme-ui'\nimport Nav from '../components/nav'\nimport styled from '@emotion/styled'\nimport Footer from '../components/footer'\nimport NextLink from 'next/link'\n\nconst Header = styled(Box)`\n  color: white;\n  background-image: linear-gradient(\n    32deg,\n    rgb(207, 45, 228) 0%,\n    rgb(228, 45, 66) 64%,\n    rgb(206, 41, 60) 100%\n  );\n  clip-path: polygon(0% 0%, 100% 0, 100% 100%, 0% 90%);\n  > div {\n    position: relative;\n  }\n`\n\nconst Seal = styled(Box)`\n  border-radius: 9999px;\n  background-color: white;\n  color: black;\n  mix-blend-mode: screen;\n  text-align: center;\n  width: 12rem;\n  height: 12rem;\n  position: absolute;\n  margin-top: -1rem;\n  transform: rotate(4deg);\n  @media screen and (min-width: 32em) {\n    transform: rotate(3deg);\n    margin-top: -3rem;\n  }\n`\n\nconst Ultraline = styled(Heading)`\n  line-height: 1.125 !important;\n  text-transform: uppercase;\n  color: 'white';\n  caps: true;\n  &:nth-of-type(2) {\n    padding-left: 1.5rem;\n    @media screen and (min-width: 48em) {\n      padding-left: 6rem;\n    }\n  }\n  &:nth-of-type(3) {\n    text-align: center;\n  }\n  &:nth-of-type(4) {\n    text-align: right;\n    position: relative;\n    &:before {\n      content: '';\n      position: absolute;\n      clip-path: polygon(8% 0%, 100% 0%, 92% 100%, 0% 100%);\n      background-color: rgba(252, 252, 252, 0.625);\n      mix-blend-mode: overlay;\n      right: -0.5rem;\n      width: 9.5rem;\n      height: 2.5rem;\n      @media screen and (min-width: 32em) {\n        width: 20rem;\n        height: 5.5rem;\n      }\n    }\n  }\n`\n\nconst Row = styled(Container)`\n  px: 3;\n  py: [4, 5];\n  color: 'black';\n  display: grid;\n  text-align: left;\n  h2 {\n    line-height: 1;\n    margin-bottom: 18px;\n  }\n  @media screen and (min-width: 48em) {\n    grid-gap: 24px;\n    grid-template-columns: 2fr 3fr;\n  }\n`\n\nconst Super = styled(Text)`\n  background-color: rgb(228, 115, 45);\n  clip-path: polygon(4% 0%, 100% 0%, 96% 100%, 0% 100%);\n  color: rgb(255, 255, 255);\n  display: inline-block;\n  padding-bottom: 12px;\n  padding-left: 18px;\n  padding-right: 18px;\n`\n\nexport default function Philosophy() {\n  return (\n    <Box sx={{ bg: 'white', color: 'black', minHeight: '100vh' }}>\n      <Nav />\n      <Meta\n        as={Head}\n        title=\"Philosophy\"\n        description=\"Read about Hack Club, a network of high school computer science clubs. We want to make building apps and websites accessible to everyone through programming clubs at every high school.\"\n        image=\"https://cloud-cz9a6kt0a-hack-club-bot.vercel.app/0social-photo_2.jpg\"\n      />\n      <Box>\n        <Header>\n          <Container\n            sx={{\n              width: '100%',\n              textAlign: 'left',\n              maxWidth: '56rem!important',\n              py: '72px',\n              px: 3\n            }}\n          >\n            <Ultraline sx={{ fontSize: [48, 54, 72, 96] }}>We're</Ultraline>\n            <Ultraline sx={{ fontSize: [48, 54, 72, 96] }}>\n              at our best\n            </Ultraline>\n            <Ultraline sx={{ fontSize: [48, 54, 72, 96] }}>\n              when we're\n            </Ultraline>\n            <Ultraline sx={{ fontSize: [48, 54, 72, 96] }}>making.</Ultraline>\n            <Seal pt={[3, 4]}>\n              <Heading\n                sx={{\n                  fontWeight: '400',\n                  marginBlockStart: '0em',\n                  fontSize: ['16px', '18px'],\n                  textTransform: 'uppercase'\n                }}\n              >\n                The Hack Club\n              </Heading>\n              <Heading\n                sx={{\n                  fontSize: [2, 3],\n                  fontWeight: '800',\n                  marginBlockStart: '0em',\n                  textTransform: 'uppercase'\n                }}\n              >\n                Philosophy\n              </Heading>\n            </Seal>\n          </Container>\n        </Header>\n        <Row py={4} mt={[0, 4]}>\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: [36, 48] }}\n            color=\"rgb(228, 45, 66);\"\n          >\n            Coding is a <Super>superpower.</Super>\n          </Heading>\n          <Box sx={{ fontSize: [3, 3] }}>\n            Learning to code is uniquely like gaining a superpower: it converts\n            you from a consumer to a creator. Suddenly, computers become a tool\n            for creating.\n          </Box>\n        </Row>\n        <Row sx={{ px: 3, py: [3, 4], color: 'black' }}>\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: [36, 48] }}\n            color=\"rgb(207, 45, 228);\"\n          >\n            Make, from anywhere.\n          </Heading>\n          <Box sx={{ fontSize: [3, 3] }}>\n            There’s never been a better time for making: anywhere in the world,\n            anyone with a laptop and an internet connection can learn to make an\n            app. Building things has never been so globally democratized.\n          </Box>\n        </Row>\n        <Row sx={{ px: 3, py: [3, 4], color: 'black' }}>\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: [36, 48] }}\n            color=\"rgb(115, 45, 228);\"\n          >\n            Hack, hack, hack.\n          </Heading>\n          <Box sx={{ fontSize: [3, 3] }}>\n            <strong>\n              The goal of Hack Club is to help you become a hacker.\n            </strong>{' '}\n            We want a space at every school where people are making interesting\n            things with code, every week. Most schools don’t provide that, so\n            we’re creating it in every school to make building things accessible\n            to everyone.\n          </Box>\n        </Row>\n        <Row sx={{ px: 3, py: [3, 4], color: 'black' }}>\n          <Heading as=\"h2\" sx={{ fontSize: [36, 48] }} color=\"rgb(45, 66, 228)\">\n            Start building.\n          </Heading>\n          <Box sx={{ fontSize: [3, 3] }}>\n            Most coding classes teach you programming concepts instead of how to\n            write real code—it’s like trying to learn carpentry without any\n            wood. So at Hack Club, you learn to code entirely through building\n            things. You start with no experience and build and ship a project\n            every meeting.\n          </Box>\n        </Row>\n        <Row sx={{ px: 3, py: [3, 4], color: 'black' }}>\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: [36, 48] }}\n            color=\"rgb(41, 143, 206)\"\n          >\n            Learn as you build.\n          </Heading>\n          <Box sx={{ fontSize: [3, 3] }}>\n            Just as the best carpenters didn’t learn in the classroom, neither\n            did the best programmers. Through our{' '}\n            <Link href=\"/workshops\">workshops</Link>, you’ll be walked through\n            building projects. Starting out, you won’t understand how the code\n            works, but you’ll build understanding as you go. You’ll get stuck\n            along the way, but we’re here to help.\n          </Box>\n        </Row>\n        <Row sx={{ px: 3, py: [3, 4], color: 'black' }}>\n          <Heading\n            as=\"h2\"\n            sx={{ fontSize: [36, 48] }}\n            color=\"rgb(36, 181, 165)\"\n          >\n            Be part of a community.\n          </Heading>\n          <Box sx={{ fontSize: [3, 3] }}>\n            Hack Club gives you a worldwide community of thousands of other\n            young makers to talk to. We’re artists, writers, engineers,\n            tinkerers, campers, filmmakers, volunteers. We make things. We help\n            one another. We have fun. Join us.\n          </Box>\n        </Row>\n        <Box\n          sx={{\n            backgroundImage: t => (t as any).util.gx('orange', 'red'),\n            margin: 'auto',\n            width: '600px',\n            maxWidth: '90%',\n            mb: 4,\n            borderRadius: 8,\n            color: 'white',\n            textAlign: 'center',\n            p: 4\n          }}\n        >\n          <Heading as=\"h1\" sx={{ fontSize: 5, mb: 2 }}>\n            Join the movement!\n          </Heading>\n          <Button\n            mr={[0, 3]}\n            mb={[3, 0]}\n            sx={{\n              bg: 'white',\n              color: 'red',\n              display: ['block', 'inline-block'],\n              mx: 'auto'\n            }}\n            as=\"a\"\n            {...({ href: 'https://apply.hackclub.com' } as any)}\n          >\n            Start a club\n          </Button>\n          <NextLink href=\"https://slack.hackclub.com\">\n            <Button sx={{ bg: 'white', color: 'red' }}>Join our Slack</Button>\n          </NextLink>\n        </Box>\n      </Box>\n      <Footer light />\n    </Box>\n  )\n}\n"
  },
  {
    "path": "pages/pizza.tsx",
    "content": "import {\n  Box,\n  Link,\n  Grid,\n  Image as ThemeImage,\n  Container,\n  Button,\n  Heading,\n  Text\n} from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\nimport Nav from '../components/nav'\nimport Tilt from '../components/tilt'\nimport Ticker from 'react-ticker'\nimport { useState, useEffect } from 'react'\nimport Image from 'next/image'\n\nconst PizzaPage = () => {\n  const [isModalOpen, setIsModalOpen] = useState(false)\n  useEffect(() => {\n    setIsModalOpen(true)\n  }, [])\n\n  useEffect(() => {\n    if (isModalOpen) {\n      document.body.style.overflow = 'hidden'\n    } else {\n      document.body.style.overflow = 'auto'\n    }\n  }, [isModalOpen])\n\n  const getColor = idx => {\n    const colors = ['#EEA820', '#FF8C37', '#EC3750']\n    return colors[idx % colors.length]\n  }\n  const pizzasByClubs = [\n    {\n      sprite:\n        'https://cloud-l0q2898m7-hack-club-bot.vercel.app/0sprite__1_.png',\n      author: 'Thomas',\n      age: 18,\n      from: 'South Carolina',\n      response:\n        \"I love pineapple pizza & hosting club meets! It's awesome how every week I get to get together with friends and build awesome open source projects. SO GLAD I STARTED MY CLUB!!!\"\n    },\n    {\n      sprite: 'https://cloud-mpql3aoi9-hack-club-bot.vercel.app/0sprite.png',\n      author: 'Odysseus',\n      age: 14,\n      from: 'Epanomi',\n      response:\n        \"I am addicted to margherita pizza and I am super excited to host club meetings! We meet every Saturday on Discord and we build projects together! On our next meeting, we will be creating a web-based operating system! I'm so happy to be a part of my club and Hack Club!\"\n    },\n    {\n      sprite: 'https://cloud-7sioop5e1-hack-club-bot.vercel.app/0sprite.png',\n      author: 'Sarvesh',\n      age: 16,\n      from: 'Ottawa',\n      response:\n        'I love meat lovers pizza and sharing my passion for technology. I love to get together with friends with the same mindset as me and work on amazing open source projects! MAKING A HACK CLUB WAS A GREAT DECISION!!!'\n    },\n    {\n      sprite: 'https://cloud-8rvh6jo64-hack-club-bot.vercel.app/0sprite.png',\n      author: 'Dieter',\n      age: 18,\n      from: 'South Carolina',\n      response:\n        \"I'm a big fan of Cheese and Spinach pizza—the texture is amazing! I started my club to fill a gap in computer science projects at my school. Leading this club allows me to challenge members; for instance, we use Sprig to create our own 2-bit games. It's Open Source, which significantly enhances our projects!\"\n    },\n    {\n      sprite: 'https://cloud-2ca30e1bb-hack-club-bot.vercel.app/0sprite.png',\n      author: 'JC',\n      age: 17,\n      from: 'Massachusetts',\n      response:\n        \"Leading a club is a lot of fun! You get to build cool stuff with other club members, but being a leader means you also get to teach people how to code. Plus who isn't excited about a Christmas pizza party (with pineapple of course)?\"\n    },\n    {\n      sprite: 'https://cloud-d16y68pgi-hack-club-bot.vercel.app/0sprite.png',\n      author: 'Miguel',\n      age: 17,\n      from: 'Illinois',\n      response:\n        \"I love Costco pizza, and we had some at my Hack Club's hackathon! I decided to lead the Hersey Hack Club to bring the magic of code to my classmates and build a coding community at my high school. Open source projects like Code Jams have given the Hersey Hack Club a great stream of new, constantly improving workshops to host for members!\"\n    },\n    {\n      sprite:\n        'https://cloud-i23dx2r15-hack-club-bot.vercel.app/0sprite__8_.png',\n      author: 'Jaime',\n      age: 18,\n      from: 'South Carolina',\n      response:\n        'I love cheese pizzaaa (Ik I am kinda basic but it is good 😭). I lead the club because it is a great opportunity to meet people in my school who are so talented and skilled in areas where I may not be. And it is a great experience to interact and make friends with them!!!'\n    },\n    {\n      sprite:\n        'https://cloud-ed5wo5bt9-hack-club-bot.vercel.app/0sprite__1_.png',\n      author: 'Sarah',\n      age: 12,\n      from: 'Massachusetts',\n      response:\n        'I love pepperoni pizza and my Hack Club! I love leading a Hack Club and sharing cool open source projects. yay!!'\n    },\n    {\n      sprite: 'https://cloud-5kl9y9pup-hack-club-bot.vercel.app/0sprite.png',\n      author: 'Shubham',\n      age: 15,\n      from: 'Bay Area',\n      response:\n        \"I love eating veggie pizza and hosting club meets at Mission San Jose High School's Hack Club! Hosting club meets is more than superficial for me—seeing everyone in the room, all exhibiting the same amount of excitement for code is something unique, and I'm glad to be hosting clubs meets for this passion to run wild.\"\n    }\n  ]\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Running a Hack Club? Get $5 in Free Pizza For Every Finished Project\"\n        description=\"GitHub is providing pizza grants to 500 Hack Clubs around the world. Wondering How To Start A Coding Club? Hack Club is the answer.\"\n        image=\"https://cloud-p6r4eeji5-hack-club-bot.vercel.app/00club-min__1___1___1_.png\"\n      />\n\n      {isModalOpen && (\n        <Box\n          onClick={() => setIsModalOpen(false)}\n          sx={{\n            position: 'fixed',\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            bg: 'rgba(0, 0, 0, 0.5)',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            zIndex: 9999\n          }}\n        >\n          <Box\n            onClick={e => e.stopPropagation()}\n            sx={{\n              bg: 'white',\n              borderRadius: '16px',\n              p: 4,\n              maxWidth: '600px',\n              width: '90%',\n              maxHeight: '80vh',\n              overflowY: 'auto',\n              position: 'relative'\n            }}\n          >\n            <Button\n              onClick={() => setIsModalOpen(false)}\n              sx={{\n                position: 'absolute',\n                top: 2,\n                right: 2,\n                bg: 'muted',\n                cursor: 'pointer',\n                borderRadius: '50%',\n                width: '32px',\n                height: '32px',\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n                fontSize: '20px',\n                border: 'none'\n              }}\n            >\n              ✕\n            </Button>\n\n            <Heading mb={3}>The pizza grant is ending! (for now)</Heading>\n            <Text sx={{ fontSize: 22 }}>\n              Hey there! The pizza grant has ended, but we're working on a\n              system to bring it back soon. For now, we've temporarily disabled\n              submissions. Keep an eye on your Leaders newsletter for updates!\n            </Text>\n          </Box>\n        </Box>\n      )}\n      <ForceTheme theme=\"light\" />\n      <Nav />\n      <Box\n        sx={{\n          paddingBottom: 256\n        }}\n      >\n        <Box\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            height: '720px',\n            left: 0,\n            top: 0,\n            zIndex: 2,\n            background:\n              'url(https://cloud-ecflmj5yi-hack-club-bot.vercel.app/00texture__1_.png)',\n            mixBlendMode: 'color-burn',\n            pointerEvents: 'none',\n            display: ['none', 'flex']\n          }}\n        ></Box>\n\n        <Box\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            height: '720px',\n            left: 0,\n            top: 0,\n            zIndex: 1,\n            background: [\n              'linear-gradient(180deg, rgba(236, 55, 80, 0.40) 0%, rgba(236, 120, 55, 0.20) 23.16%, rgba(248, 127, 59, 0.08) 45.88%, rgba(255, 140, 55, 0.04) 66.81%, rgba(255, 181, 38, 0.00) 85.52%)',\n              'linear-gradient(180deg, rgba(236, 55, 80, 0.40) 0%, rgba(236, 120, 55, 0.20) 23.16%, rgba(248, 127, 59, 0.08) 45.88%, rgba(255, 140, 55, 0.04) 66.81%, rgba(255, 181, 38, 0.00) 85.52%), radial-gradient(65.56% 65.56% at 50% 19.96%, rgba(255, 0, 0, 0.40) 0%, rgba(255, 90, 67, 0.40) 23.96%, rgba(255, 46, 0, 0.00) 100%)'\n            ],\n            mixBlendMode: 'hard-light',\n            pointerEvents: 'none'\n          }}\n        ></Box>\n        <Container\n          sx={{\n            textAlign: 'center',\n            position: 'relative',\n            width: '100%',\n            height: '100%',\n            left: 0,\n            top: 0,\n            zIndex: 2,\n            color: 'dark',\n            paddingTop: [96, 96, 128],\n            paddingLeft: '16px',\n            paddingRight: '16px'\n          }}\n        >\n          <ThemeImage\n            alt={'GitHub + Hack Club'}\n            sx={{ width: ['128px', '128px', '256px'], marginBottom: '16px' }}\n            src=\"https://cloud-e3wj9s4pe-hack-club-bot.vercel.app/00combo__1_.png\"\n          />\n          <Heading\n            as=\"h1\"\n            variant=\"title\"\n            sx={{\n              fontSize: ['38px', 6, null, 7],\n              paddingBottom: '16px',\n              span: {\n                background: [\n                  'linear-gradient(180deg, #FF8C37 25%, #EC3750 100%)'\n                ],\n                WebkitBackgroundClip: 'text',\n                WebkitTextStroke: 'currentColor',\n                WebkitTextFillColor: 'transparent'\n              }\n            }}\n          >\n            Throw A Pizza Party\n            <br />\n            <span>\n              <Text>After Every Project</Text>\n              <ThemeImage\n                alt={''}\n                sx={{\n                  position: 'absolute',\n                  display: ['none', 'none', 'none', 'flex'],\n                  left: '17.5%',\n                  bottom: '42px'\n                }}\n                src=\"https://cloud-b3bvwbz46-hack-club-bot.vercel.app/0line.svg\"\n              />\n            </span>\n          </Heading>\n          <Text variant=\"lead\">\n            GitHub is providing pizza grants to <strong>thousands</strong> of\n            Hack Clubs. {/* <strong>You're not too late!</strong> */}\n          </Text>\n        </Container>\n\n        <Box\n          sx={{\n            alignItems: 'center',\n            gap: ['12px', '16px', '24px'],\n            marginTop: '32px',\n            display: 'flex',\n            zIndex: 2,\n            justifyContent: 'center'\n          }}\n        >\n          <Link href=\"/clubs\">\n            <Button variant=\"ctaLg\" sx={{ fontSize: [16, 24] }}>\n              Start A Club\n            </Button>\n          </Link>\n          <a href=\"#GetPizza\">\n            <Button variant=\"outlineLg\" sx={{ fontSize: [16, 24] }}>\n              Get Your Pizza\n            </Button>\n          </a>\n        </Box>\n      </Box>\n\n      <Container\n        sx={{\n          display: 'flex',\n          width: 'calc(100% - 32px)',\n          position: 'relative',\n          marginTop: '-196px',\n          padding: '32px',\n          border: '1px solid #FF8C37',\n          borderRadius: '16px'\n        }}\n      >\n        {/* <Tilt>\n      <ThemeImage sx={{position: \"absolute\", marginTop: \"-82px\", marginLeft: \"-82px\"}} src=\"https://cloud-okty851hq-hack-club-bot.vercel.app/0mushroom.png\"/>\n      </Tilt>\n      <Tilt>\n      <ThemeImage sx={{position: \"absolute\", marginTop: \"-82px\", right: 0, marginRight: \"96px\"}} src=\"https://cloud-fiv5rwxlo-hack-club-bot.vercel.app/0pineapple.png\"/>\n      </Tilt>\n      <Tilt>\n      <ThemeImage sx={{position: \"absolute\", bottom: 0, marginBottom: \"-182px\", marginLeft: \"-82px\"}} src=\"https://cloud-bsv5adze8-hack-club-bot.vercel.app/0tomato.png\"/>\n      </Tilt> */}\n        <Box sx={{ position: 'absolute', top: -48, left: -48 }}>\n          <Tilt options={{ perspective: 75 }}>\n            <ThemeImage\n              alt=\"mushroom\"\n              sx={{\n                imageRendering: 'pixelated',\n                display: ['none', 'none', 'flex']\n              }}\n              src=\"https://cloud-okty851hq-hack-club-bot.vercel.app/0mushroom.png\"\n            />\n          </Tilt>\n        </Box>\n        <Box sx={{ position: 'absolute', top: -48, right: -48 }}>\n          <Tilt options={{ perspective: 75 }}>\n            <ThemeImage\n              alt=\"pineapple\"\n              sx={{\n                imageRendering: 'pixelated',\n                display: ['none', 'none', 'flex']\n              }}\n              src=\"https://cloud-fiv5rwxlo-hack-club-bot.vercel.app/0pineapple.png\"\n            />\n          </Tilt>\n        </Box>\n        <Box sx={{ position: 'absolute', bottom: -48, left: -48 }}>\n          <Tilt options={{ perspective: 75 }}>\n            <ThemeImage\n              alt=\"tomato\"\n              sx={{\n                imageRendering: 'pixelated',\n                display: ['none', 'none', 'flex']\n              }}\n              src=\"https://cloud-bsv5adze8-hack-club-bot.vercel.app/0tomato.png\"\n            />\n          </Tilt>\n        </Box>\n        <Box sx={{ position: 'absolute', bottom: -48, right: -48 }}>\n          <Tilt options={{ perspective: 75 }}>\n            <ThemeImage\n              alt=\"pizza\"\n              sx={{\n                imageRendering: 'pixelated',\n\n                display: ['none', 'none', 'flex']\n              }}\n              src=\"https://cloud-4my12nuf0-hack-club-bot.vercel.app/0pizza.png\"\n            />\n          </Tilt>\n        </Box>\n        <Grid\n          sx={{ alignItems: 'center', position: 'relative' }}\n          gap={[2, 3]}\n          columns={[null, null, null, '3fr 2fr']}\n        >\n          <Box>\n            <Heading\n              as=\"h2\"\n              variant=\"heading\"\n              sx={{\n                fontSize: [40, 40, 42],\n                lineHeight: '100%',\n                paddingBottom: '16px',\n                span: {\n                  background:\n                    'linear-gradient(180deg, #FF8C37 25%, #EC3750 100%)',\n                  WebkitBackgroundClip: 'text',\n                  WebkitTextStroke: 'currentColor',\n                  WebkitTextFillColor: 'transparent'\n                }\n              }}\n            >\n              Create A Space for Makers\n            </Heading>\n            <Text sx={{ fontSize: 22 }}>\n              Hack Club is a place for technical teens to get together and build\n              projects together. Create a club at your high school and help\n              others discover the joy of coding through building projects.\n            </Text>\n          </Box>\n          <Box>\n            <ThemeImage\n              alt=\"teens collaborating on tech products\"\n              sx={{ borderRadius: '16px' }}\n              src=\"https://cloud-r38lu87ej-hack-club-bot.vercel.app/00meta__1_.png\"\n            />\n          </Box>\n        </Grid>\n        <br />\n      </Container>\n      <Container sx={{ paddingLeft: 16, paddingRight: 16 }}>\n        <Grid\n          sx={{ marginTop: 32, width: '100%', paddingLeft: 0, paddingRight: 0 }}\n          gap={4}\n          columns={[null, null, '1fr 1fr 1fr']}\n        >\n          <Box\n            sx={{\n              backgroundColor: '#E1A300',\n              padding: 32,\n              margin: 0,\n              borderRadius: '24px',\n              color: '#fff'\n            }}\n          >\n            <Heading\n              as=\"h2\"\n              variant=\"heading\"\n              sx={{ padding: 0, marginBottom: '8px', fontSize: 36 }}\n            >\n              Join A Community of Teen Hackers\n            </Heading>\n\n            <Text sx={{ fontSize: 18, display: 'block' }}>\n              In our Slack community of over 55,000 hackers, you'll be invited\n              to a space for Hack Club leaders to ask questions & chat, share\n              projects, & attend events.\n            </Text>\n            <Link href=\"https://slack.hackclub.com\">\n              <Button\n                sx={{\n                  marginTop: 16,\n                  backgroundColor: '#fff',\n                  color: '#EEA820'\n                }}\n              >\n                Join The Slack\n              </Button>\n            </Link>\n          </Box>\n\n          <Box\n            sx={{\n              backgroundColor: '#F48801',\n              padding: 32,\n              margin: 0,\n              borderRadius: '24px',\n              color: '#fff'\n            }}\n          >\n            <Heading\n              as=\"h2\"\n              variant=\"heading\"\n              sx={{ padding: 0, marginBottom: '8px', fontSize: 36 }}\n            >\n              Tools & Perks To Lead Your Club\n            </Heading>\n\n            <Text sx={{ fontSize: 18, display: 'block' }}>\n              As a club leader, you'll get to use community projects like Sprig\n              & Jams in your Hack Club! Your Club will also get free access to\n              Zoom Pro & Figma Pro.\n            </Text>\n            <Link href=\"https://toolbox.hackclub.com/\">\n              <Button\n                sx={{\n                  marginTop: 16,\n                  backgroundColor: '#fff',\n                  color: '#FF8C37'\n                }}\n              >\n                Discover Toolbox\n              </Button>\n            </Link>\n          </Box>\n\n          <Box\n            sx={{\n              backgroundColor: '#F6013B',\n              padding: 32,\n              margin: 0,\n              borderRadius: '24px',\n              color: '#fff'\n            }}\n          >\n            <Heading\n              as=\"h2\"\n              variant=\"heading\"\n              sx={{ padding: 0, marginBottom: '8px', fontSize: 36 }}\n            >\n              Lead Weekly Club Meetings\n            </Heading>\n\n            <Text sx={{ fontSize: 18, display: 'block' }}>\n              Every week you can craft club meetings to help makers at your\n              school discover the joy of coding. Get inspired by some Jams we\n              built to help you lead your club.{' '}\n            </Text>\n\n            <Link href=\"https://jams.hackclub.com/\">\n              <Button\n                sx={{\n                  marginTop: 16,\n                  backgroundColor: '#fff',\n                  color: '#EC3750'\n                }}\n              >\n                Explore Jams\n              </Button>\n            </Link>\n          </Box>\n        </Grid>\n      </Container>\n      <Box>\n        <Container sx={{ marginTop: 32, padding: '16px' }}>\n          <Heading\n            as=\"h2\"\n            variant=\"heading\"\n            sx={{\n              padding: 0,\n              fontSize: [28, 34, 36],\n              background: 'linear-gradient(180deg, #FF8C37 25%, #EC3750 100%)',\n              WebkitBackgroundClip: 'text',\n              WebkitTextFillColor: 'transparent',\n              filter:\n                'drop-shadow(0px 3.171428680419922px 16px rgba(0, 0, 0, 0.15))'\n            }}\n          >\n            Pizzas & Clubs by Leaders\n          </Heading>{' '}\n        </Container>\n\n        <Ticker speed={3}>\n          {() => (\n            <Box as=\"div\" sx={{ display: 'flex', py: [4, 5, 5] }}>\n              {pizzasByClubs.map((pizzaByClub, idx) => (\n                <Box\n                  key={idx}\n                  sx={{\n                    position: 'relative',\n                    borderRadius: '16px',\n                    padding: '8px 16px 16px 16px',\n                    width: ['300px', '500px'],\n                    marginLeft: '16px',\n                    marginRight: '16px',\n                    border: '1px solid var(--Muted, #8492A6)'\n                  }}\n                >\n                  <Tilt\n                    sx={{ backgroundColor: '#fff' }}\n                    options={{ scale: 1.25, perspective: 2000, speed: 500 }}\n                  >\n                    <Image\n                      alt=\"pizza drawn by club\"\n                      src={pizzaByClub.sprite}\n                      width={48}\n                      height={48}\n                      style={{\n                        position: 'absolute',\n                        width: '48px',\n                        top: '-16px',\n                        left: '-16px',\n                        height: '48px',\n                        padding: '8px',\n                        imageRendering: 'pixelated',\n                        borderRadius: '8px',\n                        border: `1.75px solid ${getColor(idx)}`,\n                        backgroundColor: '#fff',\n                        zIndex: 2\n                      }}\n                    />\n                  </Tilt>\n                  <Text\n                    sx={{\n                      paddingLeft: '24px',\n                      fontSize: [18, 18, 22],\n                      fontWeight: 600,\n\n                      background:\n                        'linear-gradient(95deg, #EC3750 0%, #FF8C37 100%)',\n                      WebkitBackgroundClip: 'text',\n                      WebkitTextFillColor: 'transparent',\n                      filter:\n                        'drop-shadow(0px 3.171428680419922px 16px rgba(0, 0, 0, 0.15))'\n                    }}\n                  >\n                    {pizzaByClub.author} ({pizzaByClub.age}) from{' '}\n                    {pizzaByClub.from}\n                  </Text>\n                  <br />\n                  <Text sx={{ paddingTop: '16px', fontSize: [16, 18] }}>\n                    {pizzaByClub.response}\n                  </Text>\n                </Box>\n              ))}\n            </Box>\n          )}\n        </Ticker>\n      </Box>\n\n      <Container sx={{ padding: '16px' }}>\n        <Box\n          sx={{\n            borderRadius: '16px',\n            background:\n              'linear-gradient(95deg, #EC3750 0%, #FF8C37 100%), #D9D9D9',\n            boxShadow: '0px 3.17143px 16px 0px rgba(0, 0, 0, 0.15)',\n            padding: ['24px', '32px'],\n            marginBottom: '64px'\n          }}\n        >\n          <p\n            id=\"GetPizza\"\n            style={{ marginTop: '-128px', opacity: 0, position: 'absolute' }}\n          >\n            Above\n          </p>\n          <Heading\n            as=\"h2\"\n            variant=\"heading\"\n            sx={{\n              fontSize: 36,\n              color: '#fff',\n              fontWeight: 600,\n              marginBottom: ['16px', '16px', '0px']\n            }}\n          >\n            Get Your Pizza\n          </Heading>\n\n          <Grid\n            sx={{ alignItems: 'center', position: 'relative' }}\n            gap={[2, 3]}\n            columns={[null, null, '2.5fr 3fr 2.5fr']}\n          >\n            <Box\n              sx={{\n                backgroundColor: '#fff',\n                padding: '16px',\n                borderRadius: '16px'\n              }}\n            >\n              <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                <Image\n                  alt=\"1. \"\n                  width={32}\n                  height={32}\n                  style={{ height: '32px', width: '32px', marginRight: '12px' }}\n                  src=\"https://cloud-2prihxd69-hack-club-bot.vercel.app/0group_12.png\"\n                />\n                <Text\n                  sx={{\n                    color: '#000',\n                    fontSize: 26,\n                    display: 'block',\n                    fontWeight: 600\n                  }}\n                >\n                  Start Your Club\n                </Text>\n              </Box>\n              <Text\n                sx={{\n                  color: '#000',\n                  marginTop: '8px',\n                  display: 'block',\n                  fontSize: 18,\n                  fontWeight: 500,\n                  lineHeight: '150%'\n                }}\n              >\n                Every Hack Club starts with a teenager like you who wants to\n                bring an amazing community to their high school.\n              </Text>\n              <ThemeImage\n                alt=\"teen club of coders\"\n                sx={{\n                  width: ['75%', '75%', '40%'],\n                  borderRadius: '16px',\n                  marginTop: '8px',\n                  marginBottom: '8px'\n                }}\n                src=\"https://cloud-k4ohqgmro-hack-club-bot.vercel.app/00style__1_.png\"\n              />\n              <Box>\n                <Link href=\"/clubs\">\n                  <Button\n                    variant=\"outline\"\n                    mt={[3, 0, 0]}\n                    sx={{\n                      fontSize: '18px'\n                    }}\n                  >\n                    Start A Club\n                  </Button>\n                </Link>\n              </Box>\n            </Box>\n\n            <Box\n              sx={{\n                backgroundColor: '#fff',\n                padding: '16px',\n                borderRadius: '16px'\n              }}\n            >\n              <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                <Image\n                  alt=\"2. \"\n                  width={32}\n                  height={32}\n                  style={{ height: '32px', width: '32px', marginRight: '12px' }}\n                  src=\"https://cdn.hack.pet/slackcdn/51120204d69dcbf3a5a38fe44bb511ef.png\"\n                />\n                <Text\n                  sx={{\n                    color: '#000',\n                    fontSize: 26,\n                    display: 'block',\n                    fontWeight: 600\n                  }}\n                >\n                  Run Your Meeting\n                </Text>\n              </Box>\n              <Text\n                sx={{\n                  color: '#000',\n                  marginTop: '8px',\n                  display: 'block',\n                  fontSize: 18,\n                  fontWeight: 500,\n                  lineHeight: '150%'\n                }}\n              >\n                Host an engaging workshop where your club members create and\n                complete their own coding projects. Want ideas? check out{' '}\n                <Link href=\"https://ysws.hackclub.com\">ysws.hackclub.com</Link>{' '}\n                or{' '}\n                <Link href=\"https://jams.hackclub.com\">jams.hackclub.com</Link>!\n              </Text>\n              <Image\n                alt=\"code jams\"\n                width={800}\n                height={600}\n                style={{\n                  width: '75%',\n                  borderRadius: '16px',\n                  marginTop: '12px',\n                  marginBottom: '8px',\n                  height: 'auto',\n                  border: '1px solid lightgray'\n                }}\n                src=\"https://cdn.hackclubber.dev/slackcdn/93cb3f60fbcafd1f890e9bb96d5bf5f4.png\"\n              />\n              {/* <Box>\n                  <Button\n                    variant=\"cta\"\n                    as=\"a\"\n                    href=\"/slack\"\n                    mt={[3, 0, 0]}\n                    sx={{\n                      fontSize: '18px'\n                    }}\n                  >\n                    Join The Slack\n                  </Button>\n                </Box> */}\n            </Box>\n\n            <Box\n              sx={{\n                backgroundColor: '#fff',\n                padding: '16px',\n                borderRadius: '16px'\n              }}\n            >\n              <Box sx={{ display: 'flex', alignItems: 'center' }}>\n                <Image\n                  alt=\"3.\"\n                  width={32}\n                  height={32}\n                  style={{ height: '32px', width: '32px', marginRight: '12px' }}\n                  src=\"https://cdn.hack.pet/slackcdn/3df92ac5cfc248adc1f46457aedab4d2.png\"\n                />\n                <Text\n                  sx={{\n                    color: '#000',\n                    fontSize: 26,\n                    display: 'block',\n                    fontWeight: 600\n                  }}\n                >\n                  Order Pizza\n                </Text>\n              </Box>\n              <Text\n                sx={{\n                  color: '#000',\n                  marginTop: '8px',\n                  display: 'block',\n                  fontSize: 18,\n                  fontWeight: 500,\n                  lineHeight: '150%'\n                }}\n              >\n                Submit your members' projects on{' '}\n                <Link href=\"https://dashboard.hackclub.com\">the dashboard</Link>{' '}\n                and recieve $5 every hour up to $20 per project for pizza!\n              </Text>\n              <Tilt\n                sx={{\n                  boxShadow: '0px 3.17143px 3.17143px 0px rgba(0, 0, 0, 0.25)'\n                }}\n              >\n                <Image\n                  alt=\"HCB Card\"\n                  width={800}\n                  height={600}\n                  style={{\n                    width: '75%',\n                    borderRadius: '8px',\n                    marginTop: '12px',\n                    height: 'auto',\n                    marginBottom: '8px',\n                    boxShadow: '0px 3.17143px 3.17143px 0px rgba(0, 0, 0, 0.25)'\n                  }}\n                  src=\"https://cloud-hvhkt3xxi-hack-club-bot.vercel.app/00screenshot_2023-09-06_at_2.32_1__1_.png\"\n                />\n              </Tilt>\n              <Box>\n                <Button\n                  variant=\"cta\"\n                  // as=\"a\"\n                  // href=\"https://airtable.com/appSUAc40CDu6bDAp/pagvu2xGhfsMC8AOL/form\"\n                  mt={[3, 0, 0]}\n                  disabled={true}\n                  sx={{\n                    fontSize: '18px',\n                    opacity: 0.7,\n                    cursor: 'not-allowed',\n                    pointerEvents: 'none'\n                  }}\n                >\n                  Submit Projects\n                </Button>\n              </Box>\n            </Box>\n          </Grid>\n        </Box>\n        {/* <Box\n            sx={{\n              fontSize: 20,\n              textAlign: 'center',\n              display: 'flex',\n              justifyContent: 'center',\n              marginBottom: '32px'\n            }}\n          >\n            <Text\n              sx={{\n                border: '1px solid #EC3750',\n                color: '#EC3750',\n                padding: '16px 32px',\n                borderRadius: '32px'\n              }}\n            >\n              p.s. if you already lead a club, you can still get pizza! draw a\n              pizza in{' '}\n              <Link href=\"https://hackclub.slack.com/archives/C05RZ6K7RS5\">\n                #pizza-party\n              </Link>\n            </Text>\n          </Box> */}\n        <Text\n          as=\"p\"\n          style={{\n            textAlign: 'center',\n            width: '100%',\n            fontSize: 18,\n            marginBottom: '32px'\n          }}\n        >\n          Need help getting your Pizza Grant? Give us a hollar at{' '}\n          <Link href=\"mailto:clubs@hackclub.com\">clubs@hackclub.com</Link>.\n        </Text>\n      </Container>\n      <Footer\n        dark\n        sx={{\n          backgroundColor: 'dark',\n          position: 'relative',\n          overflow: 'hidden',\n          textShadow: '0 1px 2px rgba(0,0,0,0.375)',\n          'h2,span,p,a': { color: 'white !important' },\n          '> div img': { objectPosition: ['left', 'center'] },\n          svg: {\n            fill: 'white',\n            filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.25))'\n          }\n        }}\n      />\n    </>\n  )\n}\n\nexport default PizzaPage\n"
  },
  {
    "path": "pages/press.tsx",
    "content": "import { BaseStyles, Box, Button, Container, Grid, Heading } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport Nav from '../components/nav'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\nimport Press from '../components/press.mdx'\nimport { Logo } from './brand'\n\nconst Page = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Press\"\n      description=\"Hack Club HQ’s resources for press.\"\n      image=\"https://workshop-cards.hackclub.com/Press.png?fontSize=350px&brand=HQ\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav color=\"text\" />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'sheet',\n        color: 'text',\n        pt: [5, null, null, null, 6],\n        pb: [3, 4, 5, null, 6],\n        textAlign: 'center'\n      }}\n    >\n      <Container variant=\"copy\">\n        <Heading as=\"h1\" variant=\"title\" sx={{ color: 'primary', mt: [2, 4] }}>\n          Press\n        </Heading>\n        <Heading as=\"h2\" variant=\"subtitle\" sx={{ mt: 3, color: 'text' }}>\n          Hack Club’s resources for press.\n        </Heading>\n      </Container>\n    </Box>\n    <Container\n      variant=\"main\"\n      sx={{\n        py: [3, 4],\n        px: 3,\n        maxWidth: [null, 'copyUltra'],\n        h2: { variant: 'text.headline' }\n      }}\n    >\n      <Heading id=\"banners\" variant=\"headline\">\n        About\n      </Heading>\n      <Box\n        as={BaseStyles}\n        sx={{\n          mx: 0,\n          fontSize: 2,\n          '> p': { maxWidth: 'copy' },\n          h2: { variant: 'text.headline', mt: 4 }\n        }}\n      >\n        <Press />\n      </Box>\n      <a href=\"https://assets.hackclub.com/press.zip\">\n        <Button variant=\"outline\" mt={4} mb={4}>\n          View all →\n        </Button>\n      </a>\n      <Heading variant=\"headline\">Logos</Heading>\n      <Grid columns={[null, 2, 3]} gap={3} sx={{ input: { display: 'none' } }}>\n        {[\n          'flag-standalone',\n          'flag-orpheus-top',\n          'flag-orpheus-left',\n          'flag-standalone-bw',\n          // 'flag-orpheus-top-bw',\n          // 'flag-orpheus-left-bw',\n          'icon-rounded',\n          'icon-square'\n        ].map(key => (\n          <Logo name={key} key={key} />\n        ))}\n      </Grid>\n      <a href=\"https://assets.hackclub.com/logos.zip\">\n        <Button variant=\"outline\" my={4}>\n          Download all →\n        </Button>\n      </a>\n    </Container>\n    <Footer />\n  </>\n)\n\nexport default Page\n"
  },
  {
    "path": "pages/preston-werner-2022.tsx",
    "content": "import { Box, Container, Heading } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\nimport PrestonWernerCopy from '../components/announcements/preston-werner-2022.mdx'\nimport Amount from '../components/announcements/amount'\nimport SlackCTA from '../components/announcements/cta'\nimport AnnouncementHolder from '../components/announcements/holder'\nimport {\n  PillHolder,\n  AuthorPill,\n  DatePill\n} from '../components/announcements/pills'\n\nconst Page = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Tom and Theresa Preston-Werner are Giving $500K\"\n      description=\"We’re thrilled to announce Tom and Theresa Preston-Werner have donated $500k to Hack Club, a global nonprofit network of high school hackers & coding clubs.\"\n      image=\"https://workshop-cards.hackclub.com/Preston-Werner%20Gift%20Announcement.png?fontSize=175px&brand=HQ\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"section\"\n      sx={{\n        pt: [5, 6],\n        pb: [4, 5],\n        bg: 'rgb(104, 41, 205)',\n        backgroundImage: (t: any) => t.util.gx('blue', 'green')\n      }}\n    >\n      <Container sx={{ textAlign: 'center', color: 'white' }}>\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{\n            fontSize: [5, 6, null, '82px'],\n            span: {\n              WebkitTextStroke: 'currentColor',\n              WebkitTextStrokeWidth: ['2px', '3px'],\n              WebkitTextFillColor: 'transparent'\n            }\n          }}\n        >\n          Tom and Theresa{' '}\n          <span style={{ whiteSpace: 'nowrap' }}>Preston-Werner</span> are\n          donating <Amount amount=\"$500,000\" /> to&nbsp;Hack&nbsp;Club\n        </Heading>\n      </Container>\n    </Box>\n    <AnnouncementHolder>\n      <PillHolder>\n        <AuthorPill\n          firstName=\"Christina\"\n          tag=\"Christina Asquith, COO\"\n          image=\"https://cloud-macp9mbpq.vercel.app/0image.png\"\n        />\n        <AuthorPill\n          firstName=\"Zach\"\n          tag=\"Zach Latta, founder\"\n          image=\"https://hackclub.com/team/zach.jpg\"\n        />\n        <DatePill tag=\"Mar 16, 2022\" />\n      </PillHolder>\n      <PrestonWernerCopy />\n    </AnnouncementHolder>\n    <SlackCTA />\n    <Footer />\n  </>\n)\n\nexport default Page\n"
  },
  {
    "path": "pages/preston-werner.tsx",
    "content": "import { Avatar, Box, Container, Heading, Text } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\nimport PrestonWernerCopy from '../components/announcements/preston-werner.mdx'\nimport SlackCTA from '../components/announcements/cta'\nimport AnnouncementHolder from '../components/announcements/holder'\nimport {\n  PillHolder,\n  AuthorPill,\n  DatePill\n} from '../components/announcements/pills'\n\nconst Page = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Tom and Theresa Preston-Werner are Giving $500K\"\n      description=\"We’re thrilled to announce Tom and Theresa Preston-Werner have donated $500k to Hack Club, a global nonprofit network of high school hackers & coding clubs.\"\n      image=\"https://workshop-cards.hackclub.com/Preston-Werner%20Gift%20Announcement.png?fontSize=175px&brand=HQ\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"section\"\n      sx={{\n        pt: [5, 6],\n        pb: [4, 5],\n        bg: 'rgb(104, 41, 205)',\n        backgroundImage: (t: any) => t.util.gx('yellow', 'red')\n      }}\n    >\n      <Container sx={{ textAlign: 'center', color: 'white' }}>\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{\n            fontSize: [5, 6, null, 7],\n            span: {\n              WebkitTextStroke: 'currentColor',\n              WebkitTextStrokeWidth: ['2px', '3px'],\n              WebkitTextFillColor: 'transparent'\n            }\n          }}\n        >\n          “I love that Hack Club is <span>helping me make it possible</span>\n          {''} for more students to have opportunities like I had as a young\n          person\"\n        </Heading>\n        <Text variant=\"headline\" sx={{ display: 'inline-flex' }}>\n          —\n          <Avatar\n            src=\"https://avatars.githubusercontent.com/u/1?s=460&v=4\"\n            alt=\"Tom\"\n            size={36}\n            mr={2}\n            ml={2}\n            style={{ maxHeight: 36 }}\n          />\n          Tom Preston-Werner\n        </Text>\n      </Container>\n    </Box>\n    <AnnouncementHolder>\n      <PillHolder>\n        <AuthorPill\n          firstName=\"Christina\"\n          tag=\"Christina Asquith, COO\"\n          image=\"https://cloud-macp9mbpq.vercel.app/0image.png\"\n        />\n        <AuthorPill\n          firstName=\"Zach\"\n          tag=\"Zach Latta, founder\"\n          image=\"https://hackclub.com/team/zach.jpg\"\n        />\n        <DatePill tag=\"Jan 27, 2021\" />\n      </PillHolder>\n      <PrestonWernerCopy />\n    </AnnouncementHolder>\n    <SlackCTA />\n    <Footer />\n  </>\n)\n\nexport default Page\n"
  },
  {
    "path": "pages/relon.tsx",
    "content": "import { Box, Container, Heading } from 'theme-ui'\nimport {\n  PillHolder,\n  AuthorPill,\n  DatePill\n} from '../components/announcements/pills'\nimport Head from 'next/head'\nimport NextLink from 'next/link'\nimport styled from '@emotion/styled'\nimport theme from '../lib/theme'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport ForceTheme from '../components/force-theme'\nimport Footer from '../components/footer'\nimport ElonCopy from '../components/announcements/relon.mdx'\nimport Amount from '../components/announcements/amount'\nimport SlackCTA from '../components/announcements/cta'\nimport AnnouncementHolder from '../components/announcements/holder'\n\nconst StyledLink = styled(NextLink)`\n  text-decoration: none;\n  color: ${theme.colors.white};\n`\n\nconst RelonLink = props => {\n  const { href } = props\n  return <StyledLink href={href}>{props.children}</StyledLink>\n}\n\nconst RelonPage = () => (\n  <>\n    <Meta\n      as={Head}\n      title=\"Elon Musk's $1M Donation\"\n      description=\"We’re thrilled to announce Elon Musk has donated $1M to Hack Club, a global nonprofit network of high school hackers & coding clubs.\"\n      image=\"https://cloud-6w46cupdh-hack-club-bot.vercel.app/0social-card.png\"\n    />\n    <ForceTheme theme=\"light\" />\n    <Nav />\n    <Box\n      as=\"section\"\n      sx={{\n        pt: [5, 6],\n        pb: [4, 5],\n        bg: 'rgb(104, 41, 205)',\n        backgroundImage: (t: any) => t.util.gx('purple', 'orange')\n      }}\n    >\n      <Container sx={{ textAlign: 'center', color: 'white' }}>\n        <Heading\n          as=\"h1\"\n          variant=\"title\"\n          sx={{\n            fontSize: [5, 6, null, 7],\n            span: {\n              WebkitTextStroke: 'currentColor',\n              WebkitTextStrokeWidth: ['2px', '3px'],\n              WebkitTextFillColor: 'transparent'\n            }\n          }}\n        >\n          Elon Musk is donating <Amount amount=\"$1,000,000\" /> to{' '}\n          <RelonLink href=\"/\">Hack Club</RelonLink>\n        </Heading>\n      </Container>\n    </Box>\n    <AnnouncementHolder>\n      <PillHolder>\n        <AuthorPill\n          firstName=\"Christina\"\n          tag=\"Christina Asquith, COO\"\n          image=\"https://hackclub.com/team/christina.jpg\"\n        />\n        <AuthorPill\n          firstName=\"Zach\"\n          tag=\"Zach Latta, founder\"\n          image=\"https://hackclub.com/team/zach.jpg\"\n        />\n        <DatePill tag=\"Oct 8, 2021\" />\n      </PillHolder>\n      <ElonCopy />\n    </AnnouncementHolder>\n    <SlackCTA />\n    <Footer />\n  </>\n)\n\nexport default RelonPage\n"
  },
  {
    "path": "pages/replit.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Link, Image, Button, Heading, Text } from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Footer from '../components/footer'\nimport Nav from '../components/nav'\nimport ForceTheme from '../components/force-theme'\nimport TokenInstructions from '../components/replit/token-instructions'\nimport ScaleUp from '../components/replit/scale-up'\n\nconst ReplitPage = () => {\n  const steps = [\n    'Enter your email',\n    'Enter your replit token',\n    'Get free stickers'\n  ]\n\n  const cssDark = 'hsl(23, 94%, 32%)'\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"Export your repls\"\n        description=\"Replit free has shut down. Export with Hack Club to GitHub Education's new free codespaces offering\"\n      />\n      <style>{`html { scroll-behavior: smooth; } body { background-color: hsl(23, 94%, 96%); }`}</style>\n      <ForceTheme theme=\"light\" />\n      <Nav />\n      <Box\n        as=\"header\"\n        sx={{\n          display: 'flex',\n          flexDirection: 'column',\n          alignItems: 'center',\n          paddingTop: ['4rem', null, '6rem'],\n          paddingBottom: '1rem',\n          textAlign: 'center',\n          backgroundColor: cssDark,\n          color: 'white',\n          overflow: 'hidden'\n        }}\n      >\n        <Heading as=\"h1\" sx={{ position: 'relative', marginBottom: '1rem' }}>\n          Replit Lifeboat:{' '}\n          <Text\n            as=\"span\"\n            sx={{ display: 'inline-flex', flexDirection: 'column' }}\n          >\n            Save Our Ships\n            <Image\n              src=\"/replit/sos-morse.svg\"\n              alt=\"SOS in morse code\"\n              sx={{ opacity: 0.5 }}\n            />\n          </Text>\n          <Text\n            sx={{\n              position: 'absolute',\n              left: '-2.5rem',\n              bottom: '-1rem',\n              rotate: '-30deg',\n              fontSize: '3rem'\n            }}\n          >\n            🛟\n          </Text>\n          <Text\n            sx={{\n              position: 'absolute',\n              left: '2rem',\n              top: '-3rem',\n              rotate: '15deg',\n              fontSize: '2.5rem'\n            }}\n          >\n            🛳️\n          </Text>\n          <Text\n            sx={{\n              position: 'absolute',\n              right: '-2rem',\n              top: '-2.5rem',\n              rotate: '30deg',\n              fontSize: '3rem'\n            }}\n          >\n            🚤\n          </Text>\n          <Text\n            sx={{\n              position: 'absolute',\n              right: '-5rem',\n              bottom: '-1.5rem',\n              rotate: '20deg',\n              fontSize: '3rem'\n            }}\n          >\n            🌊\n          </Text>\n          <Text\n            sx={{\n              position: 'absolute',\n              right: '12rem',\n              bottom: '-2.5rem',\n              rotate: '-15deg',\n              fontSize: '3rem',\n              zIndex: 10\n            }}\n          >\n            ⛵\n          </Text>\n        </Heading>\n\n        <Heading\n          as=\"h2\"\n          sx={{\n            fontSize: '4em'\n          }}\n        >\n          Export your{' '}\n          <Text\n            as=\"span\"\n            sx={{\n              display: 'inline-flex',\n              alignItems: 'center',\n              position: 'relative'\n            }}\n          >\n            Replit <style>{`.replit-fire {transition: opacity 0.1s;`}</style>\n            <Image\n              src=\"/replit/replit.svg\"\n              alt=\"replit\"\n              sx={{ height: '1em' }}\n              id=\"og-replit\"\n              className=\"replit-fire\"\n            />\n          </Text>{' '}\n          repls\n        </Heading>\n\n        <Text\n          sx={{\n            maxWidth: '100ch',\n            fontSize: '1.2em',\n            marginY: '1em',\n            marginTop: '1em',\n            textWrap: 'pretty'\n          }}\n        >\n          Replit cut down its free plan - many students can't afford to keep\n          using it.\n          <br />\n          We quickly built this project exporter. It's the only way to download\n          your repls with <i>edit history intact</i> (as a git repo).\n          <br />\n          Written in Rust &{' '}\n          <Link\n            className=\"gh-link\"\n            href=\"https://github.com/hackclub/replit-lifeboat\"\n            sx={{\n              color: 'inherit'\n            }}\n          >\n            open source\n          </Link>\n          .{' '}\n          <Text>\n            <ScaleUp number={1091841} from={0} /> files &{' '}\n            <ScaleUp number={82699} from={0} /> repls exported.\n          </Text>\n        </Text>\n      </Box>\n\n      <Box\n        as=\"main\"\n        sx={{\n          maxWidth: '100ch',\n          marginX: 'auto',\n          paddingX: '1rem'\n        }}\n      >\n        <Text\n          sx={{\n            maxWidth: '100ch',\n            fontSize: '1.2em',\n            marginY: '1em',\n            textWrap: 'balance',\n            textAlign: 'center',\n            mx: 'auto',\n            marginBottom: '1em',\n            display: 'block'\n          }}\n        >\n          <Text as=\"span\" sx={{ fontWeight: 'bold' }}>\n            This does not work anymore.\n          </Text>\n          <br />\n          After 9 months of operation, Replit has changed how their GraphQL\n          endpoint works (presumably specifically to kill this project).\n          <br />\n          The time spent fixing it would not be worth it;{' '}\n          <Text as=\"span\" sx={{ fontWeight: 'bold' }}>\n            though you can still download individual Repls as ZIP archives.\n          </Text>{' '}\n          They won't have edit history though.\n        </Text>\n\n        <Image\n          src=\"https://cdn.hackclub.com/019c76b5-fd27-75f2-8dcf-747ac81f9d45/D2mv3w.png\"\n          alt=\"download repl as zip instructions\"\n          sx={{\n            width: '50%',\n            marginX: 'auto',\n            display: 'block',\n            borderRadius: 12\n          }}\n        />\n        <Box\n          sx={{\n            display: 'flex',\n            justifyContent: 'space-between',\n            marginTop: '2rem',\n            position: 'relative',\n            paddingX: [null, null, '6rem'],\n            opacity: 0.5\n          }}\n        >\n          {steps.map((step, idx) => (\n            <Box\n              key={idx}\n              sx={{\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'center',\n                fontWeight: '600',\n                paddingX: '.25em'\n              }}\n            >\n              <Box\n                sx={{\n                  width: '1.5em',\n                  height: '1.5em',\n                  backgroundColor: cssDark,\n                  color: 'white',\n                  borderRadius: '999px',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center'\n                }}\n              >\n                <Text>{idx + 1}</Text>\n              </Box>\n              <Text sx={{ textAlign: 'center' }}>{step}</Text>\n            </Box>\n          ))}\n\n          <Image\n            src=\"/replit/arrow1.svg\"\n            alt=\"\"\n            sx={{\n              position: 'absolute',\n              width: `${7 * 0.9384843737}em`,\n              bottom: '-1.5em',\n              left: '32.5%',\n              translate: '-50% 0'\n            }}\n          />\n          <Image\n            src=\"/replit/arrow2.svg\"\n            alt=\"\"\n            sx={{\n              position: 'absolute',\n              width: '7em',\n              bottom: '-2em',\n              left: '67%',\n              translate: '-50% 0'\n            }}\n          />\n        </Box>\n\n        <Box sx={{ paddingTop: '5rem' }} id=\"instructions\">\n          <Heading as=\"h2\" sx={{ marginBottom: '0.5em', textAlign: 'center' }}>\n            How to get your Replit <code>connect.sid</code> token\n          </Heading>\n\n          <TokenInstructions />\n\n          <Link href=\"#\">\n            <Button\n              sx={{\n                width: '100%',\n                backgroundColor: cssDark,\n                marginTop: '2rem'\n              }}\n            >\n              Back to top\n            </Button>\n          </Link>\n        </Box>\n      </Box>\n\n      <Footer dark sx={{ marginTop: '3rem' }} />\n    </>\n  )\n}\n\nexport default ReplitPage\n"
  },
  {
    "path": "pages/santa.tsx",
    "content": "import Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport {\n  Box,\n  Container,\n  Heading,\n  Button,\n  Text,\n  Image,\n  Input,\n  Label,\n  Link\n} from 'theme-ui'\nimport styled from '@emotion/styled'\nimport Snowfall from 'react-snowfall'\nimport Footer from '../components/footer'\nimport FadeIn from '../components/fade-in'\nimport { keyframes } from '@emotion/react'\nimport { useState } from 'react'\n\nconst announcementMessage =\n  'https://hackclub.slack.com/docs/T0266FRGM/F0671A687SA'\nconst signupsOpen = true\n\nconst Hero = styled(Box)`\n  background-image: linear-gradient(\n    to right bottom,\n    rgb(45, 158, 228),\n    rgb(41, 143, 206)\n  );\n  min-height: 100vh;\n  position: relative;\n  text-align: center;\n  canvas {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n  }\n`\n\nconst Lead = styled(Box)`\n  font-size: 24px;\n  margin-left: auto;\n  margin-right: auto;\n  margin-top: 18px;\n  margin-bottom: 18px;\n  color: rgb(249, 249, 250);\n  max-width: 48rem;\n`\n\nconst Space = styled(Text)`\n  white-space: pre;\n  transition: 1s;\n`\nconst RemoveSpace = styled(Text)`\n  &:hover .space {\n    font-size: 0;\n  }\n`\n\nconst floating = keyframes`\n  from {\n    transform: translateY(20px) rotate(0deg);\n  }\n  to {\n    transform: translateY(-20px) rotate(5deg);\n  }\n`\n\nconst Page = () => (\n  <Box sx={{ overflowX: 'hidden' }}>\n    <Meta\n      as={Head}\n      title=\"Secret Santa\"\n      description=\"Find your holiday zen this year with Hack Club’s Secret Santa.\"\n      image=\"https://cloud-9kgqrlg7o-hack-club-bot.vercel.app/0santa.png\"\n    />\n    <Nav />\n    <Hero py={4}>\n      <Snowfall />\n      <Container px={3} py={[3, 4]}>\n        <Heading\n          sx={{ py: [3, 5], fontSize: [4, 5], color: 'white', opacity: 0.8 }}\n        >\n          <FadeIn delay={300} duration={600}>\n            It's 2025,\n          </FadeIn>\n          <FadeIn delay={1200} duration={600}>\n            the holidays have come,\n            <br />\n          </FadeIn>\n          <FadeIn delay={2300} duration={600}>\n            now let's all have some fun!\n          </FadeIn>\n        </Heading>\n        <Image\n          src=\"https://cloud-k3gxm6uem.vercel.app/2020-12-07_0vmfbtyfzec2kqeujbwmp3q4bu50pr0y.png\"\n          alt=\"Illustration of a holiday themed Orpheus\"\n          width={384}\n          height={384}\n          sx={{\n            zIndex: 1,\n            animation: `${floating} cubic-bezier(.55,.03,.43,.98) 8s infinite alternate`\n          }}\n        />\n        <FadeIn delay={3300}>\n          <Heading\n            as=\"h1\"\n            sx={{ fontSize: [5, 6], color: 'white', margin: 'auto' }}\n          >\n            Hack Club Secret Santa\n          </Heading>\n          <Lead color=\"snow\" my={3} mx=\"auto\">\n            Christmas is here and it's time for some fun! The holiday season is\n            among us and the elves have assembled, which means its time for\n            gift-giving to begin! The magical elf will assign you a partner,\n            send them something fun, &amp; you'll get your own gift in the mail\n            just in time for the holidays!\n          </Lead>\n          {/* Signup form */}\n          {signupsOpen ? (\n            <Signup />\n          ) : (\n            <Button disabled sx={{ bg: 'primary', mb: 4 }}>\n              Signups closed. Check back next year!\n            </Button>\n          )}\n        </FadeIn>\n      </Container>\n    </Hero>\n    <Footer />\n  </Box>\n)\nexport default Page\n\nfunction Base({ children, action, target, method }) {\n  return (\n    <Box\n      as=\"div\"\n      sx={{\n        display: 'grid',\n        width: ['full', 512],\n        bg: 'white',\n        borderRadius: 'extra',\n        mx: 'auto',\n        p: 4,\n        mt: 4\n      }}\n    >\n      <form\n        action={action}\n        target={target}\n        method={method}\n        style={{ display: 'contents' }}\n      >\n        {children}\n      </form>\n    </Box>\n  )\n}\n\nfunction Field({ placeholder, label, name, type, value, onChange }) {\n  return (\n    <Box sx={{ my: 2 }}>\n      <Label htmlFor={name} sx={{ color: 'muted', fontSize: 18 }}>\n        {label}\n      </Label>\n      <Input\n        id={name}\n        placeholder={placeholder}\n        name={name}\n        type={type}\n        sx={{\n          bg: 'smoke',\n          color: 'black'\n        }}\n        autofillBackgroundColor=\"smoke\"\n        onChange={onChange}\n        value={value}\n        required\n      />\n    </Box>\n  )\n}\n\ntype valuesType = {\n  name?: string\n  likes?: string\n  dislikes?: string\n}\n\nfunction Signup() {\n  const [values, setValues] = useState<valuesType>({})\n  return (\n    <Base method=\"get\" action=\"https://forms.hackclub.com/santa\" target=\"_self\">\n      <Heading sx={{ color: 'black', textAlign: 'left', mb: 2 }}>\n        Register!\n      </Heading>\n      <Text sx={{ textAlign: 'left', color: 'muted' }}>\n        Be sure to check out the{' '}\n        <Link href={announcementMessage} sx={{ color: 'blue' }}>\n          rules\n        </Link>{' '}\n        before you sign up!\n      </Text>\n      <Field\n        label=\"Your Name\"\n        name=\"name\"\n        placeholder=\"Fiona Hackworth\"\n        type=\"text\"\n        value={values.name}\n        onChange={e => setValues({ ...values, name: e.target.value })}\n      />\n\n      <Field\n        label=\"Likes\"\n        name=\"likes\"\n        placeholder=\"Hardware, plushies, microwaved apples?\"\n        type=\"text\"\n        value={values.likes}\n        onChange={e => setValues({ ...values, likes: e.target.value })}\n      />\n      <Field\n        label=\"Dislikes\"\n        name=\"dislikes\"\n        placeholder=\"Socks, cheese, coal...\"\n        type=\"text\"\n        value={values.dislikes}\n        onChange={e => setValues({ ...values, dislikes: e.target.value })}\n      />\n      <Button sx={{ bg: 'blue', mt: [2, 3], py: 3 }} type=\"submit\">{`Finish ${\n        7 - Object.values(values).filter(n => n !== '').length\n      } fields to sign up`}</Button>\n    </Base>\n  )\n}\n"
  },
  {
    "path": "pages/sharkbank/index.tsx",
    "content": "import React, { useEffect, useState } from 'react'\nimport Nav from '../../components/nav'\nimport Image from 'next/image'\nimport { Box, Text } from 'theme-ui'\n\n//Desktop Mode\nfunction DesktopMode({ billboardBottom }) {\n  return (\n    <>\n      {/* First Section */}\n      <Section bg=\"/sharkbank/firstSectionBG.png\" minHeight=\"1100px\">\n        <Image\n          src=\"/sharkbank/bgBuildingsFirstSection.png\"\n          alt=\"Buildings\"\n          priority\n          fill\n          sizes=\"100vw\"\n          style={{\n            zIndex: '20',\n            backgroundPosition: 'center',\n            backgroundSize: 'cover',\n            overflow: 'hidden',\n            objectFit: 'cover'\n          }}\n        />\n\n        {/* Billboard */}\n        <Box\n          as=\"div\"\n          style={{\n            position: 'absolute',\n            left: 0,\n            bottom: `${billboardBottom}px`,\n            width: '100%',\n            display: 'flex',\n            justifyContent: 'center',\n            zIndex: 25\n          }}\n        >\n          <div style={{ position: 'relative' }}>\n            <Image\n              src=\"/sharkbank/BILLBOARD_1.PNG\"\n              alt=\"Billboard\"\n              width={950}\n              height={850}\n              priority\n              style={{\n                maxWidth: '100%',\n                height: 'auto',\n                objectFit: 'contain'\n              }}\n            />\n            <div\n              style={{\n                position: 'absolute',\n                top: 0,\n                left: 0,\n                width: '100%',\n                height: '100%',\n                display: 'flex',\n                flexDirection: 'column',\n                justifyContent: 'center',\n                alignItems: 'center',\n                padding: '0 20px',\n                textAlign: 'center'\n              }}\n            >\n              <Text\n                as=\"h4\"\n                sx={{ marginTop: '-354px', fontSize: '60px', color: 'white' }}\n              >\n                Welcome to SharkBank!\n              </Text>\n              <Text\n                as=\"p\"\n                sx={{\n                  fontSize: '30px',\n                  maxWidth: '850px',\n                  textAlign: 'center',\n                  color: 'white'\n                }}\n              >\n                The Sharks (aka HCB) are ready to invest in YOUR nonprofit.\n                Proposals are officially open to try and earn a spot pitching\n                your nonprofit mission to our panel of judges. Win up to $1000\n                in funds to propel your mission forward.\n              </Text>\n            </div>\n          </div>\n        </Box>\n      </Section>\n      {/* Second Section */}\n      <Section\n        bg=\"/sharkbank/desktop-row-2-column-1-closed.png\"\n        minHeight=\"1100px\"\n      >\n        {/* Banners */}\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            left: '-228px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/desktop-red-closed.png\"\n            alt=\"Banner-1\"\n            width={275}\n            height={800}\n            priority\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'contain'\n            }}\n          />\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            bottom: '250px',\n            right: '-162px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/desktop-blue-closed.png\"\n            alt=\"Banner-2\"\n            width={275}\n            height={800}\n            priority\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'contain'\n            }}\n          />\n        </Box>\n      </Section>\n      {/* Third Section */}\n      <Section bg=\"/sharkbank/thirdSectionBG.png\" minHeight=\"1100px\">\n        {/* Text  */}\n        <Box\n          as={'div'}\n          sx={{\n            width: '100%',\n            height: '100%',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n            position: 'absolute',\n            zIndex: '200',\n            bottom: '200px'\n          }}\n        >\n          <Text\n            as={'span'}\n            sx={{\n              fontSize: '30px',\n              position: 'absolute',\n              zIndex: '20',\n              maxWidth: '750px',\n              textAlign: 'center',\n              transform: 'perspective(800px) rotateX(17deg)',\n              transformStyle: 'preserve-3d',\n              color: 'white'\n            }}\n          >\n            <span\n              style={{\n                display: 'block',\n                transform: 'scaleX(1.0)',\n                transformOrigin: 'top center'\n              }}\n            >\n              HCB is hosting its first ever competition, SharkBank! Win up to\n              $1000 in funding to propel your mission out to sea!\n            </span>\n            <span\n              style={{\n                display: 'block',\n                transform: 'scaleX(1.1)',\n                transformOrigin: 'top center'\n              }}\n            >\n              Get ready for an exciting opportunity to pitch your organization’s\n              mission to a panel of HCB teen judges.\n            </span>\n          </Text>\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            bottom: '-50px',\n            right: '20px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <div\n            style={{\n              position: 'relative',\n              height: '300px',\n              width: '300px',\n              bottom: '500px'\n            }}\n          >\n            <div\n              style={{\n                height: '300px',\n                width: '300px',\n                position: 'absolute',\n                zIndex: 2\n              }}\n            >\n              <Image\n                src=\"/sharkbank/shark1.PNG\"\n                alt=\"Shark\"\n                width={275}\n                height={800}\n                priority\n                style={{ objectFit: 'contain' }}\n              />\n            </div>\n            <div\n              style={{\n                height: '100%',\n                width: '100%',\n                position: 'absolute',\n                bottom: '150px',\n                left: '-77px'\n              }}\n            >\n              <Image\n                src=\"/sharkbank/sign-closed.png\"\n                alt=\"Sign\"\n                width={275}\n                height={800}\n                priority\n                style={{ objectFit: 'contain' }}\n              />\n              <button\n                style={{\n                  height: '65px',\n                  width: '220px',\n                  position: 'absolute',\n                  bottom: '-326px',\n                  left: '180px',\n                  rotate: '-5deg',\n                  borderRadius: '50px',\n                  border: 'none',\n                  cursor: 'pointer',\n                  fontFamily: 'Phantom Sans',\n                  fontWeight: 500,\n                  fontSize: '20px',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                  zIndex: 200,\n                  background: 'transparent'\n                }}\n              >\n                <Image\n                  src=\"https://cdn.hackclub.com/019c76b6-34e5-74ca-9f18-07767e5a17c8/CdM8iQ.png\"\n                  alt=\"Button background\"\n                  width={400}\n                  height={100}\n                  style={{\n                    width: '100%',\n                    height: '100%',\n                    objectFit: 'cover', // Scale image to fill the button\n                    position: 'absolute', // Position the image to fill the button\n                    top: '0',\n                    left: '0',\n                    zIndex: '-1', // Place the image behind the text\n                    borderRadius: '50px' // Apply the same border-radius as the button\n                  }}\n                />\n                Applications closed!\n              </button>\n            </div>\n          </div>\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            bottom: '-210px',\n            right: '420px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/shark2.PNG\"\n            alt=\"Shark\"\n            width={275}\n            height={800}\n            priority\n            style={{ objectFit: 'contain' }}\n          />\n        </Box>\n      </Section>\n    </>\n  )\n}\n\n// Tablet Mode\nfunction TabletMode() {\n  const [isSmallScreen, setIsSmallScreen] = useState(false)\n\n  useEffect(() => {\n    const handleResize = () => {\n      setIsSmallScreen(window.innerWidth < 815)\n    }\n    handleResize()\n    window.addEventListener('resize', handleResize)\n    return () => window.removeEventListener('resize', handleResize)\n  }, [])\n\n  return (\n    <>\n      <Section bg=\"/sharkbank/row-1-column-1-tab.png\" minHeight=\"950px\">\n        <Box\n          as=\"div\"\n          style={{\n            position: 'absolute',\n            left: 0,\n            bottom: '-400px',\n            width: '100%',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <div style={{ position: 'relative', minWidth: '780px' }}>\n            <Image\n              src=\"/sharkbank/billboardMobile.PNG\"\n              alt=\"Billboard\"\n              width={1200}\n              height={2600}\n              priority\n              style={{\n                transform: 'scale(1.9)',\n                maxWidth: '100%',\n                height: 'auto',\n                objectFit: 'contain'\n              }}\n            />\n            <div\n              style={{\n                position: 'absolute',\n                top: '150px',\n                left: 0,\n                width: '100%',\n                height: '100%',\n                display: 'flex',\n                flexDirection: 'column',\n                justifyContent: 'center',\n                alignItems: 'center',\n                padding: '0 20px',\n                textAlign: 'center'\n              }}\n            >\n              <Text\n                as=\"h4\"\n                sx={{\n                  marginTop: '-290px',\n                  fontSize: isSmallScreen ? '40px' : '50px',\n                  color: 'white'\n                }}\n              >\n                Welcome to SharkBank!\n              </Text>\n              <Text\n                as=\"p\"\n                sx={{\n                  fontSize: isSmallScreen ? '20px' : '25px',\n                  maxWidth: isSmallScreen ? '400px' : '500px',\n                  textAlign: 'center',\n                  color: 'white'\n                }}\n              >\n                The Sharks (aka HCB) are ready to invest in YOUR nonprofit.\n                Proposals are officially open to try and earn a spot pitching\n                your nonprofit mission to our panel of judges. Win up to $1000\n                in funds to propel your mission forward.\n              </Text>\n            </div>\n          </div>\n        </Box>\n      </Section>\n      <Section bg=\"/sharkbank/row-2-column-1-tab.png\" minHeight=\"1561px\">\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            left: '-145px',\n            bottom: '700px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/mobile-red-closed.png\"\n            alt=\"Banner-1\"\n            width={275}\n            height={800}\n            priority\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'contain'\n            }}\n          />\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            right: '-100px',\n            bottom: '290px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/mobile-blue-closed.png\"\n            alt=\"Banner-1\"\n            width={275}\n            height={800}\n            priority\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'contain'\n            }}\n          />\n        </Box>\n      </Section>\n      <Section bg=\"/sharkbank/row-3-column-1-tab.png\" minHeight=\"1560px\">\n        {/* Text  */}\n        <Box\n          as={'div'}\n          sx={{\n            width: '100%',\n            height: '100%',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n            position: 'absolute',\n            zIndex: '200',\n            top: '-350px'\n          }}\n        >\n          <Text\n            as={'span'}\n            sx={{\n              fontSize: '25px',\n              position: 'absolute',\n              zIndex: '20',\n              maxWidth: '600px',\n              textAlign: 'center',\n              transform: 'perspective(800px) rotateX(17deg)',\n              transformStyle: 'preserve-3d',\n              color: 'white'\n            }}\n          >\n            <span\n              style={{\n                display: 'block',\n                transform: 'scaleX(1.0)',\n                transformOrigin: 'top center'\n              }}\n            >\n              HCB is hosting its first ever competition, SharkBank! Win up to\n              $1000 in funding to propel your mission out to sea!\n            </span>\n            <span\n              style={{\n                display: 'block',\n                transform: 'scaleX(1.1)',\n                transformOrigin: 'top center'\n              }}\n            >\n              Get ready for an exciting opportunity to pitch your organization’s\n              mission to a panel of HCB teen judges.\n            </span>\n          </Text>\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            bottom: '200px',\n            right: '-100px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <div\n            style={{\n              position: 'relative',\n              height: '300px',\n              width: '300px',\n              bottom: '500px'\n            }}\n          >\n            <div\n              style={{\n                height: '300px',\n                width: '300px',\n                position: 'absolute',\n                zIndex: 2\n              }}\n            >\n              <Image\n                src=\"/sharkbank/shark1.PNG\"\n                alt=\"Shark\"\n                width={275}\n                height={800}\n                priority\n                style={{ objectFit: 'contain' }}\n              />\n            </div>\n            <div\n              style={{\n                height: '100%',\n                width: '100%',\n                position: 'absolute',\n                bottom: '150px',\n                left: '-77px'\n              }}\n            >\n              <Image\n                src=\"/sharkbank/sign-closed.PNG\"\n                alt=\"Sign\"\n                width={275}\n                height={800}\n                priority\n                style={{ objectFit: 'contain' }}\n              />\n              <button\n                style={{\n                  height: '65px',\n                  width: '220px',\n                  position: 'absolute',\n                  bottom: '-326px',\n                  left: '180px',\n                  rotate: '-5deg',\n                  borderRadius: '50px',\n                  cursor: 'pointer',\n                  fontFamily: 'Phantom Sans',\n                  fontWeight: 500,\n                  fontSize: '20px',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                  zIndex: 200,\n                  background: 'transparent',\n                  border: 'none'\n                }}\n              >\n                <Image\n                  src=\"https://cdn.hackclub.com/019c76b6-34e5-74ca-9f18-07767e5a17c8/CdM8iQ.png\"\n                  alt=\"Button background\"\n                  width={400}\n                  height={100}\n                  style={{\n                    width: '100%',\n                    height: '100%',\n                    objectFit: 'cover', // Scale image to fill the button\n                    position: 'absolute', // Position the image to fill the button\n                    top: '0',\n                    left: '0',\n                    zIndex: '-1', // Place the image behind the text\n                    borderRadius: '50px' // Apply the same border-radius as the button\n                  }}\n                />\n                Applications closed!\n              </button>\n            </div>\n          </div>\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            bottom: '-80px',\n            right: '220px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/shark2.PNG\"\n            alt=\"Shark\"\n            width={275}\n            height={800}\n            priority\n            style={{ objectFit: 'contain' }}\n          />\n        </Box>\n      </Section>\n    </>\n  )\n}\n\nfunction MobileMode() {\n  const [isSmallScreen, setIsSmallScreen] = useState(false)\n\n  useEffect(() => {\n    const checkScreen = () => setIsSmallScreen(window.innerWidth < 472)\n    checkScreen() // run on mount\n    window.addEventListener('resize', checkScreen)\n    return () => window.removeEventListener('resize', checkScreen)\n  }, [])\n\n  // Sizes based on screen width\n  const imgWidth = isSmallScreen ? 220 : 275\n  const imgHeight = isSmallScreen ? 640 : 800\n\n  return (\n    <>\n      <Section bg=\"/sharkbank/row-1-column-1.png\" minHeight=\"950px\">\n        <Box\n          as=\"div\"\n          style={{\n            position: 'absolute',\n            left: 0,\n            bottom: '220px',\n            width: '100%',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <div\n            style={{ position: 'relative', minWidth: '500px', top: '200px' }}\n          >\n            <Image\n              src=\"/sharkbank/billboardMobile.PNG\"\n              alt=\"Billboard\"\n              width={1200}\n              height={2600}\n              priority\n              style={{\n                transform: 'scale(1.8)',\n                maxWidth: '100%',\n                height: 'auto',\n                objectFit: 'contain'\n              }}\n            />\n            <div\n              style={{\n                position: 'absolute',\n                top: 0,\n                left: 0,\n                width: '100%',\n                height: '100%',\n                display: 'flex',\n                flexDirection: 'column',\n                justifyContent: 'center',\n                alignItems: 'center',\n                padding: '0 20px',\n                textAlign: 'center'\n              }}\n            >\n              <Text\n                as=\"h4\"\n                sx={{\n                  marginTop: '0px',\n                  fontSize: '25px',\n                  color: 'white'\n                }}\n              >\n                Welcome to SharkBank!\n              </Text>\n              <Text\n                as=\"p\"\n                sx={{\n                  fontSize: '15px',\n                  maxWidth: '300px',\n                  textAlign: 'center',\n                  color: 'white'\n                }}\n              >\n                The Sharks (aka HCB) are ready to invest in YOUR nonprofit.\n                Proposals are officially open to try and earn a spot pitching\n                your nonprofit mission to our panel of judges. Win up to $1000\n                in funds to propel your mission forward.\n              </Text>\n            </div>\n          </div>\n        </Box>\n      </Section>\n      <Section bg=\"/sharkbank/row-2-column-1.png\" minHeight=\"950px\">\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            left: '-26%',\n            bottom: '100px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/mobile-red-closed.png\"\n            alt=\"Banner-1\"\n            width={imgWidth}\n            height={imgHeight}\n            priority\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'contain'\n            }}\n          />\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            right: '-24%',\n            bottom: '-25px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/mobile-blue-closed.png\"\n            alt=\"Banner-2\"\n            width={imgWidth}\n            height={imgHeight}\n            priority\n            style={{\n              maxWidth: '100%',\n              height: 'auto',\n              objectFit: 'contain'\n            }}\n          />\n        </Box>\n      </Section>\n      <Section bg=\"/sharkbank/row-3-column-1.png\" minHeight=\"950px\">\n        {/* Text  */}\n        <Box\n          as={'div'}\n          sx={{\n            width: '100%',\n            height: '100%',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n            position: 'absolute',\n            zIndex: '200',\n            top: '-300px'\n          }}\n        >\n          <Text\n            as={'span'}\n            sx={{\n              fontSize: '20px',\n              position: 'absolute',\n              zIndex: '20',\n              maxWidth: '300px',\n              textAlign: 'center',\n              transform: 'perspective(800px) rotateX(17deg)',\n              transformStyle: 'preserve-3d',\n              color: 'white'\n            }}\n          >\n            <span\n              style={{\n                display: 'block',\n                transform: 'scaleX(0.9)',\n                transformOrigin: 'top center'\n              }}\n            >\n              HCB is hosting its first ever competition, SharkBank! Win up to\n              $1000 in funding to propel your mission out to sea!\n            </span>\n            <span\n              style={{\n                display: 'block',\n                transform: 'scaleX(1.0)',\n                transformOrigin: 'top center'\n              }}\n            >\n              Get ready for an exciting opportunity to pitch your organization’s\n              mission to a panel of HCB teen judges.\n            </span>\n          </Text>\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            bottom: '100px',\n            right: '-70px',\n            display: 'flex',\n            justifyContent: 'center'\n          }}\n        >\n          <div\n            style={{\n              position: 'relative',\n              height: '300px',\n              width: '300px',\n              right: '80px',\n              bottom: '450px'\n            }}\n          >\n            <div\n              style={{\n                height: '300px',\n                width: '300px',\n                top: '250px',\n                left: '75px',\n                position: 'absolute',\n                zIndex: 2\n              }}\n            >\n              <Image\n                src=\"/sharkbank/shark1.PNG\"\n                alt=\"Shark\"\n                width={175}\n                height={500}\n                priority\n                style={{ objectFit: 'contain' }}\n              />\n            </div>\n            <div\n              style={{\n                height: '100%',\n                width: '100%',\n                position: 'absolute',\n                left: '10px',\n                top: '200px'\n              }}\n            >\n              <Image\n                src=\"/sharkbank/sign-closed.png\"\n                alt=\"Sign\"\n                width={220}\n                height={400}\n                priority\n                style={{ objectFit: 'contain' }}\n              />\n              <button\n                style={{\n                  height: '65px',\n                  width: '170px',\n                  position: 'absolute',\n                  bottom: '-55px',\n                  left: '135px',\n                  rotate: '-5deg',\n                  borderRadius: '50px',\n                  cursor: 'pointer',\n                  fontFamily: 'Phantom Sans',\n                  fontWeight: 500,\n                  fontSize: '15px',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                  zIndex: 200,\n                  background: 'transparent',\n                  border: 'none'\n                }}\n              >\n                <Image\n                  src=\"https://cdn.hackclub.com/019c76b6-34e5-74ca-9f18-07767e5a17c8/CdM8iQ.png\"\n                  alt=\"Button background\"\n                  width={400}\n                  height={100}\n                  style={{\n                    width: '100%',\n                    height: '75%',\n                    objectFit: 'cover', // Scale image to fill the button\n                    position: 'absolute', // Position the image to fill the button\n                    top: '6px',\n                    left: '0',\n                    zIndex: '-1', // Place the image behind the text\n                    borderRadius: '50px' // Apply the same border-radius as the button\n                  }}\n                />\n                Applications closed!\n              </button>\n            </div>\n          </div>\n        </Box>\n        <Box\n          as=\"div\"\n          sx={{\n            position: 'absolute',\n            width: '100%',\n            bottom: '-240px',\n            right: '80px',\n            display: 'flex',\n            justifyContent: 'center',\n            transform: 'scale(0.7)'\n          }}\n        >\n          <Image\n            src=\"/sharkbank/shark2.PNG\"\n            alt=\"Shark\"\n            width={275}\n            height={800}\n            priority\n            style={{\n              objectFit: 'contain'\n            }}\n          />\n        </Box>\n      </Section>\n    </>\n  )\n}\n\n// Section Component\ntype SectionProps = {\n  bg: string\n  minHeight: string\n  minWidth?: string\n  children: React.ReactNode\n}\n\nfunction Section({ bg, minHeight, minWidth, children }: SectionProps) {\n  return (\n    <div style={{ display: 'flex', justifyContent: 'center' }}>\n      <Box\n        as=\"div\"\n        style={{\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'center',\n          width: '100%',\n          height: '100vh',\n          minWidth,\n          minHeight,\n          maxWidth: '1900px',\n          backgroundColor: '#000000',\n          boxShadow: 'inset 0 0 4rem 1rem rgba(0, 0, 0, 0.5)',\n          backgroundPosition: 'center',\n          backgroundSize: 'cover',\n          position: 'relative',\n          overflow: 'hidden'\n        }}\n      >\n        <Image\n          src={bg}\n          alt=\"Section background\"\n          priority\n          fill\n          sizes=\"100vw\"\n          style={{\n            objectFit: 'cover'\n          }}\n        />\n        {children}\n      </Box>\n    </div>\n  )\n}\n\n// Main\nexport default function SharkBank() {\n  const [windowWidth, setWindowWidth] = useState(0)\n\n  useEffect(() => {\n    const handleResize = () => setWindowWidth(window.innerWidth)\n    handleResize()\n    window.addEventListener('resize', handleResize)\n    return () => window.removeEventListener('resize', handleResize)\n  }, [])\n\n  const isMobile = windowWidth <= 570\n  const isTablet = windowWidth > 570 && windowWidth <= 914\n  const isDesktop = windowWidth > 914\n  const billboardBottom = windowWidth > 1200 ? -80 : windowWidth > 800 ? 0 : 100\n\n  return (\n    <div\n      style={{\n        background: 'linear-gradient(#344750, #4A7072)',\n        userSelect: 'none'\n      }}\n      className=\"main-sharkbank-page\"\n    >\n      <Nav color=\"#bdd8e0ff\" dark />\n\n      {isDesktop && <DesktopMode billboardBottom={billboardBottom} />}\n      {isTablet && <TabletMode />}\n      {isMobile && <MobileMode />}\n    </div>\n  )\n}\n"
  },
  {
    "path": "pages/ship.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Badge, Box, Button, Container, Grid, Heading, Text } from 'theme-ui'\nimport NextLink from 'next/link'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport SlideUp from '../components/slide-up'\nimport Why from '../components/ship/why.mdx'\nimport Icon from '../components/icon'\nimport Posts from '../components/posts'\nimport Footer from '../components/footer'\nimport { orderBy, filter, take } from 'lodash'\nimport { keyframes } from '@emotion/react'\nimport { thousands } from '../lib/members'\n\nconst ShipBadge = props => (\n  <Badge\n    as=\"mark\"\n    sx={{\n      bg: '#FF62DC',\n      color: 'inherit',\n      fontSize: 'inherit',\n      display: 'inline-block',\n      borderRadius: 'default',\n      px: [2, 3],\n      py: 1,\n      ...props.sx\n    }}\n    {...props}\n  />\n)\n\nconst waves = keyframes({\n  '0%': { backgroundPositionX: '0' },\n  '100%': { backgroundPositionX: '-100%' }\n})\n\nconst ShipPage = ({ posts = [] }) => (\n  <>\n    <Meta\n      as={Head}\n      name=\"Ship\"\n      description={`Hack Clubbers ship projects: a real-time list of the projects created by the Hack Club high school community in the last month.`}\n      image=\"https://assets.hackclub.com/log/2020-05-22-ship.png\"\n    />\n    <Nav />\n    <Box\n      as=\"header\"\n      sx={{\n        bg: 'blue',\n        backgroundImage: t =>\n          `linear-gradient(to bottom, ${t.colors.cyan}, ${t.colors.blue})`,\n        color: 'white',\n        textAlign: 'center',\n        py: [5, 6]\n      }}\n    >\n      <Container\n        sx={{\n          maxWidth: [null, null, 'copyPlus', 'copyUltra'],\n          p: { fontSize: [2, 3, 4], maxWidth: 'copy', mx: 'auto' }\n        }}\n      >\n        <Text variant=\"eyebrow\" sx={{ color: 'white', opacity: 0.875 }}>\n          All aboard!\n        </Text>\n        <Heading as=\"h1\" variant=\"ultratitle\" sx={{ mb: [3, 4] }}>\n          Hack Clubbers focus on one thing: <ShipBadge>shipping.</ShipBadge>\n        </Heading>\n        <Text as=\"p\" variant=\"subtitle\">\n          After building a project, like an app or website, “shipping” is\n          publishing & sharing it online.\n        </Text>\n      </Container>\n      <SlideUp duration={750}>\n        <Grid\n          as=\"section\"\n          columns={[null, null, 2]}\n          gap={[3, 4]}\n          variant=\"layout.container\"\n          sx={{\n            mt: [3, 4, 5],\n            textAlign: 'left',\n            div: { p: [3, 4] },\n            h2: { variant: 'text.headline', color: 'blue', mt: 0, mb: 2 },\n            p: { fontSize: 2, my: 0 }\n          }}\n        >\n          <Why />\n        </Grid>\n      </SlideUp>\n    </Box>\n    <Box\n      as=\"section\"\n      id=\"projects\"\n      sx={{\n        bg: 'blue',\n        color: 'white',\n        py: 4,\n        backgroundImage: 'url(/ship/wave.svg)',\n        backgroundSize: '200% auto',\n        '@media (prefers-reduced-motion: no-preference)': {\n          animation: `${waves} 15s linear forwards infinite`\n        }\n      }}\n    >\n      <Heading\n        as=\"h2\"\n        variant=\"title\"\n        sx={{ px: 3, mb: 4, textAlign: 'center' }}\n      >\n        Recently shipped…\n      </Heading>\n      <Posts data={posts} />\n    </Box>\n    <Box\n      as=\"section\"\n      sx={{\n        color: 'black',\n        bg: 'white',\n        py: [4, 5]\n      }}\n    >\n      <Container variant=\"copy\" sx={{ textAlign: 'center' }}>\n        <Icon glyph=\"message-new\" size={72} sx={{ color: 'blue' }} />\n        <Heading as=\"h2\" variant=\"headline\" mt={0}>\n          Want to ship your own projects?\n        </Heading>\n        <Text variant=\"subtitle\" sx={{ lineHeight: 'caption', mb: 3 }}>\n          The #ship channel on the Hack&nbsp;Club Slack is where {thousands}k+\n          teenagers from around the world share what they’re working on & help\n          each other.\n        </Text>\n        <NextLink href=\"https://slack.hackclub.com\">\n          <Button variant=\"cta\" sx={{ py: 2, px: 3, fontSize: 2 }}>\n            Join our Slack\n          </Button>\n        </NextLink>\n      </Container>\n    </Box>\n    <Footer />\n  </>\n)\n\nexport default ShipPage\n\nexport const getServerSideProps = async () => {\n  let posts = []\n  try {\n    const res = await fetch('https://scrapbook.hackclub.com/api/r/ship')\n    if (res.ok) {\n      const data = await res.json()\n      posts = take(\n        orderBy(\n          filter(data, p =>\n            ['jpg', 'jpeg', 'png'].includes(\n              p.attachments[0]?.split('.')[\n                p.attachments[0]?.split('.').length - 1\n              ]\n            )\n          ),\n          'postedAt',\n          'desc'\n        ),\n        24\n      )\n    }\n  } catch (error) {\n    console.log('Failed to fetch ships:', error)\n  }\n  return { props: { posts } }\n}\n"
  },
  {
    "path": "pages/sitemap.xml.tsx",
    "content": "import { GetServerSideProps } from 'next'\nimport fs from 'fs'\nimport path from 'path'\n\nconst SITE_URL = 'https://hackclub.com'\n\nfunction getPages(dir: string, base = ''): string[] {\n  const entries = fs.readdirSync(dir, { withFileTypes: true })\n  const pages: string[] = []\n\n  for (const entry of entries) {\n    const name = entry.name\n    if (name.startsWith('_') || name.startsWith('[')) continue\n    if (name === 'api' || name === 'sitemap.xml.tsx') continue\n\n    if (entry.isDirectory()) {\n      pages.push(...getPages(path.join(dir, name), `${base}/${name}`))\n    } else if (/\\.(tsx|ts|js|jsx|mdx)$/.test(name)) {\n      const slug = name.replace(/\\.(tsx|ts|js|jsx|mdx)$/, '')\n      if (slug === 'index') {\n        pages.push(`${base}/`)\n      } else if (slug !== '404') {\n        pages.push(`${base}/${slug}/`)\n      }\n    }\n  }\n\n  return pages\n}\n\nfunction e(s: string): string {\n  return s\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&apos;')\n}\n\nfunction generateSitemap(pages: string[]): string {\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${pages\n  .sort()\n  .map(\n    page => `  <url>\n    <loc>${e(SITE_URL + page)}</loc>\n  </url>`\n  )\n  .join('\\n')}\n</urlset>`\n}\n\nexport const getServerSideProps: GetServerSideProps = async ({ res }) => {\n  const pagesDir = path.join(process.cwd(), 'pages')\n  const pages = getPages(pagesDir)\n  const sitemap = generateSitemap(pages)\n\n  res.setHeader('Content-Type', 'application/xml')\n  res.setHeader('Cache-Control', 's-maxage=86400, stale-while-revalidate')\n  res.write(sitemap)\n  res.end()\n\n  return { props: {} }\n}\n\nexport default function Sitemap() {\n  return null\n}\n"
  },
  {
    "path": "pages/steve.tsx",
    "content": "import {\n  Box,\n  Textarea,\n  Grid,\n  Image,\n  Container,\n  Button,\n  Heading,\n  Text,\n  Input,\n  Checkbox\n} from 'theme-ui'\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport ForceTheme from '../components/force-theme'\nimport Nav from '../components/nav'\nimport { useState, useEffect } from 'react'\nimport DatePicker from 'react-datepicker'\nimport 'react-datepicker/dist/react-datepicker.css'\n\nconst StevePage = () => {\n  const [startDate, setStartDate] = useState(null)\n  const [endDate, setEndDate] = useState(null)\n\n  const [disabledDates, setDisabledDates] = useState([])\n\n  useEffect(() => {\n    // Fetch the disabled dates from the API endpoint when the component mounts\n    const fetchDisabledDates = async () => {\n      try {\n        const response = await fetch('/api/steve')\n        if (!response.ok) {\n          throw new Error('Network response was not ok')\n        }\n\n        const dateStrings = await response.json()\n        const dateObjects = dateStrings.map(dateStr => {\n          const date = new Date(\n            Date.UTC(\n              dateStr.substring(0, 4),\n              dateStr.substring(5, 7) - 1,\n              dateStr.substring(8, 10)\n            )\n          )\n          date.setDate(date.getDate() + 1) // Add one day to the date\n          return date\n        })\n        setDisabledDates(dateObjects)\n      } catch (error) {\n        console.error('Failed fetching disabled dates:', error)\n      }\n    }\n\n    fetchDisabledDates()\n  }, [])\n\n  const isDateDisabled = date => {\n    return disabledDates.some(\n      disabledDate => disabledDate.getTime() === date.getTime()\n    )\n  }\n\n  const isSelectingDisabledRange = (start, end) => {\n    const currDate = new Date(start)\n    currDate.setHours(0, 0, 0, 0) // Normalize the time component\n\n    const normalizedEnd = new Date(end)\n    normalizedEnd.setHours(0, 0, 0, 0)\n\n    while (currDate <= normalizedEnd) {\n      if (isDateDisabled(currDate)) {\n        return true\n      }\n      currDate.setDate(currDate.getDate() + 1)\n    }\n    return false\n  }\n\n  const handleStartDateChange = date => {\n    if (!endDate || !isSelectingDisabledRange(date, endDate)) {\n      setStartDate(date)\n    } else {\n      setStartDate(date)\n      setEndDate(null) // Reset end date if the new range is invalid\n    }\n  }\n\n  const handleEndDateChange = date => {\n    if (!isSelectingDisabledRange(startDate, date)) {\n      setEndDate(date)\n    } // Do nothing if the range is invalid\n  }\n  const images = [\n    'https://cloud-p08od8km8-hack-club-bot.vercel.app/0image.png',\n    'https://cloud-eqvtnimxq-hack-club-bot.vercel.app/0image.png',\n    'https://cloud-r8j7lcawc-hack-club-bot.vercel.app/0image.png',\n    'https://cloud-8f162hv3i-hack-club-bot.vercel.app/0image.png',\n    'https://cloud-b7gqg2qpq-hack-club-bot.vercel.app/0image.png',\n    'https://cloud-ik2jpfk0t-hack-club-bot.vercel.app/0mountains.png'\n  ]\n  const [selectedImage, setSelectedImages] = useState(0)\n\n  return (\n    <>\n      <Meta\n        as={Head}\n        title=\"A Home For You At Hack Club HQ\"\n        description=\"We now have a free place for you to stay near Hack Club HQ! It's called Steve!\"\n        image=\"https://cloud-pnaovvpuv-hack-club-bot.vercel.app/0image.png\"\n      />\n      <ForceTheme theme=\"light\" />\n      <Box\n        sx={{\n          background:\n            'linear-gradient(0deg, rgba(15, 33, 79, 0.00) 0%, rgba(15, 33, 79, 0.00) 100%), linear-gradient(180deg, #0F214F 0%, #8B412E 100%)',\n          imageRendering: 'pixelated'\n        }}\n      >\n        <Nav />\n\n        <Heading\n          sx={{\n            marginTop: 0,\n            paddingTop: 96,\n            color: '#fff',\n            fontSize: 96,\n            textAlign: 'center',\n            lineHeight: 1\n          }}\n        >\n          Imagine a{' '}\n          <Text sx={{ color: '#F8E32E', fontFamily: 'billy' }}>home</Text> for\n          <br /> you to hack with friends\n        </Heading>\n        <Image\n          alt=\"Pixel art of Steve\"\n          sx={{ width: '100%', marginTop: 48, imageRendering: 'pixelated' }}\n          src=\"https://cloud-85qd0afpz-hack-club-bot.vercel.app/0topheroart.png\"\n        />\n      </Box>\n      <Box sx={{ backgroundColor: '#8B412E' }}>\n        <Container sx={{ paddingBottom: 32 }}>\n          <Heading\n            sx={{\n              color: '#FFF',\n              fontFamily: 'Billy',\n              fontSize: 72,\n              fontStyle: 'normal',\n              fontWeight: 700,\n              paddingTop: 32,\n              paddingBottom: 32,\n              lineHeight: '100%', // 76px\n              textShadow:\n                '6px 6px 0px #000, 6px -6px 0px #000, -6px 6px 0px #000, -6px -6px 0px #000'\n            }}\n          >\n            Welcome To <Text style={{ color: '#F8E32E' }}>Steve</Text>\n          </Heading>\n\n          <Grid\n            columns={[1, '1fr 1fr 1fr']} // Three columns in a row for smaller screens and larger screens\n            gap={'32px'} // Adjust the gap between items as needed\n          >\n            <Box\n              sx={{\n                backgroundColor: 'black',\n                color: 'white',\n                aspectRatio: 1, // Ensure a square aspect ratio\n                display: 'flex',\n                alignItems: 'center',\n                flexDirection: 'column',\n                imageRendering: 'pixelated',\n                gap: '32px',\n                justifyContent: 'center',\n                background:\n                  'url(https://cloud-h22j3ald8-hack-club-bot.vercel.app/0pixelbox.png)',\n                backgroundSize: 'cover',\n                padding: 3 // Adjust padding as needed\n              }}\n            >\n              <Image\n                alt=\"Free\"\n                style={{\n                  width: '104px',\n                  height: '104px',\n                  imageRendering: 'pixelated'\n                }}\n                src=\"https://cloud-2ccduwqc9-hack-club-bot.vercel.app/0nomoney.png\"\n              />\n              <Text\n                sx={{\n                  color: '#fff',\n                  fontFamily: 'billy',\n                  fontSize: 24,\n                  fontWeight: 600,\n                  textAlign: 'center',\n                  lineHeight: 1.25\n                }}\n              >\n                Stay At Steve\n                <br /> For Free\n              </Text>\n            </Box>\n            <Box\n              sx={{\n                backgroundColor: 'black',\n                color: 'white',\n                aspectRatio: 1, // Ensure a square aspect ratio\n                display: 'flex',\n                imageRendering: 'pixelated',\n\n                alignItems: 'center',\n                flexDirection: 'column',\n                gap: '32px',\n                justifyContent: 'center',\n                background:\n                  'url(https://cloud-h22j3ald8-hack-club-bot.vercel.app/0pixelbox.png)',\n                backgroundSize: 'cover',\n                padding: 3 // Adjust padding as needed\n              }}\n            >\n              <Image\n                alt=\"5min walk\"\n                style={{\n                  width: '104px',\n                  height: '104px',\n                  imageRendering: 'pixelated'\n                }}\n                src=\"https://cloud-2c20hobub-hack-club-bot.vercel.app/05min_walk.png\"\n              />\n              <Text\n                sx={{\n                  color: '#fff',\n                  fontFamily: 'billy',\n                  fontSize: 24,\n                  fontWeight: 600,\n                  textAlign: 'center',\n                  lineHeight: 1.25\n                }}\n              >\n                Walk to HQ\n                <br /> in 5min\n              </Text>\n            </Box>\n\n            <Box\n              sx={{\n                backgroundColor: 'black',\n                color: 'white',\n                aspectRatio: 1, // Ensure a square aspect ratio\n                display: 'flex',\n                imageRendering: 'pixelated',\n\n                alignItems: 'center',\n                flexDirection: 'column',\n                gap: '32px',\n                justifyContent: 'center',\n                background:\n                  'url(https://cloud-h22j3ald8-hack-club-bot.vercel.app/0pixelbox.png)',\n                backgroundSize: 'cover',\n                padding: 3 // Adjust padding as needed\n              }}\n            >\n              <Image\n                alt=\"friends building together\"\n                style={{\n                  width: '104px',\n                  height: '104px',\n                  imageRendering: 'pixelated'\n                }}\n                src=\"https://cloud-hc1t198xx-hack-club-bot.vercel.app/0wefriends.png\"\n              />\n              <Text\n                sx={{\n                  color: '#fff',\n                  fontFamily: 'billy',\n                  fontSize: 24,\n                  fontWeight: 600,\n                  textAlign: 'center',\n                  lineHeight: 1.25\n                }}\n              >\n                Collaborate on\n                <br /> HQ Projects IRL\n              </Text>\n            </Box>\n          </Grid>\n          <Box\n            style={{\n              marginTop: 48,\n              display: 'flex',\n              padding: 24,\n              backgroundColor: '#91979C'\n            }}\n          >\n            <Box style={{ padding: '16px', backgroundColor: '#000' }}>\n              <Image\n                alt=\"Image of Steve\"\n                width={'100%'}\n                style={{\n                  height: '100%',\n                  aspectRatio: '16/9',\n                  objectFit: 'cover'\n                }}\n                src={images[selectedImage]}\n              />\n            </Box>\n\n            <Box\n              style={{\n                flexDirection: 'column',\n                alignItems: 'center',\n                width: '142px',\n                padding: '24px 24px 24px 0px',\n                backgroundColor: '#000',\n                justifyContent: 'space-between',\n                display: 'flex'\n              }}\n            >\n              {images.map((image, idx) => (\n                <Image\n                  key={idx}\n                  alt=\"\"\n                  style={{\n                    display: idx === selectedImage ? 'flex' : 'flex',\n                    cursor: 'pointer',\n                    aspectRatio: '1',\n                    objectFit: 'cover',\n                    opacity: idx !== selectedImage ? 0.5 : 1\n                  }}\n                  onClick={() => setSelectedImages(idx)}\n                  width={'96px'}\n                  height={'96px'}\n                  src={image}\n                />\n              ))}\n            </Box>\n          </Box>\n          {/* <Image src=\"https://cloud-qutaee770-hack-club-bot.vercel.app/0untitled__1_.gif\" />\n      <Image src=\"https://cloud-qvzblkbvs-hack-club-bot.vercel.app/0ezgif-4-91825479d0.gif\" />\n      <Image src=\"https://cloud-mltm380a0-hack-club-bot.vercel.app/13__1_.gif\" />\n      <Image src=\"https://cloud-ecnni31d6-hack-club-bot.vercel.app/0ezgif-4-39f9efb85b.gif\" />\n      <Image src=\"https://cloud-mltm380a0-hack-club-bot.vercel.app/35__1_.gif\" /> */}\n        </Container>\n\n        <Image\n          alt=\"\"\n          sx={{ marginBottom: 0, width: '100vw' }}\n          src=\"https://cloud-5sry4ilri-hack-club-bot.vercel.app/0dirtrow.png\"\n        />\n        <Box style={{ backgroundColor: '#000', marginTop: -8 }}>\n          <Container sx={{ marginTop: 0 }}>\n            <Heading\n              sx={{\n                color: '#F8E32E',\n                fontFamily: 'Billy',\n                fontSize: 72,\n                fontStyle: 'normal',\n                fontWeight: 700,\n                paddingTop: 32,\n                paddingBottom: 32,\n                lineHeight: '100%', // 76px\n                textShadow:\n                  '6px 6px 0px #000, 6px -6px 0px #000, -6px 6px 0px #000, -6px -6px 0px #000'\n              }}\n            >\n              Book Your Stay\n            </Heading>\n            <Box\n              sx={{\n                display: 'flex',\n                paddingBottom: 96,\n                gap: '16px',\n                justifyContent: 'space-between'\n              }}\n            >\n              <Box sx={{ width: '100%' }}>\n                <Box>\n                  <Text\n                    sx={{ fontFamily: 'billy', fontSize: 24, color: '#fff' }}\n                  >\n                    Name\n                  </Text>\n                  <Input\n                    placeholder={'Marsha Mellow'}\n                    sx={{\n                      backgroundColor: '#fff',\n                      color: '#000',\n                      fontSize: 28,\n                      padding: 16,\n                      lineHeight: 1,\n                      borderRadius: 0,\n                      marginTop: '4px',\n                      border: '4px solid #495057'\n                    }}\n                  />\n                </Box>\n                <Box sx={{ marginTop: '16px' }}>\n                  <Text\n                    sx={{ fontFamily: 'billy', fontSize: 24, color: '#fff' }}\n                  >\n                    What Do You Plan To Work On?\n                  </Text>\n                  <Textarea\n                    placeholder=\"I wanna try building a dock for Sprig\"\n                    sx={{\n                      backgroundColor: '#fff',\n                      color: '#000',\n                      fontSize: 28,\n                      marginTop: '4px',\n                      padding: 16,\n                      lineHeight: 1,\n                      borderRadius: 0,\n                      border: '4px solid #495057'\n                    }}\n                  />\n                </Box>\n                <Box sx={{ display: 'flex' }}>\n                  <Box\n                    sx={{ display: 'flex', flex: 1, flexDirection: 'column' }}\n                  >\n                    <Text\n                      sx={{ fontFamily: 'billy', color: '#fff', fontSize: 18 }}\n                    >\n                      Start Date\n                    </Text>\n                    <DatePicker\n                      selected={startDate}\n                      onChange={handleStartDateChange}\n                      selectsStart\n                      startDate={startDate}\n                      endDate={endDate}\n                      excludeDates={disabledDates}\n                    />\n                  </Box>\n                  <Box\n                    sx={{ display: 'flex', flex: 1, flexDirection: 'column' }}\n                  >\n                    <Text\n                      sx={{ fontFamily: 'billy', color: '#fff', fontSize: 18 }}\n                    >\n                      End Date\n                    </Text>\n                    <DatePicker\n                      selected={endDate}\n                      onChange={handleEndDateChange}\n                      selectsEnd\n                      startDate={startDate}\n                      endDate={endDate}\n                      minDate={startDate}\n                      excludeDates={disabledDates}\n                    />\n                  </Box>\n                </Box>\n              </Box>\n              <Box sx={{ width: '100%' }}>\n                <Box>\n                  <Text\n                    sx={{ fontFamily: 'billy', color: '#fff', fontSize: 18 }}\n                  >\n                    Email\n                  </Text>\n                  <Input\n                    placeholder={'Marsha Mellow'}\n                    sx={{\n                      backgroundColor: '#fff',\n                      color: '#000'\n                    }}\n                  />\n                </Box>\n                <Box>\n                  <Text\n                    sx={{ fontFamily: 'billy', color: '#fff', fontSize: 18 }}\n                  >\n                    Check All That Apply <br />\n                  </Text>\n                  <Box sx={{ display: 'flex', gap: '16px' }}>\n                    <Box>\n                      <Box sx={{ display: 'flex' }}>\n                        <Checkbox />\n                        <Text sx={{ color: '#fff', marginRight: '0px' }}>\n                          Club Leader\n                        </Text>\n                      </Box>\n                      <Box sx={{ display: 'flex' }}>\n                        <Checkbox />\n                        <Text sx={{ color: '#fff', marginRight: '0px' }}>\n                          Hackathon Organizer\n                        </Text>\n                      </Box>\n                    </Box>\n                    <Box>\n                      <Box sx={{ display: 'flex' }}>\n                        <Checkbox />\n                        <Text sx={{ color: '#fff', marginRight: '0px' }}>\n                          Member Of The Slack\n                        </Text>\n                      </Box>\n                      <Box sx={{ display: 'flex' }}>\n                        <Checkbox />\n                        <Text sx={{ color: '#fff', marginRight: '0px' }}>\n                          Project Contributor\n                        </Text>\n                      </Box>\n                    </Box>\n                  </Box>\n                </Box>\n                <Box>\n                  <Button type=\"submit\">Submit</Button>\n                </Box>\n                <Box></Box>\n              </Box>\n            </Box>\n\n            {/*\n      <Box>\n        <Text>\n          <strong>Frequently Asked Questions</strong>\n        </Text>\n\n        <Text>What's Tracy House, Bank, and HQ?</Text>\n        <Text>What's the environment like at HQ?</Text>\n        <Text>What's are the sleeping arrangements?</Text>\n        <Text>How cold is it in the winter?</Text>\n        <Text>Where will I get food?</Text>\n        <Text>Who can stay at Steve?</Text>\n        <Text>How many people can stay at Steve?</Text>\n        <Text>How long can I stay at Steve?</Text>\n      </Box> */}\n            {/* <Box>\n        Have additional questions? Send us an email at{' '}\n        <Link href=\"mailto:steve@hackclub.com\">steve@hackclub.com</Link>\n      </Box> */}\n          </Container>\n        </Box>\n      </Box>\n    </>\n  )\n}\n\nexport default StevePage\n"
  },
  {
    "path": "pages/stickers.tsx",
    "content": "import { Card, Box, Flex, Grid, Heading, Image, Text } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport Nav from '../components/nav'\nimport BGImg from '../components/background-image'\nimport Footer from '../components/footer'\nimport ForceTheme from '../components/force-theme'\n\nimport fs from 'fs'\nimport path from 'path'\n\nconst color = '#EC37AD'\n\nfunction customStartCase(st) {\n  return st\n    .replace(/\\.(svg|png)$/, '')\n    .replace(/[_-]+/g, ' ')\n    .replace(/\\b\\w/g, char => char.toUpperCase())\n}\n\nconst StickersPage = ({ stickers = [] }) => [\n  <Box as=\"main\" key=\"main\" sx={{ textAlign: 'center' }}>\n    <ForceTheme theme=\"dark\" />\n    <Nav dark />\n    <Meta\n      as={Head}\n      title=\"Stickers\"\n      description=\"Check out Hack Club’s stickers.\"\n      image=\"https://cdn.glitch.com/a7605379-7582-4aac-8f44-45bbdfca0cfa%2Fstickers.png?v=1588012712143\"\n    />\n    <Box\n      as=\"article\"\n      sx={{ position: 'relative', overflow: 'hidden', py: [6, 7], px: 4 }}\n    >\n      <BGImg\n        alt=\"Students exchanging stickers\"\n        src=\"/stickers/hero.jpg\"\n        gradient=\"true\"\n      />\n      <Card\n        sx={{\n          variant: 'cards.translucentDark',\n          bg: 'rgba(0, 0, 0, 0.5) !important',\n          position: 'relative',\n          overflow: 'visible',\n          maxWidth: 'copy',\n          mx: 'auto',\n          my: [4, 5],\n          py: 3\n        }}\n      >\n        <Box\n          as=\"aside\"\n          sx={{\n            display: ['none', 'flex'],\n            justifyContent: 'center',\n            alignItems: 'center',\n            position: 'absolute',\n            top: 0,\n            left: '50%',\n            transform: 'translateX(-50%) translateY(-50%)',\n            width: '100%',\n            img: {\n              mx: 3,\n              flexShrink: 0,\n              filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.25))'\n            }\n          }}\n        >\n          <Image\n            src=\"/stickers/macintosh.svg\"\n            alt=\"Macintosh sticker\"\n            sx={{\n              transform: 'rotate(-12deg)',\n              width: '4.5rem',\n              height: '6rem'\n            }}\n          />\n          <Image\n            src=\"/stickers/2020_progress.png\"\n            alt=\"Pride sticker\"\n            sx={{\n              transform: 'rotate(3deg)',\n              width: ['4rem', '6rem'],\n              height: ['4rem', '6rem']\n            }}\n          />\n          <Image\n            src=\"/stickers/enjoy.svg\"\n            alt=\"Enjoy Hack Club Coca-Cola sticker\"\n            sx={{\n              transform: 'rotate(-12deg)',\n              width: ['6rem', '7.5rem'],\n              height: ['4rem', '5rem']\n            }}\n          />\n        </Box>\n        <Heading\n          as=\"h1\"\n          variant=\"ultratitle\"\n          sx={(t: any) => ({\n            color: 'primary',\n            ...t.util.gxText(color, 'red'),\n            mt: [3, 4]\n          })}\n        >\n          Unparalleled stickers.\n        </Heading>\n        <Text as=\"p\" variant=\"lead\" color=\"muted\">\n          Every Hack Club gets free, high-quality stickers.\n        </Text>\n      </Card>\n    </Box>\n    <Card\n      as=\"section\"\n      sx={{\n        bg: 'darkless',\n        maxWidth: 'copyUltra',\n        mx: 'auto',\n        my: [4, 5],\n        py: [3, 4],\n        overflow: 'visible'\n      }}\n    >\n      <Heading as=\"h2\" variant=\"title\" color=\"white\">\n        Gotta collect ‘em all.\n      </Heading>\n      <Grid columns={[2, 3]} gap={[3, 4]} mt={[3, 4]}>\n        {stickers.map(st => (\n          <Flex\n            key={st}\n            sx={{\n              flexDirection: 'column',\n              alignItems: 'center',\n              justifyContent: 'center',\n              img: {\n                objectFit: 'contain',\n                width: [128, 160],\n                height: [128, 160],\n                transition: '.25s transform ease-in-out',\n                ':hover': {\n                  transform: 'scale(1.5)',\n                  filter: 'drop-shadow(0 4px 8px rgba(0,0,0,0.25))'\n                }\n              }\n            }}\n          >\n            <Image\n              src={`/stickers/${st}`}\n              width={128}\n              height={128}\n              alt={st.split('.')[0]}\n            />\n            <Text as=\"span\" variant=\"caption\" sx={{ fontSize: 2, mt: [2, 3] }}>\n              {customStartCase(st)}\n            </Text>\n          </Flex>\n        ))}\n      </Grid>\n    </Card>\n    {/*\n    <Card\n      as=\"section\"\n      sx={{\n        bg: 'darkless',\n        maxWidth: 'copy',\n        mx: 'auto',\n        my: [4, 5],\n        py: [3, 4]\n      }}\n    >\n      <Heading as=\"h2\" variant=\"title\" color=\"white\" mb={4}>\n        Request a free envelope\n      </Heading>\n      <StickerForm />\n    </Card>\n*/}\n  </Box>,\n  <Footer dark key=\"footer\" />\n]\n\nexport default StickersPage\n\nexport const getStaticProps = () => {\n  const stickersDir = path.join(process.cwd(), 'public', 'stickers')\n  const stickers = fs\n    .readdirSync(stickersDir)\n    .filter(sticker => sticker !== 'hero.jpg')\n  return { props: { stickers } }\n}\n"
  },
  {
    "path": "pages/team.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport { Box, Container, Grid, Text } from 'theme-ui'\nimport Meta from '@hackclub/meta'\nimport Head from 'next/head'\nimport Nav from '../components/nav'\nimport Footer from '../components/footer'\nimport Bio from '../components/bio'\nimport BoardBox from '../components/boardbio'\nimport ForceTheme from '../components/force-theme'\nimport { fetchTeam } from './api/team'\nimport Link from 'next/link'\n\nconst CommunityTeamBox = ({ title, children }) => {\n  return (\n    <Box\n      bg=\"rgb(247 225 255)\"\n      sx={{\n        borderRadius: 'default',\n        boxShadow: 'default',\n        overflow: 'hidden'\n      }}\n      mb={2}\n    >\n      <div style={{ fontWeight: 'bold' }}>\n        <Text\n          variant=\"headline\"\n          as=\"h4\"\n          sx={{ textAlign: 'center', fontSize: 4 }}\n        >\n          {title}\n        </Text>\n      </div>\n      <div\n        style={{\n          overflow: 'hidden',\n          margin: '0 1rem 1rem'\n        }}\n      >\n        {children}\n      </div>\n    </Box>\n  )\n}\n\nexport default function Team({ team }) {\n  // Spacing between major team section boxes\n  const BOX_SPACING = 5\n\n  return (\n    <>\n      <Box as=\"main\" key=\"main\">\n        <ForceTheme theme=\"light\" />\n        <Nav />\n        <Meta\n          as={Head}\n          title=\"Team\"\n          description=\"Meet the team that runs Hack Club, a global nonprofit network of high school computer science clubs.\"\n        />\n        <Box\n          pt={6}\n          pb={5}\n          px={[2, 4]}\n          sx={{\n            backgroundImage:\n              'radial-gradient(ellipse farthest-corner at top left,rgb(36 181 165 / 70%),rgb(30 151 137 / 70%)), url(https://cdn.hackclub.com/019c76b9-a4c2-7dd4-b6bb-e497530e43cf/GfkVjA.jpg)',\n            backgroundSize: 'cover',\n            backgroundPosition: '25% 15%'\n          }}\n        >\n          <Container>\n            <Text variant=\"ultratitle\" color=\"snow\">\n              By the students,\n              <br /> for the students.\n            </Text>\n\n            <Text\n              as=\"div\"\n              variant=\"lead\"\n              color=\"smoke\"\n              sx={{ maxWidth: '650px' }}\n            >\n              We believe in a world where every young person is empowered to be\n              the change they want to see around them. At Hack Club, we’re\n              working hard to make it reality.\n            </Text>\n          </Container>\n        </Box>\n        <Box bg=\"#f9f9fa\" py={4}>\n          <Container>\n            <Box\n              sx={{\n                mb: BOX_SPACING\n              }}\n            >\n              <Text\n                variant=\"headline\"\n                mt={2}\n                mb={3}\n                as=\"h3\"\n                sx={{ textAlign: 'center', fontSize: 5 }}\n              >\n                Board & Advisors\n              </Text>\n              <Grid columns={[1, null, 2]} gap={5} mb={4}>\n                <BoardBox\n                  img=\"/team/zach.jpg\"\n                  name=\"Zach Latta\"\n                  teamRole=\"Founder\"\n                  text=\"Zach dropped out of high school after his freshman year to work in the technology industry and had over 5 million people using his software by the time he turned 17. He founded Hack Club to build the program he wish he had in high school and has been awarded the Thiel Fellowship and Forbes 30 Under 30 for his work.\"\n                  email=\"zach\"\n                />\n                <BoardBox\n                  img=\"/team/christina.jpg\"\n                  name=\"Christina Asquith\"\n                  teamRole=\"Co-Founder and COO\"\n                  text=\"With more than a decade of experience in starting and leading organizations, Christina has built global teams and raised millions of dollars. She has 20 years experience as a journalist, including reporting for The New York Times from Iraq. She has an MA in education, and taught as a public school teacher in 2000, which inspired her book “The Emergency Teacher.”\"\n                  email=\"christina\"\n                />\n              </Grid>\n              <Grid columns={[1, null, 3]} gap={4} mb={4}>\n                <BoardBox\n                  img=\"https://i.ibb.co/gMVMqJzt/2026-01-27-0io-Kleki.jpg\"\n                  name=\"Tom Preston-Werner\"\n                  teamRole={<>Board Member</>}\n                  subrole=\"Co-Founder, GitHub\"\n                  href=\"https://github.com/mojombo\"\n                />\n                <BoardBox\n                  img=\"https://i.ibb.co/qMCYrJn8/sqs.jpg\"\n                  name=\"Quinn Slack\"\n                  teamRole={<>Board Member</>}\n                  subrole=\"Co-Founder and CEO, AMP\"\n                  href=\"https://github.com/sqs\"\n                />\n                <BoardBox\n                  img=\"https://i.ibb.co/0pGTSmks/2026-01-27-0il-Kleki.png\"\n                  name=\"John Abele\"\n                  teamRole={<>Board Advisor</>}\n                  href=\"https://en.wikipedia.org/wiki/John_Abele\"\n                  subrole=\"Founder, Boston Scientific\"\n                />\n              </Grid>\n            </Box>\n            <Box\n              sx={{\n                bg: '#afcfee',\n                p: 3,\n                borderRadius: '20px',\n                mb: BOX_SPACING\n              }}\n            >\n              <Text\n                variant=\"headline\"\n                mt={2}\n                mb={3}\n                as=\"h3\"\n                sx={{ textAlign: 'center', fontSize: 5 }}\n              >\n                Hacker Resources Team\n              </Text>\n              {team.current?.filter(\n                member => member.department === 'HQ' && member.staff\n              ).length > 0 && (\n                <>\n                  <Text\n                    variant=\"headline\"\n                    mt={2}\n                    mb={2}\n                    as=\"h4\"\n                    sx={{ fontSize: 3 }}\n                  >\n                    Staff:\n                  </Text>\n                  <Grid columns={[1, null, 2, 3]} gap={3}>\n                    {team.current\n                      ?.filter(\n                        member => member.department === 'HQ' && member.staff\n                      )\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </>\n              )}\n              {team.current?.filter(\n                member => member.department === 'HQ' && member.gapyear\n              ).length > 0 && (\n                <>\n                  <Text\n                    variant=\"headline\"\n                    mt={3}\n                    mb={2}\n                    as=\"h4\"\n                    sx={{ fontSize: 3 }}\n                  >\n                    2025-2026 Gap Years:\n                  </Text>\n                  <Grid columns={[1, null, 2, 3]} gap={3}>\n                    {team.current\n                      ?.filter(\n                        member => member.department === 'HQ' && member.gapyear\n                      )\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </>\n              )}\n              {team.current?.filter(\n                member =>\n                  member.department === 'HQ' && !member.gapyear && !member.staff\n              ).length > 0 && (\n                <>\n                  <Text\n                    variant=\"headline\"\n                    mt={3}\n                    mb={2}\n                    as=\"h4\"\n                    sx={{ fontSize: 3 }}\n                  >\n                    Teen Contractors:\n                  </Text>\n                  <Grid columns={[1, null, 2, 3]} gap={3}>\n                    {team.current\n                      ?.filter(\n                        member =>\n                          member.department === 'HQ' &&\n                          !member.gapyear &&\n                          !member.staff\n                      )\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </>\n              )}\n            </Box>\n            <Box\n              sx={{\n                bg: 'rgb(236 55 80 / 40%)',\n                p: 3,\n                borderRadius: '20px',\n                mb: BOX_SPACING\n              }}\n            >\n              <Text\n                variant=\"headline\"\n                mt={2}\n                mb={3}\n                as=\"h3\"\n                sx={{ textAlign: 'center', fontSize: 5 }}\n              >\n                HCB Team\n              </Text>\n              {team.current?.filter(\n                member => member.department === 'HCB' && member.staff\n              ).length > 0 && (\n                <>\n                  <Text\n                    variant=\"headline\"\n                    mt={2}\n                    mb={2}\n                    as=\"h4\"\n                    sx={{ fontSize: 3 }}\n                  >\n                    Staff:\n                  </Text>\n                  <Grid columns={[1, null, 2, 3]} gap={3}>\n                    {team.current\n                      ?.filter(\n                        member => member.department === 'HCB' && member.staff\n                      )\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </>\n              )}\n              {team.current?.filter(\n                member => member.department === 'HCB' && !member.staff\n              ).length > 0 && (\n                <>\n                  <Text\n                    variant=\"headline\"\n                    mt={3}\n                    mb={2}\n                    as=\"h4\"\n                    sx={{ fontSize: 3 }}\n                  >\n                    Contributors:\n                  </Text>\n                  <Grid columns={[1, null, 2, 3]} gap={3}>\n                    {team.current\n                      ?.filter(\n                        member => member.department === 'HCB' && !member.staff\n                      )\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </>\n              )}\n            </Box>\n            <Box\n              sx={{\n                bg: 'rgb(166 51 214 / 40%)',\n                p: 3,\n                borderRadius: '20px'\n              }}\n            >\n              <Text\n                variant=\"headline\"\n                mt={2}\n                mb={3}\n                as=\"h3\"\n                sx={{ textAlign: 'center', fontSize: 5 }}\n              >\n                Community Team\n              </Text>\n              <Grid columns={[1, null, 2]} gap={3}>\n                <CommunityTeamBox title=\"Moderation\">\n                  <Grid columns={[1, null, 2]} gap={3} m={10}>\n                    {team.current\n                      ?.filter(member => member.department === 'Moderation')\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </CommunityTeamBox>\n                <CommunityTeamBox title=\"Welcomers\">\n                  <Grid columns={[1, null, 2]} gap={3} m={10}>\n                    {team.current\n                      ?.filter(member => member.department === 'Welcoming')\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </CommunityTeamBox>\n                <CommunityTeamBox title=\"Virtual Events\">\n                  <Grid columns={[1, null, 2]} gap={3} m={10}>\n                    {team.current\n                      ?.filter(member => member.department === 'Events')\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </CommunityTeamBox>\n                <CommunityTeamBox title=\"Newspaper\">\n                  <Grid columns={[1, null, 2]} gap={3} m={10}>\n                    {team.current\n                      ?.filter(member => member.department === 'Newspaper')\n                      .map(member => (\n                        <Bio\n                          img={member.avatar}\n                          name={member.name}\n                          teamRole={member.role}\n                          text={member.bio}\n                          pronouns={member.pronouns}\n                          email={member.email}\n                          href={member.website}\n                          key={member.name}\n                        />\n                      ))}\n                  </Grid>\n                </CommunityTeamBox>\n              </Grid>\n            </Box>\n            <br />\n            <Box sx={{ fontWeight: 'bold', textAlign: 'center' }}>\n              <Link href=\"/acknowledged/\">\n                <Box sx={{ cursor: 'pointer' }}>\n                  <Text\n                    variant=\"title\"\n                    color=\"orange\"\n                    sx={{\n                      lineHeight: '1em',\n                      fontSize: [4, 5, 6],\n                      textAlign: 'center',\n                      textDecoration: 'underline'\n                    }}\n                    as=\"h2\"\n                  >\n                    Acknowledgements\n                  </Text>\n                  <Text sx={{ color: 'muted', fontSize: 2, mt: 2 }}>\n                    Thank you to everyone who helped shape Hack Club into what\n                    it is today...\n                  </Text>\n                </Box>\n              </Link>\n            </Box>\n          </Container>\n        </Box>\n      </Box>\n      <Footer light key=\"footer\" />\n    </>\n  )\n}\n\nexport const getStaticProps = async () => {\n  try {\n    const current = await fetchTeam()\n    return { props: { team: { current } } }\n  } catch (e) {\n    return { props: { team: {} } }\n  }\n}\n"
  },
  {
    "path": "pages/winter.tsx",
    "content": "/** @jsxImportSource theme-ui */\nimport Head from 'next/head'\nimport Meta from '@hackclub/meta'\nimport Nav from '../components/nav'\nimport { Box, Container, Heading, Text, Image, Link, Flex } from 'theme-ui'\nimport Snowfall from 'react-snowfall'\nimport WinterFooter from '../components/winter/footer'\nimport ForceTheme from '../components/force-theme'\nimport RealTimeline from '../components/winter/timeline'\nimport InfoGrid from '../components/winter/info'\nimport Breakdown from '../components/winter/breakdown'\nimport Projects from '../components/winter/projects'\nimport Landing from '../components/winter/landing'\nimport Recap from '../components/winter/recap'\nimport { Zoom } from '../components/react-reveal-compat'\nexport function Winter() {\n  return (\n    <>\n      <Box as=\"main\" sx={{ bg: 'blue' }}>\n        <Meta\n          as={Head}\n          title=\"Winter Hardware Wonderland\"\n          description=\"Join the Hack Club community for a winter of hardware hacking, and get a $250 grant to build your project.\"\n          image=\"/winter/og-image.png\"\n        />\n        <Nav />\n        <Snowfall />\n        <ForceTheme theme=\"light\" />\n        <Landing />\n        <Breakdown />\n        <Projects />\n        <InfoGrid />\n        <Container>\n          <Zoom>\n            <Heading\n              variant=\"headline\"\n              sx={{\n                textShadow: '0px 0px 21px #E1F1FF',\n                color: 'white',\n                fontSize: [3, 4, 5],\n                maxWidth: '90%'\n              }}\n            >\n              This event has ended\n            </Heading>\n            <Text as=\"p\" sx={{ pb: 4, color: 'white', fontSize: [2, 3] }}>\n              Winter Hardware Wonderland has wrapped up! Check out the amazing\n              projects that were built on{' '}\n              <Link\n                href=\"https://github.com/hackclub/winter\"\n                target=\"_blank\"\n                sx={{ color: 'inherit' }}\n              >\n                GitHub\n              </Link>\n              , or come hang out with us on{' '}\n              <Link\n                target=\"_blank\"\n                href=\"https://slack.hackclub.com\"\n                sx={{ color: 'inherit' }}\n              >\n                Slack\n              </Link>\n              .\n            </Text>\n          </Zoom>\n\n          <Flex\n            sx={{\n              flexDirection: ['column', null, 'row'],\n              justifyContent: 'center',\n              alignItems: 'center'\n            }}\n          >\n            <Box\n              sx={{ display: 'flex', flexDirection: ['row', null, 'column'] }}\n            >\n              <Zoom>\n                <Heading\n                  variant=\"title\"\n                  sx={{\n                    color: 'white',\n                    textTransform: 'uppercase',\n                    transform: ['none', null, 'rotate(-90deg)'],\n                    textShadow: '0px 0px 21px #E1F1FF'\n                  }}\n                >\n                  Timeline\n                </Heading>\n                <Image\n                  src=\"https://cloud-lbajgdi3a-hack-club-bot.vercel.app/0fox_1.png\"\n                  alt=\"Illustrated orange fox sleeping in a curled position\"\n                  sx={{\n                    width: ['100px', null, '80%'],\n                    pt: [null, null, 6],\n                    ml: [2, null, null]\n                  }}\n                />\n              </Zoom>\n            </Box>\n            <RealTimeline />\n          </Flex>\n        </Container>\n        <Recap />\n        <WinterFooter />\n      </Box>\n    </>\n  )\n}\n\nexport default Winter\n"
  },
  {
    "path": "public/.well-known/security.txt",
    "content": "Contact: mailto:security@hackclub.com\nExpires: 2026-12-31T11:59:00.000Z\nPreferred-Languages: en-US\nPolicy: https://security.hackclub.com\nCanonical: https://security.hackclub.com\n"
  },
  {
    "path": "public/acknowledged.json",
    "content": "[\n  {\n    \"name\": \"Arianna Martinelli\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Mentor\",\n    \"acknowledged\": true,\n    \"bio\": \"Arianna (a current freshman at Carnegie-Mellon University and a former Hack Club leader from Kentucky) loved onboarding all our cool organizations and making HCB more accessible. When she’s not learning about how humans and computers can work together, she’s making memes and decorating the world with Hack Club stickers.\",\n    \"slackId\": \"U012U7V5W22\",\n    \"email\": \"arianna\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-r09ga84qd-hack-club-bot.vercel.app/8image.png\"\n  },\n  {\n    \"name\": \"Aryan Kapoor\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": true,\n    \"bio\": \"Aryan is currently a Computer Science freshman from India who likes to tinker with electronics. He holds a special place in his heart for dogs and even has two chihuahuas. He specializes in integrating business systems with websites and apps, and loves to help around in the community.\",\n    \"slackId\": \"U078A390FTQ\",\n    \"email\": \"aryan\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U078A390FTQ/r\"\n  },\n  {\n    \"name\": \"Caleb Denio\",\n    \"department\": \"HCB\",\n    \"role\": \"HCB Engineer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U013B6CPV62\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U013B6CPV62/r\"\n  },\n  {\n    \"name\": \"Daisy Reyes\",\n    \"department\": \"HCB\",\n    \"role\": \"HCB Operations Lead\",\n    \"acknowledged\": true,\n    \"bio\": \"Daisy has a passion for growing and maintaining positive relationships with all of the members of Hack Club and that’s her favorite part about being on the HCB team. Daisy especially loves onboarding and helping FIRST teams navigate HCB so that they can excel in their own goals. She grew up in Vermont on a dairy farm and graduated from The University of Vermont with her bachelors in Animal Science. She loves animals of all types, crocheting, board games, and traveling.\",\n    \"slackId\": \"U046V3EK56W\",\n    \"email\": \"daisy\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U046V3EK56W/r\"\n  },\n  {\n    \"name\": \"David Cornu\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U092BUBS28G\",\n    \"email\": \"davidc\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U092BUBS28G/r\"\n  },\n  {\n    \"name\": \"Hunter Goodenough\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Associate\",\n    \"acknowledged\": true,\n    \"bio\": \"Hunter is a jack of all trades with a particular passion for creating and supporting communities. He is an ardent hobbyist and is always trying out new things. He is a newer hire at HCB (Having previously worked in both the Restaurant and Medical Technology industries) and is excited to join the community and is looking forward to participating in various Hack Club projects and events.\",\n    \"slackId\": \"U05RDPEKGA3\",\n    \"email\": \"hunter\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U05RDPEKGA3/r\"\n  },\n  {\n    \"name\": \"Kunal Botla\",\n    \"department\": \"HCB\",\n    \"role\": \"HCB Operations\",\n    \"acknowledged\": true,\n    \"bio\": \"Kunal loves to make for making! He started Project Boom to help provide computers, helped build and run HCB, and organized MAHacks for a post-pandemic world. He takes photos to tell stories of an ever-changing world.\",\n    \"slackId\": \"U013DC0KYC8\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-qxgtr6fn3-hack-club-bot.vercel.app/0kunal_botla_460x460.jpg\"\n  },\n  {\n    \"name\": \"Linus Lee\",\n    \"department\": \"HCB\",\n    \"role\": \"HCB Engineer\",\n    \"acknowledged\": true,\n    \"bio\": \"Linus spends most of his free time working on side projects ranging from an audio travel diary to creative coding tools to his own programming language. He brought his experience in product & community from Cal Hacks & Dorm Room Fund to grow HCB.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-hinoss9c1-hack-club-bot.vercel.app/0image_300x300.jpg\"\n  },\n  {\n    \"name\": \"Liv Cook\",\n    \"department\": \"HCB\",\n    \"role\": \"HCB Junior Project Manager\",\n    \"acknowledged\": true,\n    \"bio\": \"During her tenure at HCB, Liv cared deeply about ensuring that every user had the best fiscal sponsorship experience possible and that new features and UX improvements were on track to launch. She also loved supporting teams on HCB that are passionate about making a difference in their communities. In her free time, Liv enjoys traveling, writing, and discovering new music. She graduated from the University of Vermont with a degree in Healthcare Systems and Policy.\",\n    \"slackId\": \"U02A67DA1QX\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-7k5s55nlw-hack-club-bot.vercel.app/0image_1821x1821.jpg\"\n  },\n  {\n    \"name\": \"Michael Destefanis\",\n    \"department\": \"HCB\",\n    \"role\": \"HCB Operations\",\n    \"acknowledged\": true,\n    \"bio\": \"After graduating high school, Michael moved to California where he began working with Hack Club. He handled the day-to-day operations of HCB from its start starting to its first million dollars in transactions.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-r6ds3fdrw-hack-club-bot.vercel.app/0michael_128x127.jpg\"\n  },\n  {\n    \"name\": \"Scott Motte\",\n    \"department\": \"HCB\",\n    \"role\": \"HCB Engineer\",\n    \"acknowledged\": true,\n    \"bio\": \"After teaching himself to code in college, Scott went on to lead an exciting software life with multiple startups. Now a father, he joined Hack Club to help build the program he wants available to his children—when they reach high school age.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-33mta2q2e-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Theo Bleier\",\n    \"department\": \"HCB\",\n    \"role\": \"Special Projects\",\n    \"acknowledged\": true,\n    \"bio\": \"Theo, a high schooler, joined the Hack Club community in Summer 2018 after reading about HCB online. Since then, he’s run multiple events on HCB & worked on coding it. In 2020, Theo worked on AMAs & distributing laptop grants to students.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-g73jcrk00-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Lux Loff\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"As a high school student, Lux joined the Hack Club Slack after finding the SSH jobs board. In her 20s, she joined the You Ship, We Ship team at Hack Club HQ, where she launched six events of varying shapes and sizes. In her spare time, you'll still find her producing music (as \\\"sporeball\\\") or designing her own rhythm game (called Khel), among other \\\"weird things\\\".\",\n    \"slackId\": \"U01G0Q9K998\",\n    \"email\": \"lux\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U01G0Q9K998/r\"\n  },\n  {\n    \"name\": \"Abby Fischler\",\n    \"department\": \"HQ\",\n    \"role\": \"Junior Administrative Engineer\",\n    \"acknowledged\": true,\n    \"bio\": \"Abby is a high school junior from Los Angeles that loves technology! Since joining the Hack Club community in May 2020, she’s enjoyed learning with friends in the Slack and on board the Hacker Zephyr. She joined Hack Club to support Christina’s work in encouraging more girls to get involved. Abby has hosted events for the community and loves sharing her coding journey on the #ship channel.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-jp1adkwpw-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Anna Grace Benny\",\n    \"department\": \"HQ\",\n    \"role\": \"APAC Clubs\",\n    \"acknowledged\": true,\n    \"bio\": \"Anna is a visual communication graduate and a social media enthusiast. She loves films and everything related. Managing and meeting new Hack Clubbers as the APAC Clubs Lead, she helped with onboarding new clubs and managed the APAC social media pages.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-aomcbxj1t-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Arpan\",\n    \"department\": \"HQ\",\n    \"role\": \"Clubs Operation/Special Activites Director\",\n    \"acknowledged\": true,\n    \"bio\": \"Arpan joined HC through Epoch in 2022. Then worked with Clubs Operations, developing Clubs Directory, OpenAI Gateway and managing clubs in the APAC region. He then helped establish the Special Activities Division as it's first Director which runs virtual events for hackclubbers. He also led the Fraud Detection team for Hack Club Arcade.\",\n    \"slackId\": \"U0409FSKU82\",\n    \"email\": \"arpan\",\n    \"website\": \"https://arpanpandey.dev\",\n    \"avatar\": \"https://media.licdn.com/dms/image/v2/D5603AQHgJ1rUos6FFA/profile-displayphoto-shrink_800_800/B56Zd.1nF2H8Ac-/0/1750179673148?e=1759363200&v=beta&t=Ta3W1GF6ZNYl7U-D6YSCAzNUJl4SHwERjslWbDsvEdQ\"\n  },\n  {\n    \"name\": \"Athul Blesson\",\n    \"department\": \"HQ\",\n    \"role\": \"APAC Director\",\n    \"acknowledged\": true,\n    \"bio\": \"Athul started dozens of the largest Hack Clubs in India. After graduating from high school, he joined Hack Club as the Regional Manager of the Asia-Pacific & Africa team where he actively managed hundreds of clubs. Then, as the APAC Director, Athul lead the APAC HQ team dedicated to supporting all of the clubs in the APAC region.\",\n    \"slackId\": \"U28HSBVU3\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-6mlr4ctui-hack-club-bot.vercel.app/0thumbnail_image.jpg\"\n  },\n  {\n    \"name\": \"Belle See\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineer for Comms\",\n    \"acknowledged\": true,\n    \"bio\": \"Belle enjoys building for her community, whether that be through developing websites or planning programs and events. She is excited to make Hack Club a better place for students around the world and looks forward to learning from the team at Hack Club!\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-9eq6pzox9-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Ben Dixon\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Coming all the way from drizzly England, Ben reconnected with his adoration for teaching people about programming through the computer graphics demoscene during lockdown; firmly believing “HLSL is basically pseudocode”. At Hack Club, Ben designs and implements snazzy new features at HCB, along with raiding their granola bars.\",\n    \"slackId\": \"U03DFNYGPCN\",\n    \"email\": \"malted\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U03DFNYGPCN/r\"\n  },\n  {\n    \"name\": \"Bence Beres\",\n    \"department\": \"HQ\",\n    \"role\": \"Bookkeeper\",\n    \"acknowledged\": true,\n    \"bio\": \"Bence is a true bureaucrat who doesn’t leave any documents unturned. Having made a sharp U-turn after college to switch from his burgeoning career in the world of political science towards the thrilling and life altering adventures of the world of Accounting, Bence understands that knowing Excel is a greatly underappreciated life skill.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-bzv1bqqmj-hack-club-bot.vercel.app/0image_d57i8fgueh0z5yejtzjavj2jffausnkcazyko7yvyz8.png\"\n  },\n  {\n    \"name\": \"Cedric Hutchings\",\n    \"department\": \"HQ\",\n    \"role\": \"Constructionist\",\n    \"acknowledged\": true,\n    \"bio\": \"Already more at home on the internet than anywhere in meat space, you can imagine a young Ced's horror when his parents moved him into a holler so deep in the Appalachian Mountains that his beloved internet was only accessible through sluggish satellite. Stubbornly refusing to be separated from his online games, he threw together his own for his brothers, a captive audience. At Hack Club, Ced made materials that shared his enthusiasm for making fun somethings from nothing but technology.\",\n    \"slackId\": \"UN971L2UQ\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-k9msfzu1k-hack-club-bot.vercel.app/0image_512x512.png\"\n  },\n  {\n    \"name\": \"Charlie Nicholson\",\n    \"department\": \"HQ\",\n    \"role\": \"YSWS & Events\",\n    \"acknowledged\": true,\n    \"bio\": \"Charlie is a Hack Clubber from the Greater Boston area. He joined Hack Club when he was 12 and launched his first YSWS when he was 13, Ham Club. More recently, he worked on a long-term hackathon called Apex, supported by Hack Club. He is now working for Hack Club to create more hardware YSWSs and events.\",\n    \"slackId\": \"U054JRXUNG0\",\n    \"email\": \"charlien\",\n    \"website\": \"https://crnicholson.com\",\n    \"avatar\": \"https://user-cdn.hackclub-assets.com/019c76b8-563a-7fe2-86c6-c4f6d481c9ac/iAdXig.png\"\n  },\n  {\n    \"name\": \"Cheru Berhanu\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U02UYFZQ0G0\",\n    \"email\": \"cheru\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-e98036o7p-hack-club-bot.vercel.app/0june_23_2024_image.jpg\"\n  },\n  {\n    \"name\": \"Dieter Schoening\",\n    \"department\": \"HQ\",\n    \"role\": \"Media Creation\",\n    \"acknowledged\": true,\n    \"bio\": \"Dieter grew up in South Carolina where he started the adventure of content creation. Now he is helping with our social media and projects to get more teens interested in Hack Club. Fun facts: He likes virtual reality development, boba, hiking, entrepreneurship\",\n    \"slackId\": \"U045B4BQ2T0\",\n    \"email\": \"deet\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-cf5rl33km-hack-club-bot.vercel.app/0tjnycdvgngp9mwk_thumbnail.jpg\"\n  },\n  {\n    \"name\": \"Dina Elhanan\",\n    \"department\": \"HQ\",\n    \"role\": \"Summer Intern\",\n    \"acknowledged\": true,\n    \"bio\": \"Dina started a club in Canada in 2018. Since then she’s run a local hackathon, organized club events & trips, and spoke at Hack Club’s Flagship 2019 Summit. After graduating high school, Dina joined HQ as a ✨Vibes Influencer✨ summer intern. She now studies Electrical Engineering at McMaster University, class of 2024.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-2dne45yzx-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Ella Xu\",\n    \"department\": \"HQ\",\n    \"role\": \"Clubs Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Ella joined the Hack Club community after learning about HCB from a project running on it. Since then, she has contributed to HCB itself in addition to other Hack Club open source projects on GitHub.\",\n    \"slackId\": \"U01D6FYHLUW\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-4yg49snx8-hack-club-bot.vercel.app/0image_512x512.jpg\"\n  },\n  {\n    \"name\": \"Faisal Sayed\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Faisal has been associated with Hack Club for 3 years and loves building open-source projects that bring joy. During the first workshop-bounty-program back in 2020, Faisal was heavily involved in creating & reviewing numerous programming workshops. At HQ, He works with Graham on HQ Engineering and infrastructure. Outside of Hack Club, Faisal likes working on his side-projects like Firefiles and tmdr.\",\n    \"slackId\": \"U014ND5P1N2\",\n    \"email\": \"fayd\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-78pj8q3kr-hack-club-bot.vercel.app/0image_192x192.jpg\"\n  },\n  {\n    \"name\": \"Fernanda Lozano\",\n    \"department\": \"HQ\",\n    \"role\": \"Flagship\",\n    \"acknowledged\": true,\n    \"bio\": \"Fernanda is a student of computational neuroscience, entrepreneur, & organizer of events like the Entrepreneurial Learning Academy for students in Mexico. In summer 2019, she helped organize the Flagship Summit in San Francisco.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-8lmsmaxve-hack-club-bot.vercel.app/0fernanda_1502x1502.jpg\"\n  },\n  {\n    \"name\": \"Graham Darcey\",\n    \"department\": \"HQ\",\n    \"role\": \"Creative Technologist\",\n    \"acknowledged\": true,\n    \"bio\": \"Originally from Vermont, Graham has worked as a full-stack software engineer in Silicon Valley for over twenty years, most recently at Uber where he worked on their core routing services and map data platform. He recently (2021) moved back east, and currently resides in Shelburne VT. Graham's hobbies include gaming, gamedev, cooking with his wife, and playing joyfully with his five year old daughter.\",\n    \"slackId\": \"U04QH1TTMBP\",\n    \"email\": \"graham\",\n    \"website\": \"\",\n    \"avatar\": \"https://user-cdn.hackclub-assets.com/019c76ba-6b8e-7ca8-b9d8-482296c53098/qG3dYw.jpg\"\n  },\n  {\n    \"name\": \"Harsh Bajpai\",\n    \"department\": \"HQ\",\n    \"role\": \"APAC Clubs\",\n    \"acknowledged\": true,\n    \"bio\": \"Harsh is a vegetarian musician who enjoys traveling around India. As the APAC Clubs Lead, Harsh welcomed new clubs to the community and built amazing tools for them. When he is not reading ancient mythology, he is programming with purpose and passion.\",\n    \"slackId\": \"U010XUNLX40\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-k7mwvhqu2-hack-club-bot.vercel.app/06uncbr_image_1784x1787.png\"\n  },\n  {\n    \"name\": \"Holly Delisle\",\n    \"department\": \"HQ\",\n    \"role\": \"Clubs Operations Lead\",\n    \"acknowledged\": true,\n    \"bio\": \"Holly comes to Hack Club with 10 years of operations management in the banking industry, bringing people together and simplifying processes. She's lived in Maine and Vermont in intervals all her life and loves the outdoors in every season. Now, Holly meets and works with amazing, inspiring technical teenagers every day from around the world. She's got two sons, two dogs and two cats, the latter of which are all named after characters in some of her favorite books.\",\n    \"slackId\": \"U03M1H014CX\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-oefs8iksx-hack-club-bot.vercel.app/0holly_2251x2251.jpg\"\n  },\n  {\n    \"name\": \"Hugo Hu\",\n    \"department\": \"HQ\",\n    \"role\": \"Mail Coordinator & Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"During his time at Hack Club, Hugo led Mail Team, significantly improving logistics for Hack Clubbers across the world. He also helped organize Assemble, and designed the PCBs for Sprig and Blot.\",\n    \"slackId\": \"U017EPB6LE9\",\n    \"email\": \"\",\n    \"website\": \"https://hugohu.me/\",\n    \"avatar\": \"https://cloud-pyqdstfyk-hack-club-bot.vercel.app/0uadlfjujq3nwa_image_512x512.png\"\n  },\n  {\n    \"name\": \"Ishan Goel\",\n    \"department\": \"HQ\",\n    \"role\": \"Communications Intern\",\n    \"acknowledged\": true,\n    \"bio\": \"Ishan was a summer intern from Seattle! During the summer of 2022, he worked on shipping projects with partners to get the word out about Hack Club, and bring more people into the community.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-7319opjbc-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Jasper Mayone\",\n    \"department\": \"HQ\",\n    \"role\": \"Community Resources\",\n    \"acknowledged\": true,\n    \"bio\": \"Introduced to Hack Club through the circus, and a native vermonter, Jasper is currently a Junior in high school, on track for graduating a full year early! While in high school, Jasper led a Hack Club at his school. Jasper tries to live by the quote “We’ve all got both light and dark inside us. What matters is the part we choose to act on...that’s who we really are.” from one of his favorite books, Harry Potter. Jasper’s hobbies include reading, being in the great outdoors, photography, computer programming, cooking, and running away to join the circus.\",\n    \"slackId\": \"U05NX48GL3T\",\n    \"email\": \"\",\n    \"website\": \"https://jaspermayone.com/\",\n    \"avatar\": \"https://cloud-nvaik9pny-hack-club-bot.vercel.app/0rtpwwytcahj9qaivhljjlyoopv1jslsywzhe5-eijle.png\"\n  },\n  {\n    \"name\": \"Jessica Card\",\n    \"department\": \"HQ\",\n    \"role\": \"Education Engineer\",\n    \"acknowledged\": true,\n    \"bio\": \"Jessica is a self taught programmer originally from Alaska. She worked for over a decade as a software engineer at startups like GitHub and Bugsnag in San Francisco. She then left the web development world to learn how to make video games. At Hack Club, Jessica brought her creative energy to an array of projects! Most notably, when she learnt Assembly along with Hack Clubbers to produce Some Assembly Required.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-ighwnsfg6-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Kara Massie\",\n    \"department\": \"HQ\",\n    \"role\": \"Production Lead\",\n    \"acknowledged\": true,\n    \"bio\": \"Before joining Hack Club, Kara was a lead producer at Activision, shipping Crash Bandicoot N. Sane Trilogy and Bungie's Destiny 2 expansions. She’s deeply committed to inclusivity in gaming and tech spaces, and is beyond thrilled to be part of an org with kindness at its core. She has lived in 3 countries and names her pets after vegetables.\",\n    \"slackId\": \"U032A2PMSE9\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-nsic6ge11-hack-club-bot.vercel.app/0rt3wsrbwdyn3ci_image.png\"\n  },\n  {\n    \"name\": \"Karthik Sankar\",\n    \"department\": \"HQ\",\n    \"role\": \"Club Onboarding and Program Development\",\n    \"acknowledged\": true,\n    \"bio\": \"Karthik is a 18 year old Hack Clubber from Singapore who has been actively involved in club onboarding and YSWSs for the past year. He also worked on Counterspell Globally. He can't wait to help more clubs get started and grow their communities!\",\n    \"slackId\": \"U04K5EPMZM1\",\n    \"email\": \"karthik\",\n    \"website\": \"https://karthik.lol/\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U04K5EPMZM1/r\"\n  },\n  {\n    \"name\": \"Kate Caulfield\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Kate is a Hackclubber from Manassas Virginia who loves cookies and the color yellow. Currently studying Engineering at George Mason University and Osbourn Park High School, she works mainly with logistics and running the YSWS program BakeBuild. In addition she also helps to run and win hackathons in Northern Virginia with events such as Counterspell, Scrapyard, and [REHACTED].\",\n    \"slackId\": \"U07PXU0657B\",\n    \"email\": \"katec\",\n    \"website\": \"\",\n    \"avatar\": \"https://user-cdn.hackclub-assets.com/019c76b7-299d-74e2-a4d1-2027ae9be299/DEwESA.png\"\n  },\n  {\n    \"name\": \"Lachlan Campbell\",\n    \"department\": \"HQ\",\n    \"role\": \"Storytelling\",\n    \"acknowledged\": true,\n    \"bio\": \"Lachlan joined as a club leader from State College, PA to make hackclub.com. 3 years later, as Head of Storytelling, they work on Hack Club’s website, design, frontend, open source, & communications. They’re currently on COVID leave from NYU ’23, majoring in Interactive Media Arts.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-qrbpph70b-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Leo McElroy\",\n    \"department\": \"HQ\",\n    \"role\": \"Clubs Engineering Lead\",\n    \"acknowledged\": true,\n    \"bio\": \"Leo builds digital systems, physical tools, and communities to help people express themselves and pursue their curiosity. He's created tools for democratizing personal automation (including programming languages for designing stuff), travelled the world visiting makerspaces on a Watson Fellowship, and created and ran a few makerspaces himself.\",\n    \"slackId\": \"U022FMN61SB\",\n    \"email\": \"leo\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-7omljnjsk-hack-club-bot.vercel.app/0image_192x192.png\"\n  },\n  {\n    \"name\": \"Lexi Mattick\",\n    \"department\": \"HQ\",\n    \"role\": \"Clubs Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Always driven by curiosity for how things work, Lexi fell in love with Hack Club in 2019 after joining a Hack Night call and discovering like-minded individuals. She spends her time programming, making music, and studying for her private pilot license; at Hack Club, she spends her time working on whatever fantastic project is happening in the present moment.\",\n    \"slackId\": \"UR6P49Q79\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-lxq4wuhlt-hack-club-bot.vercel.app/0bean_man_1555x1555.jpg\"\n  },\n  {\n    \"name\": \"Lucas Honda\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Lucas is a Hack Clubber from Sao Paulo, Brazil. Since joining the Hack Club, he has been fascinated by Sprig and is currently leading Sprig App Review Team, and working to make it the best it possibly can be. He is also member of Special Activities Division. He loves all aspects of aviation, and scours the internet/skies looking for and investigating flying machines. He spends a good portion of his time with his dog, a happy and playful dog.\",\n    \"slackId\": \"U040N4ESCEL\",\n    \"email\": \"lucas\",\n    \"website\": \"https://devlucas.page\",\n    \"avatar\": \"https://user-cdn.hackclub-assets.com/019c76b7-bf18-7905-bfb6-50126c71e3ff/3WGdxg.jpg\"\n  },\n  {\n    \"name\": \"Marianna Ludensky\",\n    \"department\": \"HQ\",\n    \"role\": \"Creative Lead\",\n    \"acknowledged\": true,\n    \"bio\": \"Originally from Ukraine, Marianna (Mare) Ludensky is a creative producer passionate about storytelling, immersive entertainment, education and building meaningful & fun experiences that bring joy and inspiration to its participants. Prior to Hack Club, Mare worked at MasterClass producing classes across a variety of topics and at VICE Media concepting and producing interactive experiences (e.g. an interactive fireworks show) for VICE audiences. At Hack Club, Mare produces the Days of Service initiative helping to bring computer science education via hackathons to girls across the country. Over the last decade, Mare has been on a life adventure living in NYC, California, and now the beaches of Florida. She is a mom who loves experimenting with new recipes, going on walks with a good podcast, and floating down a lazy river with friends.\",\n    \"slackId\": \"U05RQMKMU64\",\n    \"email\": \"marianna\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-737va6amm-hack-club-bot.vercel.app/0ml_portrait_2732x4096.jpg\"\n  },\n  {\n    \"name\": \"Mark Allen\",\n    \"department\": \"HQ\",\n    \"role\": \"AMA Producer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U03Q20XM953\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-h4a0j7gs5-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Matthew Stanciu\",\n    \"department\": \"HQ\",\n    \"role\": \"Clubs Lead\",\n    \"acknowledged\": true,\n    \"bio\": \"After leading a successful Hack Club in West Lafayette, Indiana, & organizing multiple hackathons with HCB, Matthew joined the team to lead the clubs program. He wrote curriculum, helped mentor club leaders around the world, & in spring 2020 drove across the U.S. to visit clubs.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-9dzypnhsx-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Micha Albert\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Born and raised in Northern Virginia, Micha enjoys \\\"what ifs\\\", crazy ideas, amateur radio operation, whispering lullabies to crusty gaming laptops, and breaking things just so she can put them back together. She loves PCB design and previously served on the OnBoard review team, along with running the OnBoard Live YSWS. Micha enjoys Svelte, Typescript, FastAPI, and Python, and is always working on a new way to engage high school students in computer science!\",\n    \"slackId\": \"U05C64XMMHV\",\n    \"email\": \"micha\",\n    \"website\": \"https://mra.sh\",\n    \"avatar\": \"https://cdn.hackclub.com/019c76bf-b916-70de-b6e7-2150d046613d/daoshd.png\"\n  },\n  {\n    \"name\": \"Nick Do\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Nick is a Viet-American artist who occasionally dabbles in programming and hardware. Currently an intern, it has previously contributed art for Counterspell, High Seas, and Highway/Undercity. It especially loves the games Mirror's Edge and Portal 2.\",\n    \"slackId\": \"U06FMCCDS1K\",\n    \"email\": \"nick\",\n    \"website\": \"https://bunnyguy.foo/\",\n    \"avatar\": \"https://user-cdn.hackclub-assets.com/019c76b5-a6a4-7184-afb0-355cc2309331/YypVbA.png\"\n  },\n  {\n    \"name\": \"Nila Palmo Ram\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering Assistant\",\n    \"acknowledged\": true,\n    \"bio\": \"Nila absolutely loves coding and is all about making tech awesome while experimenting on how to keep it ethical and humanistic. Over at Hack Club, she's on a mission to empower more girl Hack Clubbers by guiding them in organizing Hackathons, collaborating on special projects, and fostering connections amongst them. Alongside Christina, she's also busy drumming up funds for Hack Club, always on the lookout for new donors. When she's not in front of the screen, you'll find her out by the water, diving into all sorts of aquatic adventures.\",\n    \"slackId\": \"U01FAVARYH1\",\n    \"email\": \"nila\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-q3qyt9qjl-hack-club-bot.vercel.app/0nila_4176x2784.png\"\n  },\n  {\n    \"name\": \"Phoebe\",\n    \"department\": \"HQ\",\n    \"role\": \"Communications & Partnership\",\n    \"acknowledged\": true,\n    \"bio\": \"Phoebe is a Franco-American netizen with a passion for art, hacking and music. After going to the forward-thinking Paris 8 University - and working as a software engineer - she joined Hack Club to help with communications and partnerships!\",\n    \"slackId\": \"U08B2HD1JNA\",\n    \"email\": \"phoebe\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U08B2HD1JNA/r\"\n  },\n  {\n    \"name\": \"Rishi Kothari\",\n    \"department\": \"HQ\",\n    \"role\": \"Summer Intern\",\n    \"acknowledged\": true,\n    \"bio\": \"Rishi is a high school senior that's super interested in open-source development, startups, React, and everything in between! He is primarily a JS/TS dev, but has worked with Rust 🔥, C++ 💖, Haskell ⚡️, and Swift 🏎 in the past. He is the president of TFSS' Hack Club and a workshop coordinator at TurnerHacks, among other things.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-du0sm2210-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Sahiti Dasari\",\n    \"department\": \"HQ\",\n    \"role\": \"Prev. Clubs Operations\",\n    \"acknowledged\": true,\n    \"bio\": \"Sahiti's Hack Club journey kicked off when she stumbled upon resources to start her own high school coding club, which later led to her running a county-wide hackathon. These days, she's an active member of the Clubs Operations & Engineering team and has previously interned with Hack Club for philanthropy & communications. She strives to create technology tools and resources for clubs, such as the Hack Club Jams initiative and Club Leader onboarding. Beyond programming, Sahiti loves all things finance, business, and literature. Her mission is to make an impact by spreading opportunities.\\n\\n... .... . .----. ... / .- .-.. ... --- / ..-. .-.. ..- . -. - / .. -. / -- --- .-. ... . / -.-. --- -.. . -.-.--\",\n    \"slackId\": \"U03RU99SGKA\",\n    \"email\": \"sahiti\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-m9lcvt46z-hack-club-bot.vercel.app/0qlinq_image_2387x2387.png\"\n  },\n  {\n    \"name\": \"Shawn Malluwa-Wadu\",\n    \"department\": \"HQ\",\n    \"role\": \"Community Engineer\",\n    \"acknowledged\": true,\n    \"bio\": \"Shawn Malluwa is a Hack clubber from Maryland who joined in 2022 around the launch of Sprig and was heavily involved in refining hardware designs for various HQ projects! During his tenure, he was also the face and voice of a bunch of our social media videos, and works to share the process of making with the world. In his free time, Shawn loves to create Art across various mediums, particularly comics and animation.\",\n    \"slackId\": \"U04BBP8H9FA\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-awlbzhncm-hack-club-bot.vercel.app/0image_1024x1024.png\"\n  },\n  {\n    \"name\": \"Shubham Panth\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Shubham, a self-taught coder hailing from the serene landscapes of Sweden, has been navigating the complexities of C# and Unity3D since 2017. Initially harnessing the power of HCB to propel his own dreams as a developer, he has since shifted his focus towards empowering others. Now part of the dynamic team at HQ Engineering, Shubham dedicates his talents to contributing to open source projects and crafting tools designed to introduce programming to kids and teens. His goal is to ensure that every young aspiring coder finds their journey through the realms of technology as smooth and invigorating as his own adventures in coding.\",\n    \"slackId\": \"U014E8132DB\",\n    \"email\": \"shubham\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U014E8132DB/r\"\n  },\n  {\n    \"name\": \"Tina Soriano\",\n    \"department\": \"HQ\",\n    \"role\": \"Exec. Assistant\",\n    \"acknowledged\": true,\n    \"bio\": \"Philippine bred and settled with family in the U.S., Tina shifted her career from marketing and film production to teaching kids in the Clark County School District. At Hack Club, she helped thousands of high school students hack their way to a fabulous future.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-ahcfkt4p9-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Toby Brown\",\n    \"department\": \"HQ\",\n    \"role\": \"Storytelling\",\n    \"acknowledged\": true,\n    \"bio\": \"From a young age, Toby had a fascination with anything electronic. As a toddler, he would show far more interest in the 20-year-old air conditioning unit in the corner of the room than in anyone trying to talk to him. This fascination eventually led him to coding; and at the age of 6, Toby built his first website. While most sane people would probably describe this website as \\\"atrocious\\\", 6-year-old Toby was completely hooked. Nowadays, Toby does Storytelling at Hack Club, and is a self-proclaimed pizza eating expert.\",\n    \"slackId\": \"U02C9DQ7ZL2\",\n    \"email\": \"tobybrown\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-n30u1igiy-hack-club-bot.vercel.app/0xrmjc8ava1vfcqz9q_icon_192x192.png\"\n  },\n  {\n    \"name\": \"Woody Keppel\",\n    \"department\": \"HQ\",\n    \"role\": \"Event Alchemist\",\n    \"acknowledged\": true,\n    \"bio\": \"Woody is a film actor, musician, comedian, band leader, event producer, and convener of fun. He founded Vermont’s Festival of Fools, The Feast of Fools, The Hawaiian Vaudeville Festival, and the artist retreat & concert venue known as Mt. Foolery. For Woody, “putting on events has always been one of my great pleasures. I’ve also had the privilege of sharing my time with the elderly as well as mentoring middle & high schools students in Vermont. Being part of the Hack Club community has opened my eyes & heart to so much that is possible. It’s a great adventure we’re all on, and we’re here to light the way for each other. Shine on!”\",\n    \"slackId\": \"U02E5FBDS1H\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-eq4w6jfry-hack-club-bot.vercel.app/0woody_560x560.png\"\n  },\n  {\n    \"name\": \"Zach Fogg\",\n    \"department\": \"HQ\",\n    \"role\": \"Community Game Designer\",\n    \"acknowledged\": true,\n    \"bio\": \"At college, Zach Fogg started Bitcamp, one of the largest & longest-running annual college hackathons. He then went on to work as a software engineer in SF and mentor many more student hackathons. Zach joined the team at HQ in early 2021, he went on to bring his energy to the community and hack on countless creative projects (such as the Zephyrnet, which he then maintained as it traveled across the US).\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-a38wipt5m-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Zenab\",\n    \"department\": \"HQ\",\n    \"role\": \"Creative Events Manager\",\n    \"acknowledged\": true,\n    \"bio\": \"Zenab works as a Creative Events Manager for the Days of Service program, helping non-binary youth and young girls write their first lines of code.\",\n    \"slackId\": \"U079FFTKM37\",\n    \"email\": \"zenab\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U079FFTKM37/r\"\n  },\n  {\n    \"name\": \"Zeyu (Peter) Yao\",\n    \"department\": \"HQ\",\n    \"role\": \"Club Operations\",\n    \"acknowledged\": true,\n    \"bio\": \"Peter is a 17-year-old Hack Clubber from Singapore. He founded the SAIS Hack Club, grew it to 40+ members, and made it one of the most sustained student-led tech clubs at his school. He was then invited by HQ to speak at the inaugural Hack Club Leaders' Summit in San Francisco, where he mentored peers and led a panel on diversity and inclusion. Beyond Hack Club, he organized BuildingBloCS, Singapore's largest AI-themed student conference, and spoke at Geekcamp Singapore, where he advocates for rethinking computer science education to empower students as creators. Today, Peter mentors new leaders, supports global club operations, and coordinates the launch of Hack Clubs across the Asia-Pacific region while facilitating local workshops and hackathons.\",\n    \"slackId\": \"U03DDMP76GL\",\n    \"email\": \"\",\n    \"website\": \"https://cytronicoder.com\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U03DDMP76GL/r\"\n  },\n  {\n    \"name\": \"Aram\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U0616280E6P\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0616280E6P/r\"\n  },\n  {\n    \"name\": \"Elliot\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": true,\n    \"bio\": \"Elliot is a 15 year old Hack Clubber from Vermont, USA. He is a passionate coder and has made several esoteric languages. Elliot is currently a member of the Hack Club moderation team and helps out in the community a lot.\",\n    \"slackId\": \"U041DAECHHA\",\n    \"email\": \"\",\n    \"website\": \"https://elliot.hackclub.app/\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U041DAECHHA/r\"\n  },\n  {\n    \"name\": \"Kestrel\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": true,\n    \"bio\": \"Kestrel is an 18 year old Hack Clubber from the US. Throughout their time at Hack Club they've ran a You Ship We Ship program focusing on size limitations, helped countless people and have contributed to the moderation team.\",\n    \"slackId\": \"U07346379NY\",\n    \"email\": \"\",\n    \"website\": \"https://commonkestrel.github.io\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U07346379NY/r\"\n  },\n  {\n    \"name\": \"Miguel\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U07VC9705D4\",\n    \"email\": \"\",\n    \"website\": \"https://shymike.dev\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U07VC9705D4/r\"\n  },\n  {\n    \"name\": \"Saran Wagner\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": true,\n    \"bio\": \"Saran is a current high schooler who comes from the land of corn (the Midwest) in the United States who loves anything technology and engineering. At Hack Club, she is responsible of handling Slack moderation and being a welcoming figure to all in the community. In her free time, Saran can be found hacking up one of her projects, hanging out with others, and listening to copious and unhealthy amounts of music.\",\n    \"slackId\": \"U060YRK2734\",\n    \"email\": \"saran\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U060YRK2734/r\"\n  },\n  {\n    \"name\": \"Sean Outram\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": true,\n    \"bio\": \"Sean is a hackclubber hailing from the UK, they started by helping with HCB's operations, however more recently, they've started helping to moderate the Slack. They have also taken part in programs like HCB mentorship and helped with Arcade prize fulfillment and still help with ID verifications.\",\n    \"slackId\": \"U04FATFRE6T\",\n    \"email\": \"sean\",\n    \"website\": \"https://sean.cyou\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U04FATFRE6T/r\"\n  },\n  {\n    \"name\": \"Ruby\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": true,\n    \"bio\": \"Ruby is a Hack Clubber from Canada who welcomes people into the Slack and helps them settle in. She also worked on organising Scrapyard, a global hackathon and is an ultimate vibes engineer, as she likes to say. In her free time, she loves creating amazing artwork too!\",\n    \"slackId\": \"U0779CJQLM8\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0779CJQLM8/r\"\n  },\n  {\n    \"name\": \"Annlee Fores\",\n    \"department\": \"HQ\",\n    \"role\": \"APAC Operations\",\n    \"acknowledged\": true,\n    \"bio\": \"As the COO of Hack Club APAC, Annlee oversaw operations and handled event organisation & logistics at Hack Club APAC. When not busy juggling different tasks he takes up, he enjoys tinkering & building fun projects.\"\n  },\n  {\n    \"name\": \"Arav Narula\",\n    \"department\": \"HQ\",\n    \"role\": \"Community Operations & Engineering\",\n    \"acknowledged\": true,\n    \"bio\": \"Arav is a high schooler from Toronto (kinda) who loves everything in the intersection of social science, art, and programming. They're also a really big public transit fan, and you can often find them taking the bus to places. Over the last couple of months, Arav has led and helped run the moderation dept, and built custom tools for moderation. This summer, they interned at Hack Club helping run community logtics, and contuining to lead the moderation dept for Hack Club Arcade, running events in the process. They're a senior right now drowning in homework\",\n    \"slackId\": \"\",\n    \"email\": \"arav\",\n    \"website\": \"https://radioblahaj.com\",\n    \"avatar\": \"https://cloud-3c7rt7s1k-hack-club-bot.vercel.app/0image_512x512__1_.png\"\n  },\n  {\n    \"name\": \"Ethan Canterbury\",\n    \"department\": \"HQ\",\n    \"role\": \"Club Engineering and Operations\",\n    \"acknowledged\": true,\n    \"bio\": \"Ethan is a Hack Clubber from New Jersey who LOVES python and... cats... He's on the club operations team and does engineering as well as help with many other projects! He has a vast experiance in Python, Web dev & sysadmin.\",\n    \"slackId\": \"U08BH57AZKP\",\n    \"email\": \"ethan\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U08BH57AZKP/r\"\n  },\n  {\n    \"name\": \"Thomas Stubblefield\",\n    \"acknowledged\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Capability Changing Events Lead\",\n    \"bio\": \"Thomas is a Hack Clubber from South Carolina who led a Hack Club at his high school and is now building software to make the experience of being a part of and leading a club better. He currently leads the clubs program. He loves to build side projects, make tea, and hike. Thomas lives his life by three sayings: time will tell, in life we are always learning, and bum bum bummm (a friendly melody he hums daily).\",\n    \"slackId\": \"U041FQB8VK2\",\n    \"email\": \"thomas\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/dJkVwt7m/2026-01-27-0od-Kleki.jpg\"\n  },\n  {\n    \"name\": \"Arnav\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U078XLAFNMQ\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U078XLAFNMQ/r\"\n  },\n  {\n    \"name\": \"Michelle Wang\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U06D7NTBDCY\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06D7NTBDCY/r\"\n  },\n  {\n    \"name\": \"Eny\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U078VGCHXSP\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U078VGCHXSP/r\"\n  },\n  {\n    \"name\": \"Marios Mitsios\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U04FMKCVASJ\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U04FMKCVASJ/r\"\n  },\n  {\n    \"name\": \"Mudacumura Brunoblaise\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U03T4CQ01RR\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U03T4CQ01RR/r\"\n  },\n  {\n    \"name\": \"Rana\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U06TBP41C3E\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06TBP41C3E/r\"\n  }\n]\n"
  },
  {
    "path": "public/bin/data-loading.js",
    "content": "let partsDataCache = {}\n\nasync function pullFromStorage() {\n  const ts = parseInt(localStorage.getItem('partsDataTimestamp'))\n  if (!ts) {\n    console.log('No timestamp found in storage')\n    return null\n  }\n  const now = new Date().getTime()\n  const expiration = 1000 * 60 * 5 // 5 min\n\n  if (ts && now - ts < expiration) {\n    return JSON.parse(localStorage.getItem('partsData'))\n  } else {\n    console.log('Parts data in storage is expired')\n    return null\n  }\n}\n\nasync function setToStorage(data) {\n  localStorage.setItem('partsData', JSON.stringify(data))\n  localStorage.setItem('partsDataTimestamp', new Date().getTime())\n}\n\nasync function fetchPartsData() {\n  const response = await fetch('https://hackclub.com/api/bin/wokwi/parts/')\n  if (!response.ok) {\n    throw new Error('Network response was not ok.')\n  }\n  data = await response.json()\n\n  data = removeItemByAttribute(data, 'type', 'Microprocessor')\n  return data\n}\nfunction removeItemByAttribute(arr, attr, value) {\n  return arr.filter(item => item[attr] !== value)\n}\n\nasync function partsDataLoader() {\n  if (Object.keys(partsDataCache).length > 0) {\n    console.log('Found parts data in cache')\n    return partsDataCache\n  }\n  const storage = await pullFromStorage()\n  if (storage) {\n    console.log('Found parts data in storage')\n    return storage\n  }\n  const data = await fetchPartsData()\n  if (data) {\n    console.log('Found parts data in fetch')\n    setToStorage(data)\n    partsDataCache = data\n    return data\n  }\n}\n\nlet partsDataJob = null\nasync function partsData() {\n  if (!partsDataJob) {\n    partsDataJob = partsDataLoader()\n  }\n  return await partsDataJob\n}\n\n// start loading data as soon as this file loads\npartsData()\n"
  },
  {
    "path": "public/bin/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>The Bin</title>\n    <link rel=\"stylesheet\" href=\"./style/common.css\" />\n    <link rel=\"stylesheet\" href=\"./landing-new/style.css\" />\n    <link rel=\"stylesheet\" href=\"./style/footer.css\" />\n    <link\n      rel=\"icon\"\n      type=\"image/png\"\n      sizes=\"32x32\"\n      href=\"https://assets.hackclub.com/favicons/favicon-32x32.png\"\n    />\n    <link\n      rel=\"icon\"\n      type=\"image/png\"\n      sizes=\"16x16\"\n      href=\"https://assets.hackclub.com/favicons/favicon-16x16.png\"\n    />\n    <script src=\"https://awdev.codes/utils/smoothScroll.js\"></script>\n    <script src=\"https://awdev.codes/utils/hackclub/orph.js\"></script>\n    <script\n      src=\"https://cdnjs.cloudflare.com/ajax/libs/howler/2.2.4/howler.core.min.js\"\n      integrity=\"sha512-d00Brs/+XQUUaO0Y9Uo8Vw63o7kS6ZcLM2P++17kALrI8oihAfL4pl1jQObeRBgv06j7xG0GHOhudAW0BdrycA==\"\n      crossorigin=\"anonymous\"\n      referrerpolicy=\"no-referrer\"\n    ></script>\n    <script src=\"./landing-new/script.js\"></script>\n    <script src=\"./data-loading.js\"></script>\n    <script\n      defer\n      data-domain=\"hackclub.com\"\n      src=\"https://plausible.io/js/script.js\"\n    ></script>\n    <script>\n      window['_fs_host'] = 'fullstory.com'\n      window['_fs_script'] = 'edge.fullstory.com/s/fs.js'\n      window['_fs_org'] = 'ARN0J'\n      window['_fs_namespace'] = 'FS'\n      !(function (m, n, e, t, l, o, g, y) {\n        var s,\n          f,\n          a = (function (h) {\n            return (\n              !(h in m) ||\n              (m.console &&\n                m.console.log &&\n                m.console.log(\n                  'FullStory namespace conflict. Please set window[\"_fs_namespace\"].'\n                ),\n              !1)\n            )\n          })(e)\n        function p(b) {\n          var h,\n            d = []\n          function j() {\n            h &&\n              (d.forEach(function (b) {\n                var d\n                try {\n                  d = b[h[0]] && b[h[0]](h[1])\n                } catch (h) {\n                  return void (b[3] && b[3](h))\n                }\n                d && d.then ? d.then(b[2], b[3]) : b[2] && b[2](d)\n              }),\n              (d.length = 0))\n          }\n          function r(b) {\n            return function (d) {\n              h || ((h = [b, d]), j())\n            }\n          }\n          return (\n            b(r(0), r(1)),\n            {\n              then: function (b, h) {\n                return p(function (r, i) {\n                  ;(d.push([b, h, r, i]), j())\n                })\n              }\n            }\n          )\n        }\n        a &&\n          ((g = m[e] =\n            (function () {\n              var b = function (b, d, j, r) {\n                function i(i, c) {\n                  h(b, d, j, i, c, r)\n                }\n                r = r || 2\n                var c,\n                  u = /Async$/\n                return u.test(b)\n                  ? ((b = b.replace(u, '')),\n                    'function' == typeof Promise ? new Promise(i) : p(i))\n                  : h(b, d, j, c, c, r)\n              }\n              function h(h, d, j, r, i, c) {\n                return b._api\n                  ? b._api(h, d, j, r, i, c)\n                  : (b.q && b.q.push([h, d, j, r, i, c]), null)\n              }\n              return ((b.q = []), b)\n            })()),\n          (y = function (b) {\n            function h(h) {\n              'function' == typeof h[4] && h[4](new Error(b))\n            }\n            var d = g.q\n            if (d) {\n              for (var j = 0; j < d.length; j++) h(d[j])\n              ;((d.length = 0), (d.push = h))\n            }\n          }),\n          (function () {\n            ;(((o = n.createElement(t)).async = !0),\n              (o.crossOrigin = 'anonymous'),\n              (o.src = 'https://' + l),\n              (o.onerror = function () {\n                y('Error loading ' + l)\n              }))\n            var b = n.getElementsByTagName(t)[0]\n            b && b.parentNode\n              ? b.parentNode.insertBefore(o, b)\n              : n.head.appendChild(o)\n          })(),\n          (function () {\n            function b() {}\n            function h(b, h, d) {\n              g(b, h, d, 1)\n            }\n            function d(b, d, j) {\n              h('setProperties', { type: b, properties: d }, j)\n            }\n            function j(b, h) {\n              d('user', b, h)\n            }\n            function r(b, h, d) {\n              ;(j(\n                {\n                  uid: b\n                },\n                d\n              ),\n                h && j(h, d))\n            }\n            ;((g.identify = r),\n              (g.setUserVars = j),\n              (g.identifyAccount = b),\n              (g.clearUserCookie = b),\n              (g.setVars = d),\n              (g.event = function (b, d, j) {\n                h(\n                  'trackEvent',\n                  {\n                    name: b,\n                    properties: d\n                  },\n                  j\n                )\n              }),\n              (g.anonymize = function () {\n                r(!1)\n              }),\n              (g.shutdown = function () {\n                h('shutdown')\n              }),\n              (g.restart = function () {\n                h('restart')\n              }),\n              (g.log = function (b, d) {\n                h('log', { level: b, msg: d })\n              }),\n              (g.consent = function (b) {\n                h('setIdentity', { consent: !arguments.length || b })\n              }))\n          })(),\n          (s = 'fetch'),\n          (f = 'XMLHttpRequest'),\n          (g._w = {}),\n          (g._w[f] = m[f]),\n          (g._w[s] = m[s]),\n          m[s] &&\n            (m[s] = function () {\n              return g._w[s].apply(this, arguments)\n            }),\n          (g._v = '2.0.0'))\n      })(window, document, window._fs_namespace, 'script', window._fs_script)\n    </script>\n  </head>\n\n  <body>\n    <img src=\"https://awdev.codes/images/ww.gif\" style=\"display: none\" />\n    <section class=\"landing-section section\">\n      <div class=\"landing-header\">\n        <img src=\"./icons/icon.svg\" class=\"landing-logo\" />\n        <img src=\"./icons/recycled.png\" class=\"recycled\" />\n        <span class=\"landing-tagline landing-tagline-top\"\n          >The beginner hardware kit designed just for you</span\n        >\n        <span class=\"landing-tagline\">Free for high schoolers</span>\n        <img src=\"./parts/pico.png\" class=\"landing-main-image\" />\n      </div>\n      <a\n        class=\"floaty\"\n        style=\"top: 20%; left: 7%\"\n        href=\"https://wokwi.com/projects/398014537125976065\"\n        target=\"_blank\"\n      >\n        <img\n          src=\"https://cloud-ofybe0euz-hack-club-bot.vercel.app/00oky3527-max7219-dot-matrix-module-single-3.png\"\n        />\n      </a>\n      <a\n        class=\"floaty\"\n        style=\"top: 80%; left: 20%; animation-delay: -2500ms\"\n        href=\"https://wokwi.com/projects/346178932556431954\"\n        target=\"_blank\"\n      >\n        <img\n          src=\"https://cloud-6hdo013ly-hack-club-bot.vercel.app/0buzzer.png\"\n        />\n      </a>\n      <a\n        class=\"floaty\"\n        style=\"top: 80%; right: 10%; animation-delay: -1000ms\"\n        href=\"https://wokwi.com/projects/383628008466438145\"\n        target=\"_blank\"\n      >\n        <img src=\"./parts/humidity.png\" />\n      </a>\n      <a\n        class=\"floaty\"\n        style=\"top: 30%; right: 5%; animation-delay: -1500ms\"\n        href=\"https://wokwi.com/projects/390119173913012225\"\n        target=\"_blank\"\n      >\n        <img src=\"./parts/led.png\" />\n      </a>\n      <div class=\"scroll-prompt\" onclick=\"smoothScroll('.timeline')\">\n        <img src=\"./icons/scrolldown.svg\" />\n      </div>\n\n      <a\n        href=\"\"\n        id=\"meme\"\n        target=\"_blank\"\n        class=\"huh floaty hoverable\"\n        style=\"animation-delay: -3000ms\"\n      >\n        <img src=\"./images/idea.png\" width=\"100%\" />\n      </a>\n    </section>\n    <section class=\"section container timeline\" style=\"max-width: 71em\">\n      <!-- timeline of project -->\n      <h1 class=\"timeline-header\">What will you make</h1>\n      <h2 class=\"timeline-subheader\">this summer?</h2>\n      <div class=\"timeline-list\">\n        <div\n          class=\"timeline-item hoverable greenbutton\"\n          onclick=\"smoothScroll('.gambling-section')\"\n          style=\"cursor: pointer\"\n        >\n          <div class=\"timeline-info\">\n            <em class=\"muted\">Right now...</em>\n            <h2>Rummage for parts</h2>\n            <p>\n              Dig up some parts from our part picker or choose your own! Don't\n              have an idea yet? Ask the raccoon for some inspiration!\n            </p>\n          </div>\n        </div>\n        <div class=\"timeline-item hoverable bluebutton\">\n          <div class=\"timeline-info\">\n            <em class=\"muted\">over 3-4 days...</em>\n            <h2>Design your project</h2>\n            <p>\n              Build a project in the online editor and program it! Get support\n              from\n              <a href=\"https://slack.hackclub.com\" target=\"_blank\"\n                >other high schoolers in an online community</a\n              >.\n            </p>\n          </div>\n        </div>\n        <div class=\"timeline-item hoverable redbutton\">\n          <div class=\"timeline-info\">\n            <em class=\"muted\">in 1 week...</em>\n            <h2>Get it IRL</h2>\n            <p>\n              <a href=\"https://hack.club/bin-submit\" target=\"_blank\"\n                >Submit your design</a\n              >\n              and it will get reviewed.\n            </p>\n          </div>\n        </div>\n        <div class=\"timeline-item hoverable purplebutton\">\n          <div class=\"timeline-info\">\n            <em class=\"muted\">...Finally</em>\n            <h2>View on Gallery</h2>\n            <p>\n              <a href=\"./gallery\">See your design on the gallery</a> of projects\n              so other high schoolers can learn from your project.\n            </p>\n          </div>\n        </div>\n      </div>\n    </section>\n    <section class=\"gambling-section section container\">\n      <div class=\"gambling-header\">\n        <div class=\"gambling-header-text\">\n          <h1 class=\"gambling-title\">Rummage!</h1>\n          <h2 class=\"gambling-subheader\">Let's get those parts!</h2>\n        </div>\n        <img\n          src=\"./landing-new/rummaging.png\"\n          class=\"gambling-header-rummage\"\n        />\n      </div>\n      <button\n        onclick=\"rollParts(this)\"\n        class=\"gambling-roll hoverable disabled redbutton\"\n      >\n        Roll!\n      </button>\n      <div class=\"gambling-ui\">\n        <div class=\"gambling-spinner\">\n          <div class=\"gambling-item-wrapper\">\n            <img class=\"gambling-placeholder\" src=\"./landing-new/qmark.svg\" />\n          </div>\n        </div>\n        <div class=\"spinner-separator\">+</div>\n        <div class=\"gambling-spinner\">\n          <div class=\"gambling-item-wrapper\">\n            <img class=\"gambling-placeholder\" src=\"./landing-new/qmark.svg\" />\n          </div>\n        </div>\n        <div class=\"spinner-separator\">+</div>\n        <div class=\"gambling-spinner\">\n          <div class=\"gambling-item-wrapper\">\n            <img class=\"gambling-placeholder\" src=\"./landing-new/qmark.svg\" />\n          </div>\n        </div>\n      </div>\n      <div class=\"gambling-controls\">\n        <span class=\"flex-lb\"></span>\n        <!-- <button onclick=\"location.href='./selector/'\" class=\"gambling-select hoverable bluebutton\">Manual\n                Selection</button>\n            <button onclick=\"generateBuildLink(this)\" class=\"gambling-build hoverable disabled greenbutton\">Continue<img\n                    src=\"./icons/arrow.svg\"></button> -->\n      </div>\n    </section>\n    <section class=\"project-idea-section section container\">\n      <div class=\"project-idea-container\">\n        <h1 class=\"project-idea-title\">What are you waiting for?</h1>\n        <div class=\"hidden\" style=\"text-align: center\">\n          <h3>Get started or click the raccoon for project ideas!</h3>\n          <p>\n            <em\n              >(It doesn't know much about electronics, but it'll try its\n              best.)</em\n            >\n          </p>\n          <div style=\"justify-content: center; display: grid\">\n            <p id=\"project-idea\" class=\"thought\">🗑️</p>\n            <img\n              src=\"./images/idea.png\"\n              class=\"hoverable\"\n              style=\"\n                margin: 0 auto;\n                display: inline;\n                max-width: 10em;\n                height: auto;\n              \"\n              id=\"generate-project-idea\"\n              onclick=\"generateProjectIdea()\"\n            />\n          </div>\n        </div>\n        <div class=\"cta-container\">\n          <button\n            onclick=\"location.href = './selector/'\"\n            class=\"gambling-select hoverable bluebutton\"\n          >\n            Manual Selection\n          </button>\n          <button\n            onclick=\"generateBuildLink(this)\"\n            class=\"gambling-build hoverable greenbutton disabled\"\n            style=\"margin-top: 1em; margin-bottom: 1em\"\n          >\n            Open the editor\n            <img src=\"./icons/arrow_white.svg\" />\n          </button>\n        </div>\n        <div class=\"blur-box\">\n          <h1 class=\"title\">Check out other projects on the</h1>\n          <button\n            onclick=\"location.href = './gallery/'\"\n            class=\"gambling-select hoverable purplebutton\"\n          >\n            Gallery\n          </button>\n        </div>\n\n        <!-- <div class=\"project-idea-images\">\n                <img src=\"./parts/humidity.png\">\n                <img src=\"./parts/humidity.png\">\n                <img src=\"./parts/humidity.png\">\n            </div>\n            <h1>Need an idea?<br>Tap the raccoon!</h1>\n            <p><em>(It doesn't know much about electronics, but it'll try its best.)</em></p>\n            <div style=\"display: flex;\">\n                <div>\n                    <img src=\"./images/idea.png\" class=\"hoverable\"\n                        style=\"margin: 0 auto; display: inline; max-width: 10em; height: auto;\"\n                        id=\"generate-project-idea\" onclick=\"generateProjectIdea()\">\n                </div>\n                <p id=\"project-idea\" class=\"thought\">🗑️</p>\n            </div>\n            <textarea id=\"project-name\" placeholder=\"I'm going to build a...\"></textarea>\n            <button id=\"project-idea-build\" class=\"hoverable\">\n                Let's build!\n                <img src=\"./icons/arrow.svg\">\n            </button> -->\n      </div>\n    </section>\n    <section class=\"faq-section section container\">\n      <h1>Any questions?</h1>\n      <div class=\"faq-grid\">\n        <div class=\"faq-item\">\n          <h1>How many projects can I build?</h1>\n          <p>\n            You can submit\n            <a\n              href=\"https://cloud-mymt66p99-hack-club-bot.vercel.app/5screenshot_2024-05-16_at_00.17.34.png\"\n              >as many projects as you make</a\n            >\n            with it.\n          </p>\n        </div>\n        <div class=\"faq-item\">\n          <h1>Does The Bin have international shipping?</h1>\n          <p>\n            Yes! Bin now supports international shipping, as long as you pay\n            import fees\n          </p>\n        </div>\n        <div class=\"faq-item\">\n          <h1>Who is eligible?</h1>\n          <p>Anyone!! As long as you're a high schooler (or younger)</p>\n        </div>\n        <div class=\"faq-item\">\n          <h1>When is bin open until?</h1>\n          <p>Bin will be open and fulfilling orders until September 30th</p>\n        </div>\n        <div class=\"faq-item\">\n          <h1>I need help!</h1>\n          <p>\n            Get it in the #electronics channel of the\n            <a href=\"https://slack.hackclub.com\">Hack&nbsp;Club&nbsp;Slack</a>.\n          </p>\n        </div>\n        <div class=\"faq-item\">\n          <h1>What designs are allowed?</h1>\n          <p>\n            Check out the <a href=\"/bin/selector\">list of eligible parts</a>!\n            Each design can have up to 8 modules, and need at least 1 module.\n          </p>\n        </div>\n      </div>\n    </section>\n    <footer>\n      <div class=\"footer-wrapper\">\n        <div class=\"footer-information\">\n          <p class=\"footer-information-header\">\n            A project by\n            <a href=\"https://hackclub.com\">Hack Club</a>. Always\n            <a href=\"https://github.com/hackclub/site\">open source</a>.\n          </p>\n          <p>\n            <a href=\"https://hackclub.com/bin/prelaunch\">Prelaunch site</a>\n            Thank you:\n            <a href=\"https://awdev.codes\" target=\"_blank\">Aaron Wong</a>,\n            <a href=\"https://github.com/kvnyng\" target=\"_blank\">Kevin Yang</a>,\n            <a href=\"https://github.com/cjdenio\" target=\"_blank\">Caleb Denio</a\n            >, <a href=\"https://github.com/24c02\" target=\"_blank\">Nora</a>,\n            <a href=\"https://maxwofford.com\" target=\"_blank\">Max Wofford</a>, &\n            <a href=\"https://github.com/claynicholson\" target=\"_blank\"\n              >Clay Nicholson</a\n            >\n          </p>\n          <p>\n            Hack Club is a registered 501(c)3 nonprofit organization that\n            supports a network of 20k+ technical high schoolers. We believe you\n            learn best by building so we're removing barriers to hardware access\n            so any teenager can explore. In the past few years, we\n            <a href=\"https://onboard.hackclub.com\" target=\"_blank\">\n              fabricated custom PCBs designed by\n              <span>253</span> teenagers </a\n            >,\n            <a\n              href=\"https://github.com/hackclub/the-hacker-zephyr\"\n              target=\"_blank\"\n            >\n              hosted the world's longest hackathon on land </a\n            >, and\n            <a href=\"https://hackclub.com/winter\" target=\"_blank\"\n              >gave away $75k of hardware</a\n            >.\n          </p>\n        </div>\n        <article class=\"footer-links\">\n          <div class=\"footer-links-column\">\n            <h2>Hack&nbsp;Club</h2>\n            <a href=\"https://hackclub.com/philosophy/\">Philosophy</a>\n            <a href=\"https://hackclub.com/team/\">Our Team &amp; Board</a>\n            <a href=\"https://hackclub.com/jobs/\">Jobs</a>\n            <a href=\"https://hackclub.com/brand/\">Branding</a>\n            <a href=\"https://hackclub.com/press/\">Press Inquiries</a>\n            <a href=\"https://hackclub.com/philanthropy/\">Donate</a>\n          </div>\n          <div class=\"footer-links-column\">\n            <h2>Resources</h2>\n            <a href=\"https://hackclub.com/pizza\">Clubs Pizza Grant</a>\n            <a href=\"https://events.hackclub.com/\">Community Events</a>\n            <a href=\"https://jams.hackclub.com/\">Jams</a>\n            <a href=\"https://toolbox.hackclub.com/\">Toolbox</a>\n            <a href=\"https://directory.hackclub.com/\">Clubs Directory</a>\n            <a href=\"https://hackclub.com/conduct/\">Code of Conduct</a>\n          </div>\n          <div class=\"footer-links-column\">\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              width=\"128\"\n              height=\"45\"\n              fill=\"#8492A6\"\n              viewBox=\"0 0 256 90\"\n              aria-label=\"Hack Club logo\"\n            >\n              <path\n                d=\"M75.156 38.08l6.475 1.105s1.798-11.402-.224-10.199l-6.251 9.094zM204.85 34.495l2.161 5.06s5.237-2.106 4.619-4.915c-.537-2.442-3.098-1.496-5.641-.557h-.001c-.382.142-.764.282-1.138.412zM207.752 43.455s1.483 6.212 1.421 5.93c-.007-.093.397-.247 1.002-.477 2.014-.766 6.257-2.379 4.999-5.453-1.636-3.997-7.422 0-7.422 0z\"\n              ></path>\n              <path\n                fill-rule=\"evenodd\"\n                d=\"M7.205 89.303c-.022-2.227-.161-16.553 3.072-32.54 15.846-2.401 28.778.144 54.94 7.37 5.142 1.42 10.135 2.927 15.139 4.437 21.52 6.494 43.238 13.047 77.819 13.047 39.513 0 89.839-46.125 96.97-52.854.321-.303.07-.804-.37-.798a895.798 895.798 0 01-22.817-.006.484.484 0 01-.422-.707L241.991 6.9c.186-.36-.392-.91-.737-.696-10.403 6.44-68.291 38.655-125.701 11.127C62.987-7.874 36.693.801 29.405 4.381c.206-.647.195-1.355-.559-1.45-.953-.121-1.458.46-1.458.46-.955.738-11.701 20.409-18.91 41.665C1.272 66.313-.092 87.361.006 89.551h7.202c0-.049 0-.132-.002-.248zm33.522-73.187c-.647 3.657-1.888 9.939-4.497 18.056-5.42 12.948 3.823 10.836 6.47 5.457 1.569-2.97 3.182-6.194 3.182-6.194l8.307 3.185s-.669 3.783-1.353 6.912c-2.61 8.118 4.998 7.144 7.102 1.146.177-.583.477-1.518.856-2.697 1.62-5.045 4.672-14.553 5.648-20.073 1.814-4.357-4.395-8.336-7.205-1.295-1.502 2.593-3.941 8.27-3.941 8.27s-6.857-2.534-6.938-2.81c-.14-.362.021-1.024.212-1.812.177-.727.38-1.562.397-2.37-.418-11.655-7.37-10.693-8.24-5.775zm36.6 9.076c2.114-4.209 4.542-4.915 6.347-4.723.779.065 1.838 1.648 2.648 3.17 2.651 10.02-2.1 28.448-2.94 29.686-2.892 4.671-7.967 3.788-6.04-1.259.901-3.066 1.865-5.852 1.865-5.852l-6.568-.734c-5.162 10.028-9.802 5.829-7.128 1.497 2.861-5.074 8.956-16.183 11.816-21.785zm33.437 10.102c.857-2.414-.924-7.875-7.149-6.964-9.016.065-12.136 15.862-12.136 15.862s-1.498 7.65.867 12.865c1.971 4.611 6.52 5.007 8.041 5.139.137.012.25.022.334.032 5.917-1.78 3.891-5.722 2.879-5.849-.221-.011-.456-.014-.701-.018-1.178-.015-2.578-.034-3.746-.988-2.393-1.928-1.967-6.824-1.447-9.457 1.224-4.429 3.918-13.223 8.213-11.07 2.577 3.293 4.386 1.78 4.845.448zm5.93-.406c-.608 1.855-.691 3.748-.785 5.895-.151 3.458-.332 7.576-2.777 13.261-.68 1.62-2.071 4.212-2.9 5.756-.323.602-.561 1.045-.638 1.21-2.196 4.16 2.263 6.611 7.175-.657 1.19-1.664 2.501-5.919 2.501-5.919l2.137-.24s1.867 8.216 2.296 11.736c.46 3.396 6.476 5.328 6.564-1.338-.215-2.285-1.011-5.374-2.509-9.298 0 0-.978-2.874-1.925-3.247 0 0 6.713-6.677 7.353-9.268.67-2.714-.552-4.6-5.802-.172-5.249 4.428-5.858 5.846-5.858 5.846s1.248-5.583 1.123-9.812c.456-4.473-4.584-7.73-5.955-3.753zm33.811 8.412c-2.253 2.233-3.67 6.425-3.512 12.767.314 9.466 4.236 14.906 10.933 13.822 6.697-1.083 5.12-5.915 4.503-6.075-.088-.022-.163-.059-.244-.098-.376-.181-.861-.415-3.12.435-2.746 1.032-4.814-.173-6.545-4.375-1.144-2.843-1.764-8.367.302-11.452.537-.795 1.051-1.088 1.378-1.275l.075-.042.039-.024.019-.011c1.235-.753 2.5-.023 2.717.166 3.458 2.504 4.135-.27 2.899-2.736-2.44-3.446-5.681-4.15-9.444-1.102zm14.971.143c-.033-3.593 3.677-6.363 4.981 1.672.926 2.985 1.185 7.574 1.384 11.111.147 2.614.262 4.655.59 5.05.773.93 6.526-.368 8.084-.892 1.558-.524 4.428.164 3.78 1.724-.423 1.281-1.467 1.63-2.02 1.814-.134.045-.239.08-.3.116-.309.187-13.313 4.042-13.796 1.475-.342-1.815-.457-2.938-.667-4.986h-.001c-.087-.848-.19-1.854-.332-3.133-.178-1.594-.448-3.404-.721-5.234h-.001c-.475-3.187-.961-6.434-.981-8.717zm15.594-3.216c-.282-2.598 2.367-4.185 3.927-1.396.534.974 1.107 3.415 1.752 6.165.788 3.354 1.682 7.167 2.746 9.337 1.06 1.599 3.243 1.887 4.271.42 1.214-2.218.338-7.759-.413-12.204a62.31 62.31 0 00-.479-1.777v-.001c-.361-1.286-.655-2.334-.634-3.168.466-4.003 3.677-3.055 5.175 1.049 1.249 4.572 2.551 11.959 1.898 14.585l-.074.3c-.604 2.447-1.329 5.39-4.442 6.131-.842.185-7.855 1.196-10.321-6.477l-.757-2.562c-1.783-6.024-2.399-8.103-2.649-10.402zm21.992-8.576c4.312-2.607 7.547-3.502 10.075-2.589 1.48.91 2.436 3.407 2.037 5.558-.461 1.87-1.231 3.396-1.231 3.396 2.559.258 4.432 2.811 4.918 6.153.487 3.341-2.661 6.486-8.515 8.433-1.972.556-4.067.549-4.16-.138-.063-1.341-5.033-17.326-5.033-17.326-.015-.096-.034-.193-.053-.29-.175-.892-.37-1.884 1.962-3.197z\"\n                clip-rule=\"evenodd\"\n              ></path>\n            </svg>\n            <div class=\"footer-icons-container\">\n              <a\n                target=\"_self\"\n                rel=\"noopener me\"\n                href=\"https://slack.hackclub.com\"\n                title=\"Hack Club on Slack\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"slack-fill\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <path\n                    fill-rule=\"evenodd\"\n                    clip-rule=\"evenodd\"\n                    d=\"M16 4c10 0 12 2 12 12s-2 12-12 12S4 26 4 16 6 4 16 4zm-2.746 4.122a1.605 1.605 0 0 1 1.745.347 1.6 1.6 0 0 1 .468 1.131v1.6h-1.6a1.603 1.603 0 0 1-1.48-2.212 1.598 1.598 0 0 1 .867-.866zM9.6 12.267h4.267a1.604 1.604 0 0 1 1.478.988A1.596 1.596 0 0 1 15 14.997a1.602 1.602 0 0 1-1.132.47H9.6a1.605 1.605 0 0 1-1.479-.989 1.595 1.595 0 0 1 .347-1.742 1.601 1.601 0 0 1 1.132-.47zm14.279.988a1.596 1.596 0 0 1-.347 1.742 1.6 1.6 0 0 1-1.132.47h-1.6v-1.6a1.596 1.596 0 0 1 .987-1.478 1.605 1.605 0 0 1 1.745.347c.149.148.266.325.347.519zM19.733 9.6v4.267a1.594 1.594 0 0 1-.987 1.477 1.605 1.605 0 0 1-1.226 0 1.602 1.602 0 0 1-.987-1.477V9.6a1.596 1.596 0 0 1 .987-1.478 1.605 1.605 0 0 1 1.745.347 1.598 1.598 0 0 1 .468 1.131zm-1.6 14.4a1.603 1.603 0 0 0 1.6-1.6 1.595 1.595 0 0 0-.987-1.478 1.605 1.605 0 0 0-.613-.122h-1.6v1.6a1.597 1.597 0 0 0 1.6 1.6zm0-4.267H22.4a1.605 1.605 0 0 0 1.479-.988 1.596 1.596 0 0 0-.347-1.742 1.6 1.6 0 0 0-1.132-.47h-4.267a1.605 1.605 0 0 0-1.478.989A1.596 1.596 0 0 0 17 19.264a1.602 1.602 0 0 0 1.132.47zm-10.012-.988a1.596 1.596 0 0 1 .347-1.742 1.601 1.601 0 0 1 1.132-.47h1.6v1.6a1.596 1.596 0 0 1-.987 1.478 1.605 1.605 0 0 1-1.745-.347 1.597 1.597 0 0 1-.347-.519zm4.146 3.655v-4.267a1.593 1.593 0 0 1 .987-1.477 1.603 1.603 0 0 1 1.745.347 1.6 1.6 0 0 1 .468 1.13V22.4a1.597 1.597 0 0 1-1.6 1.6 1.603 1.603 0 0 1-1.6-1.6z\"\n                  ></path>\n                </svg>\n              </a>\n              <a\n                target=\"_blank\"\n                rel=\"noopener me\"\n                href=\"https://twitter.com/hackclub\"\n                title=\"Hack Club on Twitter\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"twitter\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <g>\n                    <path\n                      d=\"M16,28c11,0 12,-1 12,-12c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,11 1,12 12,12Zm5.825,-13.901c0,3.669 -2.889,7.901 -8.172,7.901l0,0c-1.622,0 -3.132,-0.46 -4.403,-1.248c0.225,0.026 0.454,0.039 0.685,0.039c1.346,0 2.585,-0.444 3.568,-1.189c-1.258,-0.022 -2.318,-0.825 -2.684,-1.928c0.175,0.032 0.355,0.05 0.54,0.05c0.262,0 0.516,-0.034 0.758,-0.098c-1.315,-0.255 -2.305,-1.377 -2.305,-2.722c0,-0.013 0,-0.024 0.001,-0.036c0.387,0.208 0.829,0.333 1.301,0.348c-0.772,-0.498 -1.279,-1.348 -1.279,-2.312c0,-0.509 0.143,-0.985 0.389,-1.396c1.417,1.681 3.534,2.786 5.921,2.902c-0.049,-0.204 -0.074,-0.416 -0.074,-0.633c0,-1.533 1.286,-2.777 2.872,-2.777c0.826,0 1.573,0.338 2.097,0.877c0.654,-0.124 1.269,-0.356 1.824,-0.674c-0.215,0.649 -0.67,1.192 -1.263,1.536c0.581,-0.067 1.134,-0.216 1.649,-0.437c-0.384,0.557 -0.872,1.046 -1.433,1.438c0.006,0.119 0.008,0.239 0.008,0.359Z\"\n                    ></path>\n                  </g>\n                </svg>\n              </a>\n              <a\n                target=\"_blank\"\n                rel=\"noopener me\"\n                href=\"https://github.com/hackclub\"\n                title=\"Hack Club on GitHub\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"github\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <g>\n                    <path\n                      d=\"M18.837,27.966c8.342,-0.241 9.163,-1.997 9.163,-11.966c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,9.995 0.826,11.734 9.228,11.968c0.073,-0.091 0.1,-0.205 0.1,-0.321c0,-0.25 -0.01,-2.816 -0.015,-3.699c-3.037,0.639 -3.678,-1.419 -3.678,-1.419c-0.497,-1.222 -1.213,-1.548 -1.213,-1.548c-0.991,-0.656 0.075,-0.643 0.075,-0.643c1.096,0.075 1.673,1.091 1.673,1.091c0.974,1.617 2.556,1.15 3.178,0.879c0.099,-0.683 0.381,-1.15 0.693,-1.414c-2.425,-0.267 -4.974,-1.175 -4.974,-5.23c0,-1.155 0.426,-2.099 1.124,-2.839c-0.113,-0.268 -0.487,-1.344 0.107,-2.8c0,0 0.917,-0.285 3.003,1.084c0.871,-0.235 1.805,-0.352 2.734,-0.356c0.927,0.004 1.861,0.121 2.734,0.356c2.085,-1.369 3,-1.084 3,-1.084c0.596,1.456 0.221,2.532 0.108,2.8c0.7,0.74 1.123,1.684 1.123,2.839c0,4.065 -2.553,4.96 -4.986,5.221c0.392,0.327 0.741,0.973 0.741,1.96c0,0.946 -0.006,2.619 -0.01,3.728c-0.002,0.549 -0.003,0.959 -0.003,1.074c0,0.109 0.029,0.224 0.095,0.319Z\"\n                    ></path>\n                  </g>\n                </svg>\n              </a>\n              <a\n                target=\"_blank\"\n                rel=\"noopener me\"\n                href=\"https://figma.com/@hackclub\"\n                title=\"Hack Club on Figma\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"figma-fill\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <g>\n                    <path\n                      d=\"M16.774 14.114c-.5.5-.78 1.179-.78 1.886v-2.667h2.666c-.707 0-1.386.281-1.886.781z\"\n                    ></path>\n                    <path\n                      fill-rule=\"evenodd\"\n                      clip-rule=\"evenodd\"\n                      d=\"M27.986 15.968c0 11-1 12-12 12s-12-1-12-12 1-12 12-12 12 1 12 12zm-9.326-2.635A2.667 2.667 0 1115.993 16v5.333a2.667 2.667 0 11-2.666-2.666 2.667 2.667 0 010-5.334 2.666 2.666 0 110-5.333h5.333a2.667 2.667 0 110 5.333z\"\n                    ></path>\n                  </g>\n                </svg>\n              </a>\n              <a\n                target=\"_blank\"\n                rel=\"noopener me\"\n                href=\"https://social.dino.icu/@hackclub\"\n                title=\"Hack Club on Mastodon\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"mastodon\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <g>\n                    <path\n                      fill-rule=\"evenodd\"\n                      clip-rule=\"evenodd\"\n                      d=\"M28 16C28 6 26 4 16 4C6 4 4 6 4 16C4 26 6 28 16 28C26 28 28 26 28 16ZM20.1998 8.2058C22.0924 8.46832 23.689 9.82312 23.9354 11.5423C24.0428 12.5649 23.9896 14.1016 23.9638 14.8483C23.9574 15.0339 23.9526 15.1707 23.9525 15.2387C23.9525 15.339 23.937 16.2553 23.9308 16.352C23.7649 18.8085 22.1327 19.7786 20.4176 20.0877C20.3988 20.093 20.3776 20.0968 20.3559 20.1008C20.3506 20.1018 20.3453 20.1027 20.3401 20.1037C19.2527 20.303 18.0878 20.3561 16.9826 20.3851C16.7183 20.3917 16.4548 20.3917 16.1905 20.3917C15.0917 20.3919 13.9966 20.2699 12.9284 20.0281C12.9228 20.0267 12.9168 20.0266 12.9111 20.0278C12.9054 20.0289 12.9001 20.0314 12.8955 20.0348C12.891 20.0383 12.8874 20.0427 12.8851 20.0477C12.8827 20.0528 12.8816 20.0582 12.8819 20.0637C12.9121 20.3901 12.9877 20.7113 13.1067 21.0193C13.2547 21.3756 13.7717 22.2315 15.6937 22.2315C16.8106 22.2334 17.9238 22.1114 19.0101 21.8679C19.0156 21.8667 19.0214 21.8667 19.0269 21.8679C19.0324 21.869 19.0376 21.8713 19.0421 21.8746C19.0465 21.8779 19.0501 21.882 19.0526 21.8868C19.0552 21.8916 19.0565 21.8968 19.0566 21.9021V23.1078C19.0564 23.1135 19.0548 23.1191 19.052 23.1241C19.0492 23.1292 19.0452 23.1335 19.0403 23.1369C18.7013 23.3675 18.2457 23.5032 17.8469 23.622C17.8281 23.6276 17.8095 23.6332 17.791 23.6387C17.6086 23.6925 17.4241 23.7398 17.2376 23.7805C15.5421 24.1429 13.7725 24.0552 12.127 23.5274C10.5902 23.0213 9.02149 21.7807 8.63398 20.2899C8.42703 19.4827 8.28122 18.6628 8.19763 17.8363C8.10981 16.9324 8.08046 16.0271 8.05108 15.1205C8.04001 14.779 8.02893 14.4373 8.01473 14.0955C7.9783 13.2243 7.99923 12.2746 8.19531 11.4179C8.60298 9.6784 10.2832 8.46105 12.1232 8.2058C12.161 8.20055 12.2028 8.19365 12.2517 8.18558C12.6158 8.12547 13.3759 8 15.8472 8H15.8681C18.6706 8 19.8805 8.16144 20.1998 8.2058ZM19.4922 17.6719H21.2957L21.2972 13.401C21.2972 12.5279 21.0598 11.8346 20.585 11.3212C20.0936 10.8085 19.4511 10.5452 18.6544 10.5452C17.7329 10.5452 17.0353 10.8783 16.5703 11.5437L16.1208 12.2506L15.672 11.5437C15.207 10.8783 14.5095 10.5452 13.5864 10.5452C12.7889 10.5452 12.1464 10.8085 11.6566 11.3212C11.1818 11.8351 10.9443 12.5283 10.9443 13.401V17.6719H12.7463V13.5268C12.7471 12.6542 13.1385 12.2091 13.922 12.2091C14.7885 12.2091 15.2233 12.7356 15.2233 13.7755V16.0444H17.016V13.7755C17.016 12.7356 17.45 12.2091 18.3165 12.2091C19.1047 12.2091 19.4922 12.6542 19.4922 13.5268V17.6719Z\"\n                    ></path>\n                  </g>\n                </svg>\n              </a>\n              <a\n                target=\"_blank\"\n                rel=\"noopener me\"\n                href=\"https://www.youtube.com/c/HackClubHQ\"\n                title=\"Hack Club on YouTube\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"youtube\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <g>\n                    <path\n                      fill-rule=\"evenodd\"\n                      clip-rule=\"evenodd\"\n                      d=\"M28 16C28 6 26 4 16 4S4 6 4 16s2 12 12 12 12-2 12-12zm-14.473 3.127l6.48-3.36-6.485-3.383.005 6.742z\"\n                    ></path>\n                  </g>\n                </svg>\n              </a>\n              <a\n                target=\"_blank\"\n                rel=\"noopener me\"\n                href=\"https://www.instagram.com/starthackclub\"\n                title=\"Hack Club on Instagram\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"instagram\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <g>\n                    <path\n                      fill-rule=\"evenodd\"\n                      clip-rule=\"evenodd\"\n                      d=\"M16 6c5.1 0 7.247.575 8.336 1.664C25.425 8.753 26 10.9 26 16s-.575 7.247-1.664 8.336C23.247 25.425 21.1 26 16 26s-7.247-.575-8.336-1.664C6.575 23.247 6 21.1 6 16s.575-7.247 1.664-8.336C8.753 6.575 10.9 6 16 6zm0-2c10 0 12 2 12 12s-2 12-12 12S4 26 4 16 6 4 16 4z\"\n                    ></path>\n                    <path\n                      d=\"M16 9.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 1 0 0-12.324zM16 20a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm7.845-10.405a1.44 1.44 0 1 1-2.88 0 1.44 1.44 0 0 1 2.88 0z\"\n                    ></path>\n                  </g>\n                </svg>\n              </a>\n              <a\n                target=\"_blank\"\n                rel=\"noopener me\"\n                href=\"mailto:team@hackclub.com\"\n                title=\"Hack Club on email-fill\"\n              >\n                <svg\n                  fill-rule=\"evenodd\"\n                  clip-rule=\"evenodd\"\n                  stroke-linejoin=\"round\"\n                  stroke-miterlimit=\"1.414\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  aria-label=\"email-fill\"\n                  viewBox=\"0 0 32 32\"\n                  preserveAspectRatio=\"xMidYMid meet\"\n                  fill=\"currentColor\"\n                  width=\"32\"\n                  height=\"32\"\n                >\n                  <g>\n                    <path\n                      d=\"M16,26c11,0 12,-0.833 12,-10c0,-9.167 -1,-10 -12,-10c-11,0 -12,0.833 -12,10c0,9.167 1,10 12,10Zm-8.651,-14.774c0.411,-0.344 1.023,-0.289 1.366,0.124c1.335,1.601 5.617,5.318 7.285,6.592c1.696,-1.296 5.931,-4.963 7.285,-6.592c0.343,-0.413 0.955,-0.468 1.366,-0.124c0.412,0.344 0.467,0.957 0.124,1.37c-0.695,0.838 -2.02,2.129 -3.429,3.404c1.409,1.275 2.734,2.566 3.429,3.404c0.343,0.412 0.288,1.026 -0.124,1.37c-0.411,0.344 -1.023,0.289 -1.366,-0.124c-0.662,-0.798 -2.015,-2.083 -3.422,-3.339c-1.102,0.95 -2.137,1.789 -2.841,2.291c-0.302,0.213 -0.644,0.398 -1.022,0.398c-0.378,0 -0.72,-0.185 -1.021,-0.398c-0.691,-0.492 -1.728,-1.335 -2.835,-2.292c-1.414,1.264 -2.775,2.556 -3.429,3.34c-0.343,0.413 -0.955,0.468 -1.366,0.124c-0.411,-0.344 -0.467,-0.957 -0.124,-1.37l0.001,-0.001c0.683,-0.822 2.018,-2.119 3.436,-3.403c-1.418,-1.284 -2.753,-2.582 -3.436,-3.403l-0.001,-0.001c-0.343,-0.413 -0.287,-1.026 0.124,-1.37Z\"\n                    ></path>\n                  </g>\n                </svg>\n              </a>\n            </div>\n            <span>\n              <a href=\"tel:1-855-625-HACK\" class=\"footer-tel\">1-855-625-HACK</a>\n              <span>(call toll-free)</span>\n            </span>\n          </div>\n        </article>\n        <p class=\"footer-cr-info\">\n          © 2024 Hack&nbsp;Club. 501(c)(3) nonprofit (EIN: 81-2908499)\n        </p>\n      </div>\n    </footer>\n    <script src=\"./landing-new/gambling.js\"></script>\n    <script src=\"./memes.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/bin/landing/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>The Bin</title>\n    <link rel=\"stylesheet\" href=\"../style/common.css\" />\n    <link rel=\"stylesheet\" href=\"./style.css\" />\n  </head>\n\n  <body>\n    <div class=\"landing-container\">\n      <div class=\"landing-header\">\n        <span>We want...</span>\n        <span id=\"rainbow\">hardware</span>\n        <span>in your hands.</span>\n      </div>\n      <div class=\"landing-header\">\n        <span>So we'll let you</span>\n        <span id=\"rainbow\">rummage</span>\n        <span>through the...</span>\n      </div>\n    </div>\n    <script src=\"./script.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/bin/landing/script.js",
    "content": "function rainbowColor(index, total) {\n  const hue = (360 / total) * index\n  return `hsl(${hue}, 74%, 71%)`\n}\n\nfunction rainbow(element) {\n  const text = element.innerText.trim()\n  const letters = text.split('')\n  const rainbowText = letters\n    .map((letter, index) => {\n      const color = rainbowColor(index, letters.length)\n      return `<span style=\"color: ${color}\">${letter}</span>`\n    })\n    .join('')\n  element.innerHTML = rainbowText\n}\n\ndocument.querySelectorAll('#rainbow').forEach(element => {\n  rainbow(element)\n})\n"
  },
  {
    "path": "public/bin/landing/style.css",
    "content": ".landing-container {\n  display: flex;\n  padding: 80px;\n  height: 100vh;\n  width: 100vw;\n  box-sizing: border-box;\n  flex-direction: column;\n}\n\n.landing-header {\n  flex-basis: 50%;\n  font-size: 100px;\n  display: flex;\n  flex-direction: column;\n  font-weight: bold;\n}\n\n.landing-header:nth-child(2) {\n  align-items: end;\n  justify-content: end;\n}\n\n.landing-header span {\n  width: fit-content;\n}\n\n.landing-header span:nth-child(2) {\n  color: transparent;\n  background-image: linear-gradient(\n    to left,\n    violet,\n    indigo,\n    blue,\n    green,\n    yellow,\n    orange,\n    red\n  );\n  -webkit-background-clip: text;\n  background-clip: text;\n}\n\n.landing-header:nth-child(2) span:nth-child(2) {\n  background-image: linear-gradient(\n    to right,\n    violet,\n    indigo,\n    blue,\n    green,\n    yellow,\n    orange,\n    red\n  );\n}\n\n@media screen and (aspect-ratio: 4/3) {\n  .landing-header {\n    font-size: 85px;\n  }\n}\n"
  },
  {
    "path": "public/bin/landing-new/ascii-art.txt",
    "content": "                                                                          ;:;+;++.              \n                                                                     +x:.      ..:;++x:         \n                                                                  :+..            .+.+.;;       \n                                                                 x+.:+:+:;:        .$$X$+Xx     \n                                                                X;X+x:;:;:.:.       .$xx;+      \n                                                              .X&$;x.x.X:+x:.:       +;+;       \n                                .:           .+++.           X+xx+X;;++:xx;:.:;      +.         \n                            :XX+:$    .:$xXx;:::::$X       .x.     .$;+:x;x;+:..   .x:          \n                        :xX;.    +XXX+:..          X.     ;:         .X:X:+xx...   x:           \n                     :xX;.    .xx::.               X;   ++++;+;       .xx;;;xx:.  x:            \n                     x:   .;x;.             .:xxx$$$:x;X:X$x;x;::     :++x++$.  ;x+             \n                     ;$..x:           .:+xx+X+:.    ...+;:$;XxxX;.     ;x:x..+++                \n                     +X+.        .+xx;:.+;.              ;$:x+X$:+....;x++x.                    \n                  ;X+.       .xx;.  .+:                    :X+x.                                \n               :xX:      :+X+.    .x+                        ++                                 \n              :X.    .;X+:    .;;+;            ;             +:                                 \n             x;   .+X;.   .++x. ;:            x              +x                                 \n            .X; :X;.++x++++++;:+:.           .+            .++                                  \n             ;XX::;                 .+;+.    .x           +X                                    \n                +:                       .+;: .xx.       ;;                                     \n               .x   ::.  ..                  xx$:;$.    +.                                      \n               +.  .;;   :                    x+   x;:+$X:                                      \n              :;  .+;  .x      :.              x$:&$$X&.                                        \n             ++   ++   ;      .x      ..       .X$:                                             \n             +.  ++   +.     .x       ;     :.   +                                              \n            .+  :x   :.      ::      .:    .;    x                                              \n            +. .X.  .x      :x       x    .:   .x.                                              \n            ;  ++   ;       x       :.   .x   .x.                                               \n           ;: .x    :      ;;       ;    ;    +                                                 \n          .x  X.   ::     .x      .+    +.  .X:                                                 \n          +. ::   .x     .x.      :.   :.  .x                                                   \n          ;  +.   :.     +:      :.   +.  .x.                                                   \n         X. :+    ;.    :+      .:   ::   ;X                                                    \n         x. x    .;    .x.     .+   ;.   +.                                                     \n        :+ .+    +.    ;:      :.  ;:  .X.                                                      \n        +; .:   .+    ;.      :.  ;.  .x+                                                       \n        ;. .:   .:   .;      .:  +    x                                                         \n      . x: :.   ..   :.     .+ .X    ++                                                         \n        ;.      ..   +      ; .+    ;.                                                          \n        ;+X;..              ..;    :x                                                           \n             :+$x.                .x                                                            \n                  :X$$+...       .$                                                             \n                          :+X;;:;+                                                                   "
  },
  {
    "path": "public/bin/landing-new/gambling.js",
    "content": "var fetchedParts\nvar selectedParts = []\nvar rolled = false\n\nfunction removeItemByAttribute(arr, attr, value) {\n  return arr.filter(item => item[attr] !== value)\n}\nfunction addComponentsToPage(data) {\n  document.querySelectorAll('.gambling-item-wrapper').forEach(element => {\n    /*data.forEach((component) => {\n            let spinnerItem = document.createElement(\"div\")\n            spinnerItem.className = \"spinner-item\"\n\n            let spinnerImage = document.createElement(\"img\")\n            spinnerImage.src = \"../parts/humidity.png\"\n            spinnerImage.className = \"spinner-item-image\"\n\n            const h1 = document.createElement('h1');\n            h1.classList.add('spinner-item-name');\n            h1.innerText = component.name;\n\n            const p = document.createElement('p');\n            p.classList.add('spinner-item-description');\n            p.innerText = component.flavorText;\n\n            spinnerItem.appendChild(spinnerImage);\n            spinnerItem.appendChild(h1);\n            spinnerItem.appendChild(p);\n            element.appendChild(spinnerItem)\n        })*/\n    let component = data[0]\n    let spinnerItem = document.createElement('div')\n    spinnerItem.className = 'spinner-item'\n\n    let spinnerInfo = document.createElement('div')\n    spinnerInfo.className = 'spinner-info'\n\n    let spinnerImage = document.createElement('img')\n    spinnerImage.src =\n      'https://imgk.timesnownews.com/story/raccoon_GettyImages-914090712.jpg'\n    spinnerImage.className = 'spinner-item-image'\n\n    const h1 = document.createElement('h1')\n    h1.classList.add('spinner-item-name')\n    h1.innerText = component.name\n\n    const p = document.createElement('p')\n    p.classList.add('spinner-item-description')\n    p.innerText = component.flavorText\n\n    spinnerItem.appendChild(spinnerImage)\n    spinnerInfo.appendChild(h1)\n    spinnerInfo.appendChild(p)\n    spinnerItem.appendChild(spinnerInfo)\n    element.appendChild(spinnerItem)\n  })\n}\n\nfunction sample(arr) {\n  return arr[Math.floor(Math.random() * arr.length)]\n}\n\nfunction rollPartsAnimation(ms = 1000) {\n  for (let i = 0; i < ms; i += 100) {\n    setTimeout(() => {\n      randomizeParts()\n    }, i)\n  }\n  setTimeout(() => {\n    randomizeParts()\n  }, ms + 200)\n  setTimeout(() => {\n    randomizeParts()\n  }, ms + 500)\n}\n\nfunction randomizeParts() {\n  let chosenParts = []\n  // for the first one, pick an input component\n  const inputParts = fetchedParts.filter(part => part.type == 'Input')\n  const inputPart = sample(inputParts)\n  chosenParts.push(inputPart)\n  console.log(`For the input part, we picked ${inputPart.name}`)\n  // for the second one, pick an output component\n  const outputParts = fetchedParts.filter(part => part.type == 'Output')\n  const outputPart = sample(outputParts)\n  chosenParts.push(outputPart)\n  console.log(`For the output part, we picked ${outputPart.name}`)\n  // for the rest, pick any component\n  const unusedParts = fetchedParts.filter(\n    part => part.name != inputPart.name && part.name != outputPart.name\n  )\n  const thirdPart = sample(unusedParts)\n  chosenParts.push(thirdPart)\n  console.log(`For the third part, we picked ${thirdPart.name}`)\n  let chosenPartNames = []\n  document\n    .querySelectorAll('.gambling-item-wrapper')\n    .forEach((element, key) => {\n      let thisPart = chosenParts[key]\n      //console.log(`Hydrating part ${key} with ${thisPart.name}`)\n      let spinnerImage = element.childNodes[2].childNodes[0]\n      let partTitle = element.childNodes[2].childNodes[1].childNodes[0]\n      let flavorText = element.childNodes[2].childNodes[1].childNodes[1]\n      spinnerImage.src =\n        thisPart.imageUrl == '' || thisPart.imageUrl == undefined\n          ? 'https://awdev.codes/images/ww.gif'\n          : thisPart.imageUrl\n      //spinnerImage.src = (thisPart.imageUrl == \"\" || thisPart.imageUrl == undefined) ? localStorage.getItem(\"wokwi-pedro\") : localStorage.getItem(thisPart.wokwiName)\n      partTitle.innerText = thisPart.name\n      flavorText.innerText = thisPart.flavorText\n      chosenPartNames.push(thisPart.wokwiName)\n    })\n  selectedParts = chosenPartNames\n}\n\nconst rollSound = new Howl({\n  src: 'https://cloud-eclxkeatl-hack-club-bot.vercel.app/0mario-kart-item-box-sound-mp3cut_audio.mp4'\n})\n\nfunction rollParts(el) {\n  if (el.classList.contains('disabled')) {\n    return\n  }\n  if (!rolled) {\n    document.querySelectorAll('.gambling-item-wrapper').forEach(element => {\n      element.removeChild(element.firstElementChild)\n    })\n    addComponentsToPage(fetchedParts)\n    rolled = true\n  }\n  document.querySelector('.gambling-build').classList.remove('disabled')\n  rollSound.play()\n\n  rollPartsAnimation(1200)\n}\n\nasync function generateBuildLink(e) {\n  if (!rolled) {\n    return\n  }\n  e.classList.add('disabled')\n  e.classList.add('loading')\n\n  const parts = encodeURI(selectedParts.join('|'))\n  const origin = window.location.origin\n  const url = new URL(`${origin}/api/bin/wokwi/new/${parts}`)\n\n  window.open(url, '_blank').focus()\n\n  e.classList.remove('disabled')\n  e.classList.remove('loading')\n}\n\nwindow.addEventListener('load', async e => {\n  fetchedParts = (await partsData()).filter(p => p.rollable)\n  document.querySelector('.gambling-roll').classList.remove('disabled')\n})\n\nasync function generateProjectIdea() {\n  if (\n    document\n      .querySelector('#generate-project-idea')\n      .classList.contains('disabled')\n  ) {\n    return\n  }\n\n  document.querySelector('#project-idea').innerHTML =\n    'Bin has ended! Thanks for participating.'\n}\n"
  },
  {
    "path": "public/bin/landing-new/script.js",
    "content": "function init() {\n  document.addEventListener('scroll', onScroll)\n  onScroll()\n  document.querySelectorAll('img').forEach(el => {\n    el.draggable = false\n  })\n}\nfunction getRandomInt(max) {\n  return Math.floor(Math.random() * max)\n}\n\nfunction opf(number) {\n  return 1 - number + 0.5\n}\n\nfunction onScroll() {\n  let scrollButton = document.querySelector('.scroll-prompt')\n  scrollButton.style.opacity = opf(window.scrollY / 200)\n}\n\nwindow.addEventListener('load', init)\n\nasync function fetchAndLogTextFile(url) {\n  try {\n    const response = await fetch(url)\n    if (!response.ok) {\n      throw new Error('Failed to fetch the file.')\n    }\n    const text = await response.text()\n    console.log(\n      `%cSay Hi to Binny ↓`,\n      'color:white; font-size:50px;font-weight:bolder;font-family:sans-serif'\n    )\n    console.log(`%c${text}`, 'color:white; font-size:10px;')\n  } catch (error) {\n    console.error('Error fetching the file:', error)\n  }\n}\nfunction recalculateSectionHeight() {\n  document.querySelectorAll('.section').forEach(element => {\n    element.style.minHeight = element.getBoundingClientRect().height + 'px'\n  })\n}\nfetchAndLogTextFile('./landing-new/ascii-art.txt')\n\nwindow.addEventListener('load', recalculateSectionHeight())\nwindow.addEventListener('resize', recalculateSectionHeight())\n"
  },
  {
    "path": "public/bin/landing-new/style.css",
    "content": ".section {\n  height: fit-content;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.container {\n  max-width: 62em;\n  margin: auto;\n}\n\n.landing-section {\n  height: 100vh;\n}\n\n.hoverable {\n  transition: 500ms transform;\n  cursor: pointer;\n}\n\n.hoverable:hover {\n  transform: scale(1.05);\n}\n\n.flex-lb {\n  width: 100%;\n  display: block;\n  height: 0px;\n}\n\n/*TODO: decide whether to remove this*/\n.huh {\n  position: absolute;\n  display: block;\n  width: 150px;\n  left: 50px;\n  bottom: -60px;\n}\n\n.landing-header {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -60%);\n  width: 40%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n}\n\n.landing-logo {\n  display: block;\n  width: 100%;\n}\n\n.recycled {\n  position: absolute;\n  top: 25%;\n  left: 85%;\n  transform: translate(-50%, -50%) rotate(-10deg); /* Adjust rotation angle as needed */\n  width: 60%;\n  height: auto; /* Maintain aspect ratio */\n}\n\n.landing-tagline {\n  font-size: 35px;\n  display: block;\n  font-style: italic;\n  text-wrap: nowrap;\n}\n\n.landing-tagline-top {\n  padding-top: 45px;\n}\n\n.scroll-prompt {\n  cursor: pointer;\n  position: absolute;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  left: 50%;\n  bottom: 20px;\n  transform: translateX(-50%);\n  background: linear-gradient(#63ce61, #adea00);\n  height: 50px;\n  width: 50px;\n  padding: 20px;\n  border-radius: 50%;\n  transition: transform 300ms;\n}\n\n.scroll-prompt:hover {\n  transform: translateX(-50%) scale(1.05);\n}\n\n.landing-main-image {\n  margin-top: 30px;\n  display: block;\n  width: 65%;\n}\n\n.floaty img {\n  width: 100%;\n}\n\n.floaty {\n  width: 17vw;\n  position: absolute;\n  animation: float 6s ease-in-out infinite;\n}\n\n.gambling-section {\n  padding: 50px;\n  /* display: flex; */\n  /* flex-direction: column; */\n  /* gap: 30px; */\n  /* max-width: 75em; */\n  margin: auto;\n}\n\n.gambling-header {\n  display: flex;\n  height: 200px;\n  gap: 40px;\n}\n\n.gambling-header-text {\n  display: flex;\n  flex-direction: column;\n  margin-top: auto;\n  margin-bottom: 20px;\n}\n\n.gambling-title {\n  font-size: 90px;\n}\n\n.gambling-subheader {\n  font-size: 45px;\n  font-weight: normal;\n  font-style: italic;\n}\n\n.gambling-header-rummage {\n  display: block;\n  height: 100%;\n}\n\n.gambling-ui {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 2em;\n}\n\n.gambling-spinner {\n  flex-basis: 20vw;\n  aspect-ratio: 1;\n  background-color: #c4c4c4;\n  border-radius: 30px;\n  padding: 20px;\n  box-sizing: border-box;\n  overflow-y: hidden;\n}\n\n.gambling-item-wrapper {\n  display: flex;\n  flex-direction: column;\n  gap: 26px;\n  transform: translateY(0px);\n  /*animation: gamble 7000ms ease-in-out infinite;*/\n  /*animation: gamble 100ms ease-in-out;*/\n  animation-fill-mode: forwards;\n  height: 100%;\n}\n\n@keyframes gamble {\n  0%,\n  100% {\n    transform: translateY(0px);\n  }\n\n  50% {\n    transform: translateY(calc(-100% + 292px));\n  }\n}\n\n@keyframes gamble-once {\n  0% {\n    transform: translateY(0px);\n  }\n\n  100% {\n    transform: translateY(calc(-200px * 25));\n  }\n}\n\n.spinner-item {\n  width: 100%;\n  height: 100%;\n  /* aspect-ratio: 1; */\n  padding: 15px;\n  box-sizing: border-box;\n  background-color: #d9d9d9;\n  border-radius: 10px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.spinner-item-image {\n  height: 67%;\n}\n\n.spinner-separator {\n  font-size: 100px;\n  font-weight: bolder;\n  margin: 20px;\n}\n\n.spinner-item-name {\n  font-size: 1.5em;\n  text-align: center;\n}\n\n.spinner-item-description {\n  font-size: 1.2em;\n  text-align: center;\n}\n\n.gambling-controls {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  flex-wrap: wrap;\n  width: 100%;\n  margin: auto;\n  margin-top: 0;\n  margin-bottom: 0;\n  gap: 10px;\n}\n\n/* .gambling-section button {\n    font-weight: bolder;\n    box-sizing: border-box;\n    border: none;\n    padding: 10px 30px;\n    cursor: pointer;\n    font-size: 40px;\n    border-radius: 30px;\n    height: min-content;\n    display: flex;\n    justify-content: center;\n    flex-grow: 1;\n    gap: 30px;\n    align-items: center;\n} */\n\n.gambling-controls button img {\n  height: 30px;\n}\n\nbutton {\n  border-radius: 0.5em;\n  font-size: 40px;\n  font-weight: bolder;\n  box-sizing: border-box;\n\n  color: white;\n\n  border: none;\n  padding: 10px 30px;\n\n  margin: 1em;\n}\n\n.gambling-roll {\n  background-color: #ee9f9f;\n  display: inherit;\n  margin: 0 auto;\n}\n\n.gambling-controls:first-child {\n  margin-left: 0px;\n  margin-right: 0px;\n}\n/* \n.gambling-select {\n    background-color: #7D96EC;\n} */\n\n.gambling-build {\n  background-color: #9feeb5;\n  filter: saturate(1) brightness(1);\n  transition: filter 500ms;\n  display: flex;\n  gap: 20px;\n}\n\n.gambling-build.disabled {\n  filter: saturate(0.5) brightness(0.7);\n}\n\n.cta-container {\n  display: flex;\n}\n\n@media screen and (max-width: 900px) {\n  .cta-container {\n    flex-direction: column-reverse;\n  }\n}\n\n.gambling-placeholder {\n  height: 80%;\n  width: 80%;\n  margin: auto;\n}\n\n#generate-project-idea {\n  cursor: pointer;\n}\n\n.project-idea-section {\n  margin-bottom: 30px;\n}\n\n#project-name {\n  resize: none;\n  width: 70%;\n  border: none;\n  padding: 20px;\n  font-size: 20px;\n  margin-bottom: 30px;\n  border-radius: 30px;\n}\n\n.project-idea-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  column-gap: 20px;\n  row-gap: 5px;\n}\n\n.gambling-build {\n  margin: auto;\n}\n\n.project-idea-buttons button {\n  margin: 0;\n}\n\n.project-idea-container {\n  margin: auto;\n  padding: 50px;\n  width: inherit;\n  box-sizing: border-box;\n}\n\n.project-idea-container h1 {\n  font-size: 50px;\n  margin-bottom: 10px;\n}\n\n.project-idea-images {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  justify-content: space-evenly;\n  gap: 5px;\n  display: none;\n  height: 90px;\n}\n\n.project-idea-images img {\n  height: 100%;\n  width: auto;\n}\n\n#project-idea-build {\n  font-size: 30px;\n  font-weight: bolder;\n  border: none;\n  background-color: #9feeb5;\n  padding: 10px 30px;\n  border-radius: 30px;\n  height: min-content;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n  gap: 10px;\n}\n\n#project-idea-build img {\n  height: 25px;\n}\n\n/* CSS from https://codepen.io/quadbaup/details/rKOKQv */\n.thought {\n  display: flex;\n  background-color: #fff;\n  padding: 20px;\n  border-radius: 30px;\n  min-width: 40px;\n  max-width: 220px;\n  min-height: 40px;\n  margin: 20px;\n  position: relative;\n  align-items: center;\n  justify-content: center;\n  /* text-align:center; */\n}\n\n.thought:before,\n.thought:after {\n  content: '';\n  background-color: #fff;\n  border-radius: 50%;\n  display: block;\n  position: absolute;\n  z-index: -1;\n}\n\n.thought:before {\n  width: 44px;\n  height: 44px;\n  top: -12px;\n  left: 28px;\n  box-shadow: -50px 30px 0 -12px #fff;\n}\n\n.thought:after {\n  bottom: -10px;\n  right: 26px;\n  width: 30px;\n  height: 30px;\n  box-shadow:\n    40px -34px 0 0 #fff,\n    -28px -6px 0 -2px #fff,\n    -24px 17px 0 -6px #fff,\n    -5px 25px 0 -10px #fff;\n}\n\n.disabled {\n  cursor: not-allowed;\n}\n\n.loading {\n  cursor: wait;\n}\n\n#generate-project-idea {\n  cursor: pointer;\n}\n\n#project-name {\n  resize: none;\n  width: 70%;\n  border: none;\n  padding: 20px;\n  font-size: 20px;\n  margin-bottom: 30px;\n  border-radius: 30px;\n}\n\n.faq-section {\n  padding: 50px;\n}\n\n.faq-section h1 {\n  font-size: 50px;\n}\n\n.faq-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n  gap: 20px;\n  margin-top: 2em;\n  margin-bottom: 2em;\n}\n\n.faq-item {\n  padding: 20px;\n  border-radius: 20px;\n  background-color: #eeeded;\n  backdrop-filter: blur(10px);\n  filter: saturate(0.9);\n}\n\n.faq-item a {\n  color: black;\n}\n\n.faq-item p {\n  margin-top: 1em;\n}\n\n.faq-item h1 {\n  font-size: 1.5em;\n}\n\n.timeline-header {\n  font-size: 70px;\n  width: fit-content;\n  margin: auto;\n}\n\n.timeline-subheader {\n  font-weight: normal;\n  font-style: italic;\n  margin: auto;\n  width: fit-content;\n  font-size: 50px;\n}\n\n.timeline-list {\n  margin: auto;\n  grid-template-columns: 1fr 1fr 1fr 1fr;\n  height: min-content;\n  display: grid;\n  gap: 20px;\n  width: 100%;\n  box-sizing: border-box;\n  padding: 50px;\n  max-width: 62em;\n}\n\n.timeline-item {\n  padding: 10px;\n  background-color: black;\n  border-radius: 20px;\n  box-sizing: border-box;\n  height: 100%;\n}\n\n.timeline-info {\n  background-color: #eeeded;\n  height: 100%;\n  border-radius: 12px;\n  padding: 20px;\n  box-sizing: border-box;\n}\n\n.timeline-info a {\n  color: black;\n}\n\n.muted {\n  opacity: 0.5;\n}\n\n.greenbutton {\n  background: linear-gradient(to bottom right, #63ce61, #adea00);\n}\n\n.purplebutton {\n  background: linear-gradient(to bottom right, #350491, #311c7c);\n}\n\n.bluebutton {\n  background: linear-gradient(to bottom right, #7a97fc, #7aedfc);\n}\n\n.redbutton {\n  background: linear-gradient(to bottom right, #fc7a7a, #fca97a);\n}\n\n@keyframes float {\n  from,\n  to {\n    transform: translate(0%, -47%) rotate(-2deg);\n  }\n\n  25% {\n    transform: translate(-2%, -50%) rotate(2deg);\n  }\n\n  50% {\n    transform: translate(0%, -53%) rotate(-1deg);\n  }\n\n  75% {\n    transform: translate(-1%, -50%) rotate(-1deg);\n  }\n}\n\n@media screen and (aspect-ratio: 4/3) {\n  .landing-header {\n    width: 50%;\n  }\n\n  .floaty {\n    width: 200px;\n  }\n\n  .gambling-title {\n    font-size: 100px;\n  }\n\n  .gambling-subheader {\n    font-size: 40px;\n  }\n\n  .spinner-separator {\n    font-size: 70px;\n  }\n\n  .spinner-item-name {\n    font-size: 25px;\n  }\n\n  .spinner-item-description {\n    font-size: 20px;\n  }\n}\n\n@media only screen and (max-width: 900px) {\n  body {\n    overflow-x: hidden;\n  }\n\n  .floaty {\n    display: none;\n  }\n\n  .landing-header {\n    width: 80%;\n  }\n\n  .landing-tagline {\n    font-size: 20px;\n  }\n\n  .gambling-header {\n    height: fit-content;\n  }\n\n  .gambling-header-text {\n    margin-bottom: 10px;\n  }\n\n  .gambling-header-rummage {\n    display: none;\n  }\n\n  .gambling-section {\n    padding: 30px;\n    gap: 10px;\n  }\n\n  .gambling-title {\n    font-size: 65px;\n  }\n\n  .gambling-subheader {\n    font-size: 25px;\n  }\n\n  .spinner-separator {\n    display: none;\n  }\n\n  .gambling-ui {\n    flex-direction: column;\n    gap: 20px;\n  }\n\n  .gambling-spinner {\n    aspect-ratio: unset;\n    width: 100%;\n    flex-basis: 40vw;\n    padding: 10px;\n    /*background: conic-gradient(red 51.4deg, orange 102.8deg, yellow 154.2deg,\n                green 205.6deg, blue 257deg, purple 308.4deg, red 360deg);*/\n  }\n\n  .gambling-controls {\n    margin-top: 20px;\n  }\n\n  .gambling-controls button {\n    font-size: 35px;\n  }\n\n  .spinner-item {\n    flex-direction: row;\n    border-radius: 20px;\n    gap: 10px;\n    overflow: hidden;\n  }\n\n  .spinner-item-name,\n  .spinner-item-description {\n    text-align: left;\n  }\n\n  .spinner-info {\n    text-overflow: ellipsis;\n    text-wrap: wrap;\n    flex-basis: 200px;\n    flex-grow: 0;\n    flex-shrink: 0;\n  }\n\n  .spinner-item-name {\n    font-size: 30px;\n  }\n\n  .spinner-item-image {\n    height: auto;\n    width: 100px;\n  }\n\n  .project-idea-section {\n    padding-top: 20px;\n  }\n\n  .project-idea-container {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n    padding: 30px;\n    padding-top: 20px;\n    padding-bottom: 10px;\n    box-sizing: border-box;\n    align-items: center;\n  }\n\n  .project-idea-buttons {\n    gap: 10px;\n  }\n\n  .project-idea-buttons button {\n    width: 100%;\n  }\n\n  .project-idea-title {\n    font-size: 48px;\n  }\n\n  #project-name {\n    margin: auto;\n    width: 90%;\n    display: block;\n    border-radius: 20px;\n    flex-grow: 1;\n  }\n\n  .project-idea-images {\n    display: flex;\n  }\n\n  .timeline {\n    padding: 30px;\n  }\n\n  .timeline-list {\n    padding: 0px;\n  }\n\n  .timeline-header {\n    font-size: 40px;\n    margin: 0;\n  }\n\n  .timeline-subheader {\n    font-size: 30px;\n    margin: 0;\n    margin-bottom: 20px;\n  }\n\n  .faq-section {\n    padding: 30px;\n  }\n\n  .hideonmobile {\n    display: none;\n  }\n}\n\n/*who is even using this*/\n@media only screen and (max-width: 300px) {\n  .spinner-item-image {\n    display: none;\n  }\n}\n\n@media only screen and (max-width: 52em) {\n  .timeline-list {\n    grid-template-columns: 1fr;\n  }\n}\n\n.talking {\n  animation: talking 1s infinite;\n}\n@keyframes talking {\n  0% {\n    transform: translateY(0px);\n  }\n\n  50% {\n    transform: translateY(-10px);\n  }\n\n  100% {\n    transform: translateY(0px);\n  }\n}\n\n.project-idea-title {\n  text-align: center;\n}\n\n.blur-box {\n  width: 100%;\n  max-width: 600px;\n  background: rgba(140, 15, 151, 0.3);\n  backdrop-filter: blur(10px);\n  border-radius: 15px;\n  padding: 20px;\n  text-align: center;\n  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);\n  margin: 20px auto;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  box-sizing: border-box;\n}\n\n.title {\n  font-size: 24px;\n  color: #272727;\n  margin-bottom: 20px;\n}\n"
  },
  {
    "path": "public/bin/memes.js",
    "content": "const raccoonMemes = [\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/0screenshot_2024-05-16_at_00.18.39.png',\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/1screenshot_2024-05-16_at_00.18.23.png',\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/2screenshot_2024-05-16_at_00.18.10.png',\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/3screenshot_2024-05-16_at_00.18.01.png',\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/4screenshot_2024-05-16_at_00.17.47.png',\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/5screenshot_2024-05-16_at_00.17.34.png',\n  // \"https://cloud-mymt66p99-hack-club-bot.vercel.app/6screenshot_2024-05-16_at_00.17.03.png\",\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/7screenshot_2024-05-16_at_00.16.55.png',\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/8screenshot_2024-05-16_at_00.16.47.png',\n  'https://cloud-mymt66p99-hack-club-bot.vercel.app/9screenshot_2024-05-16_at_00.16.41.png',\n  'https://cloud-15w2altd8-hack-club-bot.vercel.app/063583bc6dfeca75c4fa5b4a9f777de8ac736131f.jpg',\n  'https://cloud-15w2altd8-hack-club-bot.vercel.app/423cfcde338b5918beda111113e119aebcbf47c90.jpg',\n  'https://cloud-15w2altd8-hack-club-bot.vercel.app/7my-favorite-raccoon-memes-on-insta-v0-rnfh1ut4kpca1.jpg',\n  'https://cloud-15w2altd8-hack-club-bot.vercel.app/6eed531fa624a62ad59ff6a3fdce9a3a7_945977333666952908.webp',\n  'https://cloud-15w2altd8-hack-club-bot.vercel.app/57e6914854ab1b45f5c1c0ed49ae2165a.jpg',\n  'https://cloud-b8au5gtkn-hack-club-bot.vercel.app/0raccoon-nocturnaltrashposts-live-like-every-day-is-trash-day.jpg',\n  'https://cloud-b8au5gtkn-hack-club-bot.vercel.app/1raccoon-memes4.jpg',\n  'https://cloud-b8au5gtkn-hack-club-bot.vercel.app/2raccoon-memes-instagram-624ae8c78c21d__700.jpg',\n  'https://cloud-b8au5gtkn-hack-club-bot.vercel.app/371uzrob1zfl._ac_uf1000_1000_ql80_.jpg',\n  'https://cloud-b8au5gtkn-hack-club-bot.vercel.app/42629715d15647a5c70d2cbb9ec43b489.jpg'\n]\n\nconst getMeme = () => {\n  return sample(raccoonMemes)\n}\n\nwindow.addEventListener('load', async e => {\n  const el = document.querySelector('#meme')\n  el.src = getMeme()\n  el.onclick = () => {\n    el.href = getMeme()\n  }\n})\n"
  },
  {
    "path": "public/bin/orph/orph.css",
    "content": ".orph {\n  position: absolute;\n  z-index: 69420;\n  top: 0;\n  left: 10px;\n  height: 100px;\n  cursor: pointer;\n  transform-origin: top left;\n  transition: 750ms transform ease-in-out;\n}\n\n.orph:hover {\n  transform: rotate(-10deg);\n}\n"
  },
  {
    "path": "public/bin/orph/orph.js",
    "content": "window.addEventListener('load', e => {\n  const link = document.createElement('link')\n  link.href = '../orph.css'\n  link.rel = 'stylesheet'\n\n  document.getElementsByTagName('head')[0].appendChild(link)\n\n  const orph = document.createElement('img')\n  orph.src = '../orph.svg'\n  orph.className = 'orph'\n  orph.draggable = false\n  orph.addEventListener('click', () => {\n    location.href = 'https://hackclub.com'\n  })\n  document.body.appendChild(orph)\n})\n"
  },
  {
    "path": "public/bin/selector/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>The Bin - Selector</title>\n    <link rel=\"stylesheet\" href=\"../style/common.css\" />\n    <link rel=\"stylesheet\" href=\"./style.css\" />\n    <link rel=\"stylesheet\" href=\"../style/footer.css\" />\n    <link\n      rel=\"icon\"\n      type=\"image/png\"\n      sizes=\"32x32\"\n      href=\"https://assets.hackclub.com/favicons/favicon-32x32.png\"\n    />\n    <link\n      rel=\"icon\"\n      type=\"image/png\"\n      sizes=\"16x16\"\n      href=\"https://assets.hackclub.com/favicons/favicon-16x16.png\"\n    />\n    <script src=\"https://awdev.codes/utils/smoothScroll.js\"></script>\n    <script src=\"https://awdev.codes/utils/hackclub/orph.js\"></script>\n    <script src=\"../data-loading.js\"></script>\n    <script\n      defer\n      data-domain=\"hackclub.com\"\n      src=\"https://plausible.io/js/script.js\"\n    ></script>\n    <script>\n      window['_fs_host'] = 'fullstory.com'\n      window['_fs_script'] = 'edge.fullstory.com/s/fs.js'\n      window['_fs_org'] = 'ARN0J'\n      window['_fs_namespace'] = 'FS'\n      !(function (m, n, e, t, l, o, g, y) {\n        var s,\n          f,\n          a = (function (h) {\n            return (\n              !(h in m) ||\n              (m.console &&\n                m.console.log &&\n                m.console.log(\n                  'FullStory namespace conflict. Please set window[\"_fs_namespace\"].'\n                ),\n              !1)\n            )\n          })(e)\n        function p(b) {\n          var h,\n            d = []\n          function j() {\n            h &&\n              (d.forEach(function (b) {\n                var d\n                try {\n                  d = b[h[0]] && b[h[0]](h[1])\n                } catch (h) {\n                  return void (b[3] && b[3](h))\n                }\n                d && d.then ? d.then(b[2], b[3]) : b[2] && b[2](d)\n              }),\n              (d.length = 0))\n          }\n          function r(b) {\n            return function (d) {\n              h || ((h = [b, d]), j())\n            }\n          }\n          return (\n            b(r(0), r(1)),\n            {\n              then: function (b, h) {\n                return p(function (r, i) {\n                  ;(d.push([b, h, r, i]), j())\n                })\n              }\n            }\n          )\n        }\n        a &&\n          ((g = m[e] =\n            (function () {\n              var b = function (b, d, j, r) {\n                function i(i, c) {\n                  h(b, d, j, i, c, r)\n                }\n                r = r || 2\n                var c,\n                  u = /Async$/\n                return u.test(b)\n                  ? ((b = b.replace(u, '')),\n                    'function' == typeof Promise ? new Promise(i) : p(i))\n                  : h(b, d, j, c, c, r)\n              }\n              function h(h, d, j, r, i, c) {\n                return b._api\n                  ? b._api(h, d, j, r, i, c)\n                  : (b.q && b.q.push([h, d, j, r, i, c]), null)\n              }\n              return ((b.q = []), b)\n            })()),\n          (y = function (b) {\n            function h(h) {\n              'function' == typeof h[4] && h[4](new Error(b))\n            }\n            var d = g.q\n            if (d) {\n              for (var j = 0; j < d.length; j++) h(d[j])\n              ;((d.length = 0), (d.push = h))\n            }\n          }),\n          (function () {\n            ;(((o = n.createElement(t)).async = !0),\n              (o.crossOrigin = 'anonymous'),\n              (o.src = 'https://' + l),\n              (o.onerror = function () {\n                y('Error loading ' + l)\n              }))\n            var b = n.getElementsByTagName(t)[0]\n            b && b.parentNode\n              ? b.parentNode.insertBefore(o, b)\n              : n.head.appendChild(o)\n          })(),\n          (function () {\n            function b() {}\n            function h(b, h, d) {\n              g(b, h, d, 1)\n            }\n            function d(b, d, j) {\n              h('setProperties', { type: b, properties: d }, j)\n            }\n            function j(b, h) {\n              d('user', b, h)\n            }\n            function r(b, h, d) {\n              ;(j(\n                {\n                  uid: b\n                },\n                d\n              ),\n                h && j(h, d))\n            }\n            ;((g.identify = r),\n              (g.setUserVars = j),\n              (g.identifyAccount = b),\n              (g.clearUserCookie = b),\n              (g.setVars = d),\n              (g.event = function (b, d, j) {\n                h(\n                  'trackEvent',\n                  {\n                    name: b,\n                    properties: d\n                  },\n                  j\n                )\n              }),\n              (g.anonymize = function () {\n                r(!1)\n              }),\n              (g.shutdown = function () {\n                h('shutdown')\n              }),\n              (g.restart = function () {\n                h('restart')\n              }),\n              (g.log = function (b, d) {\n                h('log', { level: b, msg: d })\n              }),\n              (g.consent = function (b) {\n                h('setIdentity', { consent: !arguments.length || b })\n              }))\n          })(),\n          (s = 'fetch'),\n          (f = 'XMLHttpRequest'),\n          (g._w = {}),\n          (g._w[f] = m[f]),\n          (g._w[s] = m[s]),\n          m[s] &&\n            (m[s] = function () {\n              return g._w[s].apply(this, arguments)\n            }),\n          (g._v = '2.0.0'))\n      })(window, document, window._fs_namespace, 'script', window._fs_script)\n    </script>\n  </head>\n\n  <body>\n    <div class=\"selector-container\">\n      <div class=\"selector-header\">\n        <h1 class=\"selector-title\">The Bin - Selector</h1>\n        <button class=\"selector-continue\">\n          Continue<img src=\"../icons/arrow.svg\" />\n        </button>\n      </div>\n      <div class=\"selector-main\"></div>\n      <span class=\"selector-number\"></span>\n    </div>\n    <script src=\"./script.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/bin/selector/script.js",
    "content": "const partsLimit = 8\nvar fetchedParts\n\n/*\nasync function preloadImage(item) {\n    let response = await fetch(item.imageUrl);\n    let blob = response.blob();\n    return blob\n}\nasync function saveImageToCache(item) {\n    const image = await preloadImage(item)\n    const blob = URL.createObjectURL(image)\n    localStorage.setItem(item.wokwiName, blob);\n    addPartToPage(item)\n}*/\nfunction getSelectedItems() {\n  return document.querySelectorAll('.selected')\n}\nfunction recalculateSelected() {\n  let numSelectedItems = getSelectedItems().length\n  let selections = []\n  items = document.querySelectorAll('.selector-item')\n  document.querySelector('.selector-number').innerText =\n    `${partsLimit - numSelectedItems} choices remaining.`\n  if (partsLimit - numSelectedItems == 0) {\n    items.forEach(item => {\n      let isSelected = item.className.includes('selected')\n      if (!isSelected) {\n        item.classList.add('disabled')\n      }\n    })\n    document.querySelector('.selector-number').classList.add('disabled')\n  } else {\n    items.forEach(item => {\n      let isDisabled = item.className.includes('disabled')\n      if (isDisabled) {\n        item.classList.remove('disabled')\n      }\n    })\n    document.querySelector('.selector-number').classList.remove('disabled')\n  }\n  getSelectedItems().forEach(item => {\n    selections.push(item.getAttribute('part_name'))\n  })\n  return selections\n}\n\nfunction addPartToPage(part) {\n  /*\n    <div part_name=\"mic\" class=\"selector-item\">\n        <img class=\"selector-image\" src=\"../parts/mic.png\">\n        <div class=\"selector-item-name\">Mic</div>\n        <div class=\"selector-item-description\">Records sounds</div>\n    </div>\n    */\n  let selectorItem = document.createElement('div')\n  selectorItem.setAttribute('part_name', part.wokwiName)\n  selectorItem.className = 'selector-item'\n\n  let selectorImage = document.createElement('img')\n  selectorImage.src = part.imageUrl\n  selectorImage.className = 'selector-image'\n  selectorItem.appendChild(selectorImage)\n\n  let selectorItemName = document.createElement('div')\n  selectorItemName.innerText = part.name\n  selectorItemName.className = 'selector-item-name'\n  selectorItem.appendChild(selectorItemName)\n\n  let selectorItemDesc = document.createElement('div')\n  selectorItemDesc.innerText = part.flavorText\n  selectorItemDesc.className = 'selector-item-description'\n  selectorItem.appendChild(selectorItemDesc)\n  if (part.newPart) {\n    let newImage = document.createElement('img')\n    newImage.src = '../icons/new.png'\n    newImage.className = 'new-tag'\n    selectorItem.appendChild(newImage)\n  }\n\n  document.getElementsByClassName('selector-main')[0].appendChild(selectorItem)\n\n  if (part.outOfStock) {\n    //   selectorItem.classList.add(\"outOfStock\");\n\n    let outOfStockDiv = document.createElement('div')\n    outOfStockDiv.className = 'outOfStock'\n\n    let outOfStockText = document.createElement('h1')\n    outOfStockText.innerText = 'Out of Stock'\n    outOfStockText.className = 'outOfStockText'\n\n    let outOfStockInnerText = document.createElement('p')\n    outOfStockInnerText.innerText = 'Shipping times delayed'\n    outOfStockInnerText.className = 'outOfStockInnerText'\n\n    outOfStockDiv.appendChild(outOfStockText)\n    outOfStockDiv.appendChild(outOfStockInnerText)\n\n    selectorItem.appendChild(outOfStockDiv)\n  }\n\n  if (\n    part.displayAmount &&\n    part.currentStockIncludingNonFulfilled < 6 &&\n    !part.outOfStock\n  ) {\n    let stockDiv = document.createElement('div')\n    stockDiv.className = 'amountRemaining'\n\n    let stockText = document.createElement('h1')\n    stockText.innerText =\n      part.currentStockIncludingNonFulfilled + ' left in stock'\n    stockText.className = 'outOfStockText'\n\n    let stockInnerText = document.createElement('p')\n    stockInnerText.innerText = 'Shipping times may be delayed'\n    stockInnerText.className = 'outOfStockInnerText'\n\n    stockDiv.appendChild(stockText)\n    stockDiv.appendChild(stockInnerText)\n    selectorItem.appendChild(stockDiv)\n\n    console.log('display amunt' + part.displayAmount)\n    console.log('current stock' + part.currentStockIncludingNonFulfilled)\n\n    console.log('out of stock' + part.outOfStock)\n  }\n  selectorItem.addEventListener('click', () => {\n    let isSelected = selectorItem.className.includes('selected')\n    if (isSelected) {\n      selectorItem.classList.remove('selected')\n    } else {\n      if (getSelectedItems().length < partsLimit) {\n        selectorItem.classList.add('selected')\n      }\n    }\n    recalculateSelected()\n  })\n}\n\nwindow.addEventListener('load', async e => {\n  console.log('Page loaded')\n  recalculateSelected()\n  const fetchedParts = await partsData()\n  console.log('fetchedParts', fetchedParts)\n  fetchedParts.forEach(part => {\n    if (!(part.imageUrl == undefined)) {\n      addPartToPage(part)\n    }\n  })\n\n  document.querySelector('.selector-continue').onclick = () => {\n    let selectedItems = getSelectedItems()\n    let selectedItemsArray = []\n    selectedItems.forEach(item => {\n      selectedItemsArray.push(item.getAttribute('part_name'))\n    })\n    const partsList = encodeURI(recalculateSelected().sort().join('|'))\n    window.location.href = `/api/bin/wokwi/new/${partsList}`\n  }\n})\n"
  },
  {
    "path": "public/bin/selector/style.css",
    "content": ".selector-container {\n  display: flex;\n  padding: 40px;\n  flex-direction: column;\n  gap: 30px;\n  margin-top: 50px;\n}\n\n.selector-header {\n  height: fit-content;\n  display: flex;\n  align-items: end;\n  width: 100%;\n}\n\n.selector-title {\n  font-weight: bolder;\n  font-size: 80px;\n}\n\n.selector-continue {\n  font-weight: bolder;\n  border: none;\n  font-size: 40px;\n  padding: 5px 30px;\n  margin-left: auto;\n  height: 100%;\n  cursor: pointer;\n  border-radius: 20px;\n  background-color: #9feeb5;\n\n  display: flex;\n  align-items: center;\n  gap: 20px;\n}\n\n.selector-main {\n  display: grid;\n  flex-grow: 1;\n  width: 100%;\n  gap: 20px;\n  justify-content: space-around;\n  grid-template-columns: repeat(4, 1.5fr);\n}\n\n.selector-item {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: flex-end;\n  width: calc(100vw / 4.5);\n  aspect-ratio: 1;\n  background-color: #dbdec3;\n  padding: 20px;\n  border-radius: 20px;\n  gap: 5px;\n  box-sizing: border-box;\n  cursor: pointer;\n  filter: grayscale(0) brightness(1);\n  transition: filter 300ms;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Optional: Adds a shadow for a more polished look */\n}\n\n.new-tag {\n  position: absolute;\n  top: 17%;\n  right: -38%;\n  transform: translate(-50%, -50%) rotate(45deg); /* Adjust rotation angle as needed */\n  width: 60%;\n  height: auto;\n}\n\n.new-tag:hover {\n  transform: translate(-50%, -50%) rotate(30deg); /* Slight rotation on hover */\n}\n\n.selector-item:hover {\n  background-color: #bcbda7;\n  transform: translate(0%, 0%) scale(1.05); /* Slight rotation on hover */\n}\n\n.selector-item.disabled {\n  filter: grayscale(1) brightness(0.7);\n}\n\n.selector-item.outOfStock {\n  filter: grayscale(1) brightness(0.7);\n}\n\n.selector-item.selected {\n  outline: 3px solid #867dec;\n  background-color: #cbcdbc;\n}\n\n.selector-image {\n  display: block;\n  height: 60%;\n}\n\n.selector-item-name {\n  font-size: 35px;\n  font-weight: bold;\n}\n\n.selector-item-description {\n  font-size: 25px;\n  font-weight: normal;\n}\n\n.selector-number {\n  font-weight: bold;\n  font-size: 30px;\n  position: fixed;\n  bottom: 30px;\n  right: 50px;\n  padding: 10px 30px;\n  background-color: #867dec;\n  border-radius: 50px;\n  filter: grayscale(0);\n  transition: filter 300ms;\n}\n\n.selector-number.disabled {\n  filter: grayscale(0.8);\n}\n\n.outOfStock {\n  position: absolute;\n  background-color: aliceblue;\n  top: 17%;\n  left: 23%;\n  transform: translate(-50%, -50%) rotate(-35deg); /* Adjust rotation angle as needed */\n  display: flex;\n  display: table-column;\n  border-radius: 20px; /* Smooth corners */\n  background: linear-gradient(\n    135deg,\n    #74ebd5 0%,\n    #acb6e5 100%\n  ); /* Nice gradient color */\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Optional: Adds a shadow for a more polished look */\n}\n\n.outOfStock:hover {\n  transform: translate(-50%, -50%) rotate(-30deg); /* Slight rotation on hover */\n}\n\n.amountRemaining {\n  position: absolute;\n  background-color: aliceblue;\n  top: 17%;\n  left: 23%;\n  transform: translate(-50%, -50%) rotate(-35deg); /* Adjust rotation angle as needed */\n  display: flex;\n  display: table-column;\n  border-radius: 20px; /* Smooth corners */\n  background: linear-gradient(\n    135deg,\n    #f8cc08 0%,\n    #df3d01 100%\n  ); /* Nice gradient color */\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Optional: Adds a shadow for a more polished look */\n}\n\n.amountRemaining:hover {\n  transform: translate(-50%, -50%) rotate(-30deg); /* Slight rotation on hover */\n}\n\n.outOfStockText {\n  position: relative;\n  padding-top: 10px;\n  padding-left: 10px;\n  padding-right: 10px;\n  white-space: nowrap;\n}\n\n.outOfStockInnerText {\n  position: relative;\n  padding-left: 10px;\n  padding-right: 10px;\n  white-space: nowrap;\n  padding-bottom: 10px;\n}\n\n.flex-lb {\n  width: 100%;\n  display: block;\n  height: 40px;\n}\n\n@media screen and (aspect-ratio: 4/3) {\n  .selector-item {\n    width: 220px;\n  }\n\n  .selector-item-name {\n    font-size: 30px;\n  }\n\n  .selector-item-description {\n    font-size: 19px;\n  }\n\n  .flex-lb {\n    height: 20px;\n  }\n}\n\n@media only screen and (hover: none) and (pointer: coarse) {\n  .selector-header {\n    flex-direction: column;\n    align-items: center;\n  }\n\n  .selector-continue {\n    margin: 0;\n    font-size: 30px;\n    height: 40px;\n  }\n\n  .selector-continue img {\n    height: 100%;\n  }\n\n  .selector-number {\n    left: 50%;\n    text-wrap: nowrap;\n    transform: translateX(-50%);\n    width: fit-content;\n  }\n\n  .selector-item {\n    width: 40vw;\n    flex-grow: 1;\n    height: 100%;\n  }\n\n  .selector-item-name {\n    font-size: 30px;\n    text-align: center;\n    text-overflow: ellipsis;\n    overflow-x: hidden;\n    width: 100%;\n  }\n\n  .selector-item-description {\n    font-size: 20px;\n  }\n\n  .selector-image {\n    height: 110px;\n  }\n\n  .selector-container {\n    margin-top: 60px;\n  }\n}\n"
  },
  {
    "path": "public/bin/style/common.css",
    "content": "@font-face {\n  font-family: 'Lexend';\n  src: url('./Lexend.ttf');\n}\n\n@font-face {\n  font-family: 'Phantom Sans';\n  src: url('./PhantomSans_Regular.woff');\n}\n\n@font-face {\n  font-family: 'Phantom Sans';\n  src: url('./PhantomSans_Bold.woff');\n  font-weight: bold;\n}\n\n@font-face {\n  font-family: 'Helvetica';\n  src: url('./helvetica.woff') format('woff');\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: 'Helvetica';\n  src: url('./helvetica-bold.woff') format('woff');\n  font-weight: bold;\n  font-style: normal;\n}\n\nbody {\n  background-color: #ebece0;\n  background-image: url(../icons/new-background.svg);\n  background-size: 50px;\n  background-repeat: repeat;\n  margin: 0;\n}\n\n* {\n  font-family: 'Phantom Sans';\n}\n\nh1,\nh2,\nh3,\nh4,\nh5 {\n  margin: 0;\n  font-weight: bolder;\n}\n\np {\n  margin: 0;\n}\n"
  },
  {
    "path": "public/bin/style/footer.css",
    "content": "footer {\n  background-color: #f9fafc;\n  padding-top: 64px;\n  padding-bottom: 64px;\n  box-sizing: border-box;\n}\n\n.footer-wrapper {\n  max-width: 1200px;\n  margin: auto;\n  padding: 0 32px;\n  box-sizing: border-box;\n}\n\n.footer-information {\n  box-sizing: border-box;\n  margin: 0;\n  min-width: 0;\n  padding-bottom: 32px;\n  box-sizing: border-box;\n}\n\n.footer-information a {\n  color: inherit;\n}\n\n.footer-information-header {\n  font-size: 20px;\n  margin-bottom: 8px;\n  color: #3c4858;\n}\n\n.footer-information p {\n  color: #8492a6;\n  line-height: 1.375;\n  width: 60%;\n  margin-bottom: 16px;\n  text-underline-offset: 5px;\n}\n\n.footer-information p a:hover {\n  text-decoration-style: wavy;\n  text-underline-offset: 3px;\n}\n\n.footer-links {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  color: #8492a6;\n}\n\n.footer-links-column {\n  display: flex;\n  flex-direction: column;\n}\n\n.footer-links h2 {\n  font-size: 24px;\n  margin-bottom: 16px;\n}\n\n.footer-links a {\n  color: #8492a6;\n  font-size: 20px;\n  margin-bottom: 8px;\n  text-decoration: none;\n  display: block;\n  font-weight: 400;\n}\n\n.footer-links a:hover {\n  text-decoration: underline;\n  text-underline-offset: 5px;\n  color: #3c4858;\n}\n\n.footer-icons-container {\n  display: grid;\n  max-width: 192px;\n  grid-template-columns: repeat(4, 1fr);\n  align-items: center;\n  margin-left: -4px;\n  margin-top: 16px;\n  margin-bottom: 16px;\n}\n\n.footer-icons-container a {\n  margin-bottom: 0px;\n}\n\n.footer-tel {\n  display: block;\n  font-size: 20px;\n}\n\n.footer-cr-info {\n  color: #8492a6;\n  margin-top: 16px;\n}\n"
  },
  {
    "path": "public/bin/style/gallery.module.css",
    "content": ".gallery_card {\n  flex: 1;\n  break-inside: avoid;\n  border-radius: 0.5rem; /* Equivalent to rounded-lg */\n  background-color: rgba(158, 158, 158, 0.2); /* Equivalent to bg-white/20 */\n  background-clip: padding-box; /* Equivalent to bg-clip-padding */\n  padding: 1.5rem 1.5rem 1rem 1.5rem; /* Equivalent to p-6 pb-4 */\n  cursor: pointer;\n  box-shadow:\n    0 10px 15px -3px rgba(0, 0, 0, 0.1),\n    0 4px 6px -2px rgba(0, 0, 0, 0.05); /* Equivalent to shadow-lg */\n  height: fit-content; /* Equivalent to h-fit */\n  width: 100%; /* Make the card width responsive within the column */\n  margin-bottom: 24px; /* Add space between cards vertically */\n}\n\n.gallery_card:hover {\n  background-color: rgba(148, 79, 0, 0.2);\n  transform: translateY(-2px); /* Equivalent to hover:shadow-lg */\n}\n\n.feed {\n  min-height: 1000px;\n  padding-top: 32px;\n  padding-bottom: 32px;\n  width: 100%;\n  overflow-y: auto;\n  overflow-x: hidden;\n  align-self: center;\n  column-gap: 24px;\n  padding: 24px;\n\n  @media (min-width: 640px) {\n    column-count: 1;\n  }\n\n  /* Medium screens */\n  @media (min-width: 768px) {\n    column-count: 2;\n  }\n\n  /* Large screens */\n  @media (min-width: 1024px) {\n    column-count: 3;\n  }\n}\n\n.title {\n  font-family: 'Phantom Sans';\n  font-size: 5rem;\n  font-weight: 700;\n  text-align: center;\n  color: #333;\n  letter-spacing: 0.05em;\n  text-transform: uppercase;\n  margin-bottom: 1rem;\n  background: linear-gradient(to right, #f5740b, #d9a406, #fdff78);\n  -webkit-background-clip: text;\n  background-clip: text;\n  color: transparent;\n}\n\n.sub_title {\n  font-family: 'Phantom Sans';\n  margin-top: -40px;\n  font-size: 2rem;\n  font-weight: 700;\n  text-align: center;\n  color: #808080;\n  margin-bottom: 1rem;\n  text-transform: uppercase;\n  text-shadow: 5px 5px 8px rgba(0, 0, 0, 0.1);\n}\n\n.pageBackground {\n  background-color: #1c1c1c;\n  height: 100vh;\n  width: 100%;\n  margin: 0;\n  margin-top: -66.5px;\n}\n\n.background {\n  width: 100%;\n  height: 100%;\n  background-color: #333;\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: -1;\n}\n\n.card_title {\n  font-family: 'Trebuchet MS';\n  font-size: 1.5rem;\n  font-weight: 700;\n  text-align: left;\n  color: #e1e1e1;\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\n.card_desc {\n  font-family: 'Phantom Sans';\n  text-align: left;\n  color: #a7a7a7;\n  margin-bottom: 1rem;\n}\n\n.bin_home {\n  display: flex;\n  margin-top: -40px;\n  margin-left: 200px;\n}\n\n.nav {\n  width: 100%;\n  display: flex;\n  padding-left: 200px;\n  padding-top: -20px;\n  background-color: rgba(\n    255,\n    255,\n    255,\n    0.3\n  ); /* Semi-transparent background color */\n  backdrop-filter: blur(10px); /* Blur everything behind the div */\n  -webkit-backdrop-filter: blur(10px); /* For Safari support */\n  overflow: hidden; /* Hide any overflow content */\n}\n\n.loading {\n  font-size: 48px;\n  color: #a7a7a7; /* Change text color as needed */\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);\n}\n\n.dots::after {\n  content: '...';\n  animation: dots 1.5s infinite;\n}\n\n@keyframes dots {\n  0% {\n    content: '.';\n  }\n  25% {\n    content: '..';\n  }\n  50% {\n    content: '...';\n  }\n  75% {\n    content: '..';\n  }\n  100% {\n    content: '.';\n  }\n}\n\n.img_container {\n  width: 100%; /* Adjust the width as needed, e.g., 80% or a fixed width */\n  height: 300px; /* Set a specific height or make it responsive */\n  overflow: hidden; /* Hide any overflow from the image */\n  position: relative; /* Ensure the container can position the image correctly */\n}\n\n/* Style for the image */\n.img_container img {\n  width: 100%; /* Ensure the image stretches to fit the container width */\n  height: 100%; /* Ensure the image stretches to fit the container height */\n  object-fit: cover; /* Maintain aspect ratio and cover the container */\n  display: block; /* Remove any default inline spacing */\n}\n\n.nav_button {\n  display: inline-block;\n  padding: 20px 20px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  font-size: 16px;\n  font-family: monospace;\n  text-align: center;\n  cursor: pointer;\n  transition:\n    background-color 0.3s,\n    border-color 0.3s;\n  color: #202020;\n}\n\n.nav_button:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\n.date {\n  color: gray; /* Sets the text color to gray */\n  font-size: 14px; /* Optional: adjusts the font size */\n  font-family: Arial, sans-serif; /* Optional: sets the font family */\n  margin: 5px; /* Optional: removes default margins */\n  padding: 0; /* Optional: removes default padding */\n}\n\n.tag_container {\n  padding: 5px;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n  align-items: center;\n}\n\n.tag_search_container {\n  margin: 20px;\n  padding: 5px;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n  align-items: center;\n}\n\n.slack {\n  color: #e1e1e1;\n}\n\n.header_div {\n  width: 100%;\n  height: 100%;\n  padding-bottom: 100px;\n  background-color: #dfdbcf;\n  background-image: url('../images/Frame.svg');\n  background-size: cover;\n  background-position: center;\n  background-repeat: no-repeat;\n  margin-bottom: 30px;\n  min-height: 400px;\n}\n\n.search_input {\n  display: block;\n  width: 100%;\n  border-radius: 0.375rem; /* rounded-md */\n  border: 1px solid #e5e7eb; /* border-gray-200 */\n  background-color: #ffffff; /* bg-white */\n  padding: 0.625rem 3rem 0.625rem 1.25rem; /* py-2.5 pl-5 pr-12 */\n  font-family: 'Satoshi', sans-serif; /* font-satoshi */\n  font-size: 0.875rem; /* text-sm */\n  box-shadow:\n    0 10px 15px -3px rgba(0, 0, 0, 0.1),\n    0 4px 6px -2px rgba(0, 0, 0, 0.05); /* shadow-lg */\n  font-weight: 500; /* font-medium */\n  transition: border-color 0.2s;\n  margin-top: 2rem;\n}\n\n.tag_text {\n  font-family: 'Phantom Sans';\n  margin: 20px;\n\n  font-size: 2rem;\n  font-weight: 700;\n  text-align: center;\n  color: #e1e1e1;\n  margin-bottom: 1rem;\n  text-transform: uppercase;\n  text-shadow: 5px 5px 8px rgba(0, 0, 0, 0.1);\n}\n\n.first {\n  text-align: center;\n  font-size: 1.5rem;\n  font-weight: 700;\n  color: #e1e1e1;\n}\n\n.second {\n  font-size: 1.5rem;\n  font-weight: 700;\n  text-decoration: underline;\n  color: orange;\n  cursor: pointer;\n}\n\n.third {\n  font-size: 1.5rem;\n  font-weight: 700;\n  color: #e1e1e1;\n}\n\n.text_container {\n  text-align: center;\n}\n"
  },
  {
    "path": "public/carousel.json",
    "content": "[\n  {\n    \"background\": \"linear-gradient(to bottom right, #993CCF 0%, rgba(170, 77, 181, 0.95) 17.19%, rgba(193, 99, 146, 0.90) 31.77%, rgba(223, 129, 101, 0.71) 52.08%, rgba(240, 146, 75, 0.60) 63.54%)\",\n    \"titleColor\": \"white\",\n    \"descriptionColor\": \"white\",\n    \"title\": \"Jams\",\n    \"description\": \"Collaborative coding workshops where sparks ignite, fears dissolve, and inventions come to life\",\n    \"img\": \"https://cloud-7xyxcf3f6-hack-club-bot.vercel.app/0new_project__3_.png\",\n    \"link\": \"https://jams.hackclub.com\"\n  },\n  {\n    \"background\": \"linear-gradient(to bottom right, rgba(176, 209, 253, 0.7), rgba(222, 215, 247, 0.7))\",\n    \"titleColor\": \"#5B4A8A\",\n    \"descriptionColor\": \"#3D6098\",\n    \"title\": \"Sleepover\",\n    \"description\": \"Learn to code, earn prizes like plushies and iPads, and fly out to an all girls slumber party in Chicago!\",\n    \"img\": \"https://cdn.hackclub.com/019c76b5-f328-725e-9d6d-4f5368685ab5/tNACWw.png\",\n    \"link\": \"https://sleepover.hackclub.com/?utm_source=site-carousel\"\n  },\n  {\n    \"background\": \"#D6CEBD\",\n    \"titleColor\": \"#D95D39\",\n    \"descriptionColor\": \"#443C38\",\n    \"title\": \"Stasis\",\n    \"description\": \"Get your hardware projects funded and fly to the coolest hardware hackathon in Austin, Texas this May.\",\n    \"img\": \"https://cdn.hackclub.com/019c76ba-6439-7c9e-ac28-813ad404e0b5/i8kaDQ.png\",\n    \"link\": \"https://stasis.hackclub.com/?utm_source=site-carousel\"\n  },\n  {\n    \"background\": \"#5F1212\",\n    \"titleColor\": \"#FAD10B\",\n    \"descriptionColor\": \"white\",\n    \"title\": \"Jackpot\",\n    \"description\": \"No hours required...enjoy a weekend Hackathon in Las Vegas!\",\n    \"img\": \"https://cdn.hackclub.com/019d01dd-6b56-748a-8386-8f77bad07d46/meow.png\",\n    \"link\": \"https://jackpot.hackclub.com/?utm_source=site-carousel\"\n  },\n  {\n    \"background\": \"#38C9FF\",\n    \"titleColor\": \"#FFFFFF\",\n    \"descriptionColor\": \"#FFFFFF\",\n    \"title\": \"Fallout\",\n    \"description\": \"Build hardware projects, track your hours, then attend a hardware hackathon in Shenzhen!\",\n    \"img\": \"https://cdn.hackclub.com/019ce03a-13c1-7723-b8be-85d1e96268d2/soup.webp\",\n    \"link\": \"https://fallout.hackclub.com/?utm_source=site-carousel\"\n  },\n  {\n    \"background\": \"#684D3A\",\n    \"titleColor\": \"#EACFB3\",\n    \"descriptionColor\": \"#EACFB3\",\n    \"title\": \"Macondo\",\n    \"description\": \"Make hardware or software projects, win free prizes, and fly to Bogotá, Colombia for a hackathon!\",\n    \"img\": \"https://cdn.hackclub.com/019dc21b-d702-72d2-9930-487a4f7cfd9a/android-chrome-512x512.webp\",\n    \"link\": \"https://macondo.hackclub.com/?utm_source=site-carousel\"\n  },\n  {\n    \"background\": \"#ffd966\",\n    \"titleColor\": \"black\",\n    \"descriptionColor\": \"black\",\n    \"title\": \"Hack Club: The Game\",\n    \"description\": \"Build projects, then compete in a scavenger hunt adventure game across Manhattan!\",\n    \"img\": \"https://cdn.hackclub.com/019d08bf-e472-7f05-87ad-b46ee5a7c51d/hctg-circular.png\",\n    \"link\": \"https://game.hackclub.com/?utm_source=site-carousel\"\n  },\n  {\n    \"background\": \"#C76B0F\",\n    \"titleColor\": \"#F6D193\",\n    \"descriptionColor\": \"#F6D193\",\n    \"title\": \"Boba Drops\",\n    \"description\": \"Build a static site with HTML and CSS, get free boba!\",\n    \"img\": \"https://cloud-oil5vh30l-hack-club-bot.vercel.app/0boba_hc_toolbox.png\",\n    \"link\": \"https://hack.club/boba\"\n  },\n  {\n    \"background\": \"snow\",\n    \"titleColor\": \"dark\",\n    \"descriptionColor\": \"black\",\n    \"title\": \"Putting The \\\"You\\\" In CPU\",\n    \"description\": \"Curious exactly what happens when you run a program on your computer? Read this.\",\n    \"img\": \"https://cloud-eg2ex8nol-hack-club-bot.vercel.app/0favicon-on-light-removebg-preview.png\",\n    \"link\": \"https://cpu.land\"\n  },\n  {\n    \"background\": \"#000\",\n    \"titleColor\": \"green\",\n    \"descriptionColor\": \"white\",\n    \"title\": \"Sprig\",\n    \"description\": \"Join hundreds of teenagers making tile-based JavaScript games\",\n    \"img\": \"https://emoji.slack-edge.com/T0266FRGM/sprig-dino/6f01fec60b51b343.png\",\n    \"link\": \"https://sprig.hackclub.com\"\n  },\n  {\n    \"background\": \"snow\",\n    \"titleColor\": \"dark\",\n    \"descriptionColor\": \"black\",\n    \"title\": \"Some Assembly Required\",\n    \"description\": \"The 4th most starred Assembly repository on GitHub\",\n    \"img\": \"https://emoji.slack-edge.com/T0266FRGM/someassemblyrequired/cfacfacaaa2d8b1d.png\",\n    \"link\": \"https://github.com/hackclub/some-assembly-required\"\n  },\n  {\n    \"background\": \"#271932\",\n    \"titleColor\": \"#CAB4D4\",\n    \"textColor\": \"#CAB4D4\",\n    \"title\": \"SineRider\",\n    \"description\": \"Help build a game about love, math, and graphing 💖\",\n    \"img\": \"https://emoji.slack-edge.com/T0266FRGM/sinerider/68a0bc1208e885dd.png\",\n    \"link\": \"https://sinerider.com\"\n  },\n  {\n    \"background\": \"#e9e9e9\",\n    \"titleColor\": \"black\",\n    \"textColor\": \"black\",\n    \"descriptionColor\": \"black\",\n    \"title\": \"Nest\",\n    \"description\": \"Free Linux server for all Hack Clubbers to host anything they need\",\n    \"img\": \"https://emoji.slack-edge.com/T0266FRGM/nest/aa345378581cee0c.png\",\n    \"link\": \"https://hackclub.app\"\n  },\n  {\n    \"background\": \"#ec3750\",\n    \"titleColor\": \"white\",\n    \"descriptionColor\": \"white\",\n    \"title\": \"YSWS Programs\",\n    \"description\": \"Build something amazing, and Hack Club will ship you something epic in return.\",\n    \"img\": \"https://cdn.hackclub.com/019c16fa-1702-70f9-8fac-bc4d2731756d/image.png\",\n    \"link\": \"https://ysws.hackclub.com\"\n  },\n  {\n    \"background\": \"#7B4942\",\n    \"titleColor\": \"white\",\n    \"descriptionColor\": \"#f0dcc8\",\n    \"title\": \"Flavortown\",\n    \"description\": \"Build projects, earn cookies, and exchange them for iPads, MacBooks, and more!\",\n    \"img\": \"https://cdn.hackclub.com/019c76b5-b513-7f5a-8718-bea38d4abb80/DM6Ztg.avif\",\n    \"link\": \"https://flavortown.hackclub.com/?ref=site-carousel\"\n  },\n  {\n    \"background\": \"#30AE1F\",\n    \"titleColor\": \"#FFFFFF\",\n    \"descriptionColor\": \"#FFFFFF\",\n    \"title\": \"HackCraft\",\n    \"description\": \"Ship a mod - Get Minecraft\",\n    \"img\": \"https://emoji.slack-edge.com/T09V59WQY1E/minecraft/308decaa00e556b9.png\",\n    \"link\": \"https://hackcraft.hackclub.com/\"\n  }\n]\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nSitemap: https://hackclub.com/sitemap.xml\n"
  },
  {
    "path": "public/stickers-in-stock.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Hack Club | Available Stickers</title>\n    <link\n      rel=\"stylesheet\"\n      href=\"https://cdn.jsdelivr.net/npm/water.css@2/out/water.css\"\n    />\n    <link rel=\"favicon\" href=\"/favicon.png\" />\n    <link rel=\"shortcut icon\" href=\"/favicon.png\" />\n    <link rel=\"icon\" href=\"/favicon.png\" />\n  </head>\n  <body>\n    <h1>Available Hack Club Stickers</h1>\n    <h2 id=\"header\">Stickers In-Stock</h2>\n    <table>\n      <thead>\n        <tr>\n          <th>Name</th>\n          <th>Image</th>\n        </tr>\n      </thead>\n      <tbody id=\"body\">\n        <tr>\n          <td>Loading...</td>\n          <td>Please wait</td>\n        </tr>\n      </tbody>\n    </table>\n    <script>\n      const header = document.querySelector('#header')\n      const tbody = document.querySelector('#body')\n\n      fetch('https://arcade-stickers.hackclub.dev/api/skus/all')\n        .then(response => response.json())\n        .then(data => {\n          console.log(data)\n          blocked = false\n          tbody.innerHTML = `\n                    ${data.items\n                      .map(\n                        i => `\n                        <tr>\n                            <td>${i.name}</td>\n                            <td><img src=\"${i.picture}\" alt=\"${i.name}\" width=\"100\"></td>\n                        </tr>\n                    `\n                      )\n                      .join('')}\n                `\n          header.textContent = `Stickers In-Stock (${data.items.length})`\n        })\n        .catch(err => {\n          console.error(err)\n          blocked = false\n          tbody.innerHTML = `<tr>\n                    <td>Error</td>\n                    <td>Error</td>\n                </tr>`\n        })\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/team.json",
    "content": "[\n  {\n    \"name\": \"Louisa\",\n    \"department\": \"Moderation\",\n    \"role\": \"Community Moderation Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"Louisa is a high schooler from Kenya who helps lead the Hack Club Community moderation dept\",\n    \"slackId\": \"\",\n    \"email\": \"louisa\",\n    \"website\": \"U06EMBJH71S\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06EMBJH71S/r\"\n  },\n  {\n    \"name\": \"Amogh Chaubey\",\n    \"department\": \"Community\",\n    \"role\": \"Community + Events\",\n    \"acknowledged\": false,\n    \"bio\": \"Amogh is all about having fun. Whether it’s running an art showcase on the Slack or massive Kahoots at hackathons, he loves to run awesome events. Amogh joined HQ to run spectacular community events, to make Hack Club the best place to be a teenager on the internet, and as Hack Club’s second best rapper.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-qz70b5lb7-hack-club-bot.vercel.app/0tsw6s4shwqjyta7_thumbnail.jpg\"\n  },\n  {\n    \"name\": \"Eesha\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Events Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"Eesha is a 17 year old Hack Clubber from the USA who enjoys robotics, physics, and programming websites. She also likes doing nail art and learning about art history. When working, she likes to listen to Paramore or NF. She has been involved in Hack Club since March 2024, where she manages virtual events.\",\n    \"slackId\": \"U06QST7V0J2\",\n    \"email\": \"eesha\",\n    \"website\": \"https://eesha-kothari.com\",\n    \"avatar\": \"https://i.ibb.co/hpgc4Yt/eesha.jpg\"\n  },\n  {\n    \"name\": \"Claire Wang\",\n    \"department\": \"Community\",\n    \"role\": \"Community\",\n    \"acknowledged\": false,\n    \"bio\": \"Claire works on the Community Team and was a previous summer intern. She hopes to make the community both more welcoming and more technical, as well as inspire beginners to love STEM and making. She first joined Hack Club in 8th grade because of an online competition, and has been running a Hack Club ever since then. In addition to CS, she loves neuroscience, sci-fi, debate, and creating Spotify playlists.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-du0sm2210-hack-club-bot.vercel.app/1image.png\"\n  },\n  {\n    \"name\": \"Maggie Liu\",\n    \"department\": \"Community\",\n    \"role\": \"Moderation & Events\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U026XSMKEDC\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-r5ual6hw1-hack-club-bot.vercel.app/0xo8a0seoqnzxofema_512.png\"\n  },\n  {\n    \"name\": \"Mingjie Jiang\",\n    \"department\": \"Community\",\n    \"role\": \"Community\",\n    \"acknowledged\": false,\n    \"bio\": \"Mingjie started working with Hack Club in July 2017, while leading his club in Rockville, Maryland, working on community engagement & public identity. He’s also run Hack Chicago, CodeDay, and countless other hackathons to spread his passion for technology.\",\n    \"slackId\": \"\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cloud-5s053nrkt-hack-club-bot.vercel.app/0image.png\"\n  },\n  {\n    \"name\": \"Aishaani\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Aishaani is a 15 year old Hack Clubber from Canada. She focuses on organizing and supporting virtual events through Slack as part of the Special Activities Division and loves organizing hackathons. She revolves around all things tech; hardware, web development, 3D design/CAD... and sometimes helps out with art for Hack Club projects. In her free time, she enjoys listening to music and producing her own songs, writing, rollerblading, and ice skating. She is also working on her podcast series, Orbiting the Future.\",\n    \"slackId\": \"U097UCZE2BB\",\n    \"email\": \"\",\n    \"website\": \"https://j-ai.pages.dev/\",\n    \"avatar\": \"https://i.ibb.co/DPKBJt0C/aishaani.png\"\n  },\n  {\n    \"name\": \"Charlotte\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Charlotte is a 16-year-old aspiring software engineer and AI enthusiast. As a Virtual Events member, she organizes virtual events in the Slack to make Hack Club a closer community, and outside of Hack Club she programs for her school's FIRST robotics team, 2415, and runs on cross country. In the past, she has organized Daydream Atlanta, a Hack Club affiliated satellite event, and qualified for Shipwrecked, a four-day island hackathon. In her free time, she enjoys building projects, whether coding a Flask website, creating a game in Godot, or, more recently, exploring CAD in Onshape.\",\n    \"slackId\": \"U084T4KCZ8Q\",\n    \"email\": \"\",\n    \"website\": \"https://www.charlottewoodrum.dev/\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U084T4KCZ8Q/r\"\n  },\n  {\n    \"name\": \"Irtaza\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Irtaza is a 15 year old Hack Clubber from Pakistan who runs virtual events for the Hack Club community.\",\n    \"slackId\": \"U079EQY9X1D\",\n    \"email\": \"\",\n    \"website\": \"https://irtaza.xyz/portfolio\",\n    \"avatar\": \"https://i.ibb.co/Cp7kZ2gd/irtaza.jpg\"\n  },\n  {\n    \"name\": \"Lucas Honda\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Lucas is a Hack Clubber from Sao Paulo, Brazil. Since joining the Hack Club, he has been fascinated by Sprig and is currently leading Sprig App Review Team, and working to make it the best it possibly can be. He is also member of Special Activities Division. He loves all aspects of aviation, and scours the internet/skies looking for and investigating flying machines. He spends a good portion of his time with his dog, a happy and playful dog.\",\n    \"slackId\": \"U040N4ESCEL\",\n    \"email\": \"lucas\",\n    \"website\": \"https://devlucas.page\",\n    \"avatar\": \"https://cdn.hackclub.com/019c76b7-bf18-7905-bfb6-50126c71e3ff/3WGdxg.jpg\"\n  },\n  {\n    \"name\": \"Victorio\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Events Infra\",\n    \"acknowledged\": false,\n    \"bio\": \"Victorio is a Hack Clubber from Spain who welcomes people into the Slack and helps them settle in. He also loves fish, and homelabs!\",\n    \"slackId\": \"U072PTA5BNG\",\n    \"email\": \"\",\n    \"website\": \"https://v1c.rocks/\",\n    \"avatar\": \"https://profile.vic.wf/vm/picture.png\"\n  },\n  {\n    \"name\": \"Julia Do\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Julia is a 17-year-old Hack Clubber who loves mangoes, karaoke, and creating projects that tell stories. When she's not working, you can probably find her on Slack!\",\n    \"slackId\": \"U0943NG73PA\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0943NG73PA/r\"\n  },\n  {\n    \"name\": \"Benjamin Graetz\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Benjamin Graetz is a 14 year old from Adelaide, Australia. He joined Hack Club during High Seas (via GitHub Education Newspapers) but he has also successfully ran Daydream Adelaide and Campfire Adelaide plus he runs his own Hack Club. He also loves things to do with ICT like management stuff and computers.\",\n    \"slackId\": \"U0828CN2BL4\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0828CN2BL4/r\"\n  },\n  {\n    \"name\": \"Tanishq Goyal\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Tanishq Goyal is a 15-year-old hacker! He joined Hack Club during Highway, when he fell in love with engineering. He has organized a few AMAs and was a part of the Highway and Blueprint team. He loves to fence, hike, snowboard, and bike. He also loves chess and would love to take you up in a game when you meet!\",\n    \"slackId\": \"U08R4Q9H8EB\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U08R4Q9H8EB/r\"\n  },\n  {\n    \"name\": \"Joel Gallagher\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Joel, who goes by PianoMan0 online, is a member of the community team at Hack Club.\",\n    \"slackId\": \"U0829HRSQ76\",\n    \"email\": \"\",\n    \"website\": \"pianoman0.com\",\n    \"avatar\": \"https://ca.slack-edge.com/E09V59WQY1E-U0829HRSQ76-d5355bd1e025-512\"\n  },\n  {\n    \"name\": \"Gary Tou\",\n    \"staff\": true,\n    \"department\": \"HCB\",\n    \"role\": \"Engineering Manager\",\n    \"acknowledged\": false,\n    \"bio\": \"Gary is a software engineer from Seattle and loves photography! After using HCB to launch a nonprofit organization, Gary joined Hack Club to make the product that enabled him to do great things even greater for others. He guides the engineering team through leadership, product development, and vision planning for HCB’s growth. His day-to-day revolves around code reviews, software architecture, and building up the team’s engineering capacity.\",\n    \"slackId\": \"UN79ZPYMQ\",\n    \"email\": \"gary\",\n    \"website\": \"https://garytou.com\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/UN79ZPYMQ/r\"\n  },\n  {\n    \"name\": \"Paul Spitler\",\n    \"staff\": true,\n    \"department\": \"HCB\",\n    \"role\": \"Account Manager\",\n    \"acknowledged\": false,\n    \"bio\": \"Before joining Hack Club Paul (a native Shelburnite) was working in the e-commerce space in NYC but has moved back to his homeland a few years ago. His role at Hack Club will be building out new partnerships and although he has no idea how to code, he’s hoping to learn over his career. Paul enjoys playing hockey, being outdoors with his wife and dog and any kind of boards sports.\",\n    \"slackId\": \"U0641CJ2LKZ\",\n    \"email\": \"paul\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0641CJ2LKZ/r\"\n  },\n  {\n    \"name\": \"Melanie Smith\",\n    \"staff\": true,\n    \"department\": \"HCB\",\n    \"role\": \"Director of Operations\",\n    \"acknowledged\": false,\n    \"bio\": \"Melanie grew up in northern New England where she obtained a degree in Marine Biology. She then spent several years running a pet store with 20+ employees. In Feb 2021, she joined the HCB team as the Operations Lead. Now as Director of Operations, she is responsible for leading the team in vision and growth.\",\n    \"slackId\": \"U01QHUY5XLK\",\n    \"email\": \"melanie\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/LhNsvPdb/mel.png\"\n  },\n  {\n    \"name\": \"Kris Hoadley\",\n    \"staff\": true,\n    \"department\": \"HCB\",\n    \"role\": \"Bookkeeper\",\n    \"acknowledged\": false,\n    \"bio\": \"Kris is a native Vermonter and accounting nerd with the need to make all of life balance. Numbers? Give her numbers anytime.\",\n    \"slackId\": \"U05TM5A2B46\",\n    \"email\": \"kris\",\n    \"website\": \"\",\n    \"avatar\": \"https://ca.slack-edge.com/E09V59WQY1E-U05TM5A2B46-4e764f05509c-512\"\n  },\n  {\n    \"name\": \"Albert C\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U03CFAP9ABC\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U03CFAP9ABC/r\"\n  },\n  {\n    \"name\": \"Alex DeForrest\",\n    \"staff\": true,\n    \"department\": \"HCB\",\n    \"role\": \"Operations Engineer\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U02CWS020SD\",\n    \"email\": \"alexd\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/hJqLm5Cn/adf.png\"\n  },\n  {\n    \"name\": \"Alex Luo\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U0401RQMCQ5\",\n    \"email\": \"alexluo\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0401RQMCQ5/r\"\n  },\n  {\n    \"name\": \"Anish Anne\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"UR83LFD36\",\n    \"email\": \"anish\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/UR83LFD36/r\"\n  },\n  {\n    \"name\": \"Bartosz Budnik\",\n    \"department\": \"HCB\",\n    \"role\": \"Verifications & Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Bartosz is a Hack Clubber from Poland who does a little of everything. Mainly focuses on checking verifications, but also helps detecting fraud and does some general operational work. Loves creating games and making things for others.\",\n    \"slackId\": \"U079VBNLTPD\",\n    \"email\": \"bartosz\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/sphQ5BGT/barotsz.png\"\n  },\n  {\n    \"name\": \"Briyan Dyju\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Briyan is a 16-year-old Indian Hack Clubber born and raised in Dubai. He has a passion for jailbreaking and modding any device that lands in his hands. He handles the day-to-day operations at HCB, so if you mail them, there's a slight chance he's the one who might reply. If he is not doing either of these things, you'll probably find him kicking a soccer ball somewhere.\",\n    \"slackId\": \"U04FS5WUXL3\",\n    \"email\": \"briyan\",\n    \"website\": \"\",\n    \"avatar\": \"https://ca.slack-edge.com/T0266FRGM-U04FS5WUXL3-c46373538def-512\"\n  },\n  {\n    \"name\": \"Ian Madden\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Ian joined Hack Club in 2021 and developed a passion for hackathons and the infrastructure behind them. After running a few events of his own, like Assemble in 2022 and Hack OC in 2023, Ian now works on engineering at HCB.\",\n    \"slackId\": \"U022XFD2TML\",\n    \"email\": \"ian\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/dsv8m1DP/ian.png\"\n  },\n  {\n    \"name\": \"Lucy Tran\",\n    \"department\": \"HCB\",\n    \"staff\": true,\n    \"role\": \"Financial Operations\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U06859NLY5D\",\n    \"email\": \"lucy\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06859NLY5D/r\"\n  },\n  {\n    \"name\": \"Luke Oldenburg\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \" \",\n    \"slackId\": \"U06MYDS2LHX\",\n    \"email\": \"luke\",\n    \"website\": \"\",\n    \"avatar\": \"https://cdn.hackclub.com/019d4b19-8b52-79a8-a564-a80f0aba90fb/img_7726.png\"\n  },\n  {\n    \"name\": \"Manu Gurudath\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U04C8LLPKS7\",\n    \"email\": \"manu\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U04C8LLPKS7/r\"\n  },\n  {\n    \"name\": \"Lilia Dostie\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcome Team Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"Lilia, from Florida, is a Hack Clubber who runs the Gardeners (aka. Welcome Committee), who welcome newcomers to the Slack and help them get settled in!\",\n    \"slackId\": \"U07AZFQLPQ8\",\n    \"email\": \"\",\n    \"website\": \"https://kittycat.hackclub.app/\",\n    \"avatar\": \"https://i.ibb.co/ZpH8C1pn/785000-D7-213-E-4-D52-9358-939285-EA793-F-1-105-c-2-1.jpg\"\n  },\n  {\n    \"name\": \"Matthew Soh\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Matthew is a 15-year-old Singaporean coder and informatics enthusiast, now living in Cambridge, UK. He enjoys exploring algorithms, more algorithms, and occasionally organising hackathons with the Youthacks team. Outside of programming, you might find him at the piano or behind a percussion set.\",\n    \"slackId\": \"U07DPHQCCCS\",\n    \"email\": \"mattsoh\",\n    \"website\": \"https://youthacks.org\",\n    \"avatar\": \"https://i.ibb.co/RkPLjQHP/matthew.jpg\"\n  },\n  {\n    \"name\": \"Mohamad Mortada\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Mohamad is a Hack Clubber from the San Francisco Bay Area. After being encouraged to join by a friend, he ran a couple YSWS and automated a few internal processes within HQ. He loves web & app development in addition to scripting. He is now working on HCB and its brand new mobile app!\",\n    \"slackId\": \"U05UQ2RTJ6T\",\n    \"email\": \"mohamad\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/84f1859f/2026-01-27-0ot-Kleki.jpg\"\n  },\n  {\n    \"name\": \"Rhys Panopio\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Rhys is a Hack Clubber from Los Angeles, he started a Hack Club at his high school and eventually shifted into working on Operations for HCB. Rhys loves helping out in all areas on HCB but more than anything loves to make pizza.\",\n    \"slackId\": \"U04GECG3H8W\",\n    \"email\": \"rhys\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U04GECG3H8W/r\"\n  },\n  {\n    \"name\": \"Ruien Luo\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations & Engineering Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Ruien is a Hack Clubber in California. Having first found Hack Club and HCB when he was looking for a financial solution for hosting his hackathon, he now helps fellow hackclubbers and hackathon organizers get started with hackathons and other projects on HCB.\",\n    \"slackId\": \"U04JRBGPH5G\",\n    \"email\": \"ruien\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/G3B7f1Zy/2026-01-27-0oq-Kleki.png\"\n  },\n  {\n    \"name\": \"Sam Poder\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Originally from Australia, Sam now lives in Berkeley. During high school, he ran a Hack Club at his school and multiple hackathons with his friends. In the past he’s worked on everything from events to clubs to storytelling at Hack Club. That lead to all sorts of weird and wild moments: 4am rickshaw rides in New Delhi, attempting to oversee several raves, losing his voice waking up hundreds of sleeping hackers and heartstopping late-night launches. Now at university, Sam is working on HCB so that high schoolers have the financial tools they need to do similarly weird things.\",\n    \"slackId\": \"USNPNJXNX\",\n    \"email\": \"sam\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/USNPNJXNX/r\"\n  },\n  {\n    \"name\": \"Samuel Fernandez\",\n    \"department\": \"HCB\",\n    \"role\": \"Engineering Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Samuel is a Hack Clubber from Tampa, FL. After finding Hack Club while looking for hackathons, he's now attended and organized many himself, and he now works on improving HCB so other teens can run their own events and nonprofits!\",\n    \"slackId\": \"U04G40QKAAD\",\n    \"email\": \"samuelf\",\n    \"website\": \"https://sfernandez.dev\",\n    \"avatar\": \"https://i.ibb.co/m5Mj3fJf/samuel.jpg\"\n  },\n  {\n    \"name\": \"Sarvesh Mohan Kumar\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U055092HPMZ\",\n    \"email\": \"sarvesh\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U055092HPMZ/r\"\n  },\n  {\n    \"name\": \"Sean Outram\",\n    \"department\": \"HCB\",\n    \"role\": \"Operations Contributor\",\n    \"acknowledged\": false,\n    \"bio\": \"Sean is a hackclubber hailing from the UK, They help with HCB operations and writes the occassional line of code.\",\n    \"slackId\": \"U04FATFRE6T\",\n    \"email\": \"sean\",\n    \"website\": \"https://sean.cyou\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U04FATFRE6T/r\"\n  },\n  {\n    \"name\": \"Max Wofford\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Tech & Creative Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"After teaching himself to code in junior year of high school, Max joined a group of nomadic hackers in Costa Rica to experience coding in a real-world setting. He has been with Hack Club since day one and is now working full-time in Vermont to grow the movement.\",\n    \"slackId\": \"U0C7B14Q3\",\n    \"email\": \"max\",\n    \"website\": \"\",\n    \"avatar\": \"https://www.gravatar.com/avatar/0c898623b15817167d8f81b314ffc034?s=512\"\n  },\n  {\n    \"name\": \"Chris Walker\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Hacker Resources\",\n    \"acknowledged\": false,\n    \"bio\": \"Chris started programming games in middle school, a hobby that developed into a deep passion for educational software. In 2013 he accepted a Thiel Fellowship and moved to San Francisco, where he watched Hack Club grow from an early stage. He does a little bit of everything here.\",\n    \"slackId\": \"UDK5M9Y13\",\n    \"email\": \"cwalker\",\n    \"website\": \"\",\n    \"avatar\": \"https://ca.slack-edge.com/E09V59WQY1E-UDK5M9Y13-be619c5a7099-512\"\n  },\n  {\n    \"name\": \"Deven Jadhav\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Chief of Staff, YSWS\",\n    \"acknowledged\": false,\n    \"bio\": \"Deven first learned how to code when he was 14, and that changed the trajectory of his life. After being a part of Hack Club for over 5 years, and leading the in-person events and hackathons program, Deven now helps lead the YSWS team and manage events and partnerships across the board. In his free time, Deven loves listening to music, playing the classical guitar, film photography, and having deep, meaningful conversations with people!\",\n    \"slackId\": \"U0261EB1EG7\",\n    \"email\": \"dev\",\n    \"website\": \"\",\n    \"avatar\": \"https://github.com/devenjadhav.png\"\n  },\n  {\n    \"name\": \"Leo Wilkin\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": false,\n    \"bio\": \"Leo has a heart for equitable access to the digital world, especially when it comes to ensuring safety for children online. Formerly at HCB, he's now leveraging his passion and experience in Operations, helping hackathons share the magic of code to students worldwide.\",\n    \"slackId\": \"U07BLJ1MBEE\",\n    \"email\": \"leo\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/zTXTJPGv/2026-01-27-0ow-Kleki.jpg\"\n  },\n  {\n    \"name\": \"Leo Wilkin\",\n    \"department\": \"HQ\",\n    \"role\": \"Event Operations Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"Leo has a heart for equitable access to the digital world, especially when it comes to ensuring safety for children online. Formerly at HCB, he's now leveraging his passion and experience in Operations, helping hackathons share the magic of code to students worldwide.\",\n    \"slackId\": \"U07BLJ1MBEE\",\n    \"email\": \"leo\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/zTXTJPGv/2026-01-27-0ow-Kleki.jpg\"\n  },\n  {\n    \"name\": \"Rebeka Lawrence-Gomez\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Deputy to the Co-Founder\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U093FC28A82\",\n    \"email\": \"rebeka\",\n    \"website\": \"\",\n    \"avatar\": \"https://ca.slack-edge.com/E09V59WQY1E-U093FC28A82-0beced50bab9-192\"\n  },\n  {\n    \"name\": \"Evan Streams\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Community Manager\",\n    \"avatar\": \"https://i.ibb.co/PXvjBqF/2026-01-27-0on-Kleki.png\"\n  },\n  {\n    \"name\": \"Jared Senesac\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Club Operations Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U07HEH4N8UV\",\n    \"email\": \"jared\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U07HEH4N8UV/r\"\n  },\n  {\n    \"name\": \"Nora\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Engineering & Logistics\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U06QK6AG3RD\",\n    \"email\": \"nora\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06QK6AG3RD/r\"\n  },\n  {\n    \"name\": \"Rachel Albert\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Summer Intern Logistics\",\n    \"acknowledged\": false,\n    \"bio\": \"Rachel has been a public school arts teacher for more than 10 years now. She is the go-to person for having everyone at HQ feed and the go-to person for interns whether they have safety questions or questions about the dorm in general.\",\n    \"slackId\": \"U0791NE7WHH\",\n    \"email\": \"ralbert\",\n    \"website\": \"\",\n    \"avatar\": \"https://arttherapy.org/wp-content/uploads/2020/08/RachelAlbert-768x768.jpg\"\n  },\n  {\n    \"name\": \"Paolo Carino\",\n    \"department\": \"HQ\",\n    \"role\": \"Media Creations\",\n    \"staff\": true,\n    \"acknowledged\": false,\n    \"bio\": \"Paolo is a video creator from Chicago who loves telling stories through video. During the summer of 2024, he started a series online documenting his journey everyday of becoming a freelance video editor from scratch. This garnered over 200k+ views across 3 months, and fortunately, lead to the opportunity of joining Hack Club as gap year for Media Creations. In his free time Paolo loves to play music, and is currently learning more about web development.\",\n    \"slackId\": \"U07L45U4CTX\",\n    \"email\": \"paolo\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U07L45U4CTX/r\"\n  },\n  {\n    \"name\": \"Acon Lin\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"staff\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U04KEK4TS72\",\n    \"email\": \"acon\",\n    \"website\": \"https://aconlin.com\",\n    \"avatar\": \"https://i.ibb.co/QFbn0V9M/2026-01-27-0oj-Kleki.jpg\"\n  },\n  {\n    \"name\": \"Alex Ren\",\n    \"staff\": true,\n    \"department\": \"HQ\",\n    \"role\": \"Hardware Events\",\n    \"acknowledged\": false,\n    \"bio\": \"Alex is a long-time maker from Toronto who's been in and out of the hardware scene for over 10 years. They focus on building the hardware community they wish they had in high school.\",\n    \"slackId\": \"U06PR6B8D37\",\n    \"email\": \"alexren\",\n    \"website\": \"https://dari.zone\",\n    \"avatar\": \"https://raw.githubusercontent.com/qcoral/assets/refs/heads/main/pfp-irl.jpeg\"\n  },\n  {\n    \"name\": \"Nathan Alspaugh\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Nathan is an 18 year old Hack Clubber from Texas. He's currently gap-yearing for Hack Club and launching cool programs. He's an avid Kerbal Space Program player, a future aerospace engineer, and enjoys tinkering with (and sometimes breaking) hardware.\",\n    \"slackId\": \"U05EZRFKRV4\",\n    \"email\": \"nathan@hackclub.com\",\n    \"website\": \"https://notaroomba.dev\",\n    \"avatar\": \"https://i.ibb.co/yF8tbz9G/1728316229074.jpg\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Alex Van Doren\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Alex spends most of his time making boats go fast, but when he's not doing that, he designs software modelling his favourite physics problems. He's currently gap-yearing at Hack Club and is working on the YSWS team.\",\n    \"slackId\": \"U0823F39GV8\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0823F39GV8/r\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Angad Behl\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering and Community\",\n    \"acknowledged\": false,\n    \"bio\": \"Angad is a 16 year old Hack Clubber from Wisconsin. During his time in the Hack Club community, he's built a peer voting platform for over 2000 students, ran a YSWS providing travel stipends, and build moderation infastructure for Hack Club. In his free time, he enjoys photography, travel, and pondering.\",\n    \"slackId\": \"U075RTSLDQ8\",\n    \"email\": \"angad\",\n    \"website\": \"https://angad.me\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U075RTSLDQ8/r\"\n  },\n  {\n    \"name\": \"Angad Behl\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": false,\n    \"bio\": \"Angad is a 16 year old Hack Clubber from Wisconsin. During his time in the Hack Club community, he's built a peer voting platform for over 2000 students, ran a YSWS providing travel stipends, and build moderation infastructure for Hack Club. In his free time, he enjoys photography, travel, and pondering.\",\n    \"slackId\": \"U075RTSLDQ8\",\n    \"email\": \"angad\",\n    \"website\": \"https://angad.me\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U075RTSLDQ8/r\"\n  },\n  {\n    \"name\": \"Annabel\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering & Community\",\n    \"acknowledged\": false,\n    \"bio\": \"Annabel is a 17 year old Hack Clubber from Australia. They're currently gap-yearing for Hack Club and have worked on several programs and the Athena intiative. They're an avid Celeste and Hollow Knight fan and love to play games in their free time. They also love to build things, and have built several tools for Hack Club.\",\n    \"slackId\": \"U078J6H1XL3\",\n    \"email\": \"annabel\",\n    \"gapyear\": true,\n    \"website\": \"https://phthallo.com\",\n    \"avatar\": \"https://i.ibb.co/DmYsryK/1733036812203.jpg\"\n  },\n  {\n    \"name\": \"Chan Kai Ling\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Kai Ling is a Hack Clubber from Singapore that enjoys everything art, design and merchandising! Based in HQ-SF, she designs for + runs online events and in-person adventures. In her free time, she loves sewing, crows and making trinkets.\",\n    \"slackId\": \"U07DJMFAQQP\",\n    \"email\": \"kl\",\n    \"website\": \"https://kailings.garden\",\n    \"avatar\": \"https://i.ibb.co/ycBkjTvW/kl.jpg\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Clay Nicholson\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Originally from Vermont, Clay joined Hack Club in 2022. In his free time, he enjoys mountain biking, playing ultimate frisbee, and skiing. In high school, Clay served as captain and programming/mechanical lead for two robotics teams. Today, he focuses primarily on creating hardware YSWS programs.\",\n    \"slackId\": \"U078DFX40A2\",\n    \"email\": \"clay\",\n    \"website\": \"https://claynicholson.com/\",\n    \"avatar\": \"https://i.ibb.co/LzJnxXX1/1756333983052.jpg\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Dhyan\",\n    \"department\": \"HQ\",\n    \"role\": \"Club Engineering & Operations\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U0824G9PTFE\",\n    \"email\": \"dhyan\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0824G9PTFE/r\"\n  },\n  {\n    \"name\": \"Rowan\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering & Security\",\n    \"acknowledged\": false,\n    \"bio\": \"Rowan (who goes by Echo online) is a full stack programmer from the United States. They helped run Summer of Making and now work on engineering and security for Hack Club HQ. In their free time, they enjoy politics, playing video games, and listening to music.\",\n    \"slackId\": \"U080A3QP42C\",\n    \"email\": \"echo\",\n    \"website\": \"https://3kh0.net\",\n    \"avatar\": \"https://cdn.3kh0.net/profile.png\"\n  },\n  {\n    \"name\": \"Emma Borghi\",\n    \"department\": \"HQ\",\n    \"role\": \"AI and Robotics\",\n    \"acknowledged\": false,\n    \"bio\": \"Emma is a content creator from Italy, she started by participating in Hack Club's hackathons around the world, then she joined the team. She works in the AI and Robotic field, sharing content in Youtube, and now she organize YSWS programs\",\n    \"slackId\": \"U078DFX40A2\",\n    \"email\": \"emma\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/vxNKbCpx/2026-01-27-0or-Kleki.jpg\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Dhamari Trice-Hanson\",\n    \"department\": \"HQ\",\n    \"gapyear\": true,\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Dhamari is passionate about running programs surrounding music and entertainment. Coming from Detroit, he got his start in coding through Google's Code Next Detroit Lab, training 5-7 hours a week to get to where he is today.\",\n    \"bioHackFoundation\": \"\",\n    \"slackId\": \"U08RWM5U4L9\",\n    \"email\": \"dhamari\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/QvzYRZm4/Dhamari.png\"\n  },\n  {\n    \"name\": \"Estella Gu\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering & Community\",\n    \"acknowledged\": false,\n    \"bio\": \"Estella is a Hack Clubber from Massachusetts who has been actively involved in events, YSWS, and the Athena Initiative. She has worked on design for Juice and Celestial. Recently during her HQ internship, she led Jumpstart, a game-dev program. In her free time, she enjoys art, writing, photography, and piano.\",\n    \"slackId\": \"U06UYA4AH6F\",\n    \"email\": \"estella\",\n    \"website\": \"https://estellagu.com\",\n    \"avatar\": \"https://i.ibb.co/DqPg62x/2026-01-27-0ov-Kleki.jpg\"\n  },\n  {\n    \"name\": \"Euan Ripper\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Euan learned to code to automate a boring job at 16, He realised he loved coding and making so started to teach robotics to younger kids and now is building programs to teach kids all around the world at Hack Club\",\n    \"bioHackFoundatio\": \"\",\n    \"slackId\": \"U06T30DNB3L\",\n    \"email\": \"euan\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/nsDXYvPZ/Euan.jpg\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Evan Gan\",\n    \"department\": \"HQ\",\n    \"role\": \"Events & Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Evan is a 17 year old from the Greater Boston area. Evan enjoys running large scale events like Shipwrecked, working on logistics and event infrastructure.\",\n    \"slackId\": \"U05D1G4H754\",\n    \"email\": \"evan\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U05D1G4H754/r\"\n  },\n  {\n    \"name\": \"Gus Ruben\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"gapyear\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U07FCRNHS1J\",\n    \"email\": \"gus\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U07FCRNHS1J/r\"\n  },\n  {\n    \"name\": \"Renran Sun\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"gapyear\": true,\n    \"bio\": \"\",\n    \"slackId\": \"U07ACECRYM6\",\n    \"website\": \"\",\n    \"avatar\": \"https://ca.slack-edge.com/E09V59WQY1E-U07ACECRYM6-757ba9c4219d-512\"\n  },\n  {\n    \"name\": \"Ivie Fonner\",\n    \"department\": \"HQ\",\n    \"role\": \"Club Infrastructure and Operations\",\n    \"acknowledged\": false,\n    \"bio\": \"Ivie (aka. Charmunk) is a 14 year old Hack Clubber from the DC area. When she is not coding, she enjoys sci-fi novels, and playing card games. At Hack Club, she builds the underlining systems allowing Hack Club Clubs to run smoothly. She joined Hack Club in late 2024 and has been working on various projects since then.\",\n    \"slackId\": \"U04KEK4TS72\",\n    \"email\": \"ivie\",\n    \"website\": \"https://ivie.codes\",\n    \"avatar\": \"https://ivie.codes/assets/pfp.jpg\"\n  },\n  {\n    \"name\": \"Jenin Henin\",\n    \"department\": \"HQ\",\n    \"role\": \"Club Operations\",\n    \"acknowledged\": false,\n    \"bio\": \"Jenin is a 14-year-old Hack Clubber from Canada who got involved with Hack Club in July 2025. He hopes to help Hack Clubbers achieve new things!\",\n    \"slackId\": \"U0926UASBJ7\",\n    \"email\": \"jenin\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U0926UASBJ7/r\"\n  },\n  {\n    \"name\": \"Jiang Tongyu\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Tongyu is a 19-year-old Hack Clubber from Singapore who loves making games! She's taking a gap year at Hack Club SF to run events and adventures. She also likes linguistics, making crafts, and sometimes writing music.\",\n    \"slackId\": \"U07DJMFAQQP\",\n    \"email\": \"tongyu\",\n    \"website\": \"https://tongyu.fish\",\n    \"avatar\": \"https://i.ibb.co/fYTBgRn2/tongyu.png\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Joaquin Schere\",\n    \"department\": \"HQ\",\n    \"role\": \"Event Operations and Communications\",\n    \"acknowledged\": false,\n    \"bio\": \"Despite studying computer science all of high school, Joaquin had never had the courage to build a project himself until his first Hack Club hackathon. That first all-nighter changed his life, and now he's proud to work in Partnerships and Communications for the Events team, securing meaningful benefits and experiences for Hack Clubbers. When he's not writing emails to intimidating tech innovators, you can find him playing guitar or building websites.\",\n    \"slackId\": \"U083W5CCFDG\",\n    \"email\": \"joaquin\",\n    \"website\": \"https://jschere.com\",\n    \"avatar\": \"https://i.ibb.co/S7ZkBdjL/joaquin.png\"\n  },\n  {\n    \"name\": \"Jonathan Dong\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Jonathan is an aspiring developer from Canada! He likes to tinker around with mainly hardware and a bit of software. Currently he likes to make projects with ESP32s, Arduinos, and a ton of other hardware components. On the side, he likes to play volleyball, baseball, and Minecraft.\",\n    \"slackId\": \"U073Q4F60LQ\",\n    \"email\": \"jonathan\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/zH72VHvF/jonathan.jpg\"\n  },\n  {\n    \"name\": \"Josias Aurel\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Josias Aurel has been associated with Hack Club for about 3 years, working on a variety of projects including Sinerider. He has organized events such as the TiC Summit and TiC Hackathon in his local town of Yaoundé, Cameroon. He is a curiosity-driven coder who likes to take on interesting challenges and who is interested in machine learning and systems programming. He'll be working very closely with Graham over the next year on a variety of projects. Outside of tech he likes going on hikes with friends and eating vegetables.\",\n    \"slackId\": \"U01PJ08PR7S\",\n    \"email\": \"josias\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/F459SPMZ/josias.png\"\n  },\n  {\n    \"name\": \"Lynn Beato\",\n    \"department\": \"HQ\",\n    \"role\": \"Club Operations and Community Relations\",\n    \"acknowledged\": false,\n    \"bio\": \"Lynn is a 14 year old Hack Clubber from Portugal, who got involved with Clubs in November 2024, when she started her club at her school. She's also ran her own Scrapyard event, in Lisbon, as well as a Daydream event in DC. She can't wait to get more clubs up and running with cool resources!\",\n    \"slackId\": \"U07ULNFPQ4T\",\n    \"email\": \"lynn\",\n    \"website\": \"https://lynn.pt/\",\n    \"avatar\": \"https://pfp.lynn.pt/api/current\"\n  },\n  {\n    \"name\": \"Manitej Boorgu\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U04QD71QWS0\",\n    \"email\": \"manitej\",\n    \"website\": \"https://manitej.com\",\n    \"avatar\": \"https://i.ibb.co/My8Y9q8D/manitej.jpg\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Meghana Madiraju\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering & Event operations\",\n    \"acknowledged\": false,\n    \"bio\": \"Hey, I'm Meghana. I'm a 16 year old that spends her free time messing around with robots and making PCBs. I made Pathfinder and Hermes, and ran global operations for Daydream\",\n    \"slackId\": \"U06P62WGWAV\",\n    \"email\": \"meghana\",\n    \"website\": \"https://meghana.co\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06P62WGWAV/r\"\n  },\n  {\n    \"name\": \"Celeste Roselli\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering, Athena Initiative\",\n    \"avatar\": \"https://i.ibb.co/XrBqbYF7/2026-01-27-0j2-Kleki.jpg\"\n  },\n  {\n    \"name\": \"Olive Wu\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Olive is a gap year working on the YSWS team this year at HC! In her free time, she loves to bake cupcakes, play cello, and work on fun projects. She also loves penguins.\",\n    \"slackId\": \"U07BN55GN3D\",\n    \"email\": \"olive\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/0pJKd05H/2026-01-27-0ou-Kleki.jpg\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Reem Khalifa\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering & Community\",\n    \"acknowledged\": false,\n    \"bio\": \"Reem is a 17 year old Hack Clubber from New York City. She's currently gap-yearing for Hack Club's Athena Initative, working to increase the number of girls and non-binary teens in tech. In her free time, you can either find her diving into a swimming pool or snuggled in bed reading a book with her cat.\",\n    \"slackId\": \"U06U80G86H1\",\n    \"email\": \"reem\",\n    \"website\": \"https://reemkhalifa.xyz\",\n    \"avatar\": \"https://i.ibb.co/CKV0Bvcz/reem.png\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Rushil Chopra\",\n    \"department\": \"HQ\",\n    \"role\": \"YSWS & Club Operations\",\n    \"acknowledged\": false,\n    \"bio\": \"Rushil is a 16-year-old from California who runs a yoga nonprofit and is building a mental health app for teens. He joined the YSWS & Clubs Team to help grow the program and bring more people into Hack Club!\",\n    \"slackId\": \"U020X4GCWSF\",\n    \"email\": \"rushil\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U020X4GCWSF/r\"\n  },\n  {\n    \"name\": \"Sam Liu\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Sam is an 18-year-old Hack Clubber from Canada who loves building random stuff. Since joining Hack Club, he has supported hackers around the world through hackathons. Sam is currently gap-yearing at Hack Club to work on You Ship, We Ship programs.\",\n    \"slackId\": \"U03UBRVG2MS\",\n    \"email\": \"samliu\",\n    \"website\": \"https://samliu.dev\",\n    \"avatar\": \"https://i.ibb.co/0jzr1gN3/sam.png\",\n    \"gapyear\": true\n  },\n  {\n    \"name\": \"Sebastian\",\n    \"department\": \"HQ\",\n    \"role\": \"Quality and Integrity Manager, YSWS\",\n    \"acknowledged\": false,\n    \"bio\": \"Sebastian (a.k.a. Leafd) is a 18-year-old developer from México who likes making large-scale Minecraft events, loves working with Kubernetes, likes creating and learning new things, and sometimes does music production.\",\n    \"slackId\": \"U07UBCSSQH3\",\n    \"email\": \"sebastian\",\n    \"staff\": true,\n    \"website\": \"https://leafd.dev\",\n    \"avatar\": \"https://cdn.lfdl.ink/f3B0SDagmGemG7kH.JPG\"\n  },\n  {\n    \"name\": \"Sofia Egan\",\n    \"department\": \"HQ\",\n    \"role\": \"Events & Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Sofia is a high schooler from Greater Boston who loves running events like Counterspell and Shipwrecked.\",\n    \"slackId\": \"U056J6JURFF\",\n    \"email\": \"sofia\",\n    \"website\": \"https://eeriergosling.dev\",\n    \"avatar\": \"https://github.com/EerierGosling/Personal-Website/blob/main/public/hc-team-pfp.jpg?raw=true\"\n  },\n  {\n    \"name\": \"Neon\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Hi I'm Neon, a 17 year old coder for Hack Club who works on the General YSWS's and other eng tasks!\",\n    \"slackId\": \"U07L45W79E1\",\n    \"website\": \"https://saahild.com\",\n    \"email\": \"neon\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U07L45W79E1/r\"\n  },\n  {\n    \"name\": \"Mahad Kalam\",\n    \"department\": \"HQ\",\n    \"role\": \"Hackatime Engineer\",\n    \"acknowledged\": false,\n    \"bio\": \"Mahad is a 17-year-old developer from the UK who's working on making Hackatime the best time-tracking tool around. When he's not coding, he likes reading, music, and Geocaching when outdoors.\",\n    \"slackId\": \"U059VC0UDEU\",\n    \"email\": \"mahad\",\n    \"website\": \"https://mahadk.com\",\n    \"avatar\": \"https://mahadk.com/me.webp\"\n  },\n  {\n    \"name\": \"Violet Budiansky\",\n    \"department\": \"HQ\",\n    \"role\": \"Events & Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"Hi! I'm Violet, I'm a 17 year old programming who loves working on hackathons such as Campfire Flagship and Horizons. I also enjoy sewing stuffed animals, 3d printing and making games!\",\n    \"slackId\": \"U080YU735YH\",\n    \"email\": \"violet\",\n    \"website\": \"https://vvqb.dev\",\n    \"avatar\": \"https://cdn.hackclub.com/019d9e2f-c903-70b4-94f1-681003a0986b/picture.png\"\n  },\n  {\n    \"name\": \"Asc\",\n    \"department\": \"HQ\",\n    \"role\": \"Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"gapyear\": true,\n    \"slackId\": \"U082DPCGPST\",\n    \"email\": \"ascpixi\",\n    \"website\": \"https://ascpixi.dev\",\n    \"avatar\": \"https://i.ibb.co/fGL56V9B/1000002893-1.jpg\"\n  },\n  {\n    \"name\": \"Amber\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": false,\n    \"gapyear\": true,\n    \"bio\": \"Amber is a 17 year old student from Leicester (UK) who loves programming Slack apps and random scripts. She also has a deep passion for music and you'll rarely find her without headphones on. Since joining Hack Club, she's reviewed thousands of hours for Arcade, supported thousands of hackers in Arcade and around Slack, helped moderate the community, built tools for the community and welcomed new members all whilst drowning in coursework. Currently she's helping with moderation and events and also leads the Welcome team and, helping new members get settled in and feel at home whilst working on other Hack Club projects on the side.\",\n    \"slackId\": \"U054VC2KM9P\",\n    \"email\": \"amber\",\n    \"website\": \"https://transcental.dev\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U054VC2KM9P/r\"\n  },\n  {\n    \"name\": \"Kat\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Kat is a Hack Clubber who welcomes people into the Slack and helps them settle in.\",\n    \"slackId\": \"U06SQJ508LF\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06SQJ508LF/r\"\n  },\n  {\n    \"name\": \"Maadhav\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Maadhav is a Hack Clubber from India who welcomes people into the Slack and helps them settle in.\",\n    \"slackId\": \"U08L7HLBT6V\",\n    \"email\": \"\",\n    \"website\": \"https://maadhavbhatt.github.io\",\n    \"avatar\": \"https://i.ibb.co/RkPLjQHP/matthew.jpg\"\n  },\n  {\n    \"name\": \"Aishaani\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Aishaani is a Hack Clubber who welcomes people into the Slack and helps them settle in.\",\n    \"slackId\": \"U097UCZE2BB\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/DPKBJt0C/aishaani.png\"\n  },\n  {\n    \"name\": \"Darlene Wu\",\n    \"department\": \"Events\",\n    \"role\": \"Virtual Event Organizer\",\n    \"acknowledged\": false,\n    \"bio\": \"Darlene is a 16 year old Hack Clubber from Indonesia who runs virtual events for the Hack Club community. She also helps welcome members into the Slack\",\n    \"slackId\": \"U07SX29CECA\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://i.ibb.co/1GtwNqN7/darlene.jpg\"\n  },\n  {\n    \"name\": \"Joel Gallagher\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Joel, who goes by PianoMan0 online, is a Hack Clubber who welcomes people into the Slack and helps them settle in.\",\n    \"slackId\": \"U0829HRSQ76\",\n    \"avatar\": \"https://ca.slack-edge.com/E09V59WQY1E-U0829HRSQ76-d5355bd1e025-512\"\n  },\n  {\n    \"name\": \"Hasan\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U062U3SQ2T1\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U062U3SQ2T1/r\"\n  },\n  {\n    \"name\": \"Junya\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U082PAFDDS5\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U082PAFDDS5/r\"\n  },\n  {\n    \"name\": \"Jeremy\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation Engineering\",\n    \"acknowledged\": false,\n    \"bio\": \"\",\n    \"slackId\": \"U06UYA5GMB5\",\n    \"website\": \"https://jeremywoolley.com\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06UYA5GMB5/r\"\n  },\n  {\n    \"name\": \"Felix Gao\",\n    \"department\": \"Newspaper\",\n    \"role\": \"Newspaper Team Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"Felix, a teen Hack Clubber from Toronto, Canada, leads a team that writes various newsletters, ensuring Hack Clubbers know what's going on in the Slack and beyond. You'll often find him writing code or drowning two metres deep in homework. He has an absurd variety of niche interests and loves learning more about them, one of the biggest being urban planning/design.\",\n    \"slackId\": \"U07BU2HS17Z\",\n    \"email\": \"felix\",\n    \"website\": \"https://felixgao.dev/\",\n    \"avatar\": \"https://i.ibb.co/3mCMrhZ2/Felix.png\"\n  },\n  {\n    \"name\": \"Felix Gao\",\n    \"department\": \"Moderation\",\n    \"role\": \"Moderation & Conduct\",\n    \"acknowledged\": false,\n    \"bio\": \"Felix, a teen Hack Clubber from Toronto, Canada, leads a team that writes various newsletters, ensuring Hack Clubbers know what's going on in the Slack and beyond. You'll often find him writing code or drowning two metres deep in homework. He has an absurd variety of niche interests and loves learning more about them, one of the biggest being urban planning/design.\",\n    \"slackId\": \"U07BU2HS17Z\",\n    \"email\": \"felix\",\n    \"website\": \"https://felixgao.dev/\",\n    \"avatar\": \"https://i.ibb.co/3mCMrhZ2/Felix.png\"\n  },\n  {\n    \"name\": \"Mahad Kalam\",\n    \"department\": \"Newspaper\",\n    \"role\": \"Infra Lead\",\n    \"acknowledged\": false,\n    \"bio\": \"Mahad is a 16-year-old developer from the UK who builds tools to simplify teamwork. Right now, he's building infra and automation systems to help the Newspaper Team collaborate more efficiently and focus on actually writing content.\",\n    \"slackId\": \"U059VC0UDEU\",\n    \"email\": \"mahad\",\n    \"website\": \"https://mahadk.com\",\n    \"avatar\": \"https://mahadk.com/me.webp\"\n  },\n  {\n    \"name\": \"Adishree Das\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Adishree is a Hack Clubber from New York who welcomes people into the Slack and helps them settle in\",\n    \"slackId\": \"U07DEBE2RUL\",\n    \"email\": \"\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U07DEBE2RUL/r\"\n  },\n  {\n    \"name\": \"Alex Park\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Alex P, from Texas, is a Hack Clubber who welcomes people into the Slack and helps them settle in. Last summer he also helped to create the infrastructure for Hack Club's flagship hackathon - The Boreal Express.\",\n    \"slackId\": \"U01581HFAGZ\",\n    \"email\": \"alexp\",\n    \"website\": \"https://parkalex.dev\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U01581HFAGZ/r\"\n  },\n  {\n    \"name\": \"Kyra Ezikeuzor\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Kyra is an intern for the Athena program, and also helps welcome Hack Clubbers into the Slack.\",\n    \"slackId\": \"U03RG1Y7HNW\",\n    \"email\": \"kyra\",\n    \"website\": \"https://kyraezikeuzor.vercel.app/\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U03RG1Y7HNW/r\"\n  },\n  {\n    \"name\": \"Louisa\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Louisa is a high schooler from Kenya who helps lead the Hack Club Community moderation dept\",\n    \"slackId\": \"\",\n    \"email\": \"louisa\",\n    \"website\": \"\",\n    \"avatar\": \"https://cachet.dunkirk.sh/users/U06EMBJH71S/r\"\n  },\n  {\n    \"name\": \"Parneel Bhakhri\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Parneel is a Hack Clubber from San Francisco who welcomes people into the Slack and helps them settle in.\",\n    \"slackId\": \"U07V1ND4H0Q\",\n    \"email\": \"\",\n    \"website\": \"https://pbhak.dev/\",\n    \"avatar\": \"https://ca.slack-edge.com/E09V59WQY1E-U07V1ND4H0Q-694b3547e557-512\"\n  },\n  {\n    \"name\": \"Samvid\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Samvid is a Hack Clubber from Georgia, USA who welcomes people into the Slack and helps them settle in.\",\n    \"slackId\": \"U05RFBS4BEW\",\n    \"email\": \"\",\n    \"website\": \"https://samvid.bearblog.dev/\",\n    \"avatar\": \"https://i.ibb.co/WpkTQDQf/samvid.jpg\"\n  },\n  {\n    \"name\": \"Victorio\",\n    \"department\": \"Welcoming\",\n    \"role\": \"Welcomer\",\n    \"acknowledged\": false,\n    \"bio\": \"Victorio is a Hack Clubber from Spain who welcomes people into the Slack and helps them settle in. He also loves fish, and homelabs!\",\n    \"slackId\": \"U072PTA5BNG\",\n    \"email\": \"\",\n    \"website\": \"https://v1c.rocks/\",\n    \"avatar\": \"https://profile.vic.wf/vm/picture.png\"\n  }\n]\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"esnext\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": false,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noEmit\": true,\n    \"incremental\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"react-jsx\"\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "types/mdx.d.ts",
    "content": "declare module '*.mdx' {\n  import type { ComponentType } from 'react'\n  const component: ComponentType<any>\n  export default component\n}\n"
  },
  {
    "path": "vercel.json",
    "content": "{\n  \"github\": { \"silent\": true },\n  \"headers\": [\n    {\n      \"source\": \"/api/join\",\n      \"headers\": [\n        { \"key\": \"Access-Control-Allow-Origin\", \"value\": \"*\" },\n        {\n          \"key\": \"Access-Control-Allow-Methods\",\n          \"value\": \"GET,OPTIONS,PATCH,DELETE,POST,PUT\"\n        },\n        {\n          \"key\": \"Access-Control-Allow-Headers\",\n          \"value\": \"X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version\"\n        }\n      ]\n    },\n    {\n      \"source\": \"/api/sprig-console\",\n      \"headers\": [\n        { \"key\": \"Access-Control-Allow-Origin\", \"value\": \"*\" },\n        {\n          \"key\": \"Access-Control-Allow-Methods\",\n          \"value\": \"GET\"\n        },\n        {\n          \"key\": \"Access-Control-Allow-Headers\",\n          \"value\": \"X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version\"\n        }\n      ]\n    }\n  ]\n}\n"
  }
]