diff --git a/website/src/app/[countryId]/ai/page.tsx b/website/src/app/[countryId]/ai/page.tsx new file mode 100644 index 000000000..f75d7ea41 --- /dev/null +++ b/website/src/app/[countryId]/ai/page.tsx @@ -0,0 +1,32 @@ +import type { Metadata } from "next"; +import { VALID_COUNTRIES } from "@/lib/countries"; +import HeroSection from "@/components/static/HeroSection"; +import AIContent from "@/components/ai/AIContent"; + +export const metadata: Metadata = { + title: "AI & machine learning", + description: + "PolicyEngine uses artificial intelligence and machine learning to make policy analysis more accurate and accessible.", +}; + +export function generateStaticParams() { + return VALID_COUNTRIES.map((countryId) => ({ countryId })); +} + +export default async function AIPage({ + params, +}: { + params: Promise<{ countryId: string }>; +}) { + const { countryId } = await params; + + return ( +
+ + +
+ ); +} diff --git a/website/src/components/Header.tsx b/website/src/components/Header.tsx index 9ce05fcd5..72103b65e 100644 --- a/website/src/components/Header.tsx +++ b/website/src/components/Header.tsx @@ -429,7 +429,13 @@ const mobileNavLinkStyle: React.CSSProperties = { display: "block", }; -function MobileNavLink({ item, onClose }: { item: NavItemSetup; onClose: () => void }) { +function MobileNavLink({ + item, + onClose, +}: { + item: NavItemSetup; + onClose: () => void; +}) { const Tag = item.external ? "a" : Link; return ( @@ -582,8 +588,18 @@ export default function Header() { const navItems: NavItemSetup[] = [ { label: "Research", href: `/${countryId}/research`, hasDropdown: false }, - { label: "Model", href: `/${countryId}/model`, hasDropdown: false, external: true }, - { label: "API", href: `/${countryId}/api`, hasDropdown: false, external: true }, + { + label: "Model", + href: `/${countryId}/model`, + hasDropdown: false, + external: true, + }, + { + label: "API", + href: `/${countryId}/api`, + hasDropdown: false, + external: true, + }, { label: "About", hasDropdown: true, @@ -591,6 +607,7 @@ export default function Header() { { label: "Team", href: `/${countryId}/team` }, { label: "Supporters", href: `/${countryId}/supporters` }, { label: "Citations", href: `/${countryId}/citations` }, + { label: "AI & machine learning", href: `/${countryId}/ai` }, ], }, { label: "Donate", href: `/${countryId}/donate`, hasDropdown: false }, diff --git a/website/src/components/ai/AIContent.tsx b/website/src/components/ai/AIContent.tsx new file mode 100644 index 000000000..9dd1aa24b --- /dev/null +++ b/website/src/components/ai/AIContent.tsx @@ -0,0 +1,382 @@ +"use client"; + +import Link from "next/link"; +import ContentSection from "@/components/static/ContentSection"; +import { Button } from "@/components/ui"; +import { colors, typography } from "@policyengine/design-system/tokens"; + +interface AIContentProps { + countryId: string; +} + +export default function AIContent({ countryId }: AIContentProps) { + const isUK = countryId === "uk"; + const democratize = isUK ? "democratise" : "democratize"; + const optimized = isUK ? "optimised" : "optimized"; + const recognized = isUK ? "recognised" : "recognized"; + + return ( + <> + {/* Hero banner */} + +
+

+ AI grounded in real microsimulation +

+

+ PolicyEngine combines tax-benefit microsimulation with large + language models to {democratize} policy understanding. Every answer + our AI tools give is backed by a real simulation — never fabricated, + never guessed. +

+
+ + + + + + +
+
+
+ + {/* User-facing tools */} + +

+ Open chat assistants and benchmarks you can use today. +

+
+ {tools.map((tool) => ( + +
+

+ {tool.title} +

+ {tool.badge && ( + + {tool.badge} + + )} +
+

+ {tool.description} +

+ + Open → + +
+ ))} +
+
+ + {/* Four layers */} + +

+ We treat AI as infrastructure, not a feature. Our work spans four + layers — from the chat experiences users see, to the data servers that + let other AI assistants reason about policy. +

+
+ {layers.map((layer, index) => ( +
+
+ Layer {index + 1} +
+

+ {layer.title} +

+

+ {layer.description} +

+
+ ))} +
+
+ + {/* Timeline */} + +
+ {timeline.map((entry) => ( +
+
+ {entry.period} +
+

+ {entry.title} +

+

+ {entry.description(optimized, recognized, democratize)} +

+
+ ))} +
+
+ + {/* For developers */} + +

+ Most of our AI work is open source. Use these to build your own + policy-aware AI tools, or to give an existing AI assistant access to + PolicyEngine. +

+
+ {devResources.map((resource) => ( + +
+ {resource.category} +
+

+ {resource.title} +

+

+ {resource.description} +

+ + View on GitHub → + +
+ ))} +
+
+ + {/* Demo video */} + +
+