Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
1b0a9b3
fixup! Merge pull request #724 from PolicyEngine/feat/mobile-optimiza…
MaxGhenis Feb 23, 2026
873ab6f
fixup! fixup! Merge pull request #724 from PolicyEngine/feat/mobile-o…
MaxGhenis Feb 23, 2026
8c44d8d
fixup! fixup! fixup! Merge pull request #724 from PolicyEngine/feat/m…
MaxGhenis Feb 23, 2026
5a3d27c
fixup! fixup! fixup! fixup! Merge pull request #724 from PolicyEngine…
MaxGhenis Feb 23, 2026
46dcedf
fixup! fixup! fixup! fixup! fixup! Merge pull request #724 from Polic…
MaxGhenis Feb 23, 2026
783da21
fixup! fixup! fixup! fixup! fixup! fixup! Merge pull request #724 fro…
MaxGhenis Feb 23, 2026
3bdd625
Fix all lint errors and format migrated files
MaxGhenis Feb 23, 2026
a6420e3
Update packageManager to bun@1.2.21 for lockfile compatibility
MaxGhenis Feb 23, 2026
add350a
Fix TypeScript errors and Prettier formatting for CI
MaxGhenis Feb 23, 2026
cc6c0d9
Remove unused getInputFormattingProps import
MaxGhenis Feb 23, 2026
a2854f2
Remove all Mantine dependencies — complete migration to Tailwind/shadcn
MaxGhenis Feb 23, 2026
2abac83
Format date picker replacements with Prettier
MaxGhenis Feb 23, 2026
fcbdce7
Simplify migrated components and fix lint issues
MaxGhenis Feb 23, 2026
b7f5a7d
Fix borderColor type narrowing in HouseholdSummaryCard
MaxGhenis Feb 23, 2026
0310d15
Fix Tailwind v4 prefix variant ordering: variant:tw: → tw:variant:
MaxGhenis Feb 23, 2026
e1b3609
Style subscribe button with teal background to match production
MaxGhenis Feb 23, 2026
3ae24dd
Fix dropdown navigation, country picker styling, and footer polish
MaxGhenis Feb 24, 2026
1206a97
Replace hardcoded colors, typography, and spacing with design tokens
anth-volk Feb 26, 2026
ad6e173
Fix structural visual regressions from Mantine to Tailwind migration
anth-volk Feb 26, 2026
0c818e5
Add missing shadcn/ui CSS variables, base styles, and fix broken colo…
anth-volk Feb 26, 2026
c070f4b
Fix @layer base using wrong CSS variable names (missing --tw- prefix)
anth-volk Feb 26, 2026
93edd65
Fix StandardLayout to match Mantine AppShell viewport containment
anth-volk Feb 26, 2026
b188956
Fix IngredientReadView heading size and restore section title, fix Co…
anth-volk Feb 26, 2026
d08e3b8
Fix visual regressions: button color, card variants, input background…
anth-volk Feb 26, 2026
526ccdb
Constrain main content width to prevent horizontal overflow
anth-volk Feb 26, 2026
90a4fbe
Replace grid footer with flex layout — dynamic button widths
anth-volk Feb 26, 2026
65f1b17
Fix oversized US baseline card — match ButtonPanelVariant styling
anth-volk Feb 26, 2026
3fc505b
Fix table borders: light gray instead of black
anth-volk Feb 26, 2026
0d2b187
Restyle NestedMenu to match Mantine NavLink appearance
anth-volk Feb 27, 2026
bb5ff1f
Fix IngredientSubmissionView to match SetupConditionsVariant styling
anth-volk Feb 27, 2026
bf75516
Remove chevron arrows from NestedMenu items
anth-volk Feb 27, 2026
4321454
Fix ReportSidebar: remove arrows, white background, larger text
anth-volk Feb 27, 2026
82aa53a
Fix button text alignment and report table styling
anth-volk Feb 27, 2026
e01c9ec
Fix form element backgrounds, sidebar, labels, and headings
anth-volk Feb 27, 2026
110e045
Remove all dark: mode classes from shadcn components for solid white …
anth-volk Feb 27, 2026
427f8f4
Fix transparent backgrounds on accordion triggers, ghost buttons, and…
anth-volk Feb 27, 2026
8a3190f
Replace hardcoded colors, shadows, spacing, and typography with desig…
anth-volk Feb 27, 2026
8efb416
Replace more hardcoded values with design tokens across 5 files
anth-volk Feb 27, 2026
503e398
Replace remaining hardcoded values with design tokens across 22 files
anth-volk Feb 27, 2026
7a66393
Fix 6 failing tests for Sidebar and DefaultBaselineOption
anth-volk Feb 27, 2026
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
27 changes: 3 additions & 24 deletions app/.storybook/preview.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
import '@mantine/core/styles.css';
import '../src/app.css';

