Files
portfolio/package.json
denshooter f0e257ad19 feat: plakat redesign phase 3 (windows on desktop, sheets on mobile)
- Tapping an object on the desk opens a window (desktop) or a bottom sheet
  (mobile) instead of flipping: projects, now, servers, reading, about, contact
- Desktop windows in poster style (2px ink rule, hard offset shadow), open
  from the tapped object, thrown by the title bar with momentum and elastic
  viewport edges, stack by focus, minimize into a tray, Escape closes the top
  window, focus moves to close and returns to the trigger
- Mobile sheets via vaul 1.1.2: drag down to dismiss, overlay, focus trap
- Project window shows live/source links from Directus when present
- Hero "Write me" opens the contact window; still a plain #contact link
  without JavaScript
- Shared current-book loader for desk, deck and reading window
- Texts in de/en, i18n key check extended

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 23:49:21 +02:00

122 lines
4.3 KiB
JSON

{
"name": "portfolio",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "node scripts/dev-minimal.js",
"dev:simple": "node scripts/dev-simple.js",
"dev:next": "next dev",
"db:setup": "node scripts/setup-database.js",
"db:seed": "tsx -r dotenv/config prisma/seed.ts dotenv_config_path=.env.local",
"build": "next build",
"start": "next start",
"lint": "cross-env NODE_ENV=development eslint .",
"lint:fix": "eslint . --fix",
"pre-push": "./scripts/pre-push.sh",
"pre-push:full": "./scripts/pre-push-full.sh",
"pre-push:quick": "./scripts/pre-push-quick.sh",
"test:all": "npm run test && npm run test:e2e",
"buildAnalyze": "cross-env ANALYZE=true next build",
"test": "cross-env NODE_ENV=test jest",
"test:production": "NODE_ENV=production jest --config jest.config.production.ts",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:headed": "playwright test --headed",
"test:e2e:debug": "playwright test --debug",
"test:critical": "playwright test e2e/critical-paths.spec.ts",
"test:hydration": "playwright test e2e/hydration.spec.ts",
"test:email": "playwright test e2e/email.spec.ts",
"test:performance": "playwright test e2e/performance.spec.ts",
"test:accessibility": "playwright test e2e/accessibility.spec.ts",
"db:generate": "prisma generate",
"db:push": "prisma db push",
"db:studio": "prisma studio",
"db:reset": "prisma db push --force-reset",
"docker:build": "docker build -t portfolio-app .",
"docker:run": "docker run -p 3000:3000 portfolio-app",
"docker:compose": "docker compose -f docker-compose.production.yml up -d",
"docker:down": "docker compose -f docker-compose.production.yml down",
"docker:dev": "docker compose -f docker-compose.dev.minimal.yml up -d",
"docker:dev:down": "docker compose -f docker-compose.dev.minimal.yml down",
"deploy": "./scripts/deploy.sh",
"auto-deploy": "./scripts/auto-deploy.sh",
"quick-deploy": "./scripts/quick-deploy.sh",
"gitea-deploy": "./scripts/gitea-deploy.sh",
"setup-gitea-runner": "./scripts/setup-gitea-runner.sh",
"monitor": "./scripts/monitor.sh",
"health": "curl -f http://localhost:3000/api/health"
},
"prisma": {
"seed": "tsx prisma/seed.ts"
},
"dependencies": {
"@next/bundle-analyzer": "^15.1.7",
"@prisma/client": "^5.22.0",
"@swc/helpers": "^0.5.19",
"@tiptap/extension-color": "^3.15.3",
"@tiptap/extension-highlight": "^3.15.3",
"@tiptap/extension-link": "^3.15.3",
"@tiptap/extension-text-style": "^3.15.3",
"@tiptap/extension-underline": "^3.15.3",
"@tiptap/html": "^3.15.3",
"@tiptap/react": "^3.15.3",
"@tiptap/starter-kit": "^3.15.3",
"@vercel/og": "^0.6.5",
"clsx": "^2.1.1",
"dotenv": "^16.6.1",
"framer-motion": "^12.24.10",
"lucide-react": "^0.542.0",
"next": "^15.5.7",
"next-intl": "^4.7.0",
"node-cache": "^5.1.2",
"node-fetch": "^2.7.0",
"nodemailer": "^7.0.11",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"react-markdown": "^10.1.0",
"redis": "^5.8.2",
"sanitize-html": "^2.17.0",
"tailwind-merge": "^2.6.0",
"vaul": "1.1.2"
},
"browserslist": [
"chrome >= 100",
"firefox >= 100",
"safari >= 15.4",
"edge >= 100"
],
"devDependencies": {
"@eslint/eslintrc": "^3",
"@playwright/test": "^1.57.0",
"@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.2.0",
"@types/jest": "^29.5.14",
"@types/node": "^20.10.0",
"@types/node-fetch": "^2.6.13",
"@types/nodemailer": "^6.4.17",
"@types/react": "^19",
"@types/react-dom": "^19",
"@types/sanitize-html": "^2.16.0",
"autoprefixer": "^10.4.24",
"critters": "^0.0.23",
"cross-env": "^7.0.3",
"eslint": "^9",
"eslint-config-next": "^15.5.7",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"nodemailer-mock": "^2.0.9",
"playwright": "^1.57.0",
"postcss": "^8.5.6",
"prisma": "^5.22.0",
"tailwindcss": "^3.4.17",
"ts-jest": "^29.4.6",
"ts-node": "^10.9.2",
"tsx": "^4.20.5",
"typescript": "5.9.3",
"whatwg-fetch": "^3.6.20"
}
}