diff --git a/.env.example b/.env.example index d73cc03..4fedd7c 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,7 @@ # Get this from your Discord channel: Edit Channel → Integrations → Webhooks DISCORD_WEBHOOK_URL= COLOCATION_RESERVATION_DISCORD_WEBHOOK= +OFFICE_SIGNUP_DISCORD_WEBHOOK= # Autumn payments keys. Webhooks are in beta as of 04/04/2025, so you have to contact them to use it. AUTUMN_SECRET_KEY= diff --git a/src/lib/components/Nav.svelte b/src/lib/components/Nav.svelte index 97c9a46..1513d2c 100644 --- a/src/lib/components/Nav.svelte +++ b/src/lib/components/Nav.svelte @@ -4,7 +4,13 @@ import { Icon } from '@steeze-ui/svelte-icon'; import { ChevronDown, Close, Menu } from '@steeze-ui/carbon-icons'; - type InternalHref = '/' | '/about' | '/services/vps' | '/services/colocation' | '/docs'; // can we just use sveltekit resolve here + type InternalHref = + | '/' + | '/about' + | '/our-office' + | '/services/vps' + | '/services/colocation' + | '/docs'; // can we just use sveltekit resolve here let isMobileMenuOpen = $state(false); let openDropdown = $state(null); @@ -28,6 +34,11 @@ description: "Why we're building this.", href: '/about' as InternalHref }, + { + label: 'Our Office', + description: 'Work alongside us in Ravenswood.', + href: '/our-office' as InternalHref + }, { label: 'Documentation', description: 'What to expect when using Stack.', diff --git a/src/routes/our-office/+page.server.ts b/src/routes/our-office/+page.server.ts new file mode 100644 index 0000000..09c8d14 --- /dev/null +++ b/src/routes/our-office/+page.server.ts @@ -0,0 +1,47 @@ +import { fail } from '@sveltejs/kit'; +import { env } from '$env/dynamic/private'; +import type { Actions } from './$types'; + +export const actions: Actions = { + signup: async ({ request }) => { + const webhookUrl = env.OFFICE_SIGNUP_DISCORD_WEBHOOK; + if (!webhookUrl) { + return fail(500, { error: 'Office signup is not configured.' }); + } + const data = await request.formData(); + + const name = String(data.get('name') ?? '').trim(); + const email = String(data.get('email') ?? '').trim(); + const membership = String(data.get('membership') ?? '').trim(); + const note = String(data.get('note') ?? '').trim(); + + if (!name || !email) { + return fail(400, { error: 'Name and email are required.', name, email, membership, note }); + } + + const res = await fetch(webhookUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + embeds: [ + { + title: 'New office membership inquiry', + color: 0xc6716d, + fields: [ + { name: 'Name', value: name, inline: true }, + { name: 'Email', value: email, inline: true }, + { name: 'Membership', value: membership || 'Not specified', inline: true }, + ...(note ? [{ name: 'Note', value: note }] : []) + ] + } + ] + }) + }); + + if (!res.ok) { + return fail(500, { error: 'Something went wrong. Email us directly at hello@fyrastack.com.', name, email, membership, note }); + } + + return { success: true }; + } +}; diff --git a/src/routes/our-office/+page.svelte b/src/routes/our-office/+page.svelte new file mode 100644 index 0000000..cba85a7 --- /dev/null +++ b/src/routes/our-office/+page.svelte @@ -0,0 +1,436 @@ + + + + Our Office | Fyra Stack + + + + + + + + + + + + + + +
+ + +
+

+ We have an office. +

+

+ Hangout with us. +

+

+ Our office serves as a community space for anyone and everyone. +

+
+ + +
+ + +
+ {#each [{ value: '5206 N Damen Ave', label: 'Ravenswood, Chicago' }, { value: '850 sq ft', label: 'Ground floor · Foster & Damen' }, { value: 'Open Door Fridays', label: '7 - 10pm CST' }] as stat (stat.label)} +
+ {stat.value} + {stat.label} +
+ {/each} +
+ + +
+
+ +
+

+ The office. +

+

+ We needed a place to work. We ended up with more space than we needed, so we opened it up. + Our office is on the ground floor and located at Foster and Damen in Ravenswood. +

+

+ A lot of us work out of here. If you're a Stack user and something isn't working, the person + who built it is probably in the same room. That's not a pitch, just how the office is laid + out. +

+

+ Bring your work, bring your projects, most importantly, bring yourself. +

+
+ + +
+
+ The office +
+
+

Access

+

24/7

+

Members get a front door pin.

+
+
+

Day pass

+

$10

+

Membership from $30/mo.

+
+
+
+
+ + +
+ {#each ['/assets/office-2.jpeg', '/assets/office-3.jpeg', '/assets/office-4.jpeg'] as src (src)} +
+ The office +
+ {/each} +
+ + +
+
+

+ What's here. +

+

+ Our office has a lot of interesting amenities, from desks with monitors and docks to couches + and tools. +

+
+
+ {#each amenities as a (a.label)} +
+
+ {/each} +
+
+ + +
+
+
+

+ Want to get a feel first? +

+

+ Open doors is every Friday from 7 - 10pm CST, and it's free. Come see the space, meet + people, and work on something. If you're on the fence about a membership, this is how you + can figure it out. +

+
+
+
+

+ Open Door +

+

Free

+

Every Friday · 7 - 10pm CST · Just drop by!

+
+
+

Address

+

5206 N Damen Ave

+

Ravenswood, Chicago, IL 60625

+
+
+

Transit

+

~10 min from Brown Line

+

Damen stop · Bus 50 on the corner

+
+
+
+
+ + +
+
+

Membership.

+

+ We need to cover operational costs, so we charge a small membership fee. It gets you front + door pin and 24/7 access. +

+
+ +
+
+

Day Pass

+

+ $10/day +

+

Drop in any time, there's no commitment.

+
+
+

Monthly

+

+ $30/mo +

+

+ 24/7 access, front door pin, and bring a guest. +

+
+
+ +
+

+ Cost shouldn't stop you. + Please email + contact@fyrastack.com and we'll work something out. +

+
+
+ + +
+
+

Rules.

+

The short version? Be decent.

+
+
+ {#each conduct as c (c.n)} +
+ {c.n} +
+

{c.title}

+

{c.body}

+
+
+ {/each} +
+
+ + +
+
+

Sign up.

+

+ Tell us who you are and what you're after. We'll follow up with next steps. +

+
+ +
+ {#if form?.success} +

+ Got it. We'll be in touch at the email you provided. +

+ {:else} +
+ {#if form?.error} +

{form.error}

+ {/if} + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ {/if} +
+
+ + +
+
+

Interested?

+

+ Email us or drop into the Discord. Someone will get back to you. +

+
+ +
diff --git a/static/assets/office-1.jpeg b/static/assets/office-1.jpeg new file mode 100644 index 0000000..05b4c66 Binary files /dev/null and b/static/assets/office-1.jpeg differ diff --git a/static/assets/office-2.jpeg b/static/assets/office-2.jpeg new file mode 100644 index 0000000..9eb7243 Binary files /dev/null and b/static/assets/office-2.jpeg differ diff --git a/static/assets/office-3.jpeg b/static/assets/office-3.jpeg new file mode 100644 index 0000000..8d72ddc Binary files /dev/null and b/static/assets/office-3.jpeg differ diff --git a/static/assets/office-4.jpeg b/static/assets/office-4.jpeg new file mode 100644 index 0000000..0c325e7 Binary files /dev/null and b/static/assets/office-4.jpeg differ