import React, { useEffect } from 'react';
import { addons } from '@storybook/preview-api';
import { DARK_MODE_EVENT_NAME } from 'storybook-dark-mode';
import { MantineProvider, useMantineColorScheme } from '@mantine/core';
import { theme } from '../src/theme';

const channel = addons.getChannel();
import React from 'react';

export const parameters = {
layout: 'fullscreen',
Expand All @@ -18,19 +12,4 @@ export const parameters = {
},
};

function ColorSchemeWrapper({ children }: { children: React.ReactNode }) {
const { setColorScheme } = useMantineColorScheme();
const handleColorScheme = (value: boolean) => setColorScheme(value ? 'dark' : 'light');

useEffect(() => {
channel.on(DARK_MODE_EVENT_NAME, handleColorScheme);
return () => channel.off(DARK_MODE_EVENT_NAME, handleColorScheme);
}, [channel]);

return children;
}

export const decorators = [
(renderStory: any) => <ColorSchemeWrapper>{renderStory()}</ColorSchemeWrapper>,
(renderStory: any) => <MantineProvider theme={theme}>{renderStory()}</MantineProvider>,
];
export const decorators = [(renderStory: any) => <>{renderStory()}</>];
4 changes: 3 additions & 1 deletion app/calculator.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
<script async src="https://www.googletagmanager.com/gtag/js?id=G-2YHG89FY0N"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-2YHG89FY0N');
</script>
Expand Down
21 changes: 21 additions & 0 deletions app/components.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/app.css",
"baseColor": "slate",
"cssVariables": true,
"prefix": "tw"
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "tabler"
}
107 changes: 105 additions & 2 deletions app/eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,30 @@
import mantine from 'eslint-config-mantine';
import eslint from '@eslint/js';
import jsxA11y from 'eslint-plugin-jsx-a11y';
import react from 'eslint-plugin-react';
import tseslint from 'typescript-eslint';

