Initial React/TypeScript frontend setup

This commit is contained in:
Lukas Bauer 2026-01-07 10:00:00 +00:00
commit aab2c02c2e
7 changed files with 110 additions and 0 deletions

3
.env.example Normal file
View file

@ -0,0 +1,3 @@
VITE_API_BASE_URL=http://localhost:8080
VITE_AUTH_ISSUER=https://auth.nexus.local
VITE_SENTRY_DSN=

7
.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
node_modules/
dist/
.env.local
.env.*.local
*.log
.DS_Store
coverage/

27
README.md Normal file
View file

@ -0,0 +1,27 @@
# nexus/frontend
Nexus web frontend. Built with React + TypeScript + Vite.
## Development
npm install
npm run dev # dev server on http://localhost:5173
npm run build # production build to dist/
npm run test # unit tests (vitest)
npm run lint # eslint + tsc
## Structure
```
src/
components/ — reusable UI components
pages/ — route-level page components
hooks/ — custom React hooks
api/ — API client and types
styles/ — global styles and design tokens
utils/ — pure utility functions
```
## Environment variables
Copy `.env.example` to `.env.local` for local development.

28
package.json Normal file
View file

@ -0,0 +1,28 @@
{
"name": "nexus-frontend",
"version": "1.4.0",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
"test": "vitest",
"lint": "eslint src --ext .ts,.tsx && tsc --noEmit"
},
"dependencies": {
"react": "^18.3.0",
"react-dom": "^18.3.0",
"react-router-dom": "^6.22.0",
"@tanstack/react-query": "^5.28.0",
"axios": "^1.6.8"
},
"devDependencies": {
"@types/react": "^18.3.0",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react": "^4.2.1",
"typescript": "^5.4.3",
"vite": "^5.2.6",
"vitest": "^1.4.0",
"eslint": "^8.57.0",
"@typescript-eslint/eslint-plugin": "^7.4.0"
}
}

21
src/styles/tokens.css Normal file
View file

@ -0,0 +1,21 @@
:root {
--color-primary: #0055cc;
--color-primary-hover: #003d99;
--color-surface: #f8f9fa;
--color-surface-raised: #ffffff;
--color-border: #dee2e6;
--color-text: #212529;
--color-text-muted: #6c757d;
--color-error: #dc3545;
--color-success: #198754;
--font-sans: 'Inter', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 16px;
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.12);
}

13
tsconfig.json Normal file
View file

@ -0,0 +1,13 @@
{
"compilerOptions": {
"target": "ES2020",
"lib": ["ES2020", "DOM"],
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true
},
"include": ["src"]
}

11
vite.config.ts Normal file
View file

@ -0,0 +1,11 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
server: {
proxy: {
'/api': 'http://localhost:8080',
},
},
});