feat(frontend): bootstrap Vite + React 19 + TS strict toolchain (F0.1)

- Vite 8 / React 19 / TS 6 strict (noUncheckedIndexedAccess, no baseUrl deprecation)
- Tailwind 4 via @tailwindcss/vite (no PostCSS step)
- TanStack Query 5, react-router-dom 7, Recharts, clsx
- Vitest + Testing Library + jsdom for unit tests
- Playwright skeleton + first smoke spec (login redirect)
- ESLint flat config: typescript-eslint type-checked, react-hooks, react-refresh, prettier
- Prettier config (semi, single quotes, 100-col, lf)
- IBM Plex font @font-face declarations targeting /fonts/ (self-host, no CDN — OPSEC)
This commit is contained in:
ux-frontend
2026-05-21 20:30:23 +02:00
parent 2ead16114d
commit 80ca4641a3
19 changed files with 5348 additions and 0 deletions

22
frontend/src/App.tsx Normal file
View File

@@ -0,0 +1,22 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { RouterProvider } from 'react-router-dom';
import { router } from './router';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 30_000,
gcTime: 5 * 60_000,
retry: 1,
refetchOnWindowFocus: false,
},
},
});
export function App() {
return (
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
</QueryClientProvider>
);
}

15
frontend/src/main.tsx Normal file
View File

@@ -0,0 +1,15 @@
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import './styles/globals.css';
import { App } from './App';
const container = document.getElementById('root');
if (!container) {
throw new Error('Root element #root missing in index.html');
}
createRoot(container).render(
<StrictMode>
<App />
</StrictMode>,
);

View File

@@ -0,0 +1 @@
import '@testing-library/jest-dom/vitest';