From f088e1a41c9872b8bf9b95c1b101089c35014d5f Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Tue, 3 Mar 2026 19:56:59 +0100 Subject: [PATCH 1/5] Add demo site showcasing all 24 components Single-page component gallery with realistic PolicyEngine data (UBI reform scenario). Covers all primitives, layout, inputs, display, and chart components. Run with `bun run dev:demo`. Co-Authored-By: Claude Opus 4.6 --- demo/Demo.tsx | 672 ++++++++++++++++++++++++++++++++++++++++++++ demo/index.html | 18 ++ demo/main.tsx | 10 + package.json | 1 + vite.demo.config.ts | 14 + 5 files changed, 715 insertions(+) create mode 100644 demo/Demo.tsx create mode 100644 demo/index.html create mode 100644 demo/main.tsx create mode 100644 vite.demo.config.ts diff --git a/demo/Demo.tsx b/demo/Demo.tsx new file mode 100644 index 0000000..a8a2b8b --- /dev/null +++ b/demo/Demo.tsx @@ -0,0 +1,672 @@ +import { useState } from 'react'; + +// Primitives +import { Button } from '../src/primitives/Button'; +import { + Card, + CardHeader, + CardTitle, + CardDescription, + CardContent, + CardFooter, +} from '../src/primitives/Card'; +import { Badge } from '../src/primitives/Badge'; +import { Tabs, TabsList, TabsTrigger, TabsContent } from '../src/primitives/Tabs'; + +// Layout +import { DashboardShell } from '../src/layout/DashboardShell'; +import { Header } from '../src/layout/Header'; +import { SidebarLayout } from '../src/layout/SidebarLayout'; +import { SingleColumnLayout } from '../src/layout/SingleColumnLayout'; +import { InputPanel } from '../src/layout/InputPanel'; +import { ResultsPanel } from '../src/layout/ResultsPanel'; + +// Inputs +import { CurrencyInput } from '../src/inputs/CurrencyInput'; +import { NumberInput } from '../src/inputs/NumberInput'; +import { SelectInput } from '../src/inputs/SelectInput'; +import { CheckboxInput } from '../src/inputs/CheckboxInput'; +import { SliderInput } from '../src/inputs/SliderInput'; +import { InputGroup } from '../src/inputs/InputGroup'; + +// Display +import { MetricCard } from '../src/display/MetricCard'; +import { SummaryText } from '../src/display/SummaryText'; +import { DataTable } from '../src/display/DataTable'; +import { PolicyEngineWatermark } from '../src/display/PolicyEngineWatermark'; + +// Charts +import { ChartContainer } from '../src/charts/ChartContainer'; +import { PEBarChart } from '../src/charts/PEBarChart'; +import { PELineChart } from '../src/charts/PELineChart'; +import { PEAreaChart } from '../src/charts/PEAreaChart'; +import { PEWaterfallChart } from '../src/charts/PEWaterfallChart'; + +// Tokens (for display) +import { formatCurrency } from '../src/tokens/charts'; + +// --------------------------------------------------------------------------- +// Example data +// --------------------------------------------------------------------------- + +const barData = [ + { category: 'Income tax', amount: 320 }, + { category: 'Payroll tax', amount: 180 }, + { category: 'Corporate tax', amount: 95 }, + { category: 'Excise tax', amount: 45 }, + { category: 'Estate tax', amount: 22 }, + { category: 'UBI cost', amount: -480 }, +]; + +const lineData = Array.from({ length: 10 }, (_, i) => ({ + year: 2024 + i, + baseline: 11.5 - i * 0.15 + Math.random() * 0.5, + reform: 11.5 - i * 0.15 - 2.1 + Math.random() * 0.3, +})); + +const areaData = [ + { decile: '1st', income_tax: 200, payroll_tax: 800, benefits: -3200 }, + { decile: '2nd', income_tax: 600, payroll_tax: 1400, benefits: -2400 }, + { decile: '3rd', income_tax: 1200, payroll_tax: 2100, benefits: -1600 }, + { decile: '4th', income_tax: 2400, payroll_tax: 2800, benefits: -800 }, + { decile: '5th', income_tax: 4200, payroll_tax: 3600, benefits: -200 }, + { decile: '6th', income_tax: 6800, payroll_tax: 4200, benefits: 0 }, + { decile: '7th', income_tax: 10200, payroll_tax: 5100, benefits: 0 }, + { decile: '8th', income_tax: 15400, payroll_tax: 6000, benefits: 0 }, + { decile: '9th', income_tax: 24000, payroll_tax: 7200, benefits: 0 }, + { decile: '10th', income_tax: 62000, payroll_tax: 9400, benefits: 0 }, +]; + +const waterfallData = [ + { name: 'Income tax', value: 320 }, + { name: 'Payroll tax', value: 180 }, + { name: 'Corporate tax', value: 95 }, + { name: 'Excise tax', value: 45 }, + { name: 'UBI cost', value: -480 }, + { name: 'Net impact', value: 0, isTotal: true }, +]; + +const tableColumns = [ + { key: 'decile', header: 'Income decile' }, + { + key: 'avgIncome', + header: 'Average income', + align: 'right' as const, + format: (v: unknown) => formatCurrency(v as number), + }, + { + key: 'taxChange', + header: 'Tax change', + align: 'right' as const, + format: (v: unknown) => { + const n = v as number; + return n >= 0 ? `+${formatCurrency(n)}` : formatCurrency(n); + }, + }, + { + key: 'benefitChange', + header: 'Benefit change', + align: 'right' as const, + format: (v: unknown) => `+${formatCurrency(v as number)}`, + }, + { + key: 'netChange', + header: 'Net change', + align: 'right' as const, + format: (v: unknown) => { + const n = v as number; + return n >= 0 ? `+${formatCurrency(n)}` : formatCurrency(n); + }, + }, +]; + +const tableData = [ + { decile: '1st (poorest)', avgIncome: 12400, taxChange: 200, benefitChange: 6000, netChange: 5800 }, + { decile: '2nd', avgIncome: 24800, taxChange: 600, benefitChange: 6000, netChange: 5400 }, + { decile: '3rd', avgIncome: 36200, taxChange: 1200, benefitChange: 6000, netChange: 4800 }, + { decile: '4th', avgIncome: 48600, taxChange: 2400, benefitChange: 6000, netChange: 3600 }, + { decile: '5th', avgIncome: 62000, taxChange: 4200, benefitChange: 6000, netChange: 1800 }, + { decile: '6th', avgIncome: 78500, taxChange: 6800, benefitChange: 6000, netChange: -800 }, + { decile: '7th', avgIncome: 98000, taxChange: 10200, benefitChange: 6000, netChange: -4200 }, + { decile: '8th', avgIncome: 128000, taxChange: 15400, benefitChange: 6000, netChange: -9400 }, + { decile: '9th', avgIncome: 185000, taxChange: 24000, benefitChange: 6000, netChange: -18000 }, + { decile: '10th (richest)', avgIncome: 420000, taxChange: 62000, benefitChange: 6000, netChange: -56000 }, +]; + +const stateOptions = [ + { label: 'California', value: 'CA' }, + { label: 'New York', value: 'NY' }, + { label: 'Texas', value: 'TX' }, + { label: 'Florida', value: 'FL' }, + { label: 'Washington', value: 'WA' }, +]; + +const filingOptions = [ + { label: 'Single', value: 'single' }, + { label: 'Married filing jointly', value: 'mfj' }, + { label: 'Married filing separately', value: 'mfs' }, + { label: 'Head of household', value: 'hoh' }, +]; + +// --------------------------------------------------------------------------- +// Section wrapper +// --------------------------------------------------------------------------- + +function Section({ + title, + children, +}: { + title: string; + children: React.ReactNode; +}) { + return ( +
+

