Skip to content

Commit 0e7eb0f

Browse files
Changes
Co-authored-by: ghostcodedynamics <295822717+ghostcodedynamics@users.noreply.github.com>
1 parent d9f2de6 commit 0e7eb0f

1 file changed

Lines changed: 136 additions & 7 deletions

File tree

‎src/routes/events.tsx‎

Lines changed: 136 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,144 @@
1-
import { ComingSoon } from "@/components/coming-soon";
1+
import { Video, Users, Mic, Hammer, ShieldCheck, GraduationCap } from "lucide-react";
2+
import { PageHero, Reveal, SectionHeader } from "@/components/section";
23
import { Seo } from "@/components/seo";
4+
import { Faq, FeatureGrid, ProgramCta, StatusNote } from "@/components/program-page";
5+
import { breadcrumbSchema, webPageSchema } from "@/lib/seo";
6+
7+
const title = "Events & Workshops - GhostCode Dynamics";
8+
const description =
9+
"Workshops, webinars and live builds on modern web development and cybersecurity, hosted by GhostCode Dynamics.";
10+
const path = "/events";
11+
12+
const FORMATS = [
13+
{
14+
icon: <Hammer className="h-5 w-5" />,
15+
title: "Live builds",
16+
desc: "A feature built from empty file to deployed, unedited — including the parts that break.",
17+
},
18+
{
19+
icon: <Mic className="h-5 w-5" />,
20+
title: "Webinars",
21+
desc: "Sixty-minute deep dives on one topic with a proper Q&A at the end.",
22+
},
23+
{
24+
icon: <ShieldCheck className="h-5 w-5" />,
25+
title: "Security clinics",
26+
desc: "Break a deliberately vulnerable app, then patch it together on the call.",
27+
},
28+
{
29+
icon: <GraduationCap className="h-5 w-5" />,
30+
title: "Campus sessions",
31+
desc: "Guest sessions for colleges and student clubs on getting hired and building real projects.",
32+
},
33+
];
34+
35+
const PLANNED = [
36+
{
37+
kind: "Live build",
38+
title: "Ship a portfolio that gets replies",
39+
desc: "Design, build and deploy a developer portfolio in one sitting, with brutal feedback on real submissions.",
40+
when: "Date to be announced",
41+
},
42+
{
43+
kind: "Security clinic",
44+
title: "Breaking (and fixing) auth",
45+
desc: "Session handling, JWT mistakes and the login flows that quietly leak accounts.",
46+
when: "Date to be announced",
47+
},
48+
{
49+
kind: "Webinar",
50+
title: "MERN in the real world",
51+
desc: "What actually changes when a side project has paying users: errors, logs, backups and cost.",
52+
when: "Date to be announced",
53+
},
54+
];
55+
56+
const FAQS = [
57+
{
58+
q: "When is the first event?",
59+
a: "Dates are not published yet. The schedule opens once the community core is in place, so sessions have people in them.",
60+
},
61+
{
62+
q: "Free or paid?",
63+
a: "Most sessions will be free. Longer hands-on workshops with reviewed exercises may be paid, and always clearly priced up front.",
64+
},
65+
{
66+
q: "Are recordings available?",
67+
a: "Yes — free sessions get published afterwards, with notes and the repo.",
68+
},
69+
{
70+
q: "Can you speak at our college?",
71+
a: "Yes. Reach out with your dates, audience size and topic interest and we'll work it out.",
72+
},
73+
];
374

475
export default function Page() {
576
return (
677
<>
7-
<Seo title={"Events & Workshops - GhostCode Dynamics"} description={"Future workshops} path={webinars and live builds on web development and cybersecurity."} robots="noindex, follow" />
8-
<ComingSoon
9-
module="Events"
10-
title="Workshops, webinars & live builds."
11-
description="Free and paid sessions on web development, cybersecurity and shipping real projects."
12-
/>
78+
<Seo
79+
title={title}
80+
description={description}
81+
path={path}
82+
schemas={[
83+
webPageSchema(title, description, path),
84+
breadcrumbSchema([
85+
{ name: "Home", path: "/" },
86+
{ name: "Events", path },
87+
]),
88+
]}
89+
/>
90+
<PageHero
91+
eyebrow="Events · Scheduling"
92+
title="Workshops, webinars & live builds."
93+
description="Sessions on web development, cybersecurity and shipping real projects — practical, recorded, and open to students."
94+
>
95+
<StatusNote>Calendar opening soon · Topics being finalised</StatusNote>
96+
</PageHero>
97+
98+
<FeatureGrid eyebrow="Formats" title="The kinds of sessions we run" items={FORMATS} columns={4} />
99+
100+
<section className="relative border-t border-border/60 py-16 md:py-24">
101+
<div className="container-prose">
102+
<SectionHeader
103+
eyebrow="Line-up"
104+
title="First sessions planned"
105+
description="Topics are set; dates get announced to the list before they go public."
106+
/>
107+
<ul className="mt-12 grid gap-4">
108+
{PLANNED.map((e) => (
109+
<Reveal key={e.title}>
110+
<li className="flex flex-col gap-3 rounded-2xl border border-border bg-card/60 p-6 backdrop-blur transition hover:border-primary/40 sm:flex-row sm:items-center sm:justify-between">
111+
<div>
112+
<span className="font-mono text-[10px] uppercase tracking-[0.25em] text-primary">
113+
{e.kind}
114+
</span>
115+
<h3 className="mt-2 font-display text-lg font-semibold tracking-tight text-foreground">
116+
{e.title}
117+
</h3>
118+
<p className="mt-2 max-w-2xl text-sm leading-relaxed text-muted-foreground">
119+
{e.desc}
120+
</p>
121+
</div>
122+
<span className="inline-flex shrink-0 items-center gap-2 rounded-full border border-border bg-surface/60 px-3 py-1.5 text-xs text-muted-foreground">
123+
<Video className="h-3.5 w-3.5" aria-hidden />
124+
{e.when}
125+
</span>
126+
</li>
127+
</Reveal>
128+
))}
129+
</ul>
130+
</div>
131+
</section>
132+
133+
<Faq items={FAQS} />
134+
135+
<ProgramCta
136+
title="Get the schedule first"
137+
description="Seats in hands-on sessions are limited. The list gets dates and links before anything is posted publicly."
138+
primaryLabel="Notify me about events"
139+
secondaryLabel="Join the community"
140+
secondaryTo="/community"
141+
/>
13142
</>
14143
);
15144
}

0 commit comments

Comments
 (0)