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,65 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const PropertySymbol = __importStar(require("../../PropertySymbol.cjs"));
const HTMLCollection_js_1 = __importDefault(require("../element/HTMLCollection.cjs"));
/**
* HTMLFormControlsCollection.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormControlsCollection
*/
class HTMLFormControlsCollection extends HTMLCollection_js_1.default {
/**
* Constructor.
*
* @param illegalConstructorSymbol Illegal constructor symbol.
* @param ownerElement Form element.
*/
constructor(illegalConstructorSymbol, ownerElement) {
super(illegalConstructorSymbol, () => ownerElement[PropertySymbol.getFormControlItems]());
this[PropertySymbol.ownerElement] = ownerElement;
}
/**
* @override
*/
namedItem(name) {
return this[PropertySymbol.ownerElement][PropertySymbol.getFormControlNamedItem](name);
}
}
exports.default = HTMLFormControlsCollection;
//# sourceMappingURL=HTMLFormControlsCollection.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"HTMLFormControlsCollection.cjs","sourceRoot":"","sources":["../../../src/nodes/html-form-element/HTMLFormControlsCollection.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wEAA0D;AAC1D,qFAA0D;AAK1D;;;;GAIG;AACH,MAAqB,0BAA2B,SAAQ,2BAGvD;IAGA;;;;;OAKG;IACH,YAAY,wBAAgC,EAAE,YAA6B;QAC1E,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;IAClD,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC;CACD;AAvBD,6CAuBC"}

View File

@@ -0,0 +1,25 @@
import * as PropertySymbol from '../../PropertySymbol.cjs';
import HTMLCollection from '../element/HTMLCollection.cjs';
import HTMLFormElement from './HTMLFormElement.cjs';
import RadioNodeList from './RadioNodeList.cjs';
import THTMLFormControlElement from './THTMLFormControlElement.cjs';
/**
* HTMLFormControlsCollection.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormControlsCollection
*/
export default class HTMLFormControlsCollection extends HTMLCollection<THTMLFormControlElement, THTMLFormControlElement | RadioNodeList> {
private [PropertySymbol.ownerElement];
/**
* Constructor.
*
* @param illegalConstructorSymbol Illegal constructor symbol.
* @param ownerElement Form element.
*/
constructor(illegalConstructorSymbol: symbol, ownerElement: HTMLFormElement);
/**
* @override
*/
namedItem(name: string): THTMLFormControlElement | RadioNodeList | null;
}
//# sourceMappingURL=HTMLFormControlsCollection.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"HTMLFormControlsCollection.d.ts","sourceRoot":"","sources":["../../../src/nodes/html-form-element/HTMLFormControlsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,yBAAyB,CAAC;AAC1D,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,eAAe,MAAM,sBAAsB,CAAC;AACnD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,cAAc,CACrE,uBAAuB,EACvB,uBAAuB,GAAG,aAAa,CACvC;IACA,QAAgB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAkB;IAE/D;;;;;OAKG;gBACS,wBAAwB,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe;IAK3E;;OAEG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,aAAa,GAAG,IAAI;CAG9E"}

View File