+ {title} +

+ {children} +
+ ); +} + +function SubSection({ + title, + children, +}: { + title: string; + children: React.ReactNode; +}) { + return ( +
+

+ {title} +

+ {children} +
+ ); +} + +// --------------------------------------------------------------------------- +// Demo app +// --------------------------------------------------------------------------- + +export function Demo() { + const [income, setIncome] = useState(75000); + const [dependents, setDependents] = useState(2); + const [state, setState] = useState('CA'); + const [filing, setFiling] = useState('mfj'); + const [includeState, setIncludeState] = useState(true); + const [ubiAmount, setUbiAmount] = useState(500); + + return ( + +
+
+

+ @policyengine/ui-kit +

+

+ Component gallery — every component rendered with example data +

+
+ + {/* ================================================================ */} + {/* PRIMITIVES */} + {/* ================================================================ */} +
+ +
+ + + + +
+
+ + + + +
+
+ + +
+
+ + +
+ Default + Secondary + Outline + Success + Warning + Error +
+
+ + +
+ + + Universal Basic Income + + $500/month payment to every adult citizen + + + +

+ This reform would provide a monthly payment of $500 to every + adult US citizen, funded through a combination of income tax + increases and spending reductions. +

+
+ + + + +
+ + + Child Tax Credit expansion + + Increase CTC from $2,000 to $3,600 per child + + + +

