Delivered: Super Administrator — env-var provisioned, no StaffProfile at all (structural exclusion from Team/barber-picker/appointments/staff-totals, not a filter). hasPermission short-circuit + new getActingBusinessContext() helper retrofitted across 16 owner pages so it can actually manage the business. Media Manager — one upload/library/external-URL modal + field picker, backing every image field app-wide. Local-disk storage + Docker volume, SVG rejected, size-capped. Welcome backgrounds — desktop/mobile images with CSS breakpoint swap. Business Branding settings — logo/cover/welcome/favicon/icon/colours all editable post-install; cover image finally rendered (was dead config). Service descriptions — now surfaced on Home and in the booking flow. Loyalty card — live preview, ColorPicker/MediaPicker/IconPicker, flip removed for a static premium-styled card, Loyalty added to bottom nav. Fixed a real pre-existing bug where the card's configured colour/image/icon were stored but never actually rendered. Home Screen Redesign — hero gallery + sticky Services/Portfolio/Reviews/Details tabs, backed by a new unified gallery model/service (no hero/portfolio duplication). Details tab surfaces social links and a map that were never shown before. Google Reviews — real sync pipeline (24h cron, CRON_SECRET-gated, mirrors the existing notification cron exactly), DB-only customer reads, owner hide/unhide + policy management page. Architecture cleanup — SettingsPageShell extracted from 6 duplicated page wrappers; fixed a second pre-existing bug where branding image fields could never actually be cleared once set. Verification: 418 tests passing (236 unit + 182 integration, all against a real MySQL database), full typecheck/lint clean across src, and a real Docker build+run cycle — which caught and fixed a genuine bug (scripts/ wasn't copied into the production image, so Super Admin sync would have crashed on every real deployment).
81 lines
2.4 KiB
JSON
81 lines
2.4 KiB
JSON
{
|
|
"name": "nextchair",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"description": "Mobile-first barber booking platform — customer, barber and owner experiences in one Next.js app.",
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"build": "next build",
|
|
"start": "next start",
|
|
"lint": "eslint .",
|
|
"typecheck": "tsc --noEmit",
|
|
"format": "prettier --write .",
|
|
"prisma:generate": "prisma generate",
|
|
"prisma:migrate": "prisma migrate dev",
|
|
"prisma:studio": "prisma studio",
|
|
"prisma:seed": "tsx prisma/seed.ts",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:integration": "vitest run --config vitest.integration.config.mts",
|
|
"test:e2e": "playwright test"
|
|
},
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "http://192.168.0.126:3000/lazis002/NextChair.git"
|
|
},
|
|
"keywords": [],
|
|
"author": "",
|
|
"license": "ISC",
|
|
"dependencies": {
|
|
"@auth/prisma-adapter": "^2.11.3",
|
|
"@fortawesome/fontawesome-svg-core": "^7.3.1",
|
|
"@fortawesome/free-solid-svg-icons": "^7.3.1",
|
|
"@fortawesome/react-fontawesome": "^3.5.0",
|
|
"@hookform/resolvers": "^5.7.1",
|
|
"@prisma/adapter-mariadb": "^7.9.1",
|
|
"@prisma/client": "^7.9.1",
|
|
"@radix-ui/react-slot": "^1.3.3",
|
|
"@radix-ui/react-switch": "^1.3.7",
|
|
"@radix-ui/react-tabs": "^1.1.21",
|
|
"bcryptjs": "^3.0.3",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"image-size": "^2.0.2",
|
|
"lucide-react": "^1.28.0",
|
|
"luxon": "^3.7.2",
|
|
"mariadb": "^3.5.3",
|
|
"next": "^16.2.12",
|
|
"next-auth": "^5.0.0-beta.32",
|
|
"nodemailer": "^8.0.11",
|
|
"react": "^19.2.8",
|
|
"react-dom": "^19.2.8",
|
|
"react-hook-form": "^7.84.0",
|
|
"server-only": "^0.0.1",
|
|
"tailwind-merge": "^3.6.0",
|
|
"web-push": "^3.6.7",
|
|
"zod": "^4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.62.1",
|
|
"@tailwindcss/postcss": "^4.3.3",
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/luxon": "^3.7.3",
|
|
"@types/node": "^26.1.2",
|
|
"@types/nodemailer": "^8.0.1",
|
|
"@types/react": "^19.2.18",
|
|
"@types/react-dom": "^19.2.4",
|
|
"@types/web-push": "^3.6.4",
|
|
"dotenv": "^17.4.2",
|
|
"eslint": "^9.39.5",
|
|
"eslint-config-next": "^16.2.12",
|
|
"postcss": "^8.5.25",
|
|
"prettier": "^3.9.6",
|
|
"prettier-plugin-tailwindcss": "^0.8.1",
|
|
"prisma": "^7.9.1",
|
|
"tailwindcss": "^4.3.3",
|
|
"tsx": "^4.23.4",
|
|
"typescript": "^6.0.3",
|
|
"vitest": "^4.1.10"
|
|
}
|
|
}
|