diff --git a/components/bin/rsvp-form.js b/components/bin/rsvp-form.js
index 81e1744f..1799d982 100644
--- a/components/bin/rsvp-form.js
+++ b/components/bin/rsvp-form.js
@@ -40,7 +40,6 @@ export default function RsvpForm() {
@@ -49,7 +48,6 @@ export default function RsvpForm() {
diff --git a/components/index/cards/apocalypse.js b/components/index/cards/apocalypse.js
new file mode 100644
index 00000000..852df47c
--- /dev/null
+++ b/components/index/cards/apocalypse.js
@@ -0,0 +1,103 @@
+import CardModel from './card-model'
+import { Box, Flex, Grid, Image, Text } from 'theme-ui'
+import Buttons from './button'
+
+/** @jsxImportSource theme-ui */
+
+export default function Apocalypse() {
+ return (
+
+
+
+
+
+
+
+ Downtown Toronto
+
+ May 17–19
+
+
+
+ Join Us
+
+
+
+
+
+ It's 2034, and zombies have taken over! But tech still operates.
+ What would you do?
+
+
+ Join 150 high schoolers for 44 hours at Apocalypse! Take yourself
+ out of the real world and build wacky projects to spark a new age of
+ humanity.
+
+
+
+
+ )
+}
diff --git a/components/index/cards/slack.js b/components/index/cards/slack.js
index 3615bdf1..1fa6fa75 100644
--- a/components/index/cards/slack.js
+++ b/components/index/cards/slack.js
@@ -91,10 +91,10 @@ export default function Slack({ data, slackKey, events }) {
variant="subtitle"
sx={{ fontSize: [1, '16px', '24px'] }}
>
- Coding doesn’t have to be a solitary activity. At Hack Club, we
- make things together and in our Slack, you’ll find awesome people to
- hangout with too. Code together, find your programming community, or
- just hang out.
+ Coding doesn’t have to be a solitary activity. At Hack Club,
+ we make remarkable things together, and in our Slack you’ll find
+ awesome people to hang out with too. Code together, find your programming
+ community, dream up something wild, or just #lounge.
Occasionally we invite someone we really want to speak to (like Sal
diff --git a/components/slack/projects.js b/components/slack/projects.js
index fe91baa3..aafe4149 100644
--- a/components/slack/projects.js
+++ b/components/slack/projects.js
@@ -2,7 +2,7 @@ const projects = [
{
title: 'Brainwave device for thought-based computer interaction.',
description:
- 'The team of teens behind BCI is building both the hardware and software for a brainwave reading device to interact with computers using thoughts',
+ 'The team of teens behind Monolith BCI is building both the hardware and software for a brainwave reading device to interact with computers using thoughts',
img: 'bci',
color: ['#ec3750', '#F58695'],
itemId: 0
diff --git a/package.json b/package.json
index 85c5e76c..fc90a3c1 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
"format": "prettier --write ."
},
"dependencies": {
- "@apollo/client": "^3.9.9",
+ "@apollo/client": "^3.9.11",
"@emotion/react": "^11.11.4",
"@emotion/styled": "^11.11.5",
"@github/time-elements": "^4.0.0",
@@ -37,6 +37,7 @@
"animated-value": "^0.2.4",
"animejs": "^3.2.2",
"axios": "^1.6.7",
+ "camelcase": "^8.0.0",
"cookies-next": "^4.0.0",
"country-list": "^2.3.0",
"country-list-js": "^3.1.8",
@@ -75,7 +76,7 @@
"react-tooltip": "^4.5.1",
"react-tsparticles": "^2.12.2",
"react-type-animation": "^3.2.0",
- "react-use-websocket": "^4.7.0",
+ "react-use-websocket": "^4.8.1",
"react-wrap-balancer": "^1.1.0",
"recharts": "2.12.2",
"remark": "^15.0.1",
diff --git a/pages/api/bin/wokwi/new.js b/pages/api/bin/wokwi/new.js
new file mode 100644
index 00000000..6fc38f34
--- /dev/null
+++ b/pages/api/bin/wokwi/new.js
@@ -0,0 +1,104 @@
+import AirtablePlus from "airtable-plus"
+
+const createProject = async (partsList=[]) => {
+ const airtable = new AirtablePlus({
+ apiKey: process.env.AIRTABLE_API_KEY,
+ baseID: 'appKjALSnOoA0EmPk',
+ tableName: 'Supported Parts'
+ })
+
+ const parts = [
+ { "type": "board-pi-pico-w", "id": "pico", "top": 0, "left": 0, "attrs": {} }
+ ]
+
+ await Promise.all(partsList.map(async (part) => {
+ const airPart = await airtable.read({
+ filterByFormula: `{Wokwi Name}= "${part}"`,
+ maxRecords: 1
+ })
+ return airPart[0].fields['Wokwi Name'].split(',').forEach((name, i) => {
+ parts.push({
+ type: name,
+ id: name + '-' + i,
+ left: i * 100, // this is roughtly the width of most parts
+ })
+ })
+ }))
+
+ const body = JSON.stringify({
+ name: "The Bin!",
+ unlisted: false,
+ files: [{
+ name: "help.md",
+ content: `# Welcome to The Bin! 🦝
+
+Now that you've thrown some parts into The Bin, it's time to turn that trash into treasure! 🗑️➡️💎
+
+Wire up your parts and write some code to make them work together.
+
+If you'd like a tutorial, check out some sample projects:
+https://jams.hackclub.com/tags/the-bin
+
+You can get help by chatting with other high schoolers on the Hack Club Slack in the #electronics channel:
+👉 https://hackclub.com/slack 👈
+
+Once you're ready build your design IRL, click the "Share" button and submit your design:
+https://hackclub.com/bin/submit
+ `
+ },
+ {
+ name: "sketch.ino",
+ content: `// Now turn this trash into treasure!
+// Want some help? You can chat with us on the Hack Club Slack in the #electronics channel
+void setup() {
+ // put your setup code here, to run once:
+ Serial1.begin(115200);
+ Serial1.println("Hello, Raspberry Pi Pico W!");
+}
+void loop() {
+ // put your main code here, to run repeatedly:
+ delay(1); // this speeds up the simulation
+}`
+ }, {
+ name: "diagram.json",
+ content: JSON.stringify({
+ "version": 1,
+ "author": "The Bin - Hack Club",
+ "editor": "wokwi",
+ "parts": parts,
+ "connections": [["pico:GP0", "$serialMonitor:RX", "", []], ["pico:GP1", "$serialMonitor:TX", "", []]], "dependencies": {}
+ }, null, 2)
+ }],
+ })
+
+ const response = await fetch('https://wokwi.com/api/projects/save', {
+ method: 'POST',
+ cors: 'no-cors',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Referer': 'https://wokwi.com/projects/new/pi-pico-w',
+ 'User-Agent': 'Hack Club - contact max@hackclub.com for any complaints!'
+ },
+ body
+ }).catch((e) => {
+ console.log(e)
+ })
+
+ const data = await response.json()
+ const { projectId } = data
+
+ return `https://wokwi.com/projects/${projectId}`
+}
+
+export default async function handler(req, res) {
+ if (req.method === 'POST') {
+ const { parts } = req.body
+
+ const shareLink = await createProject(parts)
+ if (shareLink) {
+ res.status(200).json({ shareLink })
+ } else {
+ res.status(500).json({ error: 'Failed to create project' })
+ }
+ }
+}
\ No newline at end of file
diff --git a/pages/api/bin/wokwi/parts.js b/pages/api/bin/wokwi/parts.js
new file mode 100644
index 00000000..f01bdbd1
--- /dev/null
+++ b/pages/api/bin/wokwi/parts.js
@@ -0,0 +1,29 @@
+import AirtablePlus from "airtable-plus"
+import camelcase from "camelcase"
+
+const camelizeObject = (obj) => {
+ Object.keys(obj).forEach(key => {
+ obj[camelcase(key)] = obj[key]
+ if (key !== camelcase(key)) {
+ delete obj[key]
+ }
+ })
+ return obj
+}
+
+const wokwiParts = async () => {
+ const airtable = new AirtablePlus({
+ apiKey: process.env.AIRTABLE_API_KEY,
+ baseID: 'appKjALSnOoA0EmPk',
+ tableName: 'Supported Parts'
+ })
+
+ const records = await airtable.read()
+ const parts = records.map(record => camelizeObject(record.fields))
+ return parts
+}
+
+export default async function handler(req, res) {
+ const data = await wokwiParts()
+ res.status(200).json(data)
+}
\ No newline at end of file
diff --git a/pages/bin.js b/pages/bin.js
index a9a0ff9c..490c88e0 100644
--- a/pages/bin.js
+++ b/pages/bin.js
@@ -234,13 +234,15 @@ export default function Bin() {
cursor={false}
sequence={[
// Same substring at the start will only be typed out once, initially
- 'an RC car',
+ 'a laser guided nerf gun',
1000, // wait 1s before replacing "Mice" with "Hamsters"
'a clap activated lamp',
1000,
- 'a keyboard',
+ 'a temperature activated Febreze can',
1000,
- 'an alarm clock',
+ 'a flame actuated speaker',
+ 1000,
+ 'a light dependant door',
1000
]}
repeat={Infinity}
diff --git a/pages/fiscal-sponsorship/apply/index.js b/pages/fiscal-sponsorship/apply/index.js
index b6023368..79b490c3 100644
--- a/pages/fiscal-sponsorship/apply/index.js
+++ b/pages/fiscal-sponsorship/apply/index.js
@@ -117,6 +117,33 @@ export default function Apply() {
})
}
>
+
+
+ Join our waitlist
+
+
+ HCB has been experiencing some exciting growth and subsequent
+ capacity constraints. We are prioritizing organizations ran by Hack
+ Clubbers, teens, FIRST teams, as well as groups with an annual
+ budget greater than $50k. Please expect to hear back by May 1st,
+ 2024.
+
+
+ We currently do not work with new organizations outside of STEM,
+ Education, and Climate.
+
+
+
Your organization
diff --git a/pages/fiscal-sponsorship/apply/success.js b/pages/fiscal-sponsorship/apply/success.js
index 1ce237f5..f895d626 100644
--- a/pages/fiscal-sponsorship/apply/success.js
+++ b/pages/fiscal-sponsorship/apply/success.js
@@ -51,8 +51,10 @@ export default function ApplicationSuccess() {
- We’ll review your application and get back to you within two
- business days.
+ We are prioritizing organizations ran by Hack Clubbers, teens, FIRST
+ teams, as well as groups with an annual budget greater than $50k. If
+ you fall outside of these categories, you will hear back from us by
+ May 1st, 2024.
diff --git a/pages/fiscal-sponsorship/index.js b/pages/fiscal-sponsorship/index.js
index d4dfa72a..7d6c9587 100644
--- a/pages/fiscal-sponsorship/index.js
+++ b/pages/fiscal-sponsorship/index.js
@@ -241,10 +241,11 @@ export default function Page() {
sx={{
bg: 'blue',
backgroundImage: theme => theme.util.gx('cyan', 'blue'),
+ fontSize: [16, 16, 32],
lineHeight: 0.9
}}
>
- Apply now
+ Join the waitlist
diff --git a/pages/index.js b/pages/index.js
index 7ec0a14b..1b79d863 100644
--- a/pages/index.js
+++ b/pages/index.js
@@ -40,6 +40,7 @@ import Photo from '../components/photo'
import Comma from '../components/comma'
import Haxidraw from '../components/index/cards/haxidraw'
import Onboard from '../components/index/cards/onboard'
+import Apocalypse from '../components/index/cards/apocalypse'
/** @jsxImportSource theme-ui */
@@ -203,10 +204,10 @@ function Page({
gradient="linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.45))"
/>
+
diff --git a/pages/slack.js b/pages/slack.js
index b5e7c3be..d571b0ab 100644
--- a/pages/slack.js
+++ b/pages/slack.js
@@ -141,7 +141,7 @@ const SlackPage = () => {
person="JC"
img="https://ca.slack-edge.com/T0266FRGM-U03MNFDRSGJ-e6fb939acfd8-512"
age={17}
- location="CT"
+ location="MA"
/>
+