Split the app into the three pages the navbar promises, each with one job: - / (home) -> read-only roster, no mutation controls - /add -> create only, redirects to / on success - /edit -> update + delete only (picker, plus /edit?id=<uuid> deep links) Data layer (src/lib/students.ts) is the single source of truth: - zod studentDraftSchema validates form input (trims name, lowercases email, coerces yearLevel to an int 1-5, restricts course to a known list) - studentSchema = draft + id + createdAt, so types come from z.infer - versioned key it3206.students.v1, validated on read *and* write; corrupt or missing data degrades to an empty list instead of throwing - typed CRUD helpers; useSyncExternalStore hook with a stable snapshot cache, a window event and the storage event so every island and other tabs re-render Footer "clear local storage" is now wired to clearStudents() (confirm dialog, label feedback) instead of being inert, and the layout switched to min-h-svh + an in-flow footer so it no longer overlaps long lists. Footer padding clears the Astro dev toolbar, which was covering the link in dev. Also adds zod, plus @astrojs/check + typescript@^6 as dev deps so astro check runs (TS 7 does not expose the API astro check needs yet).
33 lines
699 B
JSON
33 lines
699 B
JSON
{
|
|
"name": "it3206-minisys",
|
|
"type": "module",
|
|
"version": "0.0.1",
|
|
"engines": {
|
|
"node": ">=22.12.0"
|
|
},
|
|
"scripts": {
|
|
"dev": "astro dev",
|
|
"build": "astro check && astro build",
|
|
"preview": "astro preview",
|
|
"astro": "astro"
|
|
},
|
|
"dependencies": {
|
|
"@astrojs/react": "^6.0.5",
|
|
"@lucide/astro": "^1.46.0",
|
|
"@tailwindcss/vite": "^4.3.3",
|
|
"@types/react": "^19.3.0",
|
|
"@types/react-dom": "^19.3.0",
|
|
"astro": "^7.3.2",
|
|
"react": "^19.3.0",
|
|
"react-dom": "^19.3.0",
|
|
"tailwindcss": "^4.3.3",
|
|
"zod": "^4.6.5"
|
|
},
|
|
"allowScripts": {
|
|
"esbuild": true
|
|
},
|
|
"devDependencies": {
|
|
"@astrojs/check": "^0.9.10",
|
|
"typescript": "^6"
|
|
}
|
|
} |