diff --git a/lib/slideshows.ts b/lib/slideshows.ts index 579fe69..ea23993 100644 --- a/lib/slideshows.ts +++ b/lib/slideshows.ts @@ -27,8 +27,10 @@ import { overhang2026Config } from "@/slideshows/overhang-2026/config"; import { overhang2026BackupConfig } from "@/slideshows/overhang-2026-backup/config"; import { overhang2026LightningConfig } from "@/slideshows/overhang-2026-lightning/config"; import { blsTaxsim2026Config } from "@/slideshows/bls-taxsim-2026/config"; +import { introduction2026Config } from "@/slideshows/introduction-2026/config"; export const slideshows: SlideshowConfig[] = [ + introduction2026Config, blsTaxsim2026Config, overhang2026Config, overhang2026LightningConfig, diff --git a/lib/speakers.ts b/lib/speakers.ts index 57e6580..8ac05be 100644 --- a/lib/speakers.ts +++ b/lib/speakers.ts @@ -36,6 +36,11 @@ export const speakers: Record = { title: 'Data Scientist', photo: '/headshots/ben-ogorek.jpg', }, + 'vahid-ahmadi': { + name: 'Vahid Ahmadi', + title: 'Research Associate', + photo: '/headshots/vahid-ahmadi.png', + }, 'maria-juaristi': { name: 'Maria Juaristi', title: 'PolicyEngine', diff --git a/public/headshots/vahid-ahmadi.png b/public/headshots/vahid-ahmadi.png new file mode 100644 index 0000000..17a654c Binary files /dev/null and b/public/headshots/vahid-ahmadi.png differ diff --git a/public/logos/orgs/10-downing-street.png b/public/logos/orgs/10-downing-street.png new file mode 100644 index 0000000..5383954 Binary files /dev/null and b/public/logos/orgs/10-downing-street.png differ diff --git a/public/logos/orgs/centre-for-policy-studies.png b/public/logos/orgs/centre-for-policy-studies.png new file mode 100644 index 0000000..cff5e89 Binary files /dev/null and b/public/logos/orgs/centre-for-policy-studies.png differ diff --git a/public/logos/orgs/good-growth-foundation.png b/public/logos/orgs/good-growth-foundation.png new file mode 100644 index 0000000..fdfec09 Binary files /dev/null and b/public/logos/orgs/good-growth-foundation.png differ diff --git a/public/logos/orgs/house-of-lords.svg b/public/logos/orgs/house-of-lords.svg new file mode 100644 index 0000000..0703f71 --- /dev/null +++ b/public/logos/orgs/house-of-lords.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/logos/orgs/new-economics-foundation.png b/public/logos/orgs/new-economics-foundation.png new file mode 100644 index 0000000..8da0ef0 Binary files /dev/null and b/public/logos/orgs/new-economics-foundation.png differ diff --git a/public/logos/orgs/nuffield-foundation.svg b/public/logos/orgs/nuffield-foundation.svg new file mode 100644 index 0000000..2315751 --- /dev/null +++ b/public/logos/orgs/nuffield-foundation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/orgs/tax-policy-associates.jpg b/public/logos/orgs/tax-policy-associates.jpg new file mode 100644 index 0000000..29344da Binary files /dev/null and b/public/logos/orgs/tax-policy-associates.jpg differ diff --git a/public/logos/orgs/wpi-economics.svg b/public/logos/orgs/wpi-economics.svg new file mode 100644 index 0000000..02be66d --- /dev/null +++ b/public/logos/orgs/wpi-economics.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/screenshots/introduction-2026/autumn-budget-2025-constituency-map.png b/public/screenshots/introduction-2026/autumn-budget-2025-constituency-map.png new file mode 100644 index 0000000..b1d569d Binary files /dev/null and b/public/screenshots/introduction-2026/autumn-budget-2025-constituency-map.png differ diff --git a/public/screenshots/introduction-2026/autumn-budget-2025.png b/public/screenshots/introduction-2026/autumn-budget-2025.png new file mode 100644 index 0000000..8c2d910 Binary files /dev/null and b/public/screenshots/introduction-2026/autumn-budget-2025.png differ diff --git a/public/screenshots/introduction-2026/capx-nationalisation.webp b/public/screenshots/introduction-2026/capx-nationalisation.webp new file mode 100644 index 0000000..294efba Binary files /dev/null and b/public/screenshots/introduction-2026/capx-nationalisation.webp differ diff --git a/public/screenshots/introduction-2026/cityam-burnham-junior-hiring-ni.jpg b/public/screenshots/introduction-2026/cityam-burnham-junior-hiring-ni.jpg new file mode 100644 index 0000000..1ceb939 Binary files /dev/null and b/public/screenshots/introduction-2026/cityam-burnham-junior-hiring-ni.jpg differ diff --git a/public/screenshots/introduction-2026/electricity-vat-cut.jpg b/public/screenshots/introduction-2026/electricity-vat-cut.jpg new file mode 100644 index 0000000..5ad08cc Binary files /dev/null and b/public/screenshots/introduction-2026/electricity-vat-cut.jpg differ diff --git a/public/screenshots/introduction-2026/energy-price-shock-calculator.jpg b/public/screenshots/introduction-2026/energy-price-shock-calculator.jpg new file mode 100644 index 0000000..28b4732 Binary files /dev/null and b/public/screenshots/introduction-2026/energy-price-shock-calculator.jpg differ diff --git a/public/screenshots/introduction-2026/free-childcare-reform.jpg b/public/screenshots/introduction-2026/free-childcare-reform.jpg new file mode 100644 index 0000000..3eddb6d Binary files /dev/null and b/public/screenshots/introduction-2026/free-childcare-reform.jpg differ diff --git a/public/screenshots/introduction-2026/itv-peston-fuel-duty.jpg b/public/screenshots/introduction-2026/itv-peston-fuel-duty.jpg new file mode 100644 index 0000000..acec4b3 Binary files /dev/null and b/public/screenshots/introduction-2026/itv-peston-fuel-duty.jpg differ diff --git a/public/screenshots/introduction-2026/itvpeston-student-loan.webp b/public/screenshots/introduction-2026/itvpeston-student-loan.webp new file mode 100644 index 0000000..29cd209 Binary files /dev/null and b/public/screenshots/introduction-2026/itvpeston-student-loan.webp differ diff --git a/public/screenshots/introduction-2026/lvt-council-tax.jpg b/public/screenshots/introduction-2026/lvt-council-tax.jpg new file mode 100644 index 0000000..e218706 Binary files /dev/null and b/public/screenshots/introduction-2026/lvt-council-tax.jpg differ diff --git a/public/screenshots/introduction-2026/middle-east-war-living-standards.jpg b/public/screenshots/introduction-2026/middle-east-war-living-standards.jpg new file mode 100644 index 0000000..a09f602 Binary files /dev/null and b/public/screenshots/introduction-2026/middle-east-war-living-standards.jpg differ diff --git a/public/screenshots/introduction-2026/nef-neets-job-quality.jpg b/public/screenshots/introduction-2026/nef-neets-job-quality.jpg new file mode 100644 index 0000000..8a6a325 Binary files /dev/null and b/public/screenshots/introduction-2026/nef-neets-job-quality.jpg differ diff --git a/public/screenshots/introduction-2026/smf-ai-junior-hiring-ni.jpg b/public/screenshots/introduction-2026/smf-ai-junior-hiring-ni.jpg new file mode 100644 index 0000000..d27a0be Binary files /dev/null and b/public/screenshots/introduction-2026/smf-ai-junior-hiring-ni.jpg differ diff --git a/public/screenshots/introduction-2026/targeted-energy-discount.jpg b/public/screenshots/introduction-2026/targeted-energy-discount.jpg new file mode 100644 index 0000000..34b135e Binary files /dev/null and b/public/screenshots/introduction-2026/targeted-energy-discount.jpg differ diff --git a/public/screenshots/introduction-2026/telegraph-nic.webp b/public/screenshots/introduction-2026/telegraph-nic.webp new file mode 100644 index 0000000..f3ab3bc Binary files /dev/null and b/public/screenshots/introduction-2026/telegraph-nic.webp differ diff --git a/public/screenshots/introduction-2026/tpa-universities-uk-ni.png b/public/screenshots/introduction-2026/tpa-universities-uk-ni.png new file mode 100644 index 0000000..6798f0c Binary files /dev/null and b/public/screenshots/introduction-2026/tpa-universities-uk-ni.png differ diff --git a/public/screenshots/introduction-2026/uk-ai-study.jpg b/public/screenshots/introduction-2026/uk-ai-study.jpg new file mode 100644 index 0000000..0802b45 Binary files /dev/null and b/public/screenshots/introduction-2026/uk-ai-study.jpg differ diff --git a/public/screenshots/introduction-2026/uk-cliff-watch.jpg b/public/screenshots/introduction-2026/uk-cliff-watch.jpg new file mode 100644 index 0000000..d0c0286 Binary files /dev/null and b/public/screenshots/introduction-2026/uk-cliff-watch.jpg differ diff --git a/slideshows/introduction-2026/README.md b/slideshows/introduction-2026/README.md new file mode 100644 index 0000000..9f8fd4d --- /dev/null +++ b/slideshows/introduction-2026/README.md @@ -0,0 +1,20 @@ +# PolicyEngine introduction and Budget planning, 9 October 2026 + +10 slides at `/slides/introduction-2026`: a short introduction to PolicyEngine +for a journalist, then recent work, the Autumn Budget and ideas for working +together. + +- `config.ts` controls the slide order and meeting metadata. +- `content.ts` holds the sources, user list, press and publication cards, + Budget plan and ideas. +- `slides/index.tsx` contains the slides. +- `SPEAKER-NOTES.md` gives the presenter track and what not to claim. + +Images are in `public/screenshots/introduction-2026/`: + +- press images and publication covers come from the app-v2 repo + (`app/public/assets/citations/` and `app/public/assets/posts/`); +- `autumn-budget-2025.png` is the 2025 dashboard overview; +- `autumn-budget-2025-constituency-map.png` was captured from + https://uk-autumn-budget-dashboard.vercel.app/uk/autumn-budget-2025 on + 8 October 2026. diff --git a/slideshows/introduction-2026/SPEAKER-NOTES.md b/slideshows/introduction-2026/SPEAKER-NOTES.md new file mode 100644 index 0000000..a0dd054 --- /dev/null +++ b/slideshows/introduction-2026/SPEAKER-NOTES.md @@ -0,0 +1,119 @@ +# Speaker notes: PolicyEngine introduction and Budget planning, 9 October 2026 + +A 30-minute conversation with a journalist who may not know PolicyEngine. +Keep the intro short (slides 2–4) and leave most of the time for slides 7–9. + +## 1. Title + +PolicyEngine: introduction and Budget planning. Presenters: Vahid Ahmadi, Max Ghenis, María Juaristi. + +## 2. What PolicyEngine is + +Free and open source. Anyone can use it in a browser. Two views: one +household, or the whole country. Source: the policyengine.org UK home page +("Free, open-source tax and benefit analysis"). + +## 3. How it works + +Three parts: the rules (open code in policyengine-uk), the households (the +Microcosm UK data: Family Resources Survey, HMRC tax records and other +surveys, matched to official statistics), and the results. Say it in plain +words; she doesn't need the pipeline detail. + +## 4. Our community + +Eight organisations that use, cite and support our work, as cards with +logos and a type label; no description lines on the slide. +- No 10 data science team (10DS): built its 10ds-microsim package on top of + PolicyEngine during Nikhil's Innovation Fellowship; the card links to our + 20 January 2026 post. That post calls the outputs supplementary, + experimental analysis, so don't say No 10 relies on PolicyEngine. +- House of Lords: our analysis was cited in a Lords debate on 24 February + 2026. A citation in debate, not Parliament using PolicyEngine. The crowned + portcullis is restricted, so the card has no logo. +- Tax Policy Associates: checked the Universities UK National Insurance + costing with PolicyEngine (10 September 2026). +- Centre for Policy Studies: its July 2023 report "Family-Friendly Taxation" + used PolicyEngine modelling to cost its personal allowance proposals. +- Nuffield Foundation: funds our local-area work; its project page names us. +- New Economics Foundation: its July 2026 report on job quality and NEETs + used PolicyEngine UK (also on slide 5). +- Good Growth Foundation and WPI Economics: both use PolicyEngine (Max + confirmed, 9 October). Neither has a public write-up yet, so the cards name + them without a link; leave detail of the work to Max. +- Don't list HM Treasury: its algorithmic transparency record says "HMT does + not currently use PolicyEngine". + +## 5. In the media and reports + +Newest first: Tax Policy Associates' article on the Universities UK +employer NI proposal (10 September 2026), CapX (1 September 2026, citing our bus +fare cap costing), the New Economics Foundation's report on job quality and +NEETs (July 2026; its modelling used PolicyEngine UK), City AM (junior hiring, July 2026), Social Market +Foundation (AI and junior hiring, July 2026), ITV Peston (fuel duty, May +2026), ITV Peston (student loans, February 2026) and Fran Ivens's Telegraph +story of 28 October 2024, two days before that Budget (paywalled): our modelling +of a 1p employer NI rise, £3,093 more employer NI on a £30,000 salary, or a +salary cut to £29,818 if passed on. Our figure was the £182 pay cut; £3,093 was +the employer's NI bill, so don't repeat the "£3,000" in the URL. It was a +pre-Budget scenario for the IEA (a 1p rate rise), not the package announced, +and it quoted Nikhil. Each card now carries one line on what we contributed; +the student loans card has none, so say it if asked. The June 2026 land value tax +post is on slide 6 instead, so it isn't shown twice. + +## 6. Recent UK work + +Eight pieces since April, newest first. Each card links to the live page. +The land value tax post (a guest post by Vahid and Max on Progress and Poverty, +4 June 2026) is new PolicyEngine modelling of a revenue-neutral swap from +council tax to a land value tax; its card shows the post's decile chart. + +## 7. Autumn Budget 2025 + +The dashboard went live at 13:43 GMT on Budget day 2025 with three measures +(two-child limit repeal, threshold freeze extension, fuel duty freeze), each +beside the OBR's costing, and the constituency map. Five more measures came on +27 November, and the ninth and the household calculator on 28 November. The +screenshot shows today's version, revised since Budget day, so don't read its +totals out as Budget-day figures. Left: the dashboard overview +(policy selector and revenue impact by year). Right: the constituency map +(average change in household net income, 2029-30, all 650 constituencies). +Both images link to the dashboard. + +## 8. Autumn Budget 2026: our plan + +Budget day is Wednesday 28 October. Same shape as last year, on the new +Microcosm data. Constituency figures need the local-area data, which hasn't +passed its checks yet, so they come later, with a short published method note. +Don't promise exact timings, embeds or exclusives. + +## 9. Ideas for working together + +For discussion, not commitments: a Budget calculator for readers, local +figures, fast costings (for example our costing of removing the £100,000 +childcare limit), chart data, explainers, and checkable numbers. + +If asked for the childcare figure: about £0.6bn a year from 2027-28. Corrections +are still landing (uk-childcare-100k-threshold #6), and the "about 10,000 +families lose" line on the current dashboard was a modelling error that #6 +removes, so don't quote it. "Checkable" means open code and a published +method: the household data are licensed survey data, so reporters can't +rerun a figure themselves. + +## 10. Thank you + +Website, email, GitHub and LinkedIn. + +## Likely questions + +- Tax Policy Associates: £6.3bn is TPA's adjusted figure. Our raw output was + £9.1bn; TPA corrected it because our dataset had 2.9m employees aged 21 to 24 + against about 2.2m (its footnote 5). Say Dan Neidle cross-checked his costing + with PolicyEngine; don't call £6.3bn our number, and acknowledge the age-count + point if it comes up. +- No 10: our co-founder and CTO, Nikhil Woodruff, did the work as a No 10 + Innovation Fellow embedded in 10DS. Say so up front. +- Inheritance tax: PolicyEngine UK doesn't model it, including pensions coming + into inheritance tax. +- Accuracy: our 2025 dashboard showed our figures next to the OBR's, and some + gaps were large. Don't claim we match the OBR. diff --git a/slideshows/introduction-2026/config.ts b/slideshows/introduction-2026/config.ts new file mode 100644 index 0000000..7ae5769 --- /dev/null +++ b/slideshows/introduction-2026/config.ts @@ -0,0 +1,35 @@ +import type { SlideshowConfig } from "@/lib/types"; +import { + Budget2025Slide, + Budget2026Slide, + ClosingSlide, + HowSlide, + IdeasSlide, + PressSlide, + PublicationsSlide, + TitleSlide, + UsersSlide, + WhatSlide, +} from "./slides"; + +export const introduction2026Config: SlideshowConfig = { + id: "introduction-2026", + title: "PolicyEngine: introduction and Budget planning", + description: + "A short introduction to PolicyEngine: what it is, who uses it, recent UK work, the Autumn Budget plan and ideas for working together.", + date: "2026-10-09", + location: "PolicyEngine", + footerText: "PolicyEngine · 9 October 2026", + slides: [ + TitleSlide, + WhatSlide, + HowSlide, + UsersSlide, + PressSlide, + PublicationsSlide, + Budget2025Slide, + Budget2026Slide, + IdeasSlide, + ClosingSlide, + ], +}; diff --git a/slideshows/introduction-2026/content.ts b/slideshows/introduction-2026/content.ts new file mode 100644 index 0000000..b4209d5 --- /dev/null +++ b/slideshows/introduction-2026/content.ts @@ -0,0 +1,335 @@ +// Content for the PolicyEngine introduction deck, 9 October 2026. +// Every link below returned 200 on 8 October 2026, except the newspaper, +// ITV, Hansard and No 10 fellowship pages, which block automated checks. + +export type Source = { label: string; href: string }; + +export const sources = { + home: { label: "policyengine.org", href: "https://www.policyengine.org/uk" }, + model: { + label: "PolicyEngine UK code", + href: "https://github.com/PolicyEngine/policyengine-uk", + }, + data: { + label: "Microcosm data pipeline", + href: "https://github.com/PolicyEngine/microcosm", + }, + no10: { + label: "No 10 Innovation Fellowship article", + href: "https://fellows.ai.gov.uk/articles/nikhil-woodruff-micro-simulation/", + }, + no10Post: { + label: "PolicyEngine at No 10", + href: "https://www.policyengine.org/uk/research/policyengine-10-downing-street", + }, + hansard: { + label: "Hansard, 24 February 2026", + href: "https://hansard.parliament.uk/Lords/2026-02-24/debates/A381F7D6-0A3C-48FD-8D9E-67751E25877A/NationalInsuranceContributions(EmployerPensionsContributions)Bill", + }, + tpa: { + label: "Tax Policy Associates, September 2026", + href: "https://taxpolicy.org.uk/2026/09/10/universities-uk-national-insurance-proposal/", + }, + cps: { + label: "Centre for Policy Studies, July 2023", + href: "https://cps.org.uk/research/family-friendly-taxation/", + }, + nuffield: { + label: "Nuffield Foundation project", + href: "https://www.nuffieldfoundation.org/project/enhancing-localising-and-democratising-tax-benefit-policy-analysis", + }, + nef: { + label: "New Economics Foundation, July 2026", + href: "https://neweconomics.org/2026/07/insecure-low-quality-work-a-major-driver-of-uks-neets-and-inactivity-crisis", + }, + citations: { + label: "All citations", + href: "https://www.policyengine.org/uk/citations", + }, + research: { + label: "UK research", + href: "https://www.policyengine.org/uk/research", + }, + budget2025: { + label: "Autumn Budget 2025 dashboard", + href: "https://www.policyengine.org/uk/autumn-budget-2025", + }, +}; + +export const steps = [ + { + title: "The rules", + text: "Tax and benefit law written as open code: income tax, National Insurance, Universal Credit, Child Benefit, Council Tax Reduction, VAT and more.", + }, + { + title: "The households", + text: "A representative picture of UK households built from the Family Resources Survey, HMRC tax records and other surveys, matched to official statistics.", + }, + { + title: "The results", + text: "Change a rule and see who gains and loses: for one family, for the whole country, by income group and by constituency.", + }, +]; + +export type User = { + name: string; + initials: string; + logo?: string; + /** Render a light logo dark so it shows on a white slide. */ + darkenLogo?: boolean; + kind: "Government" | "Parliament" | "Think tank" | "Funder" | "Consultancy"; + source?: Source; +}; + +export const users: User[] = [ + { + name: "No 10 data science team", + logo: "/logos/orgs/10-downing-street.png", + initials: "10", + kind: "Government", + source: sources.no10Post, + }, + { + name: "House of Lords", + initials: "HL", + logo: "/logos/orgs/house-of-lords.svg", + kind: "Parliament", + source: sources.hansard, + }, + { + name: "Tax Policy Associates", + logo: "/logos/orgs/tax-policy-associates.jpg", + initials: "TPA", + kind: "Think tank", + source: sources.tpa, + }, + { + name: "Centre for Policy Studies", + logo: "/logos/orgs/centre-for-policy-studies.png", + initials: "CPS", + kind: "Think tank", + source: sources.cps, + }, + { + name: "New Economics Foundation", + logo: "/logos/orgs/new-economics-foundation.png", + initials: "NEF", + kind: "Think tank", + source: sources.nef, + }, + { + name: "Good Growth Foundation", + initials: "GGF", + logo: "/logos/orgs/good-growth-foundation.png", + darkenLogo: true, + kind: "Think tank", + }, + { + name: "WPI Economics", + logo: "/logos/orgs/wpi-economics.svg", + initials: "WPI", + kind: "Consultancy", + }, + { + name: "Nuffield Foundation", + logo: "/logos/orgs/nuffield-foundation.svg", + initials: "NF", + kind: "Funder", + source: sources.nuffield, + }, +]; + +export type Card = { + title: string; + date: string; + text: string; + href: string; + image: string; + alt: string; +}; + +const shot = (file: string) => `/screenshots/introduction-2026/${file}`; + +export const press: Card[] = [ + { + title: "Universities UK: a £6bn lesson in bad tax policy", + date: "Tax Policy Associates (Dan Neidle) · September 2026", + text: "Cross-checked its £6–7bn costing with PolicyEngine UK.", + href: "https://taxpolicy.org.uk/2026/09/10/universities-uk-national-insurance-proposal/", + image: shot("tpa-universities-uk-ni.png"), + alt: "Cover of the Universities UK Future Jobs Roadmap", + }, + { + title: "Nationalisation is not a growth strategy", + date: "CapX · September 2026", + text: "Cites PolicyEngine's £409m cost for a £2 bus fare cap outside London.", + href: "https://capx.co/nationalisation-is-not-a-growth-strategy", + image: shot("capx-nationalisation.webp"), + alt: "CapX article header image", + }, + { + title: "Insecure, low-quality work a major driver of UK's NEETs and inactivity crisis", + date: "New Economics Foundation · July 2026", + text: "The report's microsimulation modelling ran on PolicyEngine UK.", + href: "https://neweconomics.org/2026/07/insecure-low-quality-work-a-major-driver-of-uks-neets-and-inactivity-crisis", + image: shot("nef-neets-job-quality.jpg"), + alt: "New Economics Foundation report on job quality and NEETs", + }, + { + title: "If Burnham wants firms to hire young people, he needs to get out of their way", + date: "City AM · July 2026", + text: "Cites our £0.77bn cost to exempt NEETs aged 21 to 24 from NI.", + href: "https://www.cityam.com/if-burnham-wants-firms-to-hire-young-people-he-needs-to-get-out-of-their-way/", + image: shot("cityam-burnham-junior-hiring-ni.jpg"), + alt: "City AM article on junior hiring", + }, + { + title: "AI looks set to squeeze junior hiring. The fix already exists in law", + date: "Social Market Foundation · July 2026", + text: "Guest post citing PolicyEngine UK's £4.7bn lower bound.", + href: "https://www.smf.co.uk/commentary_podcasts/ai-looks-set-to-squeeze-junior-hiring-the-fix-already-exists-in-law/", + image: shot("smf-ai-junior-hiring-ni.jpg"), + alt: "Social Market Foundation article on junior hiring", + }, + { + title: "Peston covers our fuel duty analysis", + date: "ITV Peston · May 2026", + text: "", + href: "https://www.itv.com/watch/peston/2a4458/2a4458a0390", + image: shot("itv-peston-fuel-duty.jpg"), + alt: "ITV Peston showing PolicyEngine's fuel duty analysis", + }, + { + title: "Can the government solve the student loan crisis in England and Wales?", + date: "ITV Peston · February 2026", + text: "", + href: "https://x.com/itvpeston/status/2027372583616741864", + image: shot("itvpeston-student-loan.webp"), + alt: "ITV Peston segment on student loans", + }, + { + title: "Workers face pay hit under Reeves's National Insurance plans", + date: "The Telegraph · October 2024", + text: "Our 1p employer NI scenario: a £30,000 salary cut to £29,818.", + href: "https://www.telegraph.co.uk/money/tax/workers-face-3000-pay-cut-under-reeves-national-insurance/", + image: shot("telegraph-nic.webp"), + alt: "The Telegraph logo", + }, +]; + +export const publications: Card[] = [ + { + title: "Targeted energy bill discount", + date: "October 2026", + text: "Cost, reach and distributional effects of the Resolution Foundation's proposed targeted energy bill discount.", + href: "https://www.policyengine.org/uk/targeted-energy-discount", + image: shot("targeted-energy-discount.jpg"), + alt: "Targeted energy bill discount dashboard cover", + }, + { + title: "The Middle East war and UK living standards", + date: "September 2026", + text: "How energy, fuel and food price rises hit households, with ten policy responses compared.", + href: "https://www.policyengine.org/uk/middle-east-war-living-standards", + image: shot("middle-east-war-living-standards.jpg"), + alt: "Middle East war and UK living standards dashboard cover", + }, + { + title: "Free childcare hours and a 75% subsidy", + date: "September 2026", + text: "Cost and household impact of 15 free hours from nine months, plus a subsidy replacing Tax-Free Childcare.", + href: "https://www.policyengine.org/uk/free-childcare-reform", + image: shot("free-childcare-reform.jpg"), + alt: "Free childcare reform dashboard cover", + }, + { + title: "Who bears the AI shock?", + date: "August 2026", + text: "AI job, wage and capital shocks traced through taxes and benefits.", + href: "https://www.policyengine.org/uk/research/uk-ai-study", + image: shot("uk-ai-study.jpg"), + alt: "Who bears the AI shock research cover", + }, + { + title: "Temporary VAT cut on domestic electricity", + date: "July 2026", + text: "Cost and distributional impact of cutting electricity VAT from 5% to 0% for six months.", + href: "https://www.policyengine.org/uk/electricity-vat-cut", + image: shot("electricity-vat-cut.jpg"), + alt: "VAT on household electricity cut from 5% to 0%", + }, + { + title: "UK CliffWatch", + date: "June 2026", + text: "Where benefit withdrawal and taxes create cliffs and high marginal rates as earnings rise.", + href: "https://www.policyengine.org/uk/uk-cliff-watch", + image: shot("uk-cliff-watch.jpg"), + alt: "UK CliffWatch tool cover", + }, + { + title: "Replacing council tax with a land value tax", + date: "June 2026 · guest post", + text: "A revenue-neutral swap modelled with PolicyEngine: most households gain and poverty edges down.", + href: "https://progressandpoverty.substack.com/p/how-replacing-council-tax-with-a", + image: shot("lvt-council-tax.jpg"), + alt: "Chart from the post: average net income change by income decile, 2026-27", + }, + { + title: "Energy price shock", + date: "April 2026", + text: "Who is hit by energy price shock scenarios, with five policy responses.", + href: "https://www.policyengine.org/uk/energy-price-shock", + image: shot("energy-price-shock-calculator.jpg"), + alt: "Energy price shock dashboard cover", + }, +]; + +export const budgetPlan = [ + { + when: "Before the Budget", + title: "Fix the model and data", + text: "Freeze the model and data versions so every figure can be reproduced, and prepare the measures trailed in advance.", + }, + { + when: "On Budget day", + title: "Model each measure", + text: "Read the Budget documents, add each measure to the model, and check when it starts and who it covers.", + }, + { + when: "Then", + title: "Publish the dashboard", + text: "Cost beside the OBR's, who gains and loses by income, and example households.", + }, + { + when: "Once the local data pass their checks", + title: "Add constituency results", + text: "Results by constituency, with a short published note on how they are estimated.", + }, +]; + +export const ideas = [ + { + title: "A Budget calculator for readers", + text: "How does the Budget affect you? Readers enter their household and see the change.", + }, + { + title: "Local figures for regional stories", + text: "Results by constituency, so a story can lead with what it means for a given area.", + }, + { + title: "Fast costings of proposals", + text: "Party and conference announcements costed quickly, as with our recent costing of removing the £100,000 childcare limit.", + }, + { + title: "The data behind the chart", + text: "Tables and charts reporters can use directly, with the numbers explained.", + }, + { + title: "Explainers", + text: "Help with how a tax or benefit works, and what a policy change does to it.", + }, + { + title: "Checkable numbers", + text: "Open code and a published method, so any figure can be cited and traced.", + }, +]; diff --git a/slideshows/introduction-2026/slides/deck.module.css b/slideshows/introduction-2026/slides/deck.module.css new file mode 100644 index 0000000..36ce313 --- /dev/null +++ b/slideshows/introduction-2026/slides/deck.module.css @@ -0,0 +1,236 @@ +/* Publication cards: a fixed-ratio cover keeps the grid even. */ +.cover { + aspect-ratio: 3 / 2; + height: auto; + max-height: 28vh; +} + +.shot { + height: auto; + max-height: 52vh; +} + +/* Side-by-side publication cards: the thumbnail fills the card's height. */ +.thumbWide { + width: 13rem; + height: auto; + min-height: 7rem; +} + +@media (max-height: 760px) { + .thumbWide { + width: 9rem; + min-height: 5rem; + } +} + +/* 4×2 card grids on slides 5 and 6. */ +.compactCover { + aspect-ratio: 16 / 9; + height: auto; + max-height: 15vh; +} + +/* Slide 7: map and scatter side by side. */ +.chart { + height: 58vh; + width: auto; +} + +@media (max-height: 850px) { + .compactCover { + max-height: 12vh; + } + + .chart { + height: 52vh; + } +} + +@media (max-height: 760px) { + .compactCover { + max-height: 9vh; + } + + .compactText { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + } + + .chart { + height: 48vh; + } +} + +/* Title slide: keep the logo, speakers and date clear of each other on laptops. */ +@media (max-height: 760px) { + .titleCover { + padding-top: 6rem !important; + } + + .titleCover > :global(*) { + margin-bottom: 1.25rem !important; + } + + .titleCover > :global(:first-child) { + display: none; + } + + .titleCover h1 { + font-size: 2.25rem; + } + + .titleCover :global(.w-28) { + width: 5rem; + height: 5rem; + } +} + +/* Keep the shared slide template legible on a laptop during the meeting. */ +@media (max-height: 850px) { + .deck > :global(.absolute.inset-0) { + padding-top: 3rem; + } + + .deck :global(.mb-10) { + margin-bottom: 1.5rem; + } + + .deck h1 { + font-size: 2.625rem; + } + + .deck :global(.mt-12) { + margin-top: 2rem; + } + + .deck :global(.mt-10), + .deck :global(.mt-9) { + margin-top: 1.5rem; + } + + .deck :global(.mt-8), + .deck :global(.mt-7) { + margin-top: 1.25rem; + } + + .deck :global(.mt-6) { + margin-top: 0.5rem; + } + + .deck th, + .deck td { + padding-top: 0.625rem; + padding-bottom: 0.625rem; + } + + .deck :global(.space-y-6) > :not(:last-child) { + margin-bottom: 1rem; + } + + .deck :global(.space-y-4) > :not(:last-child) { + margin-bottom: 0.5rem; + } + + .deck :global(.pb-5) { + padding-bottom: 1rem; + } + + .deck :global(.pb-3) { + padding-bottom: 0.5rem; + } + + .deck :global(.space-y-5) > :not(:last-child) { + margin-bottom: 0.75rem; + } + + .deck :global(.space-y-3) > :not(:last-child) { + margin-bottom: 0.5rem; + } + + .cover { + max-height: 22vh; + } +} + +/* Safari on a laptop leaves less than 760px for the slide. */ +@media (max-height: 760px) { + .deck > :global(.absolute.inset-0) { + padding-top: 2rem; + } + + .deck :global(.mb-10) { + margin-bottom: 1rem; + } + + .deck h1 { + font-size: 2.25rem; + } + + .deck :global(.text-xl) { + font-size: 1.05rem; + line-height: 1.45rem; + } + + .deck :global(.text-2xl) { + font-size: 1.25rem; + line-height: 1.7rem; + } + + .deck :global(.text-lg) { + font-size: 0.95rem; + line-height: 1.35rem; + } + + .deck :global(.text-base) { + font-size: 0.85rem; + line-height: 1.2rem; + } + + .deck th, + .deck td { + padding-top: 0.35rem; + padding-bottom: 0.35rem; + } + + .deck :global(.pb-4) { + padding-bottom: 0.5rem; + } + + .deck :global(.space-y-5) > :not(:last-child) { + margin-bottom: 0.5rem; + } + + .deck :global(.pt-5) { + padding-top: 0.75rem; + } + + .deck :global(.mt-6) { + margin-top: 0.75rem; + } + + .deck :global(.p-4) { + padding: 0.6rem 0.75rem; + } + + .cover { + max-height: 17vh; + } + + .shot { + max-height: 46vh; + } +} + +/* Slide 4: grouped logo rows. */ +.communityLogo { + height: 64px; +} + +@media (max-height: 760px) { + .communityLogo { + height: 44px; + } +} diff --git a/slideshows/introduction-2026/slides/index.tsx b/slideshows/introduction-2026/slides/index.tsx new file mode 100644 index 0000000..00d1b96 --- /dev/null +++ b/slideshows/introduction-2026/slides/index.tsx @@ -0,0 +1,405 @@ +import type { ReactNode } from "react"; +import { + IconAdjustments, + IconBrandGithub, + IconBrandLinkedin, + IconHome, + IconMail, + IconMap2, + IconWorld, +} from "@tabler/icons-react"; +import Image from "@/components/core/BasePathImage"; +import Slide from "@/components/core/Slide"; +import CoverSlide from "@/components/layout/CoverSlide"; +import SlideHeader from "@/components/layout/SlideHeader"; +import SlideTitle from "@/components/layout/SlideTitle"; +import { speakers } from "@/lib/speakers"; +import { + budgetPlan, + ideas, + press, + publications, + sources, + steps, + users, + type Card, + type Source, +} from "../content"; +import styles from "./deck.module.css"; + +function ExternalLink({ + children, + href, + className = "", +}: { + children: ReactNode; + href: string; + className?: string; +}) { + return ( + event.stopPropagation()} + className={`pointer-events-auto hover:underline ${className}`} + > + {children} + + ); +} + +function SourceLine({ items }: { items: Source[] }) { + return ( +
+ Sources + {items.map((item) => ( + + {item.label} + + ))} +
+ ); +} + +function Frame({ + title, + subtitle, + children, + references = [], +}: { + title: string; + subtitle?: ReactNode; + children: ReactNode; + references?: Source[]; +}) { + return ( + + + {title} + {subtitle && ( +

+ {subtitle} +

+ )} +
+ {children} + {references.length > 0 && } +
+ ); +} + +function CompactTile({ item }: { item: Card }) { + return ( + + {item.alt} +
+

{item.date}

+

+ {item.title} +

+ {item.text && ( +

+ {item.text} +

+ )} +
+
+ ); +} + +export function TitleSlide() { + return ( + + ); +} + +const whatCards = [ + { + Icon: IconAdjustments, + title: "Pick a policy", + text: "A tax rate, a benefit amount or a new allowance.", + }, + { + Icon: IconHome, + title: "One household", + text: "How much a family gains or loses.", + }, + { + Icon: IconMap2, + title: "The whole country", + text: "The cost to government, and who gains and loses.", + }, +]; + +export function WhatSlide() { + return ( + +

+ A model of the UK tax and benefit system that anyone can use, free, in + a web browser. +

+
+ {whatCards.map(({ Icon, title, text }) => ( +
+ + +

{title}

+

{text}

+
+ ))} +
+ + + + ); +} + +export function HowSlide() { + return ( + +
+ {steps.map((step, index) => ( +
+

{index + 1}

+

+ {step.title} +

+

+ {step.text} +

+
+ ))} +
+ + ); +} + +export function UsersSlide() { + return ( + +
+ {users.map((user) => { + const logo = user.logo ? ( + {`${user.name} + ) : ( + + {user.initials} + + ); + const body = ( +
+ {logo} +

+ {user.name} +

+
+ ); + return user.source ? ( + + {body} + + ) : ( +
{body}
+ ); + })} +
+ + ); +} + +export function PressSlide() { + return ( + +
+ {press.map((item) => ( + + ))} +
+ + ); +} + +export function PublicationsSlide() { + return ( + + Analysis published since April.{" "} + + See all UK research + + + } + > +
+ {publications.map((item) => ( + + ))} +
+ + ); +} + +export function Budget2025Slide() { + return ( + +
+ + Autumn Budget 2025 dashboard showing the policy selector and revenue impact chart + + + Map of the average change in household net income across all 650 constituencies, 2029-30 + +
+ + ); +} + +export function Budget2026Slide() { + return ( + +
+ {budgetPlan.map((step) => ( +
+

{step.when}

+
+

{step.title}

+

{step.text}

+
+
+ ))} +
+ + ); +} + +export function IdeasSlide() { + return ( + +
+ {ideas.map((idea) => ( +
+

{idea.title}

+

{idea.text}

+
+ ))} +
+ + ); +} + +const contacts = [ + { label: "policyengine.org", url: "https://www.policyengine.org/uk", Icon: IconWorld }, + { label: "hello@policyengine.org", url: "mailto:hello@policyengine.org", Icon: IconMail }, + { label: "github.com/PolicyEngine", url: "https://github.com/PolicyEngine", Icon: IconBrandGithub }, + { + label: "linkedin.com/company/thepolicyengine", + url: "https://www.linkedin.com/company/thepolicyengine", + Icon: IconBrandLinkedin, + }, +]; + +export function ClosingSlide() { + return ( + +

Thank you

+
+ {contacts.map(({ label, url, Icon }) => ( + event.stopPropagation()} + className="flex items-center gap-4 rounded-2xl border border-white/15 bg-white/10 px-5 py-4 transition-colors hover:bg-white/20" + > + + + {label} + + ))} +
+
+ ); +}