{s.term}
-
+
{s.title}
diff --git a/src/app/page.tsx b/src/app/page.tsx index c843c4f92..f94a12441 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,24 +1,130 @@ import Image from "next/image"; -import { Link } from "next-view-transitions"; +import { + cohorts, + products, + publications, + researchAreas, + team, +} from "@/content/site"; import { asset } from "@/lib/asset"; -import { HeroVisual } from "@/components/HeroVisual"; import { HeroField } from "@/components/HeroField"; -import { HeroTitle } from "@/components/HeroTitle"; -import { HomeViewToggle } from "@/components/HomeViewToggle"; import { HomeBody } from "@/components/HomeBody"; +import { StatementCarousel, type Statement } from "@/components/StatementCarousel"; import { Reveal } from "@/components/motion/Reveal"; -import { Magnetic } from "@/components/motion/Magnetic"; -import { Tilt3D } from "@/components/motion/Tilt3D"; -import { cohorts } from "@/content/site"; -export default function Home() { - const current = cohorts.find((c) => c.current); +/* Title and description come from the root layout's defaults — this is the + page they were written for. */ + +/** + * Every figure here is counted from `src/content/site.ts` at build time rather + * than typed in. The home page has already shipped a wrong number once — the + * portfolio link read "all five" while there were four research areas — and a + * hero that leads with figures is the worst place for that to happen again. + */ +const fieldedProjects = researchAreas.reduce( + (total, area) => total + area.projects.length, + 0, +); + +/** + * /portfolio spells its count out in its own heading ("Four questions."), so + * the slide that links there has to spell it the same way — a slide that says + * "4 questions" while the page it opens says "Four" reads as a different page. + */ +const WORDS = ["Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"]; +const questionCount = WORDS[researchAreas.length] ?? researchAreas.length; + +/** + * One card per destination, each led by that destination's own `
` — same + * words, same accent half — so the carousel reads as doors into the site + * rather than as statistics. The figure a card carries is the one its heading + * does NOT already state, which is why the portfolio card counts projects (its + * heading counts the questions) and the publications card says "in the + * catalogue" rather than repeating "written up". + * + * The first card stands for the home page itself — the wordmark and mission + * line. It carries no button: this IS the home page, so there is nowhere to + * send a reader who is already here. + */ +const statements: Statement[] = [ + { + lead: "Ethical Tech CoLab", + // The wordmark carries this card the way it carries `/`, so it runs a step + // larger than the sentence-shaped headings on the other cards. + headingClass: "text-[clamp(4.25rem,13vw,11rem)] leading-[0.88]", + // The serif mission line with "human condition" in the accent, and the + // intro with its live link out to the Center for Global Affairs. Passed as + // nodes so the card keeps that markup rather than being flattened to the + // caps-and-muted styling the counting cards use. + figure: ( +
+ Exploring technology to improve
+
the{" "}
+ human condition.
+
+ A research collaboration between NYU's{" "} + + Center for Global Affairs + {" "} + and Microsoft — changing the conversation on how people are informed, + and how emerging technology can be used for good. +
+ ), + }, + { + lead: `${questionCount} questions. `, + em: "One frontier.", + figure: `${fieldedProjects} projects in the portfolio`, + line: "Evacuation, cultural heritage, traceability, diplomacy — each question carried through to a fielded prototype, in the open.", + cta: "Explore the portfolio", + href: "/portfolio", + }, + { + lead: "Run the ", + em: "research", + tail: ".", + figure: `${products.length} demos you can open`, + line: "Not screenshots: the prototypes themselves, running in the browser with their source alongside.", + cta: "Open the live demos", + href: "/demos", + }, + { + lead: "The research, ", + em: "written up", + tail: ".", + figure: `${publications.items.length} in the catalogue`, + line: "Every research question the CoLab takes on is written up academically, including what did not hold.", + cta: "Read the publications", + href: "/publications", + }, + { + lead: "The people ", + em: "building", + tail: " this.", + figure: `${team.researchers.length} researchers across ${cohorts.length} cohorts`, + line: "Graduate researchers at NYU's Center for Global Affairs, with advisors and resident fellows alongside.", + cta: "Meet the team", + href: "/team", + }, +]; +export default function Home() { return ( <> - {/* Hero */} + {/* Hero — the statement carousel carries what a hero paragraph would, + one figure at a time. */}- A research collaboration between NYU's{" "} - - Center for Global Affairs - {" "} - and Microsoft — changing the conversation on how people are - informed, and how emerging technology can be used for good. + +
+ NYU CGA × Microsoft
`: the hero heading IS the
+ rotating statement, rather than a slogan with the statements
+ parked underneath it. */}
+
+
+
Projects from earlier cohorts, grouped by the year they were - worked on. Open a project with a{" "} - + to launch its live demo. + worked on, with their live demos, code, and reports alongside.
+ The Only Winning Move +
++ {warGamesReport.subtitle} +
++ {warGamesReport.authors} +
++ {stat.value} +
++ {stat.label} +
++ {warGamesReport.thesis} +
+{section.number}
++ {section.title} +
+References
+Sources
+-
+ {warGamesReport.citations.map((cite, i) => (
+
- + + {String(i + 1).padStart(2, "0")} + + + {cite.url ? ( + + {cite.ref} + + ) : ( + {cite.ref} + )} + + + ))} +
+ This report describes a research prototype built for academic + demonstration and teaching. The game dramatises a fictional + escalation borrowed from a 1983 film. It models no real command and + control system, no real escalation dynamics, and no real state + behaviour, and nothing it produces should inform any policy, + operational, or intelligence judgement. Model measurements are of + specific model versions under one prompt contract in July 2026. +
+- {project.name} -
- )} ++ {project.name} +
{project.summary}
-