+ Expanding the Child Tax Credit to $3,600 per child under 6 + and $3,000 for children 6-17, with full refundability for + all qualifying families. +

+
+ + + +
+
+
+ + + + + Overview + + Distributional impact + + Budget impact + + + + +

+ This tab shows the overview of the policy reform, + including headline metrics and a summary of key impacts + across income deciles. +

+
+
+
+ + + +

+ Distributional analysis shows how the reform affects + different income groups, with the bottom 5 deciles + gaining and the top 4 deciles bearing the net cost. +

+
+
+
+ + + +

+ The budget impact analysis estimates this reform would + cost approximately $160 billion annually, partially + offset by increased economic activity. +

+
+
+
+
+
+
+ + {/* ================================================================ */} + {/* LAYOUT */} + {/* ================================================================ */} +
+ +
+ PolicyEngine + + } + actions={ + <> + + + + } + > + + UBI Calculator + +
+
+ + +
+ + + + + + + + + + + + + } + > + +
+ + + +
+
+
+
+
+ + +
+ +

+ Policy summary +

+ + This reform introduces a $500 monthly Universal + Basic Income for all adult US citizens. The + program would be funded through a combination of income + tax surcharges on high earners and reductions in existing + means-tested transfer programs. The bottom 50% of + households would see a net income increase, while the top + 30% would see a net decrease. + +
+
+
+
+ + {/* ================================================================ */} + {/* INPUTS */} + {/* ================================================================ */} +
+
+ + +
+ + + + +
+
+
+ + +
+ + `$${v}`} + /> + + {}} + min={0} + max={100} + /> + {}} + min={0} + /> + {}} + /> + +
+
+
+
+
+ + {/* ================================================================ */} + {/* DISPLAY */} + {/* ================================================================ */} +
+ +
+ + + + +
+
+ + + + Under this reform, a married couple in California earning{' '} + {formatCurrency(income)} per year with{' '} + {dependents} dependents would receive{' '} + $12,000 in annual UBI payments and pay an + additional $8,200 in income taxes, for a{' '} + + net gain of $3,800 + {' '} + per year. + + + + + + + + + + +
+ + {/* ================================================================ */} + {/* CHARTS */} + {/* ================================================================ */} +
+
+ + Download CSV + + } + > + `$${v}B`} + /> + + + + + `${v.toFixed(1)}%`} + /> + + + + + formatCurrency(v)} + /> + + + + + `$${v}B`} + /> + + +
+
+ +
+ @policyengine/ui-kit v0.1.0 — All components shown with example data +
+
+
+ ); +} diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..5b00f56 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,18 @@ + + + + + + @policyengine/ui-kit — Component Gallery + + + + + +
+ + + diff --git a/demo/main.tsx b/demo/main.tsx new file mode 100644 index 0000000..07de5f6 --- /dev/null +++ b/demo/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import '../src/app.css'; +import { Demo } from './Demo'; + +createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/package.json b/package.json index 527902c..6cb0d3c 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ ], "scripts": { "dev": "vite", + "dev:demo": "vite --config vite.demo.config.ts", "build": "vite build && mv dist/ui-kit.css dist/styles.css && tsc -p tsconfig.build.json --emitDeclarationOnly", "test": "vitest run", "test:watch": "vitest", diff --git a/vite.demo.config.ts b/vite.demo.config.ts new file mode 100644 index 0000000..812e695 --- /dev/null +++ b/vite.demo.config.ts @@ -0,0 +1,14 @@ +import { resolve } from 'path'; +import tailwindcss from '@tailwindcss/vite'; +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), react()], + root: 'demo', + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, +}); From 9515e9a9916f4f95a519651461f61ddce43dd1b1 Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Tue, 3 Mar 2026 20:13:27 +0100 Subject: [PATCH 2/5] Fix demo Tailwind scanning by removing root: demo The root: 'demo' config caused @tailwindcss/vite to only scan files within demo/ for class names, missing all tw: classes in src/ components. Removing it lets Tailwind scan the full project, and the demo is accessed via /demo/index.html instead. Co-Authored-By: Claude Opus 4.6 --- vite.demo.config.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vite.demo.config.ts b/vite.demo.config.ts index 812e695..5fb864e 100644 --- a/vite.demo.config.ts +++ b/vite.demo.config.ts @@ -5,10 +5,12 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [tailwindcss(), react()], - root: 'demo', resolve: { alias: { '@': resolve(__dirname, 'src'), }, }, + server: { + open: '/demo/index.html', + }, }); From 9a641e57013f75ee8b9783385823d762f1d5fc09 Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Tue, 3 Mar 2026 21:49:48 +0100 Subject: [PATCH 3/5] Add Header light/dark variants, PE logos, and demo refinements - Add light/dark variant to Header with CVA-based automatic child styling - Import all PolicyEngine logo assets from app-v2 with barrel exports - Fix checkbox accent color to use teal (tw:accent-primary) - Add asset type declarations (vite-env.d.ts) - Update demo with both header variants, logo gallery, and nav links Co-Authored-By: Claude Opus 4.6 --- demo/Demo.tsx | 98 ++++++++++++++++-- src/assets/index.ts | 1 + src/assets/logos/index.ts | 21 ++++ .../logos/policyengine/teal-square-padded.svg | 10 ++ .../policyengine/teal-square-transparent.png | Bin 0 -> 2434 bytes src/assets/logos/policyengine/teal-square.png | Bin 0 -> 4172 bytes src/assets/logos/policyengine/teal-square.svg | 9 ++ src/assets/logos/policyengine/teal.png | Bin 0 -> 13907 bytes src/assets/logos/policyengine/teal.svg | 19 ++++ .../logos/policyengine/white-square.svg | 8 ++ src/assets/logos/policyengine/white.png | Bin 0 -> 7901 bytes src/assets/logos/policyengine/white.svg | 18 ++++ src/index.ts | 3 + src/inputs/CheckboxInput.tsx | 2 +- src/layout/Header.tsx | 63 +++++++++-- src/layout/index.ts | 2 +- src/vite-env.d.ts | 9 ++ 17 files changed, 245 insertions(+), 18 deletions(-) create mode 100644 src/assets/index.ts create mode 100644 src/assets/logos/index.ts create mode 100644 src/assets/logos/policyengine/teal-square-padded.svg create mode 100644 src/assets/logos/policyengine/teal-square-transparent.png create mode 100644 src/assets/logos/policyengine/teal-square.png create mode 100644 src/assets/logos/policyengine/teal-square.svg create mode 100644 src/assets/logos/policyengine/teal.png create mode 100644 src/assets/logos/policyengine/teal.svg create mode 100644 src/assets/logos/policyengine/white-square.svg create mode 100644 src/assets/logos/policyengine/white.png create mode 100644 src/assets/logos/policyengine/white.svg create mode 100644 src/vite-env.d.ts diff --git a/demo/Demo.tsx b/demo/Demo.tsx index a8a2b8b..efb9d0f 100644 --- a/demo/Demo.tsx +++ b/demo/Demo.tsx @@ -45,6 +45,9 @@ import { PEWaterfallChart } from '../src/charts/PEWaterfallChart'; // Tokens (for display) import { formatCurrency } from '../src/tokens/charts'; +// Assets +import { logos } from '../src/assets'; + // --------------------------------------------------------------------------- // Example data // --------------------------------------------------------------------------- @@ -340,28 +343,107 @@ export function Demo() { {/* LAYOUT */} {/* ================================================================ */}
- +
- PolicyEngine - + PolicyEngine } actions={ <> - + Research + About + Donate } > - + UBI Calculator
+ +
+ } + actions={ + <> + Research + About + Donate + + + } + > + + Policy calculator + +
+
+ + +
+ + + Teal wordmark (SVG) + tealWordmark + + + + + Teal wordmark (PNG) + tealWordmarkPng + + + + + White wordmark (SVG) + whiteWordmark + + + + + White wordmark (PNG) + whiteWordmarkPng + + + + + Teal square (SVG) + tealSquare + + + + + Teal square (PNG) + tealSquarePng + + + + + Teal square transparent (PNG) + tealSquareTransparent + + + + + Teal square padded (SVG) + tealSquarePadded + + + + + White square (SVG) + whiteSquare + + +
+
+
+ + + + + + + + + diff --git a/src/assets/logos/policyengine/teal-square-transparent.png b/src/assets/logos/policyengine/teal-square-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..8787fbe7d8414ea82a22c1f5993fd90be7b46545 GIT binary patch literal 2434 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 Yu<(Daqp>_f{;6bXZVP!~dga#t0B4e+RsaA1 literal 0 HcmV?d00001 diff --git a/src/assets/logos/policyengine/teal-square.svg b/src/assets/logos/policyengine/teal-square.svg new file mode 100644 index 0000000..c6d967c --- /dev/null +++ b/src/assets/logos/policyengine/teal-square.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/logos/policyengine/teal.png b/src/assets/logos/policyengine/teal.png new file mode 100644 index 0000000000000000000000000000000000000000..49f5145a0292c3fd12c1f98a7cc3f44095e68290 GIT binary patch literal 13907 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 literal 0 HcmV?d00001 diff --git a/src/assets/logos/policyengine/teal.svg b/src/assets/logos/policyengine/teal.svg new file mode 100644 index 0000000..81fbe04 --- /dev/null +++ b/src/assets/logos/policyengine/teal.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/logos/policyengine/white-square.svg b/src/assets/logos/policyengine/white-square.svg new file mode 100644 index 0000000..f96f1c7 --- /dev/null +++ b/src/assets/logos/policyengine/white-square.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/logos/policyengine/white.png b/src/assets/logos/policyengine/white.png new file mode 100644 index 0000000000000000000000000000000000000000..04a7029a6596f1173b40631e1baf92d37ec26cfe GIT binary patch literal 7901 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 A00000 literal 0 HcmV?d00001 diff --git a/src/assets/logos/policyengine/white.svg b/src/assets/logos/policyengine/white.svg new file mode 100644 index 0000000..253c046 --- /dev/null +++ b/src/assets/logos/policyengine/white.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 036f4b2..1135a2f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,3 +21,6 @@ export * from './display'; // Charts export * from './charts'; + +// Assets +export * from './assets'; diff --git a/src/inputs/CheckboxInput.tsx b/src/inputs/CheckboxInput.tsx index 82113d5..005daae 100644 --- a/src/inputs/CheckboxInput.tsx +++ b/src/inputs/CheckboxInput.tsx @@ -24,7 +24,7 @@ export const CheckboxInput = forwardRef( type="checkbox" checked={checked} onChange={(e) => onChange(e.target.checked)} - className="tw:h-4 tw:w-4 tw:rounded tw:border tw:border-border-light tw:text-primary tw:focus:ring-2 tw:focus:ring-ring tw:cursor-pointer" + className="tw:h-4 tw:w-4 tw:rounded tw:border tw:border-border-light tw:accent-primary tw:focus:ring-2 tw:focus:ring-ring tw:cursor-pointer" style={styles?.input} {...props} /> diff --git a/src/layout/Header.tsx b/src/layout/Header.tsx index a117fe3..4805356 100644 --- a/src/layout/Header.tsx +++ b/src/layout/Header.tsx @@ -1,29 +1,76 @@ +import { cva, type VariantProps } from 'class-variance-authority'; import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'; import { cn } from '../utils/cn'; -export interface HeaderProps extends HTMLAttributes { +const headerVariants = cva( + 'tw:flex tw:items-center tw:justify-between tw:h-[58px] tw:px-2xl', + { + variants: { + variant: { + light: 'tw:bg-white tw:border-b tw:border-border-light', + dark: 'tw:bg-primary-600 tw:text-white tw:shadow-md tw:border-b tw:border-border-dark', + }, + }, + defaultVariants: { variant: 'light' }, + }, +); + +const actionsVariants = cva( + 'tw:flex tw:items-center tw:gap-3xl', + { + variants: { + variant: { + light: + '[&_a]:tw:text-text-secondary [&_a]:tw:text-lg [&_a]:tw:font-medium [&_a]:tw:no-underline [&_a]:tw:hover:text-text-primary [&_button]:tw:text-text-secondary', + dark: + '[&_a]:tw:text-white [&_a]:tw:text-lg [&_a]:tw:font-medium [&_a]:tw:no-underline [&_a]:tw:hover:opacity-80 [&_button]:tw:text-white', + }, + }, + defaultVariants: { variant: 'light' }, + }, +); + +const subtitleVariants = cva( + 'tw:flex tw:items-center tw:gap-md', + { + variants: { + variant: { + light: '[&>span]:tw:text-text-secondary [&>span]:tw:text-lg [&>span]:tw:font-medium', + dark: '[&>span]:tw:text-white/70 [&>span]:tw:text-lg [&>span]:tw:font-medium', + }, + }, + defaultVariants: { variant: 'light' }, + }, +); + +export interface HeaderProps + extends HTMLAttributes, + VariantProps { logo?: ReactNode; actions?: ReactNode; styles?: { root?: React.CSSProperties }; } export const Header = forwardRef( - ({ logo, actions, className, styles, children, ...props }, ref) => ( + ({ logo, actions, variant, className, styles, children, ...props }, ref) => (
-
+
{logo} {children}
- {actions &&
{actions}
} + {actions && ( +
+ {actions} +
+ )}
), ); Header.displayName = 'Header'; + +export { headerVariants }; diff --git a/src/layout/index.ts b/src/layout/index.ts index 17b4cb3..285e50d 100644 --- a/src/layout/index.ts +++ b/src/layout/index.ts @@ -1,6 +1,6 @@ export { DashboardShell, type DashboardShellProps } from './DashboardShell'; export { SidebarLayout, type SidebarLayoutProps } from './SidebarLayout'; export { SingleColumnLayout, type SingleColumnLayoutProps } from './SingleColumnLayout'; -export { Header, type HeaderProps } from './Header'; +export { Header, headerVariants, type HeaderProps } from './Header'; export { InputPanel, type InputPanelProps } from './InputPanel'; export { ResultsPanel, type ResultsPanelProps } from './ResultsPanel'; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..2f1d21f --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,9 @@ +declare module '*.svg' { + const src: string; + export default src; +} + +declare module '*.png' { + const src: string; + export default src; +} From 550b0ece35f7d74f839f4f3dc6c74168eb1a3bdd Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Tue, 3 Mar 2026 22:30:21 +0100 Subject: [PATCH 4/5] Add PR workflow with towncrier changelog check and tests - Add GitHub Actions PR workflow running towncrier check + vitest - Configure towncrier for changelog management (towncrier.toml) - Add initial changelog fragment for demo-site work Co-Authored-By: Claude Opus 4.6 --- .github/workflows/pr.yaml | 43 ++++++++++++++++++++++++++++++++++ changelog.d/.gitkeep | 0 changelog.d/demo-site.added.md | 1 + towncrier.toml | 21 +++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 .github/workflows/pr.yaml create mode 100644 changelog.d/.gitkeep create mode 100644 changelog.d/demo-site.added.md create mode 100644 towncrier.toml diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 0000000..0d39616 --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,43 @@ +name: PR checks + +on: + pull_request: + +jobs: + changelog: + name: Changelog fragment + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install towncrier + run: pip install towncrier + + - name: Check for changelog fragment + run: towncrier check --compare-with origin/main + + test: + name: Tests + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Run tests + run: bun run test diff --git a/changelog.d/.gitkeep b/changelog.d/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/changelog.d/demo-site.added.md b/changelog.d/demo-site.added.md new file mode 100644 index 0000000..88473d3 --- /dev/null +++ b/changelog.d/demo-site.added.md @@ -0,0 +1 @@ +Add demo site showcasing all components with light/dark Header variants and logo gallery. diff --git a/towncrier.toml b/towncrier.toml new file mode 100644 index 0000000..28e80a1 --- /dev/null +++ b/towncrier.toml @@ -0,0 +1,21 @@ +[tool.towncrier] +directory = "changelog.d" +filename = "CHANGELOG.md" +title_format = "## [{version}] - {project_date}" +issue_format = "" +underlines = ["", "", ""] + +[tool.towncrier.fragment.breaking] +name = "Breaking changes" + +[tool.towncrier.fragment.added] +name = "Added" + +[tool.towncrier.fragment.changed] +name = "Changed" + +[tool.towncrier.fragment.fixed] +name = "Fixed" + +[tool.towncrier.fragment.removed] +name = "Removed" From 7b09657b06f1c2e1d1e6560408d3d32a1ef3a4a5 Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Tue, 3 Mar 2026 23:02:30 +0100 Subject: [PATCH 5/5] Trigger PR workflow detection