Ports the existing hackerspace.sh Vue site (sibling repo) into this
codebase as a route group `app/(resources)/` so a single domain serves
both the public research / games subsite and the authenticated
management app.
Routes added (all public, all prerendered):
/resources landing page (the original HomePage.vue)
/zine iframe to the printable hackerspace zine
/governance iframe to Governance in a Box
/space-after-dark iframe to the isometric exploration game
/proposal-duel iframe to the proposal-debate game
/atlas iframe to the bundled atlas.html (2.2 MB)
The individual resource paths match the originals exactly so existing
deep links and bookmarks survive the domain switch-over.
Ports six Vue components to React: Wordmark, SpaceIcon, TraceIcon,
CubeIcon, KeyIcon, GridIcon, PromptIcon, AtlasLogo, ProjectCard,
IframeWrapper. CSS scoped under `.resources-root` so the dark IBM Plex
Mono / Libre Baskerville theme cannot bleed into the management app's
shadcn design system. Fonts loaded via next/font/google. The 2.2 MB
atlas.html lives in /public.
proxy.ts adds the six routes plus /atlas.html to PUBLIC_ROUTES so
anonymous visitors can reach them without redirecting to /login.
The management landing page links to /resources twice: a "Resources"
nav link, and a callout under the CTA buttons ("Not running a space?
Read the hackerspace research and games").
34 lines
930 B
TypeScript
34 lines
930 B
TypeScript
import type { Metadata } from 'next'
|
|
import { IBM_Plex_Mono, Libre_Baskerville } from 'next/font/google'
|
|
import './resources.css'
|
|
|
|
const ibmPlexMono = IBM_Plex_Mono({
|
|
subsets: ['latin'],
|
|
weight: ['400', '500'],
|
|
variable: '--font-ibm-plex-mono',
|
|
display: 'swap',
|
|
})
|
|
|
|
const libreBaskerville = Libre_Baskerville({
|
|
subsets: ['latin'],
|
|
weight: ['400', '700'],
|
|
style: ['normal', 'italic'],
|
|
variable: '--font-libre-baskerville',
|
|
display: 'swap',
|
|
})
|
|
|
|
export const metadata: Metadata = {
|
|
title: 'hackerspace.sh',
|
|
description:
|
|
'How hackerspaces actually work. Research, tools, and games for community workshop governance.',
|
|
}
|
|
|
|
export default function ResourcesLayout({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<div className={`resources-root ${ibmPlexMono.variable} ${libreBaskerville.variable}`}>
|
|
<div className="resources-grid-bg" aria-hidden="true" />
|
|
{children}
|
|
</div>
|
|
)
|
|
}
|