Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 5m56s
CI / Build container images (pull_request) Successful in 1m27s
CI / Auth e2e pack (pull_request) Successful in 9m18s
CI / Import/export fidelity gate (pull_request) Successful in 1m6s
CI / Import/export fidelity gate (push) Blocked by required conditions
CD / Build and push images (push) Successful in 20s
CD / Deploy to Test (push) Successful in 11s
CD / Smoke tests against Test (push) Successful in 1m25s
CD / Promote to Int (push) Successful in 12s
CI / Lint, typecheck, test (push) Successful in 6m5s
CI / Build container images (push) Has been skipped
CI / Auth e2e pack (push) Has been cancelled
First @media print support at all: page size/margins, navigation and interactive chrome suppressed, break behaviour for headings, tables, code blocks, figures and plugin blocks. The VS-NfD marking runs as header AND footer on every sheet via a real-table PrintFrame whose thead/tfoot browsers repeat per page — @page margin boxes are unimplemented and position:fixed places unreliably in both engines (verified empirically); on screen the table chain renders as plain blocks, so nothing changes visually. Verified as PDF-from-browser in Chromium 140 and Firefox 153 (2 markings on every page of a multi-page document); the repeatable procedure is documented in apps/web/e2e/README.md. Unclassified pages print without a marking. Co-Authored-By: Claude Fable 5 (1M context) <noreply@anthropic.com>
57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
import { StrictMode } from 'react';
|
|
import { createRoot } from 'react-dom/client';
|
|
import { BrowserRouter } from 'react-router-dom';
|
|
|
|
import { App } from './App';
|
|
import { AuthProvider } from './auth/auth-context';
|
|
import { ToastProvider } from './components/Toast';
|
|
import './i18n';
|
|
import { ApiError } from './lib/api';
|
|
import { initUserTheme } from './theme/apply-theme';
|
|
import { applyTheme, initSystemThemeListener, readStoredThemeMode } from './theme/theme';
|
|
import './styles/tokens.css';
|
|
import './styles/base.css';
|
|
import './styles/print.css';
|
|
|
|
// theme-init.js already themed the document pre-paint; re-applying here is
|
|
// a no-op safety net for contexts serving index.html without it, and the
|
|
// listener keeps 'system' users in sync with live OS scheme changes.
|
|
applyTheme(readStoredThemeMode());
|
|
initSystemThemeListener();
|
|
// Accent choice (#184): re-derive from the stored choice — heals a stale
|
|
// ui.theme.css cache after app updates; theme-init.js only bridges paint.
|
|
initUserTheme();
|
|
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
// A 4xx won't turn into something else on retry (wrong permissions,
|
|
// page in trash, not found, …) — only retry on network/5xx errors.
|
|
retry: (failureCount, error) => {
|
|
if (error instanceof ApiError && error.status >= 400 && error.status < 500) return false;
|
|
return failureCount < 3;
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
const container = document.getElementById('root');
|
|
if (!container) {
|
|
throw new Error('index.html is missing the #root element');
|
|
}
|
|
|
|
createRoot(container).render(
|
|
<StrictMode>
|
|
<QueryClientProvider client={queryClient}>
|
|
<AuthProvider>
|
|
<ToastProvider>
|
|
<BrowserRouter>
|
|
<App />
|
|
</BrowserRouter>
|
|
</ToastProvider>
|
|
</AuthProvider>
|
|
</QueryClientProvider>
|
|
</StrictMode>,
|
|
);
|