Files
kvitt/web/package.json
T
jacobh2 2ae65a5a9f
Build Kvitt images / build (push) Failing after 1h14m5s
W0 web foundation: Vite + React SPA under /app/, sync-pull ledger, auth, tokens, shared components
web/ is the browser client's scaffold: Vite 8, React 19, TypeScript 5.9 strict, React Router 7 (basename /app, every
fixed route with a lazy placeholder page), TanStack Query 5 (refetch on focus and every 60 s), openapi-typescript
types generated from contracts/openapi.yaml with openapi-fetch. Reads go through GET /sync (no REST reads exist for
the ledger, SPEC §7): useLedger() pulls from cursor 0 and then incrementally, restarting on a new epoch or
cursor_ahead. Login pairs the browser as "Web · <browser>" with an invite code (E-3); every call sends the SPEC
§14.3.1 headers, a 401 signs out. kvitt-domain's split, balances, allocation and settlement rules are ported to
web/src/lib and pass every case of contracts/test-vectors. Design tokens from design-spec §2 in tokens.css
(light-dark()), Material Symbols Rounded (Apache-2.0) as generated inline SVG, sv/en catalogs generated from
docs/ux/strings.csv plus web-strings.csv. Gate: cd web && npm run check.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
2026-10-21 21:03:25 +02:00

62 lines
1.9 KiB
JSON

{
"name": "kvitt-web",
"private": true,
"version": "0.1.0",
"description": "Kvitt web client: the SPA served by kvitt-server under /app/",
"type": "module",
"kvitt": {
"versionCode": 1
},
"engines": {
"node": ">=22.18"
},
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"typecheck": "tsc --noEmit -p tsconfig.json",
"lint": "eslint --max-warnings 0 .",
"test": "vitest run",
"api:types": "openapi-typescript ../contracts/openapi.yaml -o src/api/schema.d.ts",
"i18n:import": "node scripts/gen-i18n.mjs",
"icons:import": "node scripts/gen-icons.mjs",
"generated:check": "node scripts/check-generated.mjs",
"format": "prettier --write .",
"format:check": "prettier --check .",
"check": "npm run generated:check && npm run typecheck && npm run lint && npm run format:check && npm run test && npm run build"
},
"dependencies": {
"@tanstack/react-query": "5.104.5",
"openapi-fetch": "0.17.0",
"react": "19.3.1",
"react-dom": "19.3.1",
"react-is": "19.3.1",
"react-router": "7.18.4",
"recharts": "3.10.1"
},
"devDependencies": {
"@eslint/js": "10.0.1",
"@material-symbols/svg-500": "0.48.1",
"@material-symbols/svg-600": "0.48.1",
"@testing-library/dom": "10.4.2",
"@testing-library/jest-dom": "7.0.1",
"@testing-library/react": "16.3.3",
"@testing-library/user-event": "14.6.8",
"@types/node": "26.6.5",
"@types/react": "19.3.0",
"@types/react-dom": "19.3.0",
"@vitejs/plugin-react": "6.1.2",
"eslint": "10.13.0",
"eslint-config-prettier": "10.1.8",
"eslint-plugin-react-hooks": "7.1.1",
"globals": "17.13.0",
"jsdom": "30.1.3",
"openapi-typescript": "7.13.0",
"prettier": "3.9.10",
"typescript": "5.9.3",
"typescript-eslint": "8.72.0",
"vite": "8.3.5",
"vitest": "5.0.5"
}
}