@@ -0,0 +1,604 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const HTMLElement_js_1 = __importDefault(require("../html-element/HTMLElement.cjs"));
const PropertySymbol = __importStar(require("../../PropertySymbol.cjs"));
const Event_js_1 = __importDefault(require("../../event/Event.cjs"));
const SubmitEvent_js_1 = __importDefault(require("../../event/events/SubmitEvent.cjs"));
const HTMLFormControlsCollection_js_1 = __importDefault(require("./HTMLFormControlsCollection.cjs"));
const BrowserFrameNavigator_js_1 = __importDefault(require("../../browser/utilities/BrowserFrameNavigator.cjs"));
const QuerySelector_js_1 = __importDefault(require("../../query-selector/QuerySelector.cjs"));
const RadioNodeList_js_1 = __importDefault(require("./RadioNodeList.cjs"));
const WindowBrowserContext_js_1 = __importDefault(require("../../window/WindowBrowserContext.cjs"));
const ClassMethodBinder_js_1 = __importDefault(require("../../utilities/ClassMethodBinder.cjs"));
const Node_js_1 = __importDefault(require("../node/Node.cjs"));
const Element_js_1 = __importDefault(require("../element/Element.cjs"));
const EventTarget_js_1 = __importDefault(require("../../event/EventTarget.cjs"));
const ElementEventAttributeUtility_js_1 = __importDefault(require("../element/ElementEventAttributeUtility.cjs"));
/**
* HTML Form Element.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement.
*/
class HTMLFormElement extends HTMLElement_js_1.default {
// Internal properties.
[PropertySymbol.elements] = null;
[PropertySymbol.proxy];
/* eslint-enable jsdoc/require-jsdoc */
/**
* Constructor.
*/
constructor() {
super();
const methodBinder = new ClassMethodBinder_js_1.default(this, [
HTMLFormElement,
HTMLElement_js_1.default,
Element_js_1.default,
Node_js_1.default,
EventTarget_js_1.default
]);
const proxy = new Proxy(this, {
get: (target, property) => {
if (property === 'length') {
return target[PropertySymbol.getFormControlItems]().length;
}
if (property in target || typeof property === 'symbol') {
methodBinder.bind(property);
return target[property];
}
const index = Number(property);
if (!isNaN(index)) {
return target[PropertySymbol.getFormControlItems]()[index];
}
return target[PropertySymbol.getFormControlNamedItem](property) || undefined;
},
set(target, property, newValue) {
methodBinder.bind(property);
if (typeof property === 'symbol') {
target[property] = newValue;
return true;
}
const index = Number(property);
if (isNaN(index)) {
target[property] = newValue;
}
return true;
},
deleteProperty(target, property) {
if (typeof property === 'symbol') {
delete target[property];
return true;
}
const index = Number(property);
if (isNaN(index)) {
delete target[property];
}
return true;
},
ownKeys(target) {
return Object.keys(target[PropertySymbol.getFormControlItems]());
},
has(target, property) {
if (property in target) {
return true;
}
if (typeof property === 'symbol') {
return false;
}
const items = target[PropertySymbol.getFormControlItems]();
const index = Number(property);
if (!isNaN(index) && index >= 0 && index < items.length) {
return true;
}
property = String(property);
for (let i = 0; i < items.length; i++) {
const item = items[i];
const name = item.getAttribute('id') || item.getAttribute('name');
if (name && name === property) {
return true;
}
}
return false;
},
defineProperty(target, property, descriptor) {
methodBinder.preventBinding(property);
if (!descriptor.value) {
Object.defineProperty(target, property, descriptor);
return true;
}
const index = Number(descriptor.value);
if (isNaN(index)) {
Object.defineProperty(target, property, descriptor);
return true;
}
return false;
},
getOwnPropertyDescriptor(target, property) {
if (property in target) {
return Object.getOwnPropertyDescriptor(target, property);
}
const items = target[PropertySymbol.getFormControlItems]();
const index = Number(property);
if (!isNaN(index) && index >= 0 && index < items.length) {
return {
value: items[index],
writable: false,
enumerable: true,
configurable: true
};
}
for (let i = 0; i < items.length; i++) {
const item = items[i];
const name = item.getAttribute('id') || item.getAttribute('name');
if (name && name === property) {
return {
value: item,
writable: false,
enumerable: true,
configurable: true
};
}
}
}
});
this[PropertySymbol.proxy] = proxy;
this[PropertySymbol.formNode] = proxy;
return proxy;
}
// Events
/* eslint-disable jsdoc/require-jsdoc */
get onformdata() {
return ElementEventAttributeUtility_js_1.default.getEventListener(this, 'onformdata');
}
set onformdata(value) {
this[PropertySymbol.propertyEventListeners].set('onformdata', value);
}
get onreset() {
return ElementEventAttributeUtility_js_1.default.getEventListener(this, 'onreset');
}
set onreset(value) {
this[PropertySymbol.propertyEventListeners].set('onreset', value);
}
get onsubmit() {
return ElementEventAttributeUtility_js_1.default.getEventListener(this, 'onsubmit');
}
set onsubmit(value) {
this[PropertySymbol.propertyEventListeners].set('onsubmit', value);
}
/**
* Returns elements.
*
* @returns Elements.
*/
get elements() {
if (!this[PropertySymbol.elements]) {
this[PropertySymbol.elements] = new HTMLFormControlsCollection_js_1.default(PropertySymbol.illegalConstructor, this);
}
return this[PropertySymbol.elements];
}
/**
* Returns length.
*
* @returns Length.
*/
get length() {
return this[PropertySymbol.getFormControlItems]().length;
}
/**
* Returns name.
*
* @returns Name.
*/
get name() {
return this.getAttribute('name') || '';
}
/**
* Sets name.
*
* @param name Name.
*/
set name(name) {
this.setAttribute('name', name);
}
/**
* Returns method.
*
* @returns Method.
*/
get method() {
return this.getAttribute('method') || 'get';
}
/**
* Sets method.
*
* @param method Method.
*/
set method(method) {
this.setAttribute('method', method);
}
/**
* Returns target.
*
* @returns Target.
*/
get target() {
return this.getAttribute('target') || '';
}
/**
* Sets target.
*
* @param target Target.
*/
set target(target) {
this.setAttribute('target', target);
}
/**
* Returns action.
*
* @returns Action.
*/
get action() {
if (!this.hasAttribute('action')) {
return this[PropertySymbol.ownerDocument].location.href;
}
try {
return new URL(this.getAttribute('action'), this[PropertySymbol.ownerDocument].location.href)
.href;
}
catch (e) {
return '';
}
}
/**
* Sets action.
*
* @param action Action.
*/
set action(action) {
this.setAttribute('action', action);
}
/**
* Returns encoding.
*
* @returns Encoding.
*/
get encoding() {
return this.getAttribute('encoding') || '';
}
/**
* Sets encoding.
*
* @param encoding Encoding.
*/
set encoding(encoding) {
this.setAttribute('encoding', encoding);
}
/**
* Returns enctype.
*
* @returns Enctype.
*/
get enctype() {
return this.getAttribute('enctype') || '';
}
/**
* Sets enctype.
*
* @param enctype Enctype.
*/
set enctype(enctype) {
this.setAttribute('enctype', enctype);
}
/**
* Returns autocomplete.
*
* @returns Autocomplete.
*/
get autocomplete() {
return this.getAttribute('autocomplete') || '';
}
/**
* Sets autocomplete.
*
* @param autocomplete Autocomplete.
*/
set autocomplete(autocomplete) {
this.setAttribute('autocomplete', autocomplete);
}
/**
* Returns accept charset.
*
* @returns Accept charset.
*/
get acceptCharset() {
return this.getAttribute('acceptcharset') || '';
}
/**
* Sets accept charset.
*
* @param acceptCharset Accept charset.
*/
set acceptCharset(acceptCharset) {
this.setAttribute('acceptcharset', acceptCharset);
}
/**
* Returns no validate.
*
* @returns No validate.
*/
get noValidate() {
return this.getAttribute('novalidate') !== null;
}
/**
* Sets no validate.
*
* @param noValidate No validate.
*/
set noValidate(noValidate) {
if (!noValidate) {
this.removeAttribute('novalidate');
}
else {
this.setAttribute('novalidate', '');
}
}
/**
* Submits form. No submit event is raised. In particular, the form's "submit" event handler is not run.
*/
submit() {
this.#submit();
}
/**
* Submits form, reports validity and raises submit event.
*
* @param [submitter] Submitter.
*/
requestSubmit(submitter) {
const noValidate = submitter?.formNoValidate || this.noValidate;
if (noValidate || this.checkValidity()) {
const event = new SubmitEvent_js_1.default('submit', {
bubbles: true,
cancelable: true,
submitter: submitter || this[PropertySymbol.proxy]
});
this.dispatchEvent(event);
if (!event.defaultPrevented) {
this.#submit(submitter);
}
}
}
/**
* Resets form.
*/
reset() {
for (const element of this[PropertySymbol.getFormControlItems]()) {
switch (element[PropertySymbol.tagName]) {
case 'TEXTAREA':
element[PropertySymbol.value] = null;
break;
case 'INPUT':
element[PropertySymbol.value] = null;
element[PropertySymbol.checked] = null;
break;
case 'OUTPUT':
element.textContent = element[PropertySymbol.defaultValue];
break;
case 'SELECT':
let hasSelectedAttribute = false;
for (const option of element.options) {
if (option.hasAttribute('selected')) {
hasSelectedAttribute = true;
option.selected = true;
break;
}
}
if (!hasSelectedAttribute && element.options.length > 0) {
element.options[0].selected = true;
}
break;
}
}
this.dispatchEvent(new Event_js_1.default('reset', { bubbles: true, cancelable: true }));
}
/**
* Checks validity.
*
* @returns "true" if validation does'nt fail.
*/
checkValidity() {
const radioValidationState = {};
let isFormValid = true;
for (const element of this[PropertySymbol.getFormControlItems]()) {
if (element[PropertySymbol.tagName] === 'INPUT' && element.type === 'radio' && element.name) {
if (!radioValidationState[element.name]) {
radioValidationState[element.name] = true;
if (!element.checkValidity()) {
isFormValid = false;
}
}
}
else if (!element.checkValidity()) {
isFormValid = false;
}
}
return isFormValid;
}
/**
* Reports validity.
*
* @returns "true" if validation does'nt fail.
*/
reportValidity() {
return this.checkValidity();
}
/**
* @override
*/
[PropertySymbol.cloneNode](deep = false) {
return super[PropertySymbol.cloneNode](deep);
}
/**
* Returns form control items.
*
* @returns Form control items.
*/
[PropertySymbol.getFormControlItems]() {
const elements = (QuerySelector_js_1.default.querySelectorAll(this, 'input,select,textarea,button,fieldset,object,output')[PropertySymbol.items].slice());
if (this[PropertySymbol.isConnected]) {
const id = this.getAttribute('id');
if (id) {
for (const element of (QuerySelector_js_1.default.querySelectorAll(this[PropertySymbol.ownerDocument], `input[form="${id}"],select[form="${id}"],textarea[form="${id}"],button[form="${id}"],fieldset[form="${id}"],object[form="${id}"],output[form="${id}"]`)[PropertySymbol.items])) {
if (!elements.includes(element)) {
elements.push(element);
}
}
}
}
return elements;
}
/**
* Returns form control named item.
*
* @param name
* @returns Form control named item.
*/
[PropertySymbol.getFormControlNamedItem](name) {
const items = this[PropertySymbol.getFormControlItems]();
const namedItems = [];
name = String(name);
for (const item of items) {
if (item.getAttribute('id') === name || item.getAttribute('name') === name) {
namedItems.push(item);
}
}
if (!namedItems.length) {
return null;
}
if (namedItems.length === 1) {
return namedItems[0];
}
return new RadioNodeList_js_1.default(PropertySymbol.illegalConstructor, namedItems);
}
/**
* Submits form.
*
* @param browserFrame Browser frame. Injected by the constructor.
* @param [submitter] Submitter.
*/
#submit(submitter) {
const method = submitter?.formMethod || this.method;
if (method === 'dialog') {
let dialog = null;
let parent = this;
while (parent) {
if (parent[PropertySymbol.tagName] === 'DIALOG') {
dialog = parent;
break;
}
parent = parent.parentElement;
}
if (dialog) {
dialog.close(submitter?.value);
return;
}
}
const action = submitter?.hasAttribute('formaction')
? submitter?.formAction || this.action
: this.action;
const browserFrame = new WindowBrowserContext_js_1.default(this[PropertySymbol.window]).getBrowserFrame();
if (!browserFrame) {
return;
}
if (!action) {
// The URL is invalid when the action is empty.
// This is what Chrome does when the URL is invalid.
this[PropertySymbol.ownerDocument].location.hash = '#blocked';
return;
}
const formData = new this[PropertySymbol.window].FormData(this);
let targetFrame;
switch (submitter?.formTarget || this.target) {
default:
case '_self':
targetFrame = browserFrame;
break;
case '_top':
targetFrame = browserFrame.page.mainFrame;
break;
case '_parent':
targetFrame = browserFrame.parentFrame ?? browserFrame;
break;
case '_blank':
const newPage = browserFrame.page.context.newPage();
targetFrame = newPage.mainFrame;
targetFrame[PropertySymbol.openerFrame] = browserFrame;
break;
}
if (method === 'get') {
const url = new URL(action);
url.search = '';
for (const [key, value] of formData) {
if (typeof value === 'string') {
url.searchParams.append(key, value);
}
}
BrowserFrameNavigator_js_1.default.navigate({
windowClass: (this[PropertySymbol.ownerDocument][PropertySymbol.defaultView].constructor),
frame: targetFrame,
url: url.href,
goToOptions: {
referrer: browserFrame.page.mainFrame.window.location.origin
}
});
return;
}
BrowserFrameNavigator_js_1.default.navigate({
windowClass: (this[PropertySymbol.ownerDocument][PropertySymbol.defaultView].constructor),
frame: targetFrame,
method: method,
url: action,
formData,
goToOptions: {
referrer: browserFrame.page.mainFrame.window.location.origin
}
});
}
}
exports.default = HTMLFormElement;
//# sourceMappingURL=HTMLFormElement.cjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,194 @@
import HTMLElement from '../html-element/HTMLElement.cjs';
import * as PropertySymbol from '../../PropertySymbol.cjs';
import Event from '../../event/Event.cjs';
import HTMLFormControlsCollection from './HTMLFormControlsCollection.cjs';
import HTMLInputElement from '../html-input-element/HTMLInputElement.cjs';
import HTMLButtonElement from '../html-button-element/HTMLButtonElement.cjs';
import THTMLFormControlElement from './THTMLFormControlElement.cjs';
import RadioNodeList from './RadioNodeList.cjs';
/**
* HTML Form Element.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement.
*/
export default class HTMLFormElement extends HTMLElement {
#private;
cloneNode: (deep?: boolean) => HTMLFormElement;
[PropertySymbol.elements]: HTMLFormControlsCollection | null;
[PropertySymbol.proxy]: HTMLFormElement;
/**
* Constructor.
*/
constructor();
get onformdata(): ((event: Event) => void) | null;
set onformdata(value: ((event: Event) => void) | null);
get onreset(): ((event: Event) => void) | null;
set onreset(value: ((event: Event) => void) | null);
get onsubmit(): ((event: Event) => void) | null;
set onsubmit(value: ((event: Event) => void) | null);
/**
* Returns elements.
*
* @returns Elements.
*/
get elements(): HTMLFormControlsCollection;
/**
* Returns length.
*
* @returns Length.
*/
get length(): number;
/**
* Returns name.
*
* @returns Name.
*/
get name(): string;
/**
* Sets name.
*
* @param name Name.
*/
set name(name: string);
/**
* Returns method.
*
* @returns Method.
*/
get method(): string;
/**
* Sets method.
*
* @param method Method.
*/
set method(method: string);
/**
* Returns target.
*
* @returns Target.
*/
get target(): string;
/**
* Sets target.
*
* @param target Target.
*/
set target(target: string);
/**
* Returns action.
*
* @returns Action.
*/
get action(): string;
/**
* Sets action.
*
* @param action Action.
*/
set action(action: string);
/**
* Returns encoding.
*
* @returns Encoding.
*/
get encoding(): string;
/**
* Sets encoding.
*
* @param encoding Encoding.
*/
set encoding(encoding: string);
/**
* Returns enctype.
*
* @returns Enctype.
*/
get enctype(): string;
/**
* Sets enctype.
*
* @param enctype Enctype.
*/
set enctype(enctype: string);
/**
* Returns autocomplete.
*
* @returns Autocomplete.
*/
get autocomplete(): string;
/**
* Sets autocomplete.
*
* @param autocomplete Autocomplete.
*/
set autocomplete(autocomplete: string);
/**
* Returns accept charset.
*
* @returns Accept charset.
*/
get acceptCharset(): string;
/**
* Sets accept charset.
*
* @param acceptCharset Accept charset.
*/
set acceptCharset(acceptCharset: string);
/**
* Returns no validate.
*
* @returns No validate.
*/
get noValidate(): boolean;
/**
* Sets no validate.
*
* @param noValidate No validate.
*/
set noValidate(noValidate: boolean);
/**
* Submits form. No submit event is raised. In particular, the form's "submit" event handler is not run.
*/
submit(): void;
/**
* Submits form, reports validity and raises submit event.
*
* @param [submitter] Submitter.
*/
requestSubmit(submitter?: HTMLInputElement | HTMLButtonElement): void;
/**
* Resets form.
*/
reset(): void;
/**
* Checks validity.
*
* @returns "true" if validation does'nt fail.
*/
checkValidity(): boolean;
/**
* Reports validity.
*
* @returns "true" if validation does'nt fail.
*/
reportValidity(): boolean;
/**
* @override
*/
[PropertySymbol.cloneNode](deep?: boolean): HTMLFormElement;
/**
* Returns form control items.
*
* @returns Form control items.
*/
[PropertySymbol.getFormControlItems](): THTMLFormControlElement[];
/**
* Returns form control named item.
*
* @param name
* @returns Form control named item.
*/
[PropertySymbol.getFormControlNamedItem](name: string): THTMLFormControlElement | RadioNodeList | null;
}
//# sourceMappingURL=HTMLFormElement.d.ts.map

