diff --git a/app/(landing)/layout.tsx b/app/(landing)/layout.tsx new file mode 100644 index 0000000..b76986f --- /dev/null +++ b/app/(landing)/layout.tsx @@ -0,0 +1,14 @@ +import type { Metadata } from 'next' + +export const metadata: Metadata = { + title: 'hackerspace.sh — Operational Software for Makerspaces', + description: 'Member management, dues tracking, task coordination, and project visibility. Built by people who have actually run these spaces.', +} + +export default function LandingLayout({ + children, +}: { + children: React.ReactNode +}) { + return children +} diff --git a/app/(landing)/page.tsx b/app/(landing)/page.tsx new file mode 100644 index 0000000..a570b32 --- /dev/null +++ b/app/(landing)/page.tsx @@ -0,0 +1,504 @@ +'use client' + +import { useState, useEffect } from 'react' +import Link from 'next/link' + +// Icons +function IcoUsers({ className }: { className?: string }) { + return +} +function IcoTask({ className }: { className?: string }) { + return +} +function IcoFolder({ className }: { className?: string }) { + return +} +function IcoCreditCard({ className }: { className?: string }) { + return +} +function IcoLock({ className }: { className?: string }) { + return +} +function IcoDoc({ className }: { className?: string }) { + return +} +function IcoArrow({ className }: { className?: string }) { + return +} +function IcoTerminal({ className }: { className?: string }) { + return +} +function IcoEye({ className }: { className?: string }) { + return +} +function IcoPin({ className }: { className?: string }) { + return +} + +// ─── Mini UI Previews ────────────────────────────────────────────────────────── + +function MiniMemberTable() { + const [activeRow, setActiveRow] = useState(0) + const members = [ + { name: 'Alex Chen', tier: 'PLUS', status: 'current' }, + { name: 'Jordan Mills', tier: 'BASIC', status: 'current' }, + { name: 'Sam Rivera', tier: 'PLUS', status: 'late' }, + { name: 'Casey Wong', tier: 'BASIC', status: 'current' }, + ] + useEffect(() => { + const t = setInterval(() => setActiveRow(p => (p + 1) % members.length), 2000) + return () => clearInterval(t) + }, [members.length]) + return ( +
CNC Upgrade
+Network rack
+{members}
+12
++ hackerspace management +
++ Track who is in your space, what they owe, what needs doing, and where to find the WiFi password. +
+What it does
++ {feature.description} +
+Setup
+{item.step}
+{item.description}
+