Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/slideshows.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ import { cbo2026Config } from "@/slideshows/cbo-2026/config";
import { civicBuilders2026Config } from "@/slideshows/civic-builders-2026/config";
import { policybenchWebinarConfig } from "@/slideshows/policybench-webinar/config";
import { aspenBenefits2026Config } from "@/slideshows/aspen-benefits-2026/config";
import { statesProject2026Config } from "@/slideshows/states-project-2026/config";

export const slideshows: SlideshowConfig[] = [
statesProject2026Config,
aspenBenefits2026Config,
policybenchWebinarConfig,
civicBuilders2026Config,
Expand Down
Binary file added public/images/dan-mckee.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
42 changes: 42 additions & 0 deletions slideshows/states-project-2026/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { SlideshowConfig } from '@/lib/types';
import CoverSlide from './slides/CoverSlide';
import WhatIsSlide from './slides/WhatIsSlide';
import ThreeLevelsSlide from './slides/ThreeLevelsSlide';
import HouseholdSlide from './slides/HouseholdSlide';
import RhodeIslandSlide from './slides/RhodeIslandSlide';
import GovernorQuoteSlide from './slides/GovernorQuoteSlide';
import RICalculatorSlide from './slides/RICalculatorSlide';
import SpeedSlide from './slides/SpeedSlide';
import DCSlide from './slides/DCSlide';
import TrackerSlide from './slides/TrackerSlide';
import DistrictsSlide from './slides/DistrictsSlide';
import FederalSlide from './slides/FederalSlide';
import OpportunitySlide from './slides/OpportunitySlide';
import EndSlide from './slides/EndSlide';

export const statesProject2026Config: SlideshowConfig = {
id: 'states-project-2026',
title: 'Modeling the real-world impact of policy',
description:
'How PolicyEngine helps state legislators and their partners model the impact of tax and benefit policy — household, district, and state.',
date: '2026-06-01',
location: 'The States Project · States Forum · FutureNow',
footerText: 'PolicyEngine · The States Project · June 2026',
private: true,
slides: [
CoverSlide,
WhatIsSlide,
ThreeLevelsSlide,
HouseholdSlide,
RhodeIslandSlide,
GovernorQuoteSlide,
RICalculatorSlide,
SpeedSlide,
DCSlide,
TrackerSlide,
DistrictsSlide,
FederalSlide,
OpportunitySlide,
EndSlide,
],
};
16 changes: 16 additions & 0 deletions slideshows/states-project-2026/slides/CoverSlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import CoverSlideTemplate from '@/components/layout/CoverSlide';

export default function CoverSlide() {
return (
<CoverSlideTemplate
subtitle="Tax and benefit policy — for every family, district, and state"
speakers={[
{
name: 'Max Ghenis',
title: 'Founder & CEO, PolicyEngine',
photo: '/headshots/max-ghenis.png',
},
]}
/>
);
}
53 changes: 53 additions & 0 deletions slideshows/states-project-2026/slides/DCSlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import Slide from '@/components/core/Slide';
import SlideHeader from '@/components/layout/SlideHeader';
import SlideTitle from '@/components/layout/SlideTitle';
import StatNumber from '@/components/content/StatNumber';

const stats = [
{ value: '$500', label: 'Per child', sublabel: 'Refundable' },
{ value: '$27M', label: 'Annual cost', sublabel: 'Estimated' },
{ value: '1 in 5', label: 'Washingtonians', sublabel: 'See a benefit' },
{ value: '−5%', label: 'Child poverty', sublabel: 'Supplemental Poverty Measure' },
];

export default function DCSlide() {
return (
<Slide>
<SlideHeader>
<SlideTitle>Washington, DC: scoring a Council proposal</SlideTitle>
</SlideHeader>

<p className="text-2xl text-gray-500 -mt-4 mb-9">
PolicyEngine analyzed Councilmember Parker&apos;s District Child Tax Credit
</p>

<div className="grid grid-cols-4 gap-5">
{stats.map((s) => (
<div key={s.label} className="content-card p-5">
<StatNumber value={s.value} label={s.label} sublabel={s.sublabel} />
</div>
))}
</div>

<div className="mt-7">
<div className="text-sm font-semibold uppercase tracking-wider text-gray-400 mb-3">
The same analysis goes deeper — from a governor&apos;s budget to a single council bill
</div>
<div className="flex gap-4">
{[
'Impact by income decile',
'Poverty effects by race and sex',
'Whether it adds or avoids benefit cliffs',
].map((t) => (
<div
key={t}
className="flex-1 rounded-xl border border-pe-200 bg-pe-50 px-5 py-4 text-lg font-medium text-pe-dark"
>
{t}
</div>
))}
</div>
</div>
</Slide>
);
}
48 changes: 48 additions & 0 deletions slideshows/states-project-2026/slides/DistrictsSlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import Slide from '@/components/core/Slide';
import SlideHeader from '@/components/layout/SlideHeader';
import SlideTitle from '@/components/layout/SlideTitle';

export default function DistrictsSlide() {
return (
<Slide>
<SlideHeader>
<SlideTitle>What did that vote do to the people you represent?</SlideTitle>
</SlideHeader>

<p className="text-2xl text-gray-500 -mt-4 mb-9">
Reforms, broken down to the district — household by household
</p>

<div className="grid grid-cols-2 gap-6">
<div className="content-card p-8">
<div className="slide-tag mb-4">New</div>
<div className="text-3xl font-bold text-pe-dark mb-3">
All 435 congressional districts
</div>
<p className="text-xl text-gray-600 leading-snug">
A capability we just built, on enhanced microdata: take any federal reform and see its
effect district by district, with demographic crosstabs.
</p>
</div>

<div className="rounded-2xl border-2 border-dashed border-gray-300 bg-gray-50/50 p-8">
<div className="mb-4 inline-flex items-center rounded-full bg-gray-200 px-4 py-1.5 text-sm font-semibold uppercase tracking-wider text-gray-600">
The frontier
</div>
<div className="text-3xl font-bold text-gray-900 mb-3">
State legislative districts
</div>
<p className="text-xl text-gray-600 leading-snug">
Not built yet — and the piece we&apos;d most like to build next: the same household-level
view for state house and senate districts.
</p>
</div>
</div>

<p className="mt-9 text-2xl text-gray-600">
The goal: show, household by household, what a state legislator&apos;s vote would do to the
people they represent.
</p>
</Slide>
);
}
15 changes: 15 additions & 0 deletions slideshows/states-project-2026/slides/EndSlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import EndSlideTemplate from '@/components/layout/EndSlide';

export default function EndSlide() {
return (
<EndSlideTemplate
message="Let's build."
subtitle="Try it, partner with us, or reach out directly."
links={[
{ label: 'policyengine.org', url: 'https://policyengine.org' },
{ label: 'hello@policyengine.org', url: 'mailto:hello@policyengine.org' },
{ label: 'max@policyengine.org', url: 'mailto:max@policyengine.org' },
]}
/>
);
}
51 changes: 51 additions & 0 deletions slideshows/states-project-2026/slides/FederalSlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import Slide from '@/components/core/Slide';
import SlideHeader from '@/components/layout/SlideHeader';
import SlideTitle from '@/components/layout/SlideTitle';

const examples = [
{
title: 'One Big Beautiful Bill Act',
body: 'A household-by-household explorer of the 2025 federal tax law.',
},
{
title: 'Child Tax Credit — both parties',
body: 'Modeled the Harris and Vance proposals, and the bipartisan Wyden–Smith expansion.',
},
{
title: 'EITC reforms',
body: "Including Scott Winship's individualized EITC at the American Enterprise Institute.",
},
{
title: 'Research partners',
body: 'NBER, the Atlanta Fed, Brookings, and the Niskanen Center.',
},
];

export default function FederalSlide() {
return (
<Slide>
<SlideHeader>
<SlideTitle>The same engine scores federal law</SlideTitle>
</SlideHeader>

<p className="text-2xl text-gray-500 -mt-4 mb-9">
Built and trusted across the political spectrum
</p>

<div className="grid grid-cols-2 gap-5">
{examples.map((e) => (
<div key={e.title} className="content-card p-6">
<div className="text-2xl font-bold text-pe-dark mb-1">{e.title}</div>
<p className="text-lg text-gray-600 leading-snug">{e.body}</p>
</div>
))}
</div>

<div className="mt-6 accent-block">
<p className="text-2xl font-medium text-pe-dark">
Credible and nonpartisan — the foundation that political work has to stand on.
</p>
</div>
</Slide>
);
}
38 changes: 38 additions & 0 deletions slideshows/states-project-2026/slides/GovernorQuoteSlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import Slide from '@/components/core/Slide';
import Image from '@/components/core/BasePathImage';

export default function GovernorQuoteSlide() {
return (
<Slide fullBleed showFooter={false}>
<div className="gradient-bg w-full h-full flex items-center">
<div className="relative z-10 mx-auto flex max-w-6xl items-center gap-16 px-20">
<div className="flex-1">
<div className="text-8xl leading-none text-white/25 mb-1">“</div>
<blockquote className="-mt-6 text-4xl font-medium leading-snug text-white">
I&apos;m grateful to the PolicyEngine team for building the models that helped us see
clearly how different policy choices would affect Rhode Island families. That ability to{' '}
<span className="font-semibold text-pe-300">test options in real time</span> strengthened
our proposal and helped us design a Child Tax Credit that will deliver more than $30
million each year to the families who need it most.
</blockquote>
</div>

<div className="flex w-[280px] shrink-0 flex-col items-center gap-5">
<Image
src="/images/dan-mckee.png"
alt="Governor Dan McKee"
width={220}
height={220}
className="rounded-full border-4 border-pe-300 object-cover shadow-2xl"
style={{ height: 'auto' }}
/>
<div className="text-center">
<div className="text-2xl font-semibold text-white">Governor Dan McKee</div>
<div className="text-white/60">Rhode Island</div>
</div>
</div>
</div>
</div>
</Slide>
);
}
51 changes: 51 additions & 0 deletions slideshows/states-project-2026/slides/HouseholdSlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import Slide from '@/components/core/Slide';
import SlideHeader from '@/components/layout/SlideHeader';
import SlideTitle from '@/components/layout/SlideTitle';

export default function HouseholdSlide() {
return (
<Slide>
<SlideHeader>
<SlideTitle>Not an average. Yours.</SlideTitle>
</SlideHeader>

<p className="text-2xl text-gray-500 -mt-4 mb-9">
Any voter can see exactly how a proposal changes their own family&apos;s bottom line
</p>

<div className="grid grid-cols-[1fr_auto_1.45fr] items-center gap-8">
<div className="rounded-2xl border border-gray-200 bg-gray-50 p-7">
<div className="text-sm font-semibold uppercase tracking-wider text-gray-400 mb-4">
A household enters
</div>
<ul className="space-y-3 text-xl text-gray-700">
<li><span className="text-gray-400">Who&apos;s in the home —</span> 2 adults, 2 kids</li>
<li><span className="text-gray-400">Earnings —</span> $48,000</li>
<li><span className="text-gray-400">State —</span> their own</li>
</ul>
</div>

<div className="text-5xl font-bold text-pe-teal">›</div>

<div className="content-card p-7">
<div className="text-sm font-semibold uppercase tracking-wider text-pe-teal mb-4">
PolicyEngine returns — to the dollar
</div>
<div className="grid grid-cols-2 gap-x-6 gap-y-3 text-xl text-gray-800">
<div>Federal &amp; state taxes</div>
<div>SNAP, Medicaid, EITC, CTC</div>
<div>Net income, before vs. after</div>
<div>Marginal tax rate</div>
<div className="col-span-2 pt-1 font-semibold text-pe-dark">
Benefit cliffs they&apos;d hit as earnings rise
</div>
</div>
</div>
</div>

<p className="mt-9 text-xl text-gray-500">
Change one rule — a credit, a phase-out, a threshold — and the family&apos;s number updates instantly.
</p>
</Slide>
);
}
38 changes: 38 additions & 0 deletions slideshows/states-project-2026/slides/OpportunitySlide.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import Slide from '@/components/core/Slide';

const openings = [
'A calculator in every campaign, town hall, and constituent inbox',
'District-by-district accountability after every vote',
'Policy designed, polled, and refined in days',
];

export default function OpportunitySlide() {
return (
<Slide fullBleed showFooter={false}>
<div className="gradient-bg w-full h-full flex items-center">
<div className="relative z-10 mx-auto w-full max-w-5xl px-20">
<h1 className="font-display text-6xl font-bold leading-tight text-white mb-6">
Where this is headed
</h1>
<p className="text-2xl leading-snug text-white/75 mb-10">
PolicyEngine builds the credible, nonpartisan engine — on a shoestring, with no comms team.
The interfaces and the reach on top are still mostly unbuilt.
</p>

<div className="space-y-4">
{openings.map((o) => (
<div key={o} className="flex items-center gap-4">
<div className="h-2.5 w-2.5 shrink-0 rounded-full bg-pe-300" />
<div className="text-2xl text-white">{o}</div>
</div>
))}
</div>

<p className="mt-12 text-2xl font-semibold text-pe-300">
That part takes imagination — and partners like you.
</p>
</div>
</div>
</Slide>
);
}
Loading
Loading