export default tseslint.config(
...mantine,
eslint.configs.recommended,
...tseslint.configs.recommended,
jsxA11y.flatConfigs.recommended,
{ ignores: ['**/*.{mjs,cjs,js,d.ts,d.mts}', './.storybook/main.ts', 'src/_archived/**'] },
{
files: ['**/*.story.tsx'],
rules: { 'no-console': 'off' },
},
{
// ESLint rules (previously from eslint-config-mantine)
rules: {
'array-callback-return': 'error',
'no-duplicate-imports': 'error',
'no-var': 'error',
'no-self-compare': 'error',
'no-template-curly-in-string': 'error',
curly: 'error',
'default-case': 'off',
'default-case-last': 'error',
'dot-notation': 'error',
'no-alert': 'error',
'no-console': [
'warn',
{
Expand Down Expand Up @@ -38,6 +53,94 @@ export default tseslint.config(
],
},
],
'no-else-return': 'error',
'no-eval': 'warn',
'no-lonely-if': 'error',
'no-multi-assign': 'error',
'no-multi-str': 'error',
'no-param-reassign': 'error',
'no-return-assign': 'error',
'no-script-url': 'error',
'no-sequences': 'error',
'no-throw-literal': 'error',
'no-unneeded-ternary': 'error',
'no-useless-call': 'error',
'no-useless-constructor': 'error',
'no-useless-return': 'error',
'object-shorthand': 'error',
'operator-assignment': ['error', 'always'],
'prefer-arrow-callback': 'error',
'prefer-const': 'error',
'prefer-exponentiation-operator': 'error',
'prefer-object-has-own': 'error',
'prefer-promise-reject-errors': 'error',
'prefer-object-spread': 'error',
'prefer-template': 'error',
yoda: 'error',
radix: 'error',
eqeqeq: ['error', 'smart'],
'no-undef': 'off',
},
},
{
// TypeScript ESLint rules
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/consistent-generic-constructors': 'error',
'@typescript-eslint/method-signature-style': ['error', 'property'],
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/lines-between-class-members': 'off',
'@typescript-eslint/indent': 'off',
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/comma-dangle': 'off',
'@typescript-eslint/no-redeclare': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/no-loop-func': 'off',
'@typescript-eslint/no-empty-object-type': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
{
args: 'all',
argsIgnorePattern: '^_',
caughtErrors: 'none',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
ignoreRestSiblings: true,
},
],
},
},
{
// React rules
plugins: { react },
settings: { react: { version: 'detect' } },
rules: {
'react/button-has-type': 'error',
'react/jsx-boolean-value': 'error',
'react/jsx-curly-brace-presence': ['error', 'never'],
'react/jsx-fragments': ['error', 'syntax'],
'react/jsx-no-comment-textnodes': 'error',
'react/jsx-no-duplicate-props': 'error',
'react/jsx-no-target-blank': 'error',
'react/no-children-prop': 'error',
'react/no-deprecated': 'error',
'react/no-find-dom-node': 'error',
'react/no-string-refs': 'error',
'react/self-closing-comp': 'error',
'react/void-dom-elements-no-children': 'error',
},
},
{
// JSX A11y overrides
rules: {
'jsx-a11y/no-autofocus': 'off',
'jsx-a11y/control-has-associated-label': 'off',
'jsx-a11y/mouse-events-have-key-events': 'off',
'jsx-a11y/label-has-for': 'off',
'jsx-a11y/anchor-is-valid': 'off',
'jsx-a11y/label-has-associated-control': 'off',
'jsx-a11y/anchor-has-content': 'off',
},
}
);
13 changes: 8 additions & 5 deletions app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,25 @@
"storybook:build": "storybook build"
},
"dependencies": {
"@mantine/core": "8.1.2",
"@mantine/dates": "^8.1.2",
"@mantine/hooks": "8.1.2",
"@normy/react-query": "^0.20.0",
"@policyengine/design-system": "*",
"@reduxjs/toolkit": "^2.8.2",
"@tabler/icons-react": "^3.34.0",
"@tailwindcss/vite": "^4.2.0",
"@tanstack/react-query": "^5.84.1",
"@tanstack/react-query-devtools": "^5.83.0",
"@vercel/analytics": "^1.6.1",
"@vercel/speed-insights": "^1.3.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"dayjs": "^1.11.13",
"framer-motion": "^12.23.24",
"fuse.js": "^7.0.0",
"html-to-image": "^1.11.13",
"jsonp": "^0.2.1",
"lucide-react": "^0.575.0",
"radix-ui": "^1.4.3",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-markdown": "^9.0.0",
Expand All @@ -59,6 +62,8 @@
"rehype-raw": "^7.0.0",
"remark-gfm": "^4.0.0",
"remark-math": "^6.0.0",
"tailwind-merge": "^3.5.0",
"tailwindcss": "^4.2.0",
"wordwrapjs": "^5.1.1"
},
"devDependencies": {
Expand All @@ -83,13 +88,11 @@
"@vitejs/plugin-react": "^4.5.2",
"concurrently": "^9.1.2",
"eslint": "^9.29.0",
"eslint-config-mantine": "^4.0.3",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"identity-obj-proxy": "^3.0.0",
"jsdom": "^26.1.0",
"postcss": "^8.5.5",
"postcss-preset-mantine": "1.17.0",
"postcss-simple-vars": "^7.0.1",
"prettier": "^3.5.3",
"prop-types": "^15.8.1",
Expand Down
11 changes: 5 additions & 6 deletions app/postcss.config.cjs
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
module.exports = {
plugins: {
'postcss-preset-mantine': {},
'postcss-simple-vars': {
variables: {
'mantine-breakpoint-xs': '36em',
'mantine-breakpoint-sm': '48em',
'mantine-breakpoint-md': '62em',
'mantine-breakpoint-lg': '75em',
'mantine-breakpoint-xl': '88em',
'breakpoint-xs': '36em',
'breakpoint-sm': '48em',
'breakpoint-md': '62em',
'breakpoint-lg': '75em',
'breakpoint-xl': '88em',
},
},
},
Expand Down
1,583 changes: 1,582 additions & 1 deletion app/public/assets/posts/encode-policy-multi-agent-ai/assets/index-BJx1p784.css

Large diffs are not rendered by default.

21,869 changes: 21,833 additions & 36 deletions app/public/assets/posts/encode-policy-multi-agent-ai/assets/index-DC8RyDPP.js

Large diffs are not rendered by default.

11 changes: 7 additions & 4 deletions app/public/assets/posts/encode-policy-multi-agent-ai/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Automating Tax and Benefit Policy Modeling with Multi-Agent AI</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Source+Serif+4:opsz,wght@8..60,400;8..60,600;8..60,700&display=swap" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Source+Serif+4:opsz,wght@8..60,400;8..60,600;8..60,700&display=swap"
rel="stylesheet"
/>
<script type="module" crossorigin src="./assets/index-DC8RyDPP.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-BJx1p784.css">
<link rel="stylesheet" crossorigin href="./assets/index-BJx1p784.css" />
</head>
<body>
<div id="root"></div>
Expand Down
20,425 changes: 20,424 additions & 1 deletion app/public/data/geojson/congressional_districts_hex.geojson

Large diffs are not rendered by default.

28 changes: 13 additions & 15 deletions app/src/CalculatorApp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,17 @@
* Calculator App (app.policyengine.org)
* Interactive policy simulation and analysis
*/
import '@mantine/core/styles.css';
import '@mantine/dates/styles.css';
import './app.css';

import { QueryNormalizerProvider } from '@normy/react-query';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { Provider } from 'react-redux';
import { MantineProvider } from '@mantine/core';
import { TooltipProvider } from '@/components/ui/tooltip';
import { CalculatorRouter } from './CalculatorRouter';
import { AppProvider } from './contexts/AppContext';
import { CalcOrchestratorProvider } from './contexts/CalcOrchestratorContext';
import { store } from './store';
import { policyEngineTheme } from './theme';
import { cacheMonitor } from './utils/cacheMonitor';

const queryClient = new QueryClient({
Expand All @@ -31,21 +29,21 @@ export default function CalculatorApp() {
return (
<AppProvider mode="calculator">
<Provider store={store}>
<MantineProvider theme={policyEngineTheme}>
<QueryNormalizerProvider
queryClient={queryClient}
normalizerConfig={{
devLogging: import.meta.env.DEV,
}}
>
<QueryClientProvider client={queryClient}>
<QueryNormalizerProvider
queryClient={queryClient}
normalizerConfig={{
devLogging: import.meta.env.DEV,
}}
>
<QueryClientProvider client={queryClient}>
<TooltipProvider>
<CalcOrchestratorProvider>
<CalculatorRouter />
<ReactQueryDevtools initialIsOpen={false} />
</CalcOrchestratorProvider>
</QueryClientProvider>
</QueryNormalizerProvider>
</MantineProvider>
</TooltipProvider>
</QueryClientProvider>
</QueryNormalizerProvider>
</Provider>
</AppProvider>
);
Expand Down
30 changes: 14 additions & 16 deletions app/src/WebsiteApp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@
* Website App (policyengine.org)
* Homepage, blog, team, and embedded calculators
*/
import '@mantine/core/styles.css';
import '@mantine/dates/styles.css';
import './app.css';

import { QueryNormalizerProvider } from '@normy/react-query';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { Provider } from 'react-redux';
import { MantineProvider } from '@mantine/core';
import { TooltipProvider } from '@/components/ui/tooltip';
import { AppProvider } from './contexts/AppContext';
import { store } from './store';
import { policyEngineTheme } from './theme';
import { cacheMonitor } from './utils/cacheMonitor';
import { WebsiteRouter } from './WebsiteRouter';

Expand All @@ -31,19 +29,19 @@ export default function WebsiteApp() {
return (
<AppProvider mode="website">
<Provider store={store}>
<MantineProvider theme={policyEngineTheme}>
<QueryNormalizerProvider
queryClient={queryClient}
normalizerConfig={{
devLogging: true,
}}
>
<QueryClientProvider client={queryClient}>
<QueryNormalizerProvider
queryClient={queryClient}
normalizerConfig={{
devLogging: true,
}}
>
<QueryClientProvider client={queryClient}>
<TooltipProvider>
<WebsiteRouter />
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</QueryNormalizerProvider>
</MantineProvider>
</TooltipProvider>
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</QueryNormalizerProvider>
</Provider>
</AppProvider>
);
Expand Down
Loading