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

View File

@@ -0,0 +1,46 @@
import Event from '../../event/Event.js';
import HTMLElement from '../html-element/HTMLElement.js';
/**
* HTMLBodyElement
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLBodyElement
*/
export default class HTMLBodyElement extends HTMLElement {
get onafterprint(): ((event: Event) => void) | null;
set onafterprint(value: ((event: Event) => void) | null);
get onbeforeprint(): ((event: Event) => void) | null;
set onbeforeprint(value: ((event: Event) => void) | null);
get onbeforeunload(): ((event: Event) => void) | null;
set onbeforeunload(value: ((event: Event) => void) | null);
get ongamepadconnected(): ((event: Event) => void) | null;
set ongamepadconnected(value: ((event: Event) => void) | null);
get ongamepaddisconnected(): ((event: Event) => void) | null;
set ongamepaddisconnected(value: ((event: Event) => void) | null);
get onhashchange(): ((event: Event) => void) | null;
set onhashchange(value: ((event: Event) => void) | null);
get onlanguagechange(): ((event: Event) => void) | null;
set onlanguagechange(value: ((event: Event) => void) | null);
get onmessage(): ((event: Event) => void) | null;
set onmessage(value: ((event: Event) => void) | null);
get onmessageerror(): ((event: Event) => void) | null;
set onmessageerror(value: ((event: Event) => void) | null);
get onoffline(): ((event: Event) => void) | null;
set onoffline(value: ((event: Event) => void) | null);
get ononline(): ((event: Event) => void) | null;
set ononline(value: ((event: Event) => void) | null);
get onpagehide(): ((event: Event) => void) | null;
set onpagehide(value: ((event: Event) => void) | null);
get onpageshow(): ((event: Event) => void) | null;
set onpageshow(value: ((event: Event) => void) | null);
get onpopstate(): ((event: Event) => void) | null;
set onpopstate(value: ((event: Event) => void) | null);
get onrejectionhandled(): ((event: Event) => void) | null;
set onrejectionhandled(value: ((event: Event) => void) | null);
get onstorage(): ((event: Event) => void) | null;
set onstorage(value: ((event: Event) => void) | null);
get onunhandledrejection(): ((event: Event) => void) | null;
set onunhandledrejection(value: ((event: Event) => void) | null);
get onunload(): ((event: Event) => void) | null;
set onunload(value: ((event: Event) => void) | null);
}
//# sourceMappingURL=HTMLBodyElement.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"HTMLBodyElement.d.ts","sourceRoot":"","sources":["../../../src/nodes/html-body-element/HTMLBodyElement.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,121 @@
import ElementEventAttributeUtility from '../element/ElementEventAttributeUtility.js';
import HTMLElement from '../html-element/HTMLElement.js';
import * as PropertySymbol from '../../PropertySymbol.js';
/**
* HTMLBodyElement
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLBodyElement
*/
export default class HTMLBodyElement extends HTMLElement {
// Events
/* eslint-disable jsdoc/require-jsdoc */
get onafterprint() {
return ElementEventAttributeUtility.getEventListener(this, 'onafterprint');
}
set onafterprint(value) {
this[PropertySymbol.propertyEventListeners].set('onafterprint', value);
}
get onbeforeprint() {
return ElementEventAttributeUtility.getEventListener(this, 'onbeforeprint');
}
set onbeforeprint(value) {
this[PropertySymbol.propertyEventListeners].set('onbeforeprint', value);
}
get onbeforeunload() {
return ElementEventAttributeUtility.getEventListener(this, 'onbeforeunload');
}
set onbeforeunload(value) {
this[PropertySymbol.propertyEventListeners].set('onbeforeunload', value);
}
get ongamepadconnected() {
return ElementEventAttributeUtility.getEventListener(this, 'ongamepadconnected');
}
set ongamepadconnected(value) {
this[PropertySymbol.propertyEventListeners].set('ongamepadconnected', value);
}
get ongamepaddisconnected() {
return ElementEventAttributeUtility.getEventListener(this, 'ongamepaddisconnected');
}
set ongamepaddisconnected(value) {
this[PropertySymbol.propertyEventListeners].set('ongamepaddisconnected', value);
}
get onhashchange() {
return ElementEventAttributeUtility.getEventListener(this, 'onhashchange');
}
set onhashchange(value) {
this[PropertySymbol.propertyEventListeners].set('onhashchange', value);
}
get onlanguagechange() {
return ElementEventAttributeUtility.getEventListener(this, 'onlanguagechange');
}
set onlanguagechange(value) {
this[PropertySymbol.propertyEventListeners].set('onlanguagechange', value);
}
get onmessage() {
return ElementEventAttributeUtility.getEventListener(this, 'onmessage');
}
set onmessage(value) {
this[PropertySymbol.propertyEventListeners].set('onmessage', value);
}
get onmessageerror() {
return ElementEventAttributeUtility.getEventListener(this, 'onmessageerror');
}
set onmessageerror(value) {
this[PropertySymbol.propertyEventListeners].set('onmessageerror', value);
}
get onoffline() {
return ElementEventAttributeUtility.getEventListener(this, 'onoffline');
}
set onoffline(value) {
this[PropertySymbol.propertyEventListeners].set('onoffline', value);
}
get ononline() {
return ElementEventAttributeUtility.getEventListener(this, 'ononline');
}
set ononline(value) {
this[PropertySymbol.propertyEventListeners].set('ononline', value);
}
get onpagehide() {
return ElementEventAttributeUtility.getEventListener(this, 'onpagehide');
}
set onpagehide(value) {
this[PropertySymbol.propertyEventListeners].set('onpagehide', value);
}
get onpageshow() {
return ElementEventAttributeUtility.getEventListener(this, 'onpageshow');
}
set onpageshow(value) {
this[PropertySymbol.propertyEventListeners].set('onpageshow', value);
}
get onpopstate() {
return ElementEventAttributeUtility.getEventListener(this, 'onpopstate');
}
set onpopstate(value) {
this[PropertySymbol.propertyEventListeners].set('onpopstate', value);
}
get onrejectionhandled() {
return ElementEventAttributeUtility.getEventListener(this, 'onrejectionhandled');
}
set onrejectionhandled(value) {
this[PropertySymbol.propertyEventListeners].set('onrejectionhandled', value);
}
get onstorage() {
return ElementEventAttributeUtility.getEventListener(this, 'onstorage');
}
set onstorage(value) {
this[PropertySymbol.propertyEventListeners].set('onstorage', value);
}
get onunhandledrejection() {
return ElementEventAttributeUtility.getEventListener(this, 'onunhandledrejection');
}
set onunhandledrejection(value) {
this[PropertySymbol.propertyEventListeners].set('onunhandledrejection', value);
}
get onunload() {
return ElementEventAttributeUtility.getEventListener(this, 'onunload');
}
set onunload(value) {
this[PropertySymbol.propertyEventListeners].set('onunload', value);
}
}
//# sourceMappingURL=HTMLBodyElement.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"HTMLBodyElement.js","sourceRoot":"","sources":["../../../src/nodes/html-body-element/HTMLBodyElement.ts"],"names":[],"mappings":"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"}