View File

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

View File

@@ -0,0 +1,62 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const NodeList_js_1 = __importDefault(require("../node/NodeList.cjs"));
const PropertySymbol = __importStar(require("../../PropertySymbol.cjs"));
/**
* RadioNodeList
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/RadioNodeList
*/
class RadioNodeList extends NodeList_js_1.default {
/**
* Returns value.
*
* @returns Value.
*/
get value() {
for (const node of this[PropertySymbol.items]) {
if (node.checked) {
return node.value;
}
}
return null;
}
}
exports.default = RadioNodeList;
//# sourceMappingURL=RadioNodeList.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"RadioNodeList.cjs","sourceRoot":"","sources":["../../../src/nodes/html-form-element/RadioNodeList.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,sEAA2C;AAE3C,wEAA0D;AAE1D;;;;GAIG;AACH,MAAqB,aAAc,SAAQ,qBAAiC;IAC3E;;;;OAIG;IACH,IAAW,KAAK;QACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,IAAuB,IAAK,CAAC,OAAO,EAAE,CAAC;gBACtC,OAA0B,IAAK,CAAC,KAAK,CAAC;YACvC,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAdD,gCAcC"}

View File

@@ -0,0 +1,16 @@
import NodeList from '../node/NodeList.cjs';
import THTMLFormControlElement from './THTMLFormControlElement.cjs';
/**
* RadioNodeList
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/RadioNodeList
*/
export default class RadioNodeList extends NodeList<THTMLFormControlElement> {
/**
* Returns value.
*
* @returns Value.
*/
get value(): string;
}
//# sourceMappingURL=RadioNodeList.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"RadioNodeList.d.ts","sourceRoot":"","sources":["../../../src/nodes/html-form-element/RadioNodeList.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAGnE;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,QAAQ,CAAC,uBAAuB,CAAC;IAC3E;;;;OAIG;IACH,IAAW,KAAK,IAAI,MAAM,CAOzB;CACD"}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=THTMLFormControlElement.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"THTMLFormControlElement.cjs","sourceRoot":"","sources":["../../../src/nodes/html-form-element/THTMLFormControlElement.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,10 @@
import HTMLButtonElement from '../html-button-element/HTMLButtonElement.cjs';
import HTMLFieldSetElement from '../html-field-set-element/HTMLFieldSetElement.cjs';
import HTMLInputElement from '../html-input-element/HTMLInputElement.cjs';
import HTMLObjectElement from '../html-object-element/HTMLObjectElement.cjs';
import HTMLOutputElement from '../html-output-element/HTMLOutputElement.cjs';
import HTMLSelectElement from '../html-select-element/HTMLSelectElement.cjs';
import HTMLTextAreaElement from '../html-text-area-element/HTMLTextAreaElement.cjs';
type THTMLFormControlElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | HTMLButtonElement | HTMLFieldSetElement | HTMLObjectElement | HTMLOutputElement;
export default THTMLFormControlElement;
//# sourceMappingURL=THTMLFormControlElement.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"THTMLFormControlElement.d.ts","sourceRoot":"","sources":["../../../src/nodes/html-form-element/THTMLFormControlElement.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,6CAA6C,CAAC;AAC5E,OAAO,mBAAmB,MAAM,kDAAkD,CAAC;AACnF,OAAO,gBAAgB,MAAM,2CAA2C,CAAC;AACzE,OAAO,iBAAiB,MAAM,6CAA6C,CAAC;AAC5E,OAAO,iBAAiB,MAAM,6CAA6C,CAAC;AAC5E,OAAO,iBAAiB,MAAM,6CAA6C,CAAC;AAC5E,OAAO,mBAAmB,MAAM,kDAAkD,CAAC;AAEnF,KAAK,uBAAuB,GACzB,gBAAgB,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,iBAAiB,CAAC;AAErB,eAAe,uBAAuB,CAAC"}