feat(01-01): scaffold Vite project with CSS design system and project structure

- Vite 6 + TypeScript + Biome + Vitest configured
- All directories from spec section 13 created
- CSS custom properties for full color palette and finger colors
- index.html with 5 screen sections and Google Fonts
- Dev server binds to 0.0.0.0:5173 for VPS access

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 11:01:10 +02:00
co-authored by Claude Opus 4.6
parent 27d9e91439
commit 4dc9523044
22 changed files with 1931 additions and 0 deletions
+10
View File
@@ -1 +1,11 @@
# Dependencies
node_modules
# Build output
dist
# API config (contains secrets)
public/config.json
# Local env files
*.local
+20
View File
@@ -0,0 +1,20 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"organizeImports": {
"enabled": true
},
"formatter": {
"enabled": true,
"indentStyle": "tab",
"lineWidth": 100
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"files": {
"ignore": ["dist", "node_modules"]
}
}
+23
View File
@@ -0,0 +1,23 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Zauberwald</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=Quicksand:wght@400;600;700&family=Nunito:wght@400;600&display=swap"
rel="stylesheet"
/>
</head>
<body>
<section id="screen-welcome" class="screen screen--active"></section>
<section id="screen-forest" class="screen"></section>
<section id="screen-lesson" class="screen"></section>
<section id="screen-reward" class="screen"></section>
<section id="screen-parent" class="screen"></section>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
+1766
View File
File diff suppressed because it is too large Load Diff
+21
View File
@@ -0,0 +1,21 @@
{
"name": "zauberwald",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite --host",
"build": "tsc && vite build",
"preview": "vite preview --host --port 4173",
"test": "vitest run",
"test:watch": "vitest",
"lint": "biome check .",
"lint:fix": "biome check --write ."
},
"devDependencies": {
"typescript": "~5.8.0",
"vite": "^6.0.0",
"vitest": "^3.0.0",
"@biomejs/biome": "^1.9.0"
}
}
+5
View File
@@ -0,0 +1,5 @@
{
"geminiApiKey": "YOUR_API_KEY_HERE",
"geminiModel": "gemini-2.5-flash",
"imageModel": "gemini-3.1-flash-image-preview"
}
View File
View File
View File
View File
View File
View File
View File
+3
View File
@@ -0,0 +1,3 @@
import "./styles/main.css";
console.log("Zauberwald loaded");
+57
View File
@@ -0,0 +1,57 @@
/* Zauberwald Design System */
:root {
/* Grundpalette — warm, einladend, Waldstimmung */
--bg-cream: #FFF8F0;
--bg-forest: #E8F5E4;
--text-dark: #3D3225;
--text-warm: #5C4A3A;
--text-light: #8B7D6B;
--accent-green: #6DB87D;
--accent-gold: #E8B84B;
--accent-pink: #E88BAE;
--accent-purple: #9B7DC4;
--accent-blue: #7DB8D4;
/* Fingerfarben — weiche Pastelltoene */
--finger-l-pinky: #E8B4C8;
--finger-l-ring: #C4A8D4;
--finger-l-mid: #A8C4E0;
--finger-l-index: #A8D8B8;
--finger-r-index: #D4D8A8;
--finger-r-mid: #E0C4A8;
--finger-r-ring: #D4A8A8;
--finger-r-pinky: #C8B4E8;
--finger-thumb: #D4CFC8;
}
/* Base styles */
body {
font-family: "Nunito", sans-serif;
background: var(--bg-cream);
color: var(--text-dark);
font-size: 16px;
margin: 0;
padding: 0;
}
h1,
h2,
h3 {
font-family: "Quicksand", sans-serif;
}
/* Screen management */
.screen {
display: none;
opacity: 0;
transition: opacity 0.3s ease;
}
.screen--active {
display: flex;
flex-direction: column;
align-items: center;
opacity: 1;
min-height: 100vh;
}
View File
+20
View File
@@ -0,0 +1,20 @@
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedIndexedAccess": true
},
"include": ["src"]
}
+6
View File
@@ -0,0 +1,6 @@
import { defineConfig } from "vite";
export default defineConfig({
server: { host: "0.0.0.0", port: 5173 },
preview: { host: "0.0.0.0", port: 4173 },
});