feat: Reinitialize frontend with SvelteKit and TypeScript

- Delete old Vite+Svelte frontend
- Initialize new SvelteKit project with TypeScript
- Configure Tailwind CSS v4 + DaisyUI
- Implement JWT authentication with auto-refresh
- Create login page with form validation (Zod)
- Add protected route guards
- Update Docker configuration for single-stage build
- Add E2E tests with Playwright (6/11 passing)
- Fix Svelte 5 reactivity with $state() runes

Known issues:
- 5 E2E tests failing (timing/async issues)
- Token refresh implementation needs debugging
- Validation error display timing
This commit is contained in:
2026-02-17 16:19:59 -05:00
parent 54df6018f5
commit de2d83092e
28274 changed files with 3816354 additions and 90 deletions

24
frontend/node_modules/totalist/dist/index.js generated vendored Normal file
View File

@@ -0,0 +1,24 @@
const { join, resolve } = require('path');
const { readdir, stat } = require('fs');
const { promisify } = require('util');
const toStats = promisify(stat);
const toRead = promisify(readdir);
async function totalist(dir, callback, pre='') {
dir = resolve('.', dir);
await toRead(dir).then(arr => {
return Promise.all(
arr.map(str => {
let abs = join(dir, str);
return toStats(abs).then(stats => {
return stats.isDirectory()
? totalist(abs, callback, join(pre, str))
: callback(join(pre, str), abs, stats)
});
})
);
});
}
exports.totalist = totalist;

22
frontend/node_modules/totalist/dist/index.mjs generated vendored Normal file
View File

@@ -0,0 +1,22 @@
import { join, resolve } from 'path';
import { readdir, stat } from 'fs';
import { promisify } from 'util';
const toStats = promisify(stat);
const toRead = promisify(readdir);
export async function totalist(dir, callback, pre='') {
dir = resolve('.', dir);
await toRead(dir).then(arr => {
return Promise.all(
arr.map(str => {
let abs = join(dir, str);
return toStats(abs).then(stats => {
return stats.isDirectory()
? totalist(abs, callback, join(pre, str))
: callback(join(pre, str), abs, stats)
});
})
